@darkiceinteractive/mcp-conductor 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +558 -0
  3. package/dist/bin/cli.d.ts +8 -0
  4. package/dist/bin/cli.d.ts.map +1 -0
  5. package/dist/bin/cli.js +940 -0
  6. package/dist/bin/cli.js.map +1 -0
  7. package/dist/bridge/http-server.d.ts +161 -0
  8. package/dist/bridge/http-server.d.ts.map +1 -0
  9. package/dist/bridge/http-server.js +367 -0
  10. package/dist/bridge/http-server.js.map +1 -0
  11. package/dist/bridge/index.d.ts +5 -0
  12. package/dist/bridge/index.d.ts.map +1 -0
  13. package/dist/bridge/index.js +5 -0
  14. package/dist/bridge/index.js.map +1 -0
  15. package/dist/config/defaults.d.ts +29 -0
  16. package/dist/config/defaults.d.ts.map +1 -0
  17. package/dist/config/defaults.js +60 -0
  18. package/dist/config/defaults.js.map +1 -0
  19. package/dist/config/index.d.ts +7 -0
  20. package/dist/config/index.d.ts.map +1 -0
  21. package/dist/config/index.js +7 -0
  22. package/dist/config/index.js.map +1 -0
  23. package/dist/config/loader.d.ts +49 -0
  24. package/dist/config/loader.d.ts.map +1 -0
  25. package/dist/config/loader.js +272 -0
  26. package/dist/config/loader.js.map +1 -0
  27. package/dist/config/schema.d.ts +93 -0
  28. package/dist/config/schema.d.ts.map +1 -0
  29. package/dist/config/schema.js +5 -0
  30. package/dist/config/schema.js.map +1 -0
  31. package/dist/hub/index.d.ts +5 -0
  32. package/dist/hub/index.d.ts.map +1 -0
  33. package/dist/hub/index.js +5 -0
  34. package/dist/hub/index.js.map +1 -0
  35. package/dist/hub/mcp-hub.d.ts +176 -0
  36. package/dist/hub/mcp-hub.d.ts.map +1 -0
  37. package/dist/hub/mcp-hub.js +550 -0
  38. package/dist/hub/mcp-hub.js.map +1 -0
  39. package/dist/index.d.ts +9 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +45 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/metrics/index.d.ts +5 -0
  44. package/dist/metrics/index.d.ts.map +1 -0
  45. package/dist/metrics/index.js +5 -0
  46. package/dist/metrics/index.js.map +1 -0
  47. package/dist/metrics/metrics-collector.d.ts +211 -0
  48. package/dist/metrics/metrics-collector.d.ts.map +1 -0
  49. package/dist/metrics/metrics-collector.js +437 -0
  50. package/dist/metrics/metrics-collector.js.map +1 -0
  51. package/dist/modes/index.d.ts +5 -0
  52. package/dist/modes/index.d.ts.map +1 -0
  53. package/dist/modes/index.js +5 -0
  54. package/dist/modes/index.js.map +1 -0
  55. package/dist/modes/mode-handler.d.ts +132 -0
  56. package/dist/modes/mode-handler.d.ts.map +1 -0
  57. package/dist/modes/mode-handler.js +252 -0
  58. package/dist/modes/mode-handler.js.map +1 -0
  59. package/dist/runtime/executor.d.ts +57 -0
  60. package/dist/runtime/executor.d.ts.map +1 -0
  61. package/dist/runtime/executor.js +700 -0
  62. package/dist/runtime/executor.js.map +1 -0
  63. package/dist/runtime/index.d.ts +5 -0
  64. package/dist/runtime/index.d.ts.map +1 -0
  65. package/dist/runtime/index.js +5 -0
  66. package/dist/runtime/index.js.map +1 -0
  67. package/dist/server/index.d.ts +5 -0
  68. package/dist/server/index.d.ts.map +1 -0
  69. package/dist/server/index.js +5 -0
  70. package/dist/server/index.js.map +1 -0
  71. package/dist/server/mcp-server.d.ts +62 -0
  72. package/dist/server/mcp-server.d.ts.map +1 -0
  73. package/dist/server/mcp-server.js +1272 -0
  74. package/dist/server/mcp-server.js.map +1 -0
  75. package/dist/skills/index.d.ts +5 -0
  76. package/dist/skills/index.d.ts.map +1 -0
  77. package/dist/skills/index.js +5 -0
  78. package/dist/skills/index.js.map +1 -0
  79. package/dist/skills/skills-engine.d.ts +157 -0
  80. package/dist/skills/skills-engine.d.ts.map +1 -0
  81. package/dist/skills/skills-engine.js +405 -0
  82. package/dist/skills/skills-engine.js.map +1 -0
  83. package/dist/streaming/execution-stream.d.ts +158 -0
  84. package/dist/streaming/execution-stream.d.ts.map +1 -0
  85. package/dist/streaming/execution-stream.js +320 -0
  86. package/dist/streaming/execution-stream.js.map +1 -0
  87. package/dist/streaming/index.d.ts +5 -0
  88. package/dist/streaming/index.d.ts.map +1 -0
  89. package/dist/streaming/index.js +5 -0
  90. package/dist/streaming/index.js.map +1 -0
  91. package/dist/utils/errors.d.ts +36 -0
  92. package/dist/utils/errors.d.ts.map +1 -0
  93. package/dist/utils/errors.js +68 -0
  94. package/dist/utils/errors.js.map +1 -0
  95. package/dist/utils/helpers.d.ts +44 -0
  96. package/dist/utils/helpers.d.ts.map +1 -0
  97. package/dist/utils/helpers.js +95 -0
  98. package/dist/utils/helpers.js.map +1 -0
  99. package/dist/utils/index.d.ts +9 -0
  100. package/dist/utils/index.d.ts.map +1 -0
  101. package/dist/utils/index.js +9 -0
  102. package/dist/utils/index.js.map +1 -0
  103. package/dist/utils/logger.d.ts +13 -0
  104. package/dist/utils/logger.d.ts.map +1 -0
  105. package/dist/utils/logger.js +48 -0
  106. package/dist/utils/logger.js.map +1 -0
  107. package/dist/utils/permissions.d.ts +97 -0
  108. package/dist/utils/permissions.d.ts.map +1 -0
  109. package/dist/utils/permissions.js +165 -0
  110. package/dist/utils/permissions.js.map +1 -0
  111. package/dist/utils/rate-limiter.d.ts +87 -0
  112. package/dist/utils/rate-limiter.d.ts.map +1 -0
  113. package/dist/utils/rate-limiter.js +187 -0
  114. package/dist/utils/rate-limiter.js.map +1 -0
  115. package/dist/watcher/config-watcher.d.ts +67 -0
  116. package/dist/watcher/config-watcher.d.ts.map +1 -0
  117. package/dist/watcher/config-watcher.js +150 -0
  118. package/dist/watcher/config-watcher.js.map +1 -0
  119. package/dist/watcher/index.d.ts +5 -0
  120. package/dist/watcher/index.d.ts.map +1 -0
  121. package/dist/watcher/index.js +5 -0
  122. package/dist/watcher/index.js.map +1 -0
  123. package/package.json +86 -0
  124. package/templates/CLAUDE.md +137 -0
  125. package/templates/skill-mcp-conductor.md +64 -0
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Metrics Collector
3
+ *
4
+ * Comprehensive metrics collection and analysis for MCP Executor.
5
+ * Provides detailed tracking of executions, token savings, and performance.
6
+ */
7
+ import { EventEmitter } from 'node:events';
8
+ import type { MetricsConfig } from '../config/index.js';
9
+ /**
10
+ * Token estimation configuration for different content types
11
+ */
12
+ export interface TokenEstimationConfig {
13
+ /** Chars per token for code content (typically higher density) */
14
+ codeCharsPerToken: number;
15
+ /** Chars per token for JSON content */
16
+ jsonCharsPerToken: number;
17
+ /** Chars per token for natural language */
18
+ textCharsPerToken: number;
19
+ /** Overhead tokens per tool call */
20
+ toolCallOverheadTokens: number;
21
+ /** Tokens per KB of raw data in context */
22
+ tokensPerKb: number;
23
+ }
24
+ /**
25
+ * Single execution metrics
26
+ */
27
+ export interface ExecutionMetrics {
28
+ executionId: string;
29
+ timestamp: Date;
30
+ durationMs: number;
31
+ success: boolean;
32
+ codeTokens: number;
33
+ resultTokens: number;
34
+ toolCalls: number;
35
+ dataProcessedBytes: number;
36
+ resultSizeBytes: number;
37
+ estimatedTokensSaved: number;
38
+ savingsPercent: number;
39
+ mode: 'execution' | 'passthrough';
40
+ serversUsed: string[];
41
+ toolsUsed: string[];
42
+ }
43
+ /**
44
+ * Aggregated session metrics
45
+ */
46
+ export interface SessionMetrics {
47
+ sessionId: string;
48
+ sessionStart: Date;
49
+ lastActivity: Date;
50
+ uptime: number;
51
+ totalExecutions: number;
52
+ successfulExecutions: number;
53
+ failedExecutions: number;
54
+ totalToolCalls: number;
55
+ toolCallsByServer: Record<string, number>;
56
+ toolCallsByTool: Record<string, number>;
57
+ totalDataProcessedBytes: number;
58
+ totalResultBytes: number;
59
+ averageDataPerExecution: number;
60
+ totalCodeTokens: number;
61
+ totalResultTokens: number;
62
+ totalEstimatedDirectTokens: number;
63
+ totalTokensSaved: number;
64
+ averageTokensSaved: number;
65
+ averageSavingsPercent: number;
66
+ totalDurationMs: number;
67
+ averageDurationMs: number;
68
+ minDurationMs: number;
69
+ maxDurationMs: number;
70
+ executionModeCount: number;
71
+ passthroughModeCount: number;
72
+ totalErrors: number;
73
+ errorsByType: Record<string, number>;
74
+ }
75
+ /**
76
+ * Time-windowed metrics for trend analysis
77
+ */
78
+ export interface WindowedMetrics {
79
+ windowStart: Date;
80
+ windowEnd: Date;
81
+ windowDurationMs: number;
82
+ executions: number;
83
+ tokensSaved: number;
84
+ averageDurationMs: number;
85
+ successRate: number;
86
+ }
87
+ /**
88
+ * Metrics Collector class
89
+ */
90
+ export declare class MetricsCollector extends EventEmitter {
91
+ private config;
92
+ private estimationConfig;
93
+ private sessionId;
94
+ private sessionStart;
95
+ private executions;
96
+ private maxStoredExecutions;
97
+ private logPath;
98
+ constructor(config: MetricsConfig, estimationConfig?: Partial<TokenEstimationConfig>);
99
+ /**
100
+ * Generate a unique session ID
101
+ */
102
+ private generateSessionId;
103
+ /**
104
+ * Ensure log directory exists
105
+ */
106
+ private ensureLogDirectory;
107
+ /**
108
+ * Estimate tokens for code content
109
+ */
110
+ estimateCodeTokens(code: string): number;
111
+ /**
112
+ * Estimate tokens for JSON content
113
+ */
114
+ estimateJsonTokens(json: string | unknown): number;
115
+ /**
116
+ * Estimate tokens for general text content
117
+ */
118
+ estimateTextTokens(text: string): number;
119
+ /**
120
+ * Estimate tokens from byte size
121
+ */
122
+ estimateTokensFromBytes(bytes: number): number;
123
+ /**
124
+ * Estimate tokens that would be used in passthrough mode
125
+ */
126
+ estimatePassthroughTokens(toolCalls: number, dataBytes: number): number;
127
+ /**
128
+ * Calculate token savings from execution mode
129
+ */
130
+ calculateTokenSavings(params: {
131
+ codeTokens: number;
132
+ resultTokens: number;
133
+ toolCalls: number;
134
+ dataProcessedBytes: number;
135
+ }): {
136
+ tokensSaved: number;
137
+ savingsPercent: number;
138
+ };
139
+ /**
140
+ * Record an execution
141
+ */
142
+ recordExecution(params: {
143
+ executionId: string;
144
+ code: string;
145
+ result: unknown;
146
+ success: boolean;
147
+ durationMs: number;
148
+ toolCalls: number;
149
+ dataProcessedBytes: number;
150
+ resultSizeBytes: number;
151
+ mode: 'execution' | 'passthrough';
152
+ serversUsed?: string[];
153
+ toolsUsed?: string[];
154
+ errorType?: string;
155
+ }): ExecutionMetrics;
156
+ /**
157
+ * Log metrics to file
158
+ */
159
+ private logToFile;
160
+ /**
161
+ * Get aggregated session metrics
162
+ */
163
+ getSessionMetrics(): SessionMetrics;
164
+ /**
165
+ * Get windowed metrics for trend analysis
166
+ */
167
+ getWindowedMetrics(windowMs?: number): WindowedMetrics[];
168
+ /**
169
+ * Get recent executions
170
+ */
171
+ getRecentExecutions(limit?: number): ExecutionMetrics[];
172
+ /**
173
+ * Get top servers by usage
174
+ */
175
+ getTopServers(limit?: number): Array<{
176
+ server: string;
177
+ calls: number;
178
+ }>;
179
+ /**
180
+ * Get top tools by usage
181
+ */
182
+ getTopTools(limit?: number): Array<{
183
+ tool: string;
184
+ calls: number;
185
+ }>;
186
+ /**
187
+ * Export metrics to JSON
188
+ */
189
+ exportToJson(): string;
190
+ /**
191
+ * Save metrics snapshot to file
192
+ */
193
+ saveSnapshot(path: string): void;
194
+ /**
195
+ * Reset all metrics
196
+ */
197
+ reset(): void;
198
+ /**
199
+ * Check if metrics collection is enabled
200
+ */
201
+ isEnabled(): boolean;
202
+ }
203
+ /**
204
+ * Get or create the global metrics collector
205
+ */
206
+ export declare function getMetricsCollector(config?: MetricsConfig): MetricsCollector;
207
+ /**
208
+ * Shutdown the global metrics collector
209
+ */
210
+ export declare function shutdownMetricsCollector(): void;
211
+ //# sourceMappingURL=metrics-collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-collector.d.ts","sourceRoot":"","sources":["../../src/metrics/metrics-collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,437 @@
1
+ /**
2
+ * Metrics Collector
3
+ *
4
+ * Comprehensive metrics collection and analysis for MCP Executor.
5
+ * Provides detailed tracking of executions, token savings, and performance.
6
+ */
7
+ import { EventEmitter } from 'node:events';
8
+ import { appendFileSync, existsSync, mkdirSync, writeFileSync } from 'node:fs';
9
+ import { dirname } from 'node:path';
10
+ import { logger } from '../utils/index.js';
11
+ /**
12
+ * Metrics Collector class
13
+ */
14
+ export class MetricsCollector extends EventEmitter {
15
+ config;
16
+ estimationConfig;
17
+ sessionId;
18
+ sessionStart;
19
+ executions = [];
20
+ maxStoredExecutions = 1000;
21
+ logPath = null;
22
+ constructor(config, estimationConfig) {
23
+ super();
24
+ this.config = config;
25
+ this.sessionId = this.generateSessionId();
26
+ this.sessionStart = new Date();
27
+ // Default token estimation config - tuned for Claude's tokenizer
28
+ this.estimationConfig = {
29
+ codeCharsPerToken: 3.5, // Code is denser
30
+ jsonCharsPerToken: 3.8, // JSON has structure overhead
31
+ textCharsPerToken: 4.0, // Natural language average
32
+ toolCallOverheadTokens: 150, // Request + response overhead per call
33
+ tokensPerKb: 256, // ~4 bytes per token
34
+ ...estimationConfig,
35
+ };
36
+ // Set up file logging if enabled
37
+ if (config.logToFile && config.logPath) {
38
+ this.logPath = config.logPath;
39
+ this.ensureLogDirectory();
40
+ }
41
+ }
42
+ /**
43
+ * Generate a unique session ID
44
+ */
45
+ generateSessionId() {
46
+ return `session_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
47
+ }
48
+ /**
49
+ * Ensure log directory exists
50
+ */
51
+ ensureLogDirectory() {
52
+ if (this.logPath) {
53
+ const dir = dirname(this.logPath);
54
+ if (!existsSync(dir)) {
55
+ mkdirSync(dir, { recursive: true });
56
+ }
57
+ }
58
+ }
59
+ /**
60
+ * Estimate tokens for code content
61
+ */
62
+ estimateCodeTokens(code) {
63
+ if (!code)
64
+ return 0;
65
+ // Account for common code patterns that affect tokenization
66
+ let adjustedLength = code.length;
67
+ // Count special constructs that typically become single tokens
68
+ const singleTokenPatterns = [
69
+ /\b(const|let|var|function|async|await|return|import|export|class|interface|type)\b/g,
70
+ /[{}[\]()]/g, // Brackets often become single tokens
71
+ /\s+/g, // Whitespace is often compressed
72
+ ];
73
+ for (const pattern of singleTokenPatterns) {
74
+ const matches = code.match(pattern);
75
+ if (matches) {
76
+ // These are typically 1 token regardless of exact character count
77
+ adjustedLength -= matches.reduce((sum, m) => sum + m.length - 1, 0);
78
+ }
79
+ }
80
+ return Math.ceil(adjustedLength / this.estimationConfig.codeCharsPerToken);
81
+ }
82
+ /**
83
+ * Estimate tokens for JSON content
84
+ */
85
+ estimateJsonTokens(json) {
86
+ const str = typeof json === 'string' ? json : JSON.stringify(json);
87
+ if (!str)
88
+ return 0;
89
+ // JSON has structural overhead - keys, quotes, brackets
90
+ let adjustedLength = str.length;
91
+ // Account for string keys being tokenized as units
92
+ const keyMatches = str.match(/"[^"]+"\s*:/g);
93
+ if (keyMatches) {
94
+ // Keys are often 1-2 tokens
95
+ adjustedLength -= keyMatches.reduce((sum, k) => sum + Math.max(0, k.length - 4), 0);
96
+ }
97
+ return Math.ceil(adjustedLength / this.estimationConfig.jsonCharsPerToken);
98
+ }
99
+ /**
100
+ * Estimate tokens for general text content
101
+ */
102
+ estimateTextTokens(text) {
103
+ if (!text)
104
+ return 0;
105
+ // Count words as a cross-check (average ~1.3 tokens per word)
106
+ const words = text.split(/\s+/).filter(w => w.length > 0).length;
107
+ const charBasedEstimate = Math.ceil(text.length / this.estimationConfig.textCharsPerToken);
108
+ const wordBasedEstimate = Math.ceil(words * 1.3);
109
+ // Use the average of both methods
110
+ return Math.ceil((charBasedEstimate + wordBasedEstimate) / 2);
111
+ }
112
+ /**
113
+ * Estimate tokens from byte size
114
+ */
115
+ estimateTokensFromBytes(bytes) {
116
+ return Math.ceil(bytes / 4);
117
+ }
118
+ /**
119
+ * Estimate tokens that would be used in passthrough mode
120
+ */
121
+ estimatePassthroughTokens(toolCalls, dataBytes) {
122
+ const overhead = toolCalls * this.estimationConfig.toolCallOverheadTokens;
123
+ const dataTokens = dataBytes / 1024 * this.estimationConfig.tokensPerKb;
124
+ return Math.ceil(overhead + dataTokens);
125
+ }
126
+ /**
127
+ * Calculate token savings from execution mode
128
+ */
129
+ calculateTokenSavings(params) {
130
+ const { codeTokens, resultTokens, toolCalls, dataProcessedBytes } = params;
131
+ // What execution mode actually used
132
+ const executionModeTokens = codeTokens + resultTokens;
133
+ // What passthrough mode would have used
134
+ const passthroughModeTokens = this.estimatePassthroughTokens(toolCalls, dataProcessedBytes);
135
+ // Calculate savings
136
+ const tokensSaved = Math.max(0, passthroughModeTokens - executionModeTokens);
137
+ const savingsPercent = passthroughModeTokens > 0
138
+ ? Math.round((tokensSaved / passthroughModeTokens) * 100)
139
+ : 0;
140
+ return { tokensSaved, savingsPercent };
141
+ }
142
+ /**
143
+ * Record an execution
144
+ */
145
+ recordExecution(params) {
146
+ const { executionId, code, result, success, durationMs, toolCalls, dataProcessedBytes, resultSizeBytes, mode, serversUsed = [], toolsUsed = [], errorType, } = params;
147
+ // Calculate token usage
148
+ const codeTokens = this.estimateCodeTokens(code);
149
+ const resultTokens = result ? this.estimateJsonTokens(result) : 0;
150
+ // Calculate savings (only meaningful for execution mode)
151
+ const savings = mode === 'execution'
152
+ ? this.calculateTokenSavings({ codeTokens, resultTokens, toolCalls, dataProcessedBytes })
153
+ : { tokensSaved: 0, savingsPercent: 0 };
154
+ const metrics = {
155
+ executionId,
156
+ timestamp: new Date(),
157
+ durationMs,
158
+ success,
159
+ codeTokens,
160
+ resultTokens,
161
+ toolCalls,
162
+ dataProcessedBytes,
163
+ resultSizeBytes,
164
+ estimatedTokensSaved: savings.tokensSaved,
165
+ savingsPercent: savings.savingsPercent,
166
+ mode,
167
+ serversUsed,
168
+ toolsUsed,
169
+ };
170
+ // Store execution
171
+ this.executions.push(metrics);
172
+ // Trim old executions if needed
173
+ if (this.executions.length > this.maxStoredExecutions) {
174
+ this.executions = this.executions.slice(-this.maxStoredExecutions);
175
+ }
176
+ // Emit event
177
+ this.emit('execution', metrics);
178
+ // Log to file if enabled
179
+ if (this.config.logToFile && this.logPath) {
180
+ this.logToFile(metrics, errorType);
181
+ }
182
+ logger.debug('Execution recorded', {
183
+ executionId,
184
+ tokensSaved: savings.tokensSaved,
185
+ savingsPercent: savings.savingsPercent,
186
+ mode,
187
+ });
188
+ return metrics;
189
+ }
190
+ /**
191
+ * Log metrics to file
192
+ */
193
+ logToFile(metrics, errorType) {
194
+ if (!this.logPath)
195
+ return;
196
+ const logEntry = {
197
+ ...metrics,
198
+ errorType,
199
+ timestamp: metrics.timestamp.toISOString(),
200
+ };
201
+ const line = JSON.stringify(logEntry) + '\n';
202
+ try {
203
+ appendFileSync(this.logPath, line);
204
+ }
205
+ catch (error) {
206
+ logger.error('Failed to write metrics to file', { error, path: this.logPath });
207
+ }
208
+ }
209
+ /**
210
+ * Get aggregated session metrics
211
+ */
212
+ getSessionMetrics() {
213
+ const now = new Date();
214
+ const uptime = now.getTime() - this.sessionStart.getTime();
215
+ // Initialize aggregates
216
+ const toolCallsByServer = {};
217
+ const toolCallsByTool = {};
218
+ const errorsByType = {};
219
+ let totalDataProcessedBytes = 0;
220
+ let totalResultBytes = 0;
221
+ let totalCodeTokens = 0;
222
+ let totalResultTokens = 0;
223
+ let totalTokensSaved = 0;
224
+ let totalDurationMs = 0;
225
+ let minDurationMs = Number.MAX_SAFE_INTEGER;
226
+ let maxDurationMs = 0;
227
+ let successfulExecutions = 0;
228
+ let failedExecutions = 0;
229
+ let totalToolCalls = 0;
230
+ let executionModeCount = 0;
231
+ let passthroughModeCount = 0;
232
+ let totalErrors = 0;
233
+ let totalSavingsPercent = 0;
234
+ let lastActivity = this.sessionStart;
235
+ for (const exec of this.executions) {
236
+ // Update last activity
237
+ if (exec.timestamp > lastActivity) {
238
+ lastActivity = exec.timestamp;
239
+ }
240
+ // Count successes/failures
241
+ if (exec.success) {
242
+ successfulExecutions++;
243
+ }
244
+ else {
245
+ failedExecutions++;
246
+ totalErrors++;
247
+ }
248
+ // Aggregate data
249
+ totalDataProcessedBytes += exec.dataProcessedBytes;
250
+ totalResultBytes += exec.resultSizeBytes;
251
+ totalCodeTokens += exec.codeTokens;
252
+ totalResultTokens += exec.resultTokens;
253
+ totalTokensSaved += exec.estimatedTokensSaved;
254
+ totalDurationMs += exec.durationMs;
255
+ totalSavingsPercent += exec.savingsPercent;
256
+ // Duration tracking
257
+ if (exec.durationMs < minDurationMs)
258
+ minDurationMs = exec.durationMs;
259
+ if (exec.durationMs > maxDurationMs)
260
+ maxDurationMs = exec.durationMs;
261
+ // Tool call tracking
262
+ totalToolCalls += exec.toolCalls;
263
+ // Count unique servers used per execution
264
+ const uniqueServers = new Set(exec.serversUsed);
265
+ for (const server of uniqueServers) {
266
+ toolCallsByServer[server] = (toolCallsByServer[server] || 0) + 1;
267
+ }
268
+ // Count unique tools used per execution
269
+ const uniqueTools = new Set(exec.toolsUsed);
270
+ for (const tool of uniqueTools) {
271
+ toolCallsByTool[tool] = (toolCallsByTool[tool] || 0) + 1;
272
+ }
273
+ // Mode tracking
274
+ if (exec.mode === 'execution') {
275
+ executionModeCount++;
276
+ }
277
+ else {
278
+ passthroughModeCount++;
279
+ }
280
+ }
281
+ const totalExecutions = this.executions.length;
282
+ const avgDuration = totalExecutions > 0 ? totalDurationMs / totalExecutions : 0;
283
+ const avgTokensSaved = totalExecutions > 0 ? totalTokensSaved / totalExecutions : 0;
284
+ const avgSavingsPercent = totalExecutions > 0 ? totalSavingsPercent / totalExecutions : 0;
285
+ const avgDataPerExecution = totalExecutions > 0 ? totalDataProcessedBytes / totalExecutions : 0;
286
+ // Estimate what direct mode would have used
287
+ const totalEstimatedDirectTokens = this.executions.reduce((sum, exec) => {
288
+ return sum + this.estimatePassthroughTokens(exec.toolCalls, exec.dataProcessedBytes);
289
+ }, 0);
290
+ return {
291
+ sessionId: this.sessionId,
292
+ sessionStart: this.sessionStart,
293
+ lastActivity,
294
+ uptime,
295
+ totalExecutions,
296
+ successfulExecutions,
297
+ failedExecutions,
298
+ totalToolCalls,
299
+ toolCallsByServer,
300
+ toolCallsByTool,
301
+ totalDataProcessedBytes,
302
+ totalResultBytes,
303
+ averageDataPerExecution: avgDataPerExecution,
304
+ totalCodeTokens,
305
+ totalResultTokens,
306
+ totalEstimatedDirectTokens,
307
+ totalTokensSaved,
308
+ averageTokensSaved: avgTokensSaved,
309
+ averageSavingsPercent: avgSavingsPercent,
310
+ totalDurationMs,
311
+ averageDurationMs: avgDuration,
312
+ minDurationMs: totalExecutions > 0 ? minDurationMs : 0,
313
+ maxDurationMs,
314
+ executionModeCount,
315
+ passthroughModeCount,
316
+ totalErrors,
317
+ errorsByType,
318
+ };
319
+ }
320
+ /**
321
+ * Get windowed metrics for trend analysis
322
+ */
323
+ getWindowedMetrics(windowMs = 60000) {
324
+ if (this.executions.length === 0)
325
+ return [];
326
+ const windows = [];
327
+ const now = new Date();
328
+ // Group executions by time window
329
+ const windowGroups = new Map();
330
+ for (const exec of this.executions) {
331
+ const windowKey = Math.floor(exec.timestamp.getTime() / windowMs) * windowMs;
332
+ if (!windowGroups.has(windowKey)) {
333
+ windowGroups.set(windowKey, []);
334
+ }
335
+ windowGroups.get(windowKey).push(exec);
336
+ }
337
+ // Calculate metrics for each window
338
+ for (const [windowStart, execs] of windowGroups.entries()) {
339
+ const tokensSaved = execs.reduce((sum, e) => sum + e.estimatedTokensSaved, 0);
340
+ const totalDuration = execs.reduce((sum, e) => sum + e.durationMs, 0);
341
+ const successCount = execs.filter(e => e.success).length;
342
+ windows.push({
343
+ windowStart: new Date(windowStart),
344
+ windowEnd: new Date(windowStart + windowMs),
345
+ windowDurationMs: windowMs,
346
+ executions: execs.length,
347
+ tokensSaved,
348
+ averageDurationMs: execs.length > 0 ? totalDuration / execs.length : 0,
349
+ successRate: execs.length > 0 ? (successCount / execs.length) * 100 : 0,
350
+ });
351
+ }
352
+ return windows.sort((a, b) => a.windowStart.getTime() - b.windowStart.getTime());
353
+ }
354
+ /**
355
+ * Get recent executions
356
+ */
357
+ getRecentExecutions(limit = 10) {
358
+ return this.executions.slice(-limit);
359
+ }
360
+ /**
361
+ * Get top servers by usage
362
+ */
363
+ getTopServers(limit = 5) {
364
+ const metrics = this.getSessionMetrics();
365
+ return Object.entries(metrics.toolCallsByServer)
366
+ .map(([server, calls]) => ({ server, calls }))
367
+ .sort((a, b) => b.calls - a.calls)
368
+ .slice(0, limit);
369
+ }
370
+ /**
371
+ * Get top tools by usage
372
+ */
373
+ getTopTools(limit = 5) {
374
+ const metrics = this.getSessionMetrics();
375
+ return Object.entries(metrics.toolCallsByTool)
376
+ .map(([tool, calls]) => ({ tool, calls }))
377
+ .sort((a, b) => b.calls - a.calls)
378
+ .slice(0, limit);
379
+ }
380
+ /**
381
+ * Export metrics to JSON
382
+ */
383
+ exportToJson() {
384
+ return JSON.stringify({
385
+ session: this.getSessionMetrics(),
386
+ executions: this.executions,
387
+ windowedMetrics: this.getWindowedMetrics(),
388
+ }, null, 2);
389
+ }
390
+ /**
391
+ * Save metrics snapshot to file
392
+ */
393
+ saveSnapshot(path) {
394
+ const data = this.exportToJson();
395
+ writeFileSync(path, data);
396
+ logger.info('Metrics snapshot saved', { path });
397
+ }
398
+ /**
399
+ * Reset all metrics
400
+ */
401
+ reset() {
402
+ this.sessionId = this.generateSessionId();
403
+ this.sessionStart = new Date();
404
+ this.executions = [];
405
+ this.emit('reset');
406
+ }
407
+ /**
408
+ * Check if metrics collection is enabled
409
+ */
410
+ isEnabled() {
411
+ return this.config.enabled;
412
+ }
413
+ }
414
+ // Global metrics collector instance
415
+ let globalMetricsCollector = null;
416
+ /**
417
+ * Get or create the global metrics collector
418
+ */
419
+ export function getMetricsCollector(config) {
420
+ if (!globalMetricsCollector && !config) {
421
+ throw new Error('Metrics collector not initialised. Provide config on first call.');
422
+ }
423
+ if (!globalMetricsCollector && config) {
424
+ globalMetricsCollector = new MetricsCollector(config);
425
+ }
426
+ return globalMetricsCollector;
427
+ }
428
+ /**
429
+ * Shutdown the global metrics collector
430
+ */
431
+ export function shutdownMetricsCollector() {
432
+ if (globalMetricsCollector) {
433
+ globalMetricsCollector.removeAllListeners();
434
+ globalMetricsCollector = null;
435
+ }
436
+ }
437
+ //# sourceMappingURL=metrics-collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-collector.js","sourceRoot":"","sources":["../../src/metrics/metrics-collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Modes module exports
3
+ */
4
+ export { ModeHandler, getModeHandler, shutdownModeHandler, type ModeMetrics, type PassthroughToolCall, type HybridDecision, type ModeHandlerConfig, } from './mode-handler.js';
5
+ //# sourceMappingURL=index.d.ts.map