@vorionsys/atsf-core 0.1.0 → 0.2.1

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/README.md +12 -12
  2. package/dist/api/server.d.ts.map +1 -1
  3. package/dist/api/server.js +463 -35
  4. package/dist/api/server.js.map +1 -1
  5. package/dist/arbitration/index.d.ts.map +1 -1
  6. package/dist/arbitration/index.js +8 -6
  7. package/dist/arbitration/index.js.map +1 -1
  8. package/dist/audit/key-manager.d.ts +118 -0
  9. package/dist/audit/key-manager.d.ts.map +1 -0
  10. package/dist/audit/key-manager.js +565 -0
  11. package/dist/audit/key-manager.js.map +1 -0
  12. package/dist/basis/evaluator.d.ts +31 -0
  13. package/dist/basis/evaluator.d.ts.map +1 -1
  14. package/dist/basis/evaluator.js +205 -10
  15. package/dist/basis/evaluator.js.map +1 -1
  16. package/dist/basis/parser.d.ts +210 -210
  17. package/dist/basis/parser.js.map +1 -1
  18. package/dist/carbon-aware/carbon-metrics.d.ts +151 -0
  19. package/dist/carbon-aware/carbon-metrics.d.ts.map +1 -0
  20. package/dist/carbon-aware/carbon-metrics.js +370 -0
  21. package/dist/carbon-aware/carbon-metrics.js.map +1 -0
  22. package/dist/carbon-aware/carbon-router.d.ts +101 -0
  23. package/dist/carbon-aware/carbon-router.d.ts.map +1 -0
  24. package/dist/carbon-aware/carbon-router.js +400 -0
  25. package/dist/carbon-aware/carbon-router.js.map +1 -0
  26. package/dist/chain/index.d.ts +147 -0
  27. package/dist/chain/index.d.ts.map +1 -0
  28. package/dist/chain/index.js +219 -0
  29. package/dist/chain/index.js.map +1 -0
  30. package/dist/cognigate/index.d.ts +33 -4
  31. package/dist/cognigate/index.d.ts.map +1 -1
  32. package/dist/cognigate/index.js +199 -24
  33. package/dist/cognigate/index.js.map +1 -1
  34. package/dist/common/adapters.d.ts +172 -0
  35. package/dist/common/adapters.d.ts.map +1 -0
  36. package/dist/common/adapters.js +329 -0
  37. package/dist/common/adapters.js.map +1 -0
  38. package/dist/common/config.d.ts +168 -163
  39. package/dist/common/config.d.ts.map +1 -1
  40. package/dist/common/config.js +2 -0
  41. package/dist/common/config.js.map +1 -1
  42. package/dist/common/index.d.ts +1 -0
  43. package/dist/common/index.d.ts.map +1 -1
  44. package/dist/common/index.js +1 -0
  45. package/dist/common/index.js.map +1 -1
  46. package/dist/common/types.d.ts +67 -16
  47. package/dist/common/types.d.ts.map +1 -1
  48. package/dist/common/types.js +4 -0
  49. package/dist/common/types.js.map +1 -1
  50. package/dist/enforce/index.d.ts +226 -16
  51. package/dist/enforce/index.d.ts.map +1 -1
  52. package/dist/enforce/index.js +196 -49
  53. package/dist/enforce/index.js.map +1 -1
  54. package/dist/governance/fluid-workflow.d.ts +217 -0
  55. package/dist/governance/fluid-workflow.d.ts.map +1 -0
  56. package/dist/governance/fluid-workflow.js +491 -0
  57. package/dist/governance/fluid-workflow.js.map +1 -0
  58. package/dist/governance/index.d.ts +1 -0
  59. package/dist/governance/index.d.ts.map +1 -1
  60. package/dist/governance/index.js +1 -0
  61. package/dist/governance/index.js.map +1 -1
  62. package/dist/index.d.ts +9 -3
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +14 -3
  65. package/dist/index.js.map +1 -1
  66. package/dist/intent/index.d.ts +127 -10
  67. package/dist/intent/index.d.ts.map +1 -1
  68. package/dist/intent/index.js +121 -16
  69. package/dist/intent/index.js.map +1 -1
  70. package/dist/langchain/executor.d.ts +19 -5
  71. package/dist/langchain/executor.d.ts.map +1 -1
  72. package/dist/langchain/executor.js +287 -36
  73. package/dist/langchain/executor.js.map +1 -1
  74. package/dist/langchain/index.d.ts +2 -1
  75. package/dist/langchain/index.d.ts.map +1 -1
  76. package/dist/langchain/index.js +3 -1
  77. package/dist/langchain/index.js.map +1 -1
  78. package/dist/langchain/tools.d.ts.map +1 -1
  79. package/dist/langchain/tools.js +2 -1
  80. package/dist/langchain/tools.js.map +1 -1
  81. package/dist/langchain/types.d.ts +41 -0
  82. package/dist/langchain/types.d.ts.map +1 -1
  83. package/dist/layers/index.d.ts +1 -1
  84. package/dist/layers/index.d.ts.map +1 -1
  85. package/dist/persistence/file.d.ts +35 -3
  86. package/dist/persistence/file.d.ts.map +1 -1
  87. package/dist/persistence/file.js +138 -11
  88. package/dist/persistence/file.js.map +1 -1
  89. package/dist/persistence/index.d.ts +11 -1
  90. package/dist/persistence/index.d.ts.map +1 -1
  91. package/dist/persistence/index.js +25 -1
  92. package/dist/persistence/index.js.map +1 -1
  93. package/dist/persistence/sqlite.d.ts +135 -0
  94. package/dist/persistence/sqlite.d.ts.map +1 -0
  95. package/dist/persistence/sqlite.js +372 -0
  96. package/dist/persistence/sqlite.js.map +1 -0
  97. package/dist/persistence/supabase.d.ts +93 -0
  98. package/dist/persistence/supabase.d.ts.map +1 -0
  99. package/dist/persistence/supabase.js +219 -0
  100. package/dist/persistence/supabase.js.map +1 -0
  101. package/dist/persistence/types.d.ts +5 -1
  102. package/dist/persistence/types.d.ts.map +1 -1
  103. package/dist/phase6/ceiling.d.ts +177 -0
  104. package/dist/phase6/ceiling.d.ts.map +1 -0
  105. package/dist/phase6/ceiling.js +463 -0
  106. package/dist/phase6/ceiling.js.map +1 -0
  107. package/dist/phase6/context.d.ts +207 -0
  108. package/dist/phase6/context.d.ts.map +1 -0
  109. package/dist/phase6/context.js +603 -0
  110. package/dist/phase6/context.js.map +1 -0
  111. package/dist/phase6/index.d.ts +79 -0
  112. package/dist/phase6/index.d.ts.map +1 -0
  113. package/dist/phase6/index.js +152 -0
  114. package/dist/phase6/index.js.map +1 -0
  115. package/dist/phase6/presets.d.ts +148 -0
  116. package/dist/phase6/presets.d.ts.map +1 -0
  117. package/dist/phase6/presets.js +467 -0
  118. package/dist/phase6/presets.js.map +1 -0
  119. package/dist/phase6/provenance.d.ts +148 -0
  120. package/dist/phase6/provenance.d.ts.map +1 -0
  121. package/dist/phase6/provenance.js +545 -0
  122. package/dist/phase6/provenance.js.map +1 -0
  123. package/dist/phase6/role-gates/index.d.ts +7 -0
  124. package/dist/phase6/role-gates/index.d.ts.map +1 -0
  125. package/dist/phase6/role-gates/index.js +7 -0
  126. package/dist/phase6/role-gates/index.js.map +1 -0
  127. package/dist/phase6/role-gates/kernel.d.ts +84 -0
  128. package/dist/phase6/role-gates/kernel.d.ts.map +1 -0
  129. package/dist/phase6/role-gates/kernel.js +258 -0
  130. package/dist/phase6/role-gates/kernel.js.map +1 -0
  131. package/dist/phase6/role-gates/policy.d.ts +110 -0
  132. package/dist/phase6/role-gates/policy.d.ts.map +1 -0
  133. package/dist/phase6/role-gates/policy.js +157 -0
  134. package/dist/phase6/role-gates/policy.js.map +1 -0
  135. package/dist/phase6/role-gates.d.ts +164 -0
  136. package/dist/phase6/role-gates.d.ts.map +1 -0
  137. package/dist/phase6/role-gates.js +536 -0
  138. package/dist/phase6/role-gates.js.map +1 -0
  139. package/dist/phase6/types.d.ts +1827 -0
  140. package/dist/phase6/types.d.ts.map +1 -0
  141. package/dist/phase6/types.js +450 -0
  142. package/dist/phase6/types.js.map +1 -0
  143. package/dist/phase6/weight-presets/canonical.d.ts +93 -0
  144. package/dist/phase6/weight-presets/canonical.d.ts.map +1 -0
  145. package/dist/phase6/weight-presets/canonical.js +122 -0
  146. package/dist/phase6/weight-presets/canonical.js.map +1 -0
  147. package/dist/phase6/weight-presets/deltas.d.ts +144 -0
  148. package/dist/phase6/weight-presets/deltas.d.ts.map +1 -0
  149. package/dist/phase6/weight-presets/deltas.js +184 -0
  150. package/dist/phase6/weight-presets/deltas.js.map +1 -0
  151. package/dist/phase6/weight-presets/index.d.ts +8 -0
  152. package/dist/phase6/weight-presets/index.d.ts.map +1 -0
  153. package/dist/phase6/weight-presets/index.js +8 -0
  154. package/dist/phase6/weight-presets/index.js.map +1 -0
  155. package/dist/phase6/weight-presets/merger.d.ts +79 -0
  156. package/dist/phase6/weight-presets/merger.d.ts.map +1 -0
  157. package/dist/phase6/weight-presets/merger.js +161 -0
  158. package/dist/phase6/weight-presets/merger.js.map +1 -0
  159. package/dist/proof/index.d.ts +50 -1
  160. package/dist/proof/index.d.ts.map +1 -1
  161. package/dist/proof/index.js +122 -3
  162. package/dist/proof/index.js.map +1 -1
  163. package/dist/proof/merkle.d.ts +195 -0
  164. package/dist/proof/merkle.d.ts.map +1 -0
  165. package/dist/proof/merkle.js +412 -0
  166. package/dist/proof/merkle.js.map +1 -0
  167. package/dist/proof/zk-proofs.d.ts +218 -0
  168. package/dist/proof/zk-proofs.d.ts.map +1 -0
  169. package/dist/proof/zk-proofs.js +531 -0
  170. package/dist/proof/zk-proofs.js.map +1 -0
  171. package/dist/trust-engine/ceiling-enforcement/audit.d.ts +98 -0
  172. package/dist/trust-engine/ceiling-enforcement/audit.d.ts.map +1 -0
  173. package/dist/trust-engine/ceiling-enforcement/audit.js +160 -0
  174. package/dist/trust-engine/ceiling-enforcement/audit.js.map +1 -0
  175. package/dist/trust-engine/ceiling-enforcement/index.d.ts +6 -0
  176. package/dist/trust-engine/ceiling-enforcement/index.d.ts.map +1 -0
  177. package/dist/trust-engine/ceiling-enforcement/index.js +6 -0
  178. package/dist/trust-engine/ceiling-enforcement/index.js.map +1 -0
  179. package/dist/trust-engine/ceiling-enforcement/kernel.d.ts +112 -0
  180. package/dist/trust-engine/ceiling-enforcement/kernel.d.ts.map +1 -0
  181. package/dist/trust-engine/ceiling-enforcement/kernel.js +158 -0
  182. package/dist/trust-engine/ceiling-enforcement/kernel.js.map +1 -0
  183. package/dist/trust-engine/context-policy/enforcement.d.ts +62 -0
  184. package/dist/trust-engine/context-policy/enforcement.d.ts.map +1 -0
  185. package/dist/trust-engine/context-policy/enforcement.js +104 -0
  186. package/dist/trust-engine/context-policy/enforcement.js.map +1 -0
  187. package/dist/trust-engine/context-policy/factory.d.ts +75 -0
  188. package/dist/trust-engine/context-policy/factory.d.ts.map +1 -0
  189. package/dist/trust-engine/context-policy/factory.js +130 -0
  190. package/dist/trust-engine/context-policy/factory.js.map +1 -0
  191. package/dist/trust-engine/context-policy/index.d.ts +6 -0
  192. package/dist/trust-engine/context-policy/index.d.ts.map +1 -0
  193. package/dist/trust-engine/context-policy/index.js +6 -0
  194. package/dist/trust-engine/context-policy/index.js.map +1 -0
  195. package/dist/trust-engine/creation-modifiers/index.d.ts +5 -0
  196. package/dist/trust-engine/creation-modifiers/index.d.ts.map +1 -0
  197. package/dist/trust-engine/creation-modifiers/index.js +5 -0
  198. package/dist/trust-engine/creation-modifiers/index.js.map +1 -0
  199. package/dist/trust-engine/creation-modifiers/types.d.ts +112 -0
  200. package/dist/trust-engine/creation-modifiers/types.d.ts.map +1 -0
  201. package/dist/trust-engine/creation-modifiers/types.js +166 -0
  202. package/dist/trust-engine/creation-modifiers/types.js.map +1 -0
  203. package/dist/trust-engine/decay-profiles.d.ts +159 -0
  204. package/dist/trust-engine/decay-profiles.d.ts.map +1 -0
  205. package/dist/trust-engine/decay-profiles.js +210 -0
  206. package/dist/trust-engine/decay-profiles.js.map +1 -0
  207. package/dist/trust-engine/index.d.ts +144 -5
  208. package/dist/trust-engine/index.d.ts.map +1 -1
  209. package/dist/trust-engine/index.js +320 -15
  210. package/dist/trust-engine/index.js.map +1 -1
  211. package/dist/trust-engine/phase6-types.d.ts +123 -0
  212. package/dist/trust-engine/phase6-types.d.ts.map +1 -0
  213. package/dist/trust-engine/phase6-types.js +88 -0
  214. package/dist/trust-engine/phase6-types.js.map +1 -0
  215. package/package.json +26 -10
@@ -0,0 +1,400 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carbon-router.js","sourceRoot":"","sources":["../../src/carbon-aware/carbon-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * CHAIN Layer - Blockchain Anchoring
3
+ *
4
+ * Anchors proof hashes to Polygon blockchain for immutable verification.
5
+ * Supports batching via Merkle trees for cost efficiency.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ /**
10
+ * Polygon network configuration
11
+ */
12
+ export declare const POLYGON_NETWORKS: {
13
+ readonly mainnet: {
14
+ readonly rpcUrl: "https://polygon-rpc.com";
15
+ readonly chainId: 137;
16
+ readonly blockExplorer: "https://polygonscan.com";
17
+ readonly name: "Polygon Mainnet";
18
+ };
19
+ readonly amoy: {
20
+ readonly rpcUrl: "https://rpc-amoy.polygon.technology";
21
+ readonly chainId: 80002;
22
+ readonly blockExplorer: "https://amoy.polygonscan.com";
23
+ readonly name: "Polygon Amoy Testnet";
24
+ };
25
+ };
26
+ export type NetworkName = keyof typeof POLYGON_NETWORKS;
27
+ /**
28
+ * Chain anchor configuration
29
+ */
30
+ export interface ChainAnchorConfig {
31
+ /** Network to use (mainnet or amoy testnet) */
32
+ network: NetworkName;
33
+ /** Deployed BASISAnchor contract address */
34
+ contractAddress: string;
35
+ /** Private key for transaction signing (hex string) */
36
+ privateKey?: string;
37
+ /** Custom RPC URL override */
38
+ rpcUrl?: string;
39
+ /** Gas limit multiplier (default: 1.2 = 20% buffer) */
40
+ gasMultiplier?: number;
41
+ }
42
+ /**
43
+ * Proof data to anchor
44
+ */
45
+ export interface ProofToAnchor {
46
+ /** SHA-256 hash of the proof (0x-prefixed hex) */
47
+ proofHash: string;
48
+ /** Agent ID associated with the proof */
49
+ agentId: string;
50
+ }
51
+ /**
52
+ * Result of anchoring operation
53
+ */
54
+ export interface AnchorResult {
55
+ /** Batch ID assigned by the contract */
56
+ batchId: bigint;
57
+ /** Transaction hash */
58
+ transactionHash: string;
59
+ /** Block number where anchored */
60
+ blockNumber: number;
61
+ /** Merkle root of the batch */
62
+ merkleRoot: string;
63
+ /** Number of proofs in the batch */
64
+ proofCount: number;
65
+ /** Block explorer URL */
66
+ explorerUrl: string;
67
+ }
68
+ /**
69
+ * Result of verification operation
70
+ */
71
+ export interface VerificationResult {
72
+ /** Whether the proof is valid on-chain */
73
+ valid: boolean;
74
+ /** Batch ID containing the proof */
75
+ batchId: bigint;
76
+ /** Merkle root of the batch */
77
+ merkleRoot: string;
78
+ /** Timestamp when anchored */
79
+ anchoredAt: Date;
80
+ /** Block explorer URL */
81
+ explorerUrl: string;
82
+ }
83
+ /**
84
+ * Compute SHA-256 hash of a string
85
+ */
86
+ export declare function sha256(data: string): Promise<string>;
87
+ /**
88
+ * Compute keccak256 hash (Ethereum-style)
89
+ * Note: In production, use ethers.keccak256
90
+ */
91
+ export declare function keccak256Concat(a: string, b: string): Promise<string>;
92
+ /**
93
+ * Compute Merkle root from a list of hashes
94
+ */
95
+ export declare function computeMerkleRoot(hashes: string[]): Promise<string>;
96
+ /**
97
+ * Compute Merkle proof for a specific leaf
98
+ */
99
+ export declare function computeMerkleProof(hashes: string[], targetIndex: number): Promise<string[]>;
100
+ /**
101
+ * Verify a Merkle proof
102
+ */
103
+ export declare function verifyMerkleProof(leaf: string, proof: string[], root: string): Promise<boolean>;
104
+ /**
105
+ * Mock ChainAnchorService for testing
106
+ * In production, use the full implementation with ethers.js
107
+ */
108
+ export declare class MockChainAnchorService {
109
+ private config;
110
+ private batchCount;
111
+ private batches;
112
+ private proofToBatch;
113
+ constructor(config: ChainAnchorConfig);
114
+ /**
115
+ * Mock anchor batch - simulates blockchain anchoring
116
+ */
117
+ anchorBatch(proofs: ProofToAnchor[]): Promise<AnchorResult>;
118
+ /**
119
+ * Mock verify proof
120
+ */
121
+ verifyProof(proofHash: string, merkleProof: string[], batchId: bigint): Promise<boolean>;
122
+ /**
123
+ * Mock get proof anchor info
124
+ */
125
+ getProofAnchor(proofHash: string): Promise<VerificationResult | null>;
126
+ /**
127
+ * Get batch info
128
+ */
129
+ getBatch(batchId: bigint): {
130
+ merkleRoot: string;
131
+ proofHashes: string[];
132
+ timestamp: Date;
133
+ };
134
+ /**
135
+ * Get stats
136
+ */
137
+ getStats(): {
138
+ batchCount: bigint;
139
+ totalProofs: number;
140
+ };
141
+ }
142
+ /**
143
+ * Create a chain anchor service
144
+ * Returns mock service by default; use createRealChainAnchor for production
145
+ */
146
+ export declare function createChainAnchor(config: ChainAnchorConfig): MockChainAnchorService;
147
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chain/index.ts"],"names":[],"mappings":"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"}