@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.
- package/README.md +12 -12
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +463 -35
- package/dist/api/server.js.map +1 -1
- package/dist/arbitration/index.d.ts.map +1 -1
- package/dist/arbitration/index.js +8 -6
- package/dist/arbitration/index.js.map +1 -1
- package/dist/audit/key-manager.d.ts +118 -0
- package/dist/audit/key-manager.d.ts.map +1 -0
- package/dist/audit/key-manager.js +565 -0
- package/dist/audit/key-manager.js.map +1 -0
- package/dist/basis/evaluator.d.ts +31 -0
- package/dist/basis/evaluator.d.ts.map +1 -1
- package/dist/basis/evaluator.js +205 -10
- package/dist/basis/evaluator.js.map +1 -1
- package/dist/basis/parser.d.ts +210 -210
- package/dist/basis/parser.js.map +1 -1
- package/dist/carbon-aware/carbon-metrics.d.ts +151 -0
- package/dist/carbon-aware/carbon-metrics.d.ts.map +1 -0
- package/dist/carbon-aware/carbon-metrics.js +370 -0
- package/dist/carbon-aware/carbon-metrics.js.map +1 -0
- package/dist/carbon-aware/carbon-router.d.ts +101 -0
- package/dist/carbon-aware/carbon-router.d.ts.map +1 -0
- package/dist/carbon-aware/carbon-router.js +400 -0
- package/dist/carbon-aware/carbon-router.js.map +1 -0
- package/dist/chain/index.d.ts +147 -0
- package/dist/chain/index.d.ts.map +1 -0
- package/dist/chain/index.js +219 -0
- package/dist/chain/index.js.map +1 -0
- package/dist/cognigate/index.d.ts +33 -4
- package/dist/cognigate/index.d.ts.map +1 -1
- package/dist/cognigate/index.js +199 -24
- package/dist/cognigate/index.js.map +1 -1
- package/dist/common/adapters.d.ts +172 -0
- package/dist/common/adapters.d.ts.map +1 -0
- package/dist/common/adapters.js +329 -0
- package/dist/common/adapters.js.map +1 -0
- package/dist/common/config.d.ts +168 -163
- package/dist/common/config.d.ts.map +1 -1
- package/dist/common/config.js +2 -0
- package/dist/common/config.js.map +1 -1
- package/dist/common/index.d.ts +1 -0
- package/dist/common/index.d.ts.map +1 -1
- package/dist/common/index.js +1 -0
- package/dist/common/index.js.map +1 -1
- package/dist/common/types.d.ts +67 -16
- package/dist/common/types.d.ts.map +1 -1
- package/dist/common/types.js +4 -0
- package/dist/common/types.js.map +1 -1
- package/dist/enforce/index.d.ts +226 -16
- package/dist/enforce/index.d.ts.map +1 -1
- package/dist/enforce/index.js +196 -49
- package/dist/enforce/index.js.map +1 -1
- package/dist/governance/fluid-workflow.d.ts +217 -0
- package/dist/governance/fluid-workflow.d.ts.map +1 -0
- package/dist/governance/fluid-workflow.js +491 -0
- package/dist/governance/fluid-workflow.js.map +1 -0
- package/dist/governance/index.d.ts +1 -0
- package/dist/governance/index.d.ts.map +1 -1
- package/dist/governance/index.js +1 -0
- package/dist/governance/index.js.map +1 -1
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -1
- package/dist/intent/index.d.ts +127 -10
- package/dist/intent/index.d.ts.map +1 -1
- package/dist/intent/index.js +121 -16
- package/dist/intent/index.js.map +1 -1
- package/dist/langchain/executor.d.ts +19 -5
- package/dist/langchain/executor.d.ts.map +1 -1
- package/dist/langchain/executor.js +287 -36
- package/dist/langchain/executor.js.map +1 -1
- package/dist/langchain/index.d.ts +2 -1
- package/dist/langchain/index.d.ts.map +1 -1
- package/dist/langchain/index.js +3 -1
- package/dist/langchain/index.js.map +1 -1
- package/dist/langchain/tools.d.ts.map +1 -1
- package/dist/langchain/tools.js +2 -1
- package/dist/langchain/tools.js.map +1 -1
- package/dist/langchain/types.d.ts +41 -0
- package/dist/langchain/types.d.ts.map +1 -1
- package/dist/layers/index.d.ts +1 -1
- package/dist/layers/index.d.ts.map +1 -1
- package/dist/persistence/file.d.ts +35 -3
- package/dist/persistence/file.d.ts.map +1 -1
- package/dist/persistence/file.js +138 -11
- package/dist/persistence/file.js.map +1 -1
- package/dist/persistence/index.d.ts +11 -1
- package/dist/persistence/index.d.ts.map +1 -1
- package/dist/persistence/index.js +25 -1
- package/dist/persistence/index.js.map +1 -1
- package/dist/persistence/sqlite.d.ts +135 -0
- package/dist/persistence/sqlite.d.ts.map +1 -0
- package/dist/persistence/sqlite.js +372 -0
- package/dist/persistence/sqlite.js.map +1 -0
- package/dist/persistence/supabase.d.ts +93 -0
- package/dist/persistence/supabase.d.ts.map +1 -0
- package/dist/persistence/supabase.js +219 -0
- package/dist/persistence/supabase.js.map +1 -0
- package/dist/persistence/types.d.ts +5 -1
- package/dist/persistence/types.d.ts.map +1 -1
- package/dist/phase6/ceiling.d.ts +177 -0
- package/dist/phase6/ceiling.d.ts.map +1 -0
- package/dist/phase6/ceiling.js +463 -0
- package/dist/phase6/ceiling.js.map +1 -0
- package/dist/phase6/context.d.ts +207 -0
- package/dist/phase6/context.d.ts.map +1 -0
- package/dist/phase6/context.js +603 -0
- package/dist/phase6/context.js.map +1 -0
- package/dist/phase6/index.d.ts +79 -0
- package/dist/phase6/index.d.ts.map +1 -0
- package/dist/phase6/index.js +152 -0
- package/dist/phase6/index.js.map +1 -0
- package/dist/phase6/presets.d.ts +148 -0
- package/dist/phase6/presets.d.ts.map +1 -0
- package/dist/phase6/presets.js +467 -0
- package/dist/phase6/presets.js.map +1 -0
- package/dist/phase6/provenance.d.ts +148 -0
- package/dist/phase6/provenance.d.ts.map +1 -0
- package/dist/phase6/provenance.js +545 -0
- package/dist/phase6/provenance.js.map +1 -0
- package/dist/phase6/role-gates/index.d.ts +7 -0
- package/dist/phase6/role-gates/index.d.ts.map +1 -0
- package/dist/phase6/role-gates/index.js +7 -0
- package/dist/phase6/role-gates/index.js.map +1 -0
- package/dist/phase6/role-gates/kernel.d.ts +84 -0
- package/dist/phase6/role-gates/kernel.d.ts.map +1 -0
- package/dist/phase6/role-gates/kernel.js +258 -0
- package/dist/phase6/role-gates/kernel.js.map +1 -0
- package/dist/phase6/role-gates/policy.d.ts +110 -0
- package/dist/phase6/role-gates/policy.d.ts.map +1 -0
- package/dist/phase6/role-gates/policy.js +157 -0
- package/dist/phase6/role-gates/policy.js.map +1 -0
- package/dist/phase6/role-gates.d.ts +164 -0
- package/dist/phase6/role-gates.d.ts.map +1 -0
- package/dist/phase6/role-gates.js +536 -0
- package/dist/phase6/role-gates.js.map +1 -0
- package/dist/phase6/types.d.ts +1827 -0
- package/dist/phase6/types.d.ts.map +1 -0
- package/dist/phase6/types.js +450 -0
- package/dist/phase6/types.js.map +1 -0
- package/dist/phase6/weight-presets/canonical.d.ts +93 -0
- package/dist/phase6/weight-presets/canonical.d.ts.map +1 -0
- package/dist/phase6/weight-presets/canonical.js +122 -0
- package/dist/phase6/weight-presets/canonical.js.map +1 -0
- package/dist/phase6/weight-presets/deltas.d.ts +144 -0
- package/dist/phase6/weight-presets/deltas.d.ts.map +1 -0
- package/dist/phase6/weight-presets/deltas.js +184 -0
- package/dist/phase6/weight-presets/deltas.js.map +1 -0
- package/dist/phase6/weight-presets/index.d.ts +8 -0
- package/dist/phase6/weight-presets/index.d.ts.map +1 -0
- package/dist/phase6/weight-presets/index.js +8 -0
- package/dist/phase6/weight-presets/index.js.map +1 -0
- package/dist/phase6/weight-presets/merger.d.ts +79 -0
- package/dist/phase6/weight-presets/merger.d.ts.map +1 -0
- package/dist/phase6/weight-presets/merger.js +161 -0
- package/dist/phase6/weight-presets/merger.js.map +1 -0
- package/dist/proof/index.d.ts +50 -1
- package/dist/proof/index.d.ts.map +1 -1
- package/dist/proof/index.js +122 -3
- package/dist/proof/index.js.map +1 -1
- package/dist/proof/merkle.d.ts +195 -0
- package/dist/proof/merkle.d.ts.map +1 -0
- package/dist/proof/merkle.js +412 -0
- package/dist/proof/merkle.js.map +1 -0
- package/dist/proof/zk-proofs.d.ts +218 -0
- package/dist/proof/zk-proofs.d.ts.map +1 -0
- package/dist/proof/zk-proofs.js +531 -0
- package/dist/proof/zk-proofs.js.map +1 -0
- package/dist/trust-engine/ceiling-enforcement/audit.d.ts +98 -0
- package/dist/trust-engine/ceiling-enforcement/audit.d.ts.map +1 -0
- package/dist/trust-engine/ceiling-enforcement/audit.js +160 -0
- package/dist/trust-engine/ceiling-enforcement/audit.js.map +1 -0
- package/dist/trust-engine/ceiling-enforcement/index.d.ts +6 -0
- package/dist/trust-engine/ceiling-enforcement/index.d.ts.map +1 -0
- package/dist/trust-engine/ceiling-enforcement/index.js +6 -0
- package/dist/trust-engine/ceiling-enforcement/index.js.map +1 -0
- package/dist/trust-engine/ceiling-enforcement/kernel.d.ts +112 -0
- package/dist/trust-engine/ceiling-enforcement/kernel.d.ts.map +1 -0
- package/dist/trust-engine/ceiling-enforcement/kernel.js +158 -0
- package/dist/trust-engine/ceiling-enforcement/kernel.js.map +1 -0
- package/dist/trust-engine/context-policy/enforcement.d.ts +62 -0
- package/dist/trust-engine/context-policy/enforcement.d.ts.map +1 -0
- package/dist/trust-engine/context-policy/enforcement.js +104 -0
- package/dist/trust-engine/context-policy/enforcement.js.map +1 -0
- package/dist/trust-engine/context-policy/factory.d.ts +75 -0
- package/dist/trust-engine/context-policy/factory.d.ts.map +1 -0
- package/dist/trust-engine/context-policy/factory.js +130 -0
- package/dist/trust-engine/context-policy/factory.js.map +1 -0
- package/dist/trust-engine/context-policy/index.d.ts +6 -0
- package/dist/trust-engine/context-policy/index.d.ts.map +1 -0
- package/dist/trust-engine/context-policy/index.js +6 -0
- package/dist/trust-engine/context-policy/index.js.map +1 -0
- package/dist/trust-engine/creation-modifiers/index.d.ts +5 -0
- package/dist/trust-engine/creation-modifiers/index.d.ts.map +1 -0
- package/dist/trust-engine/creation-modifiers/index.js +5 -0
- package/dist/trust-engine/creation-modifiers/index.js.map +1 -0
- package/dist/trust-engine/creation-modifiers/types.d.ts +112 -0
- package/dist/trust-engine/creation-modifiers/types.d.ts.map +1 -0
- package/dist/trust-engine/creation-modifiers/types.js +166 -0
- package/dist/trust-engine/creation-modifiers/types.js.map +1 -0
- package/dist/trust-engine/decay-profiles.d.ts +159 -0
- package/dist/trust-engine/decay-profiles.d.ts.map +1 -0
- package/dist/trust-engine/decay-profiles.js +210 -0
- package/dist/trust-engine/decay-profiles.js.map +1 -0
- package/dist/trust-engine/index.d.ts +144 -5
- package/dist/trust-engine/index.d.ts.map +1 -1
- package/dist/trust-engine/index.js +320 -15
- package/dist/trust-engine/index.js.map +1 -1
- package/dist/trust-engine/phase6-types.d.ts +123 -0
- package/dist/trust-engine/phase6-types.d.ts.map +1 -0
- package/dist/trust-engine/phase6-types.js +88 -0
- package/dist/trust-engine/phase6-types.js.map +1 -0
- 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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"}
|