@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,151 @@
1
+ /**
2
+ * Carbon Metrics
3
+ *
4
+ * Tracks and reports carbon-related metrics including estimated CO2 per request,
5
+ * carbon savings from routing decisions, and regional intensity history.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { EventEmitter } from 'events';
10
+ import type { CloudRegion, CarbonMetricsSnapshot, IntensityHistoryEntry, RoutingDecision, IntensityFetchedEvent, FallbackUsedEvent } from './types.js';
11
+ /**
12
+ * Carbon Metrics Collector
13
+ *
14
+ * Aggregates and reports carbon-related metrics for the AI Gateway.
15
+ */
16
+ export declare class CarbonMetrics extends EventEmitter {
17
+ private _totalRequests;
18
+ private _totalEstimatedCO2Grams;
19
+ private _totalSavingsGrams;
20
+ private _totalIntensitySum;
21
+ private _cacheHits;
22
+ private _cacheMisses;
23
+ private _fallbackCount;
24
+ private _totalFetches;
25
+ private _requestsByRegion;
26
+ private _requestsByProvider;
27
+ private _co2ByRegion;
28
+ private _intensityHistory;
29
+ private _historySize;
30
+ private _baselineIntensity;
31
+ private _periodStart;
32
+ constructor(config?: CarbonMetricsConfig);
33
+ /**
34
+ * Get total requests routed
35
+ */
36
+ get totalRequests(): number;
37
+ /**
38
+ * Get total estimated CO2 (grams)
39
+ */
40
+ get totalEstimatedCO2Grams(): number;
41
+ /**
42
+ * Get total CO2 savings (grams)
43
+ */
44
+ get totalSavingsGrams(): number;
45
+ /**
46
+ * Get average carbon intensity
47
+ */
48
+ get averageIntensity(): number;
49
+ /**
50
+ * Get green routing percentage
51
+ */
52
+ get greenRoutingPercentage(): number;
53
+ /**
54
+ * Get cache hit rate
55
+ */
56
+ get cacheHitRate(): number;
57
+ /**
58
+ * Get fallback rate
59
+ */
60
+ get fallbackRate(): number;
61
+ /**
62
+ * Record a routing decision
63
+ */
64
+ recordRouting(decision: RoutingDecision, estimatedTokens: number): void;
65
+ /**
66
+ * Record intensity fetch result
67
+ */
68
+ recordIntensityFetch(event: IntensityFetchedEvent): void;
69
+ /**
70
+ * Record fallback usage
71
+ */
72
+ recordFallback(event: FallbackUsedEvent): void;
73
+ /**
74
+ * Get a snapshot of all metrics
75
+ */
76
+ getSnapshot(): CarbonMetricsSnapshot;
77
+ /**
78
+ * Get intensity history for a region
79
+ */
80
+ getIntensityHistory(region?: CloudRegion): IntensityHistoryEntry[];
81
+ /**
82
+ * Get average intensity for a region over the history period
83
+ */
84
+ getAverageRegionIntensity(region: CloudRegion): number;
85
+ /**
86
+ * Get regions sorted by average intensity (greenest first)
87
+ */
88
+ getRegionsByIntensity(): Array<{
89
+ region: CloudRegion;
90
+ averageIntensity: number;
91
+ }>;
92
+ /**
93
+ * Get CO2 savings breakdown by region
94
+ */
95
+ getSavingsByRegion(): Map<CloudRegion, number>;
96
+ /**
97
+ * Get sustainability report
98
+ */
99
+ getSustainabilityReport(): SustainabilityReport;
100
+ /**
101
+ * Reset all metrics
102
+ */
103
+ reset(): void;
104
+ /**
105
+ * Calculate CO2 for a request
106
+ */
107
+ private calculateCO2;
108
+ /**
109
+ * Add entry to intensity history
110
+ */
111
+ private addToHistory;
112
+ /**
113
+ * Generate sustainability recommendations
114
+ */
115
+ private generateRecommendations;
116
+ /**
117
+ * Emit savings calculated event
118
+ */
119
+ private emitSavingsEvent;
120
+ }
121
+ /**
122
+ * Configuration for carbon metrics
123
+ */
124
+ export interface CarbonMetricsConfig {
125
+ /** Maximum number of history entries to retain */
126
+ historySize?: number;
127
+ /** Baseline carbon intensity for savings calculation (gCO2eq/kWh) */
128
+ baselineIntensity?: number;
129
+ }
130
+ /**
131
+ * Sustainability report
132
+ */
133
+ export interface SustainabilityReport extends CarbonMetricsSnapshot {
134
+ /** CO2 savings by region */
135
+ savingsByRegion: Map<CloudRegion, number>;
136
+ /** Equivalent number of trees (annual CO2 absorption) */
137
+ treesEquivalent: number;
138
+ /** Equivalent miles driven in an average car */
139
+ milesDrivenEquivalent: number;
140
+ /** Greenest region used */
141
+ greenestRegion?: CloudRegion;
142
+ /** Highest-carbon region used */
143
+ dirtiestRegion?: CloudRegion;
144
+ /** Recommendations for improving sustainability */
145
+ recommendations: string[];
146
+ }
147
+ /**
148
+ * Create a carbon metrics collector
149
+ */
150
+ export declare function createCarbonMetrics(config?: CarbonMetricsConfig): CarbonMetrics;
151
+ //# sourceMappingURL=carbon-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carbon-metrics.d.ts","sourceRoot":"","sources":["../../src/carbon-aware/carbon-metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,370 @@
1
+ /**
2
+ * Carbon Metrics
3
+ *
4
+ * Tracks and reports carbon-related metrics including estimated CO2 per request,
5
+ * carbon savings from routing decisions, and regional intensity history.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { EventEmitter } from 'events';
10
+ import { createLogger } from '../common/logger.js';
11
+ import { ENERGY_PER_1000_TOKENS_KWH } from './types.js';
12
+ const logger = createLogger({ component: 'carbon-metrics' });
13
+ /**
14
+ * Default history retention (24 hours worth at 5-minute intervals)
15
+ */
16
+ const DEFAULT_HISTORY_SIZE = 288;
17
+ /**
18
+ * Default baseline carbon intensity for savings calculation (gCO2eq/kWh)
19
+ * Based on global average grid intensity
20
+ */
21
+ const DEFAULT_BASELINE_INTENSITY = 450;
22
+ /**
23
+ * Carbon Metrics Collector
24
+ *
25
+ * Aggregates and reports carbon-related metrics for the AI Gateway.
26
+ */
27
+ export class CarbonMetrics extends EventEmitter {
28
+ _totalRequests = 0;
29
+ _totalEstimatedCO2Grams = 0;
30
+ _totalSavingsGrams = 0;
31
+ _totalIntensitySum = 0;
32
+ _cacheHits = 0;
33
+ _cacheMisses = 0;
34
+ _fallbackCount = 0;
35
+ _totalFetches = 0;
36
+ _requestsByRegion = new Map();
37
+ _requestsByProvider = new Map();
38
+ _co2ByRegion = new Map();
39
+ _intensityHistory = [];
40
+ _historySize;
41
+ _baselineIntensity;
42
+ _periodStart;
43
+ constructor(config = {}) {
44
+ super();
45
+ this._historySize = config.historySize ?? DEFAULT_HISTORY_SIZE;
46
+ this._baselineIntensity = config.baselineIntensity ?? DEFAULT_BASELINE_INTENSITY;
47
+ this._periodStart = new Date().toISOString();
48
+ }
49
+ /**
50
+ * Get total requests routed
51
+ */
52
+ get totalRequests() {
53
+ return this._totalRequests;
54
+ }
55
+ /**
56
+ * Get total estimated CO2 (grams)
57
+ */
58
+ get totalEstimatedCO2Grams() {
59
+ return this._totalEstimatedCO2Grams;
60
+ }
61
+ /**
62
+ * Get total CO2 savings (grams)
63
+ */
64
+ get totalSavingsGrams() {
65
+ return this._totalSavingsGrams;
66
+ }
67
+ /**
68
+ * Get average carbon intensity
69
+ */
70
+ get averageIntensity() {
71
+ return this._totalRequests > 0 ? this._totalIntensitySum / this._totalRequests : 0;
72
+ }
73
+ /**
74
+ * Get green routing percentage
75
+ */
76
+ get greenRoutingPercentage() {
77
+ if (this._totalRequests === 0)
78
+ return 0;
79
+ let greenCount = 0;
80
+ Array.from(this._requestsByRegion.entries()).forEach(([region, count]) => {
81
+ // Consider regions with intensity <= 150 as "green"
82
+ const avgIntensity = this.getAverageRegionIntensity(region);
83
+ if (avgIntensity <= 150) {
84
+ greenCount += count;
85
+ }
86
+ });
87
+ return (greenCount / this._totalRequests) * 100;
88
+ }
89
+ /**
90
+ * Get cache hit rate
91
+ */
92
+ get cacheHitRate() {
93
+ const total = this._cacheHits + this._cacheMisses;
94
+ return total > 0 ? this._cacheHits / total : 0;
95
+ }
96
+ /**
97
+ * Get fallback rate
98
+ */
99
+ get fallbackRate() {
100
+ return this._totalFetches > 0 ? this._fallbackCount / this._totalFetches : 0;
101
+ }
102
+ /**
103
+ * Record a routing decision
104
+ */
105
+ recordRouting(decision, estimatedTokens) {
106
+ this._totalRequests++;
107
+ // Calculate CO2
108
+ const co2Grams = this.calculateCO2(decision.carbonIntensity.intensity, estimatedTokens);
109
+ this._totalEstimatedCO2Grams += co2Grams;
110
+ this._totalIntensitySum += decision.carbonIntensity.intensity;
111
+ // Calculate savings vs baseline
112
+ const baselineCO2 = this.calculateCO2(this._baselineIntensity, estimatedTokens);
113
+ const savings = Math.max(0, baselineCO2 - co2Grams);
114
+ this._totalSavingsGrams += savings;
115
+ // Update region counts
116
+ const regionCount = this._requestsByRegion.get(decision.region) ?? 0;
117
+ this._requestsByRegion.set(decision.region, regionCount + 1);
118
+ // Update provider counts
119
+ const providerCount = this._requestsByProvider.get(decision.provider) ?? 0;
120
+ this._requestsByProvider.set(decision.provider, providerCount + 1);
121
+ // Update CO2 by region
122
+ const regionCO2 = this._co2ByRegion.get(decision.region) ?? 0;
123
+ this._co2ByRegion.set(decision.region, regionCO2 + co2Grams);
124
+ // Track intensity history for green routing percentage calculation
125
+ this.addToHistory({
126
+ region: decision.region,
127
+ intensity: decision.carbonIntensity.intensity,
128
+ timestamp: decision.decidedAt,
129
+ source: 'routing_decision',
130
+ });
131
+ // Emit savings event
132
+ this.emitSavingsEvent(decision.id, co2Grams, baselineCO2, savings);
133
+ logger.debug({
134
+ requestId: decision.id,
135
+ region: decision.region,
136
+ co2Grams,
137
+ savingsGrams: savings,
138
+ totalRequests: this._totalRequests,
139
+ }, 'Routing recorded');
140
+ }
141
+ /**
142
+ * Record intensity fetch result
143
+ */
144
+ recordIntensityFetch(event) {
145
+ this._totalFetches++;
146
+ if (event.cacheHit) {
147
+ this._cacheHits++;
148
+ }
149
+ else {
150
+ this._cacheMisses++;
151
+ }
152
+ // Add to history
153
+ this.addToHistory({
154
+ region: event.region,
155
+ intensity: event.intensity,
156
+ timestamp: event.timestamp,
157
+ source: event.source,
158
+ });
159
+ }
160
+ /**
161
+ * Record fallback usage
162
+ */
163
+ recordFallback(event) {
164
+ this._fallbackCount++;
165
+ logger.debug({
166
+ region: event.region,
167
+ primarySource: event.primarySource,
168
+ fallbackSource: event.fallbackSource,
169
+ reason: event.reason,
170
+ }, 'Fallback recorded');
171
+ }
172
+ /**
173
+ * Get a snapshot of all metrics
174
+ */
175
+ getSnapshot() {
176
+ return {
177
+ totalRequests: this._totalRequests,
178
+ totalEstimatedCO2Grams: this._totalEstimatedCO2Grams,
179
+ totalSavingsGrams: this._totalSavingsGrams,
180
+ averageIntensity: this.averageIntensity,
181
+ requestsByRegion: new Map(this._requestsByRegion),
182
+ requestsByProvider: new Map(this._requestsByProvider),
183
+ co2ByRegion: new Map(this._co2ByRegion),
184
+ greenRoutingPercentage: this.greenRoutingPercentage,
185
+ cacheHitRate: this.cacheHitRate,
186
+ fallbackRate: this.fallbackRate,
187
+ periodStart: this._periodStart,
188
+ periodEnd: new Date().toISOString(),
189
+ };
190
+ }
191
+ /**
192
+ * Get intensity history for a region
193
+ */
194
+ getIntensityHistory(region) {
195
+ if (region) {
196
+ return this._intensityHistory.filter(e => e.region === region);
197
+ }
198
+ return [...this._intensityHistory];
199
+ }
200
+ /**
201
+ * Get average intensity for a region over the history period
202
+ */
203
+ getAverageRegionIntensity(region) {
204
+ const regionHistory = this.getIntensityHistory(region);
205
+ if (regionHistory.length === 0)
206
+ return this._baselineIntensity;
207
+ const sum = regionHistory.reduce((acc, e) => acc + e.intensity, 0);
208
+ return sum / regionHistory.length;
209
+ }
210
+ /**
211
+ * Get regions sorted by average intensity (greenest first)
212
+ */
213
+ getRegionsByIntensity() {
214
+ const regions = new Set(this._intensityHistory.map(e => e.region));
215
+ const result = [];
216
+ Array.from(regions).forEach((region) => {
217
+ result.push({
218
+ region,
219
+ averageIntensity: this.getAverageRegionIntensity(region),
220
+ });
221
+ });
222
+ return result.sort((a, b) => a.averageIntensity - b.averageIntensity);
223
+ }
224
+ /**
225
+ * Get CO2 savings breakdown by region
226
+ */
227
+ getSavingsByRegion() {
228
+ const savings = new Map();
229
+ Array.from(this._co2ByRegion.entries()).forEach(([region, totalCO2]) => {
230
+ const requests = this._requestsByRegion.get(region) ?? 0;
231
+ if (requests > 0) {
232
+ // Estimate what the CO2 would have been at baseline
233
+ const avgCO2PerRequest = totalCO2 / requests;
234
+ const baselineCO2PerRequest = avgCO2PerRequest * (this._baselineIntensity / this.getAverageRegionIntensity(region));
235
+ const regionSavings = (baselineCO2PerRequest - avgCO2PerRequest) * requests;
236
+ savings.set(region, Math.max(0, regionSavings));
237
+ }
238
+ });
239
+ return savings;
240
+ }
241
+ /**
242
+ * Get sustainability report
243
+ */
244
+ getSustainabilityReport() {
245
+ const snapshot = this.getSnapshot();
246
+ const savingsByRegion = this.getSavingsByRegion();
247
+ const regionsByIntensity = this.getRegionsByIntensity();
248
+ // Calculate equivalent metrics
249
+ const treesEquivalent = this._totalSavingsGrams / 21000; // ~21kg CO2 per tree per year
250
+ const milesDrivenEquivalent = this._totalSavingsGrams / 404; // ~404g CO2 per mile
251
+ // Find greenest and dirtiest routes used
252
+ let greenestRegion;
253
+ let dirtiestRegion;
254
+ let minIntensity = Infinity;
255
+ let maxIntensity = 0;
256
+ for (const { region, averageIntensity } of regionsByIntensity) {
257
+ if (this._requestsByRegion.get(region)) {
258
+ if (averageIntensity < minIntensity) {
259
+ minIntensity = averageIntensity;
260
+ greenestRegion = region;
261
+ }
262
+ if (averageIntensity > maxIntensity) {
263
+ maxIntensity = averageIntensity;
264
+ dirtiestRegion = region;
265
+ }
266
+ }
267
+ }
268
+ return {
269
+ ...snapshot,
270
+ savingsByRegion,
271
+ treesEquivalent,
272
+ milesDrivenEquivalent,
273
+ greenestRegion,
274
+ dirtiestRegion,
275
+ recommendations: this.generateRecommendations(snapshot, regionsByIntensity),
276
+ };
277
+ }
278
+ /**
279
+ * Reset all metrics
280
+ */
281
+ reset() {
282
+ this._totalRequests = 0;
283
+ this._totalEstimatedCO2Grams = 0;
284
+ this._totalSavingsGrams = 0;
285
+ this._totalIntensitySum = 0;
286
+ this._cacheHits = 0;
287
+ this._cacheMisses = 0;
288
+ this._fallbackCount = 0;
289
+ this._totalFetches = 0;
290
+ this._requestsByRegion.clear();
291
+ this._requestsByProvider.clear();
292
+ this._co2ByRegion.clear();
293
+ this._intensityHistory = [];
294
+ this._periodStart = new Date().toISOString();
295
+ logger.info('Carbon metrics reset');
296
+ }
297
+ /**
298
+ * Calculate CO2 for a request
299
+ */
300
+ calculateCO2(intensityGCO2, tokens) {
301
+ const energyKWh = (tokens / 1000) * ENERGY_PER_1000_TOKENS_KWH;
302
+ return energyKWh * intensityGCO2;
303
+ }
304
+ /**
305
+ * Add entry to intensity history
306
+ */
307
+ addToHistory(entry) {
308
+ this._intensityHistory.push(entry);
309
+ // Trim if over size limit
310
+ if (this._intensityHistory.length > this._historySize) {
311
+ this._intensityHistory = this._intensityHistory.slice(-this._historySize);
312
+ }
313
+ }
314
+ /**
315
+ * Generate sustainability recommendations
316
+ */
317
+ generateRecommendations(snapshot, regionsByIntensity) {
318
+ const recommendations = [];
319
+ // Check green routing percentage
320
+ if (snapshot.greenRoutingPercentage < 50) {
321
+ recommendations.push('Consider relaxing latency constraints to allow more routing to low-carbon regions.');
322
+ }
323
+ // Check if high-carbon regions are being used frequently
324
+ const highCarbonRegions = regionsByIntensity.filter(r => r.averageIntensity > 300);
325
+ for (const { region } of highCarbonRegions) {
326
+ const requests = snapshot.requestsByRegion.get(region) ?? 0;
327
+ if (requests > snapshot.totalRequests * 0.1) {
328
+ recommendations.push(`Region ${region} has high carbon intensity. Consider alternative regions if latency permits.`);
329
+ }
330
+ }
331
+ // Check cache hit rate
332
+ if (snapshot.cacheHitRate < 0.5) {
333
+ recommendations.push('Low cache hit rate detected. Consider increasing cache TTL for carbon intensity data.');
334
+ }
335
+ // Check fallback rate
336
+ if (snapshot.fallbackRate > 0.1) {
337
+ recommendations.push('High fallback rate detected. Check primary carbon data source connectivity.');
338
+ }
339
+ // Recommend greenest regions
340
+ const greenestRegions = regionsByIntensity.slice(0, 3);
341
+ if (greenestRegions.length > 0) {
342
+ const regionNames = greenestRegions.map(r => r.region).join(', ');
343
+ recommendations.push(`Greenest available regions: ${regionNames}. Consider prioritizing these when possible.`);
344
+ }
345
+ return recommendations;
346
+ }
347
+ /**
348
+ * Emit savings calculated event
349
+ */
350
+ emitSavingsEvent(requestId, actualCO2Grams, baselineCO2Grams, savingsGrams) {
351
+ const event = {
352
+ type: 'carbon:savings_calculated',
353
+ timestamp: new Date().toISOString(),
354
+ requestId,
355
+ actualCO2Grams,
356
+ baselineCO2Grams,
357
+ savingsGrams,
358
+ savingsPercentage: baselineCO2Grams > 0 ? (savingsGrams / baselineCO2Grams) * 100 : 0,
359
+ };
360
+ this.emit(event.type, event);
361
+ this.emit('carbon:*', event);
362
+ }
363
+ }
364
+ /**
365
+ * Create a carbon metrics collector
366
+ */
367
+ export function createCarbonMetrics(config) {
368
+ return new CarbonMetrics(config);
369
+ }
370
+ //# sourceMappingURL=carbon-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carbon-metrics.js","sourceRoot":"","sources":["../../src/carbon-aware/carbon-metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
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 { CarbonIntensityClient } from './carbon-intensity-client.js';
11
+ import { CarbonMetrics } from './carbon-metrics.js';
12
+ import type { CarbonRouterConfig, RoutingRequest, RoutingDecision, CloudRegion, AIProvider, CarbonIntensity } from './types.js';
13
+ /**
14
+ * Carbon-Aware Router
15
+ *
16
+ * Intelligently routes AI requests to minimize carbon footprint while
17
+ * respecting performance and cost constraints.
18
+ */
19
+ export declare class CarbonRouter extends EventEmitter {
20
+ private _client;
21
+ private _metrics;
22
+ private _defaultConstraints;
23
+ private _providerAvailability;
24
+ private _regionLatencies;
25
+ private _costMultipliers;
26
+ private _enableMetrics;
27
+ constructor(config?: CarbonRouterConfig);
28
+ /**
29
+ * Get the carbon intensity client
30
+ */
31
+ get client(): CarbonIntensityClient;
32
+ /**
33
+ * Get the metrics collector
34
+ */
35
+ get metrics(): CarbonMetrics;
36
+ /**
37
+ * Route a request to the optimal region based on carbon intensity
38
+ */
39
+ route(request: RoutingRequest): Promise<RoutingDecision>;
40
+ /**
41
+ * Get the best provider for a specific region
42
+ */
43
+ getProviderForRegion(region: CloudRegion, preferredProviders?: AIProvider[]): Promise<AIProvider | undefined>;
44
+ /**
45
+ * Get carbon intensity for all regions
46
+ */
47
+ getRegionIntensities(): Promise<Map<CloudRegion, CarbonIntensity>>;
48
+ /**
49
+ * Get the lowest carbon regions
50
+ */
51
+ getGreenRegions(count?: number): Promise<CarbonIntensity[]>;
52
+ /**
53
+ * Check if a region meets carbon constraints
54
+ */
55
+ isGreenRegion(region: CloudRegion, maxIntensity?: number): Promise<boolean>;
56
+ /**
57
+ * Update provider availability
58
+ */
59
+ updateProviderAvailability(region: CloudRegion, provider: AIProvider, available: boolean): void;
60
+ /**
61
+ * Calculate estimated CO2 for a request
62
+ */
63
+ calculateCO2(intensityGCO2: number, tokens: number): number;
64
+ /**
65
+ * Close the router and release resources
66
+ */
67
+ close(): Promise<void>;
68
+ /**
69
+ * Route to a required region
70
+ */
71
+ private routeToRequired;
72
+ /**
73
+ * Route using fallback when no eligible routes found
74
+ */
75
+ private routeFallback;
76
+ /**
77
+ * Get eligible routes based on constraints
78
+ */
79
+ private getEligibleRoutes;
80
+ /**
81
+ * Determine routing reason
82
+ */
83
+ private determineReason;
84
+ /**
85
+ * Convert eligible route to alternative route format
86
+ */
87
+ private toAlternativeRoute;
88
+ /**
89
+ * Create default provider availability map
90
+ */
91
+ private createDefaultAvailability;
92
+ /**
93
+ * Emit request routed event
94
+ */
95
+ private emitRoutedEvent;
96
+ }
97
+ /**
98
+ * Create a carbon-aware router
99
+ */
100
+ export declare function createCarbonRouter(config?: CarbonRouterConfig): CarbonRouter;
101
+ //# sourceMappingURL=carbon-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carbon-router.d.ts","sourceRoot":"","sources":["../../src/carbon-aware/carbon-router.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,qBAAqB,EAA+B,MAAM,8BAA8B,CAAC;AAClG,OAAO,EAAE,aAAa,EAAuB,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACd,eAAe,EAEf,WAAW,EACX,UAAU,EACV,eAAe,EAKhB,MAAM,YAAY,CAAC;AAmBpB;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,qBAAqB,CAA2C;IACxE,OAAO,CAAC,gBAAgB,CAA2B;IACnD,OAAO,CAAC,gBAAgB,CAA2B;IACnD,OAAO,CAAC,cAAc,CAAU;gBAEpB,MAAM,GAAE,kBAAuB;IAsB3C;;OAEG;IACH,IAAI,MAAM,IAAI,qBAAqB,CAElC;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,aAAa,CAE3B;IAED;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAsE9D;;OAEG;IACG,oBAAoB,CACxB,MAAM,EAAE,WAAW,EACnB,kBAAkB,CAAC,EAAE,UAAU,EAAE,GAChC,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IA0BlC;;OAEG;IACG,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAIxE;;OAEG;IACG,eAAe,CAAC,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAIpE;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMjF;;OAEG;IACH,0BAA0B,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI;IAW/F;;OAEG;IACH,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAO3D;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;OAEG;YACW,eAAe;IAiC7B;;OAEG;YACW,aAAa;IAoC3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsEzB;;OAEG;IACH,OAAO,CAAC,eAAe;IA0BvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAiBjC;;OAEG;IACH,OAAO,CAAC,eAAe;CAexB;AAcD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAE5E"}