@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.
- package/LICENSE +21 -0
- package/README.md +558 -0
- package/dist/bin/cli.d.ts +8 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +940 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/bridge/http-server.d.ts +161 -0
- package/dist/bridge/http-server.d.ts.map +1 -0
- package/dist/bridge/http-server.js +367 -0
- package/dist/bridge/http-server.js.map +1 -0
- package/dist/bridge/index.d.ts +5 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/index.js +5 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/config/defaults.d.ts +29 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +60 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +7 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +49 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +272 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +93 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +5 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/hub/index.d.ts +5 -0
- package/dist/hub/index.d.ts.map +1 -0
- package/dist/hub/index.js +5 -0
- package/dist/hub/index.js.map +1 -0
- package/dist/hub/mcp-hub.d.ts +176 -0
- package/dist/hub/mcp-hub.d.ts.map +1 -0
- package/dist/hub/mcp-hub.js +550 -0
- package/dist/hub/mcp-hub.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics/index.d.ts +5 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +5 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/metrics-collector.d.ts +211 -0
- package/dist/metrics/metrics-collector.d.ts.map +1 -0
- package/dist/metrics/metrics-collector.js +437 -0
- package/dist/metrics/metrics-collector.js.map +1 -0
- package/dist/modes/index.d.ts +5 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +5 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/mode-handler.d.ts +132 -0
- package/dist/modes/mode-handler.d.ts.map +1 -0
- package/dist/modes/mode-handler.js +252 -0
- package/dist/modes/mode-handler.js.map +1 -0
- package/dist/runtime/executor.d.ts +57 -0
- package/dist/runtime/executor.d.ts.map +1 -0
- package/dist/runtime/executor.js +700 -0
- package/dist/runtime/executor.js.map +1 -0
- package/dist/runtime/index.d.ts +5 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +5 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/server/index.d.ts +5 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +5 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/mcp-server.d.ts +62 -0
- package/dist/server/mcp-server.d.ts.map +1 -0
- package/dist/server/mcp-server.js +1272 -0
- package/dist/server/mcp-server.js.map +1 -0
- package/dist/skills/index.d.ts +5 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +5 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/skills-engine.d.ts +157 -0
- package/dist/skills/skills-engine.d.ts.map +1 -0
- package/dist/skills/skills-engine.js +405 -0
- package/dist/skills/skills-engine.js.map +1 -0
- package/dist/streaming/execution-stream.d.ts +158 -0
- package/dist/streaming/execution-stream.d.ts.map +1 -0
- package/dist/streaming/execution-stream.js +320 -0
- package/dist/streaming/execution-stream.js.map +1 -0
- package/dist/streaming/index.d.ts +5 -0
- package/dist/streaming/index.d.ts.map +1 -0
- package/dist/streaming/index.js +5 -0
- package/dist/streaming/index.js.map +1 -0
- package/dist/utils/errors.d.ts +36 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +68 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/helpers.d.ts +44 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +95 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +48 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/permissions.d.ts +97 -0
- package/dist/utils/permissions.d.ts.map +1 -0
- package/dist/utils/permissions.js +165 -0
- package/dist/utils/permissions.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +87 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +187 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/watcher/config-watcher.d.ts +67 -0
- package/dist/watcher/config-watcher.d.ts.map +1 -0
- package/dist/watcher/config-watcher.js +150 -0
- package/dist/watcher/config-watcher.js.map +1 -0
- package/dist/watcher/index.d.ts +5 -0
- package/dist/watcher/index.d.ts.map +1 -0
- package/dist/watcher/index.js +5 -0
- package/dist/watcher/index.js.map +1 -0
- package/package.json +86 -0
- package/templates/CLAUDE.md +137 -0
- package/templates/skill-mcp-conductor.md +64 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/modes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/modes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,cAAc,EACd,mBAAmB,GAKpB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mode Handler
|
|
3
|
+
*
|
|
4
|
+
* Manages operation modes for the MCP Executor:
|
|
5
|
+
* - execution: All requests go through code execution (maximum token savings)
|
|
6
|
+
* - passthrough: Direct tool exposure from connected MCP servers
|
|
7
|
+
* - hybrid: Automatic selection based on task complexity
|
|
8
|
+
*/
|
|
9
|
+
import { EventEmitter } from 'node:events';
|
|
10
|
+
import type { ExecutionMode } from '../config/index.js';
|
|
11
|
+
export interface ModeMetrics {
|
|
12
|
+
executionCalls: number;
|
|
13
|
+
passthroughCalls: number;
|
|
14
|
+
hybridAutoExecutions: number;
|
|
15
|
+
hybridAutoPassthroughs: number;
|
|
16
|
+
tokensSavedEstimate: number;
|
|
17
|
+
}
|
|
18
|
+
export interface PassthroughToolCall {
|
|
19
|
+
server: string;
|
|
20
|
+
tool: string;
|
|
21
|
+
params: Record<string, unknown>;
|
|
22
|
+
timestamp: Date;
|
|
23
|
+
durationMs?: number;
|
|
24
|
+
success: boolean;
|
|
25
|
+
error?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface HybridDecision {
|
|
28
|
+
task: string;
|
|
29
|
+
decision: 'execution' | 'passthrough';
|
|
30
|
+
reason: string;
|
|
31
|
+
confidence: number;
|
|
32
|
+
}
|
|
33
|
+
export interface ModeHandlerConfig {
|
|
34
|
+
/** Default operation mode */
|
|
35
|
+
defaultMode: ExecutionMode;
|
|
36
|
+
/** Hybrid mode threshold - tool calls above this use execution mode */
|
|
37
|
+
hybridToolCallThreshold: number;
|
|
38
|
+
/** Hybrid mode threshold - data above this KB uses execution mode */
|
|
39
|
+
hybridDataThreshold: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Handles operation mode logic and tracking
|
|
43
|
+
*/
|
|
44
|
+
export declare class ModeHandler extends EventEmitter {
|
|
45
|
+
private currentMode;
|
|
46
|
+
private config;
|
|
47
|
+
private metrics;
|
|
48
|
+
private recentPassthroughCalls;
|
|
49
|
+
private maxRecentCalls;
|
|
50
|
+
constructor(config?: Partial<ModeHandlerConfig>);
|
|
51
|
+
/**
|
|
52
|
+
* Get current operation mode
|
|
53
|
+
*/
|
|
54
|
+
getMode(): ExecutionMode;
|
|
55
|
+
/**
|
|
56
|
+
* Set operation mode
|
|
57
|
+
*/
|
|
58
|
+
setMode(mode: ExecutionMode): ExecutionMode;
|
|
59
|
+
/**
|
|
60
|
+
* Check if passthrough mode is active
|
|
61
|
+
*/
|
|
62
|
+
isPassthroughMode(): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Check if execution mode is active
|
|
65
|
+
*/
|
|
66
|
+
isExecutionMode(): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Check if hybrid mode is active
|
|
69
|
+
*/
|
|
70
|
+
isHybridMode(): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Decide which mode to use for a task (hybrid mode logic)
|
|
73
|
+
*/
|
|
74
|
+
decideMode(task: {
|
|
75
|
+
description?: string;
|
|
76
|
+
estimatedToolCalls?: number;
|
|
77
|
+
estimatedDataKb?: number;
|
|
78
|
+
toolNames?: string[];
|
|
79
|
+
}): HybridDecision;
|
|
80
|
+
/**
|
|
81
|
+
* Check if description contains data processing keywords
|
|
82
|
+
*/
|
|
83
|
+
private containsProcessingKeywords;
|
|
84
|
+
/**
|
|
85
|
+
* Record an execution mode call
|
|
86
|
+
*/
|
|
87
|
+
recordExecutionCall(tokensSaved?: number): void;
|
|
88
|
+
/**
|
|
89
|
+
* Record a passthrough mode call
|
|
90
|
+
*/
|
|
91
|
+
recordPassthroughCall(call: Omit<PassthroughToolCall, 'timestamp'>): void;
|
|
92
|
+
/**
|
|
93
|
+
* Get mode metrics
|
|
94
|
+
*/
|
|
95
|
+
getMetrics(): ModeMetrics;
|
|
96
|
+
/**
|
|
97
|
+
* Reset metrics
|
|
98
|
+
*/
|
|
99
|
+
resetMetrics(): void;
|
|
100
|
+
/**
|
|
101
|
+
* Get recent passthrough calls
|
|
102
|
+
*/
|
|
103
|
+
getRecentPassthroughCalls(): PassthroughToolCall[];
|
|
104
|
+
/**
|
|
105
|
+
* Generate tool prefix for passthrough mode
|
|
106
|
+
*/
|
|
107
|
+
generatePassthroughToolName(serverName: string, toolName: string): string;
|
|
108
|
+
/**
|
|
109
|
+
* Parse a passthrough tool name back to server and tool
|
|
110
|
+
*/
|
|
111
|
+
parsePassthroughToolName(combinedName: string): {
|
|
112
|
+
server: string;
|
|
113
|
+
tool: string;
|
|
114
|
+
} | null;
|
|
115
|
+
/**
|
|
116
|
+
* Get effective mode for a request (handles hybrid auto-selection)
|
|
117
|
+
*/
|
|
118
|
+
getEffectiveMode(task?: {
|
|
119
|
+
description?: string;
|
|
120
|
+
estimatedToolCalls?: number;
|
|
121
|
+
estimatedDataKb?: number;
|
|
122
|
+
}): 'execution' | 'passthrough';
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get or create the global mode handler
|
|
126
|
+
*/
|
|
127
|
+
export declare function getModeHandler(config?: Partial<ModeHandlerConfig>): ModeHandler;
|
|
128
|
+
/**
|
|
129
|
+
* Shutdown the global mode handler
|
|
130
|
+
*/
|
|
131
|
+
export declare function shutdownModeHandler(): void;
|
|
132
|
+
//# sourceMappingURL=mode-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode-handler.d.ts","sourceRoot":"","sources":["../../src/modes/mode-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mode Handler
|
|
3
|
+
*
|
|
4
|
+
* Manages operation modes for the MCP Executor:
|
|
5
|
+
* - execution: All requests go through code execution (maximum token savings)
|
|
6
|
+
* - passthrough: Direct tool exposure from connected MCP servers
|
|
7
|
+
* - hybrid: Automatic selection based on task complexity
|
|
8
|
+
*/
|
|
9
|
+
import { EventEmitter } from 'node:events';
|
|
10
|
+
import { logger } from '../utils/index.js';
|
|
11
|
+
/**
|
|
12
|
+
* Handles operation mode logic and tracking
|
|
13
|
+
*/
|
|
14
|
+
export class ModeHandler extends EventEmitter {
|
|
15
|
+
currentMode;
|
|
16
|
+
config;
|
|
17
|
+
metrics;
|
|
18
|
+
recentPassthroughCalls = [];
|
|
19
|
+
maxRecentCalls = 100;
|
|
20
|
+
constructor(config = {}) {
|
|
21
|
+
super();
|
|
22
|
+
this.config = {
|
|
23
|
+
defaultMode: 'execution',
|
|
24
|
+
hybridToolCallThreshold: 3,
|
|
25
|
+
hybridDataThreshold: 5,
|
|
26
|
+
...config,
|
|
27
|
+
};
|
|
28
|
+
this.currentMode = this.config.defaultMode;
|
|
29
|
+
this.metrics = {
|
|
30
|
+
executionCalls: 0,
|
|
31
|
+
passthroughCalls: 0,
|
|
32
|
+
hybridAutoExecutions: 0,
|
|
33
|
+
hybridAutoPassthroughs: 0,
|
|
34
|
+
tokensSavedEstimate: 0,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get current operation mode
|
|
39
|
+
*/
|
|
40
|
+
getMode() {
|
|
41
|
+
return this.currentMode;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Set operation mode
|
|
45
|
+
*/
|
|
46
|
+
setMode(mode) {
|
|
47
|
+
const previousMode = this.currentMode;
|
|
48
|
+
this.currentMode = mode;
|
|
49
|
+
if (previousMode !== mode) {
|
|
50
|
+
logger.info('Operation mode changed', { from: previousMode, to: mode });
|
|
51
|
+
this.emit('modeChanged', { previousMode, currentMode: mode });
|
|
52
|
+
}
|
|
53
|
+
return previousMode;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Check if passthrough mode is active
|
|
57
|
+
*/
|
|
58
|
+
isPassthroughMode() {
|
|
59
|
+
return this.currentMode === 'passthrough';
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Check if execution mode is active
|
|
63
|
+
*/
|
|
64
|
+
isExecutionMode() {
|
|
65
|
+
return this.currentMode === 'execution';
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Check if hybrid mode is active
|
|
69
|
+
*/
|
|
70
|
+
isHybridMode() {
|
|
71
|
+
return this.currentMode === 'hybrid';
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Decide which mode to use for a task (hybrid mode logic)
|
|
75
|
+
*/
|
|
76
|
+
decideMode(task) {
|
|
77
|
+
const { estimatedToolCalls = 1, estimatedDataKb = 0, description = '' } = task;
|
|
78
|
+
// Simple heuristics for hybrid mode
|
|
79
|
+
let decision = 'passthrough';
|
|
80
|
+
let reason = '';
|
|
81
|
+
let confidence = 0.5;
|
|
82
|
+
// Check tool call count
|
|
83
|
+
if (estimatedToolCalls > this.config.hybridToolCallThreshold) {
|
|
84
|
+
decision = 'execution';
|
|
85
|
+
reason = `Multiple tool calls expected (${estimatedToolCalls})`;
|
|
86
|
+
confidence = 0.8;
|
|
87
|
+
}
|
|
88
|
+
// Check data volume
|
|
89
|
+
else if (estimatedDataKb > this.config.hybridDataThreshold) {
|
|
90
|
+
decision = 'execution';
|
|
91
|
+
reason = `Large data volume expected (${estimatedDataKb}KB)`;
|
|
92
|
+
confidence = 0.75;
|
|
93
|
+
}
|
|
94
|
+
// Check for data processing keywords
|
|
95
|
+
else if (this.containsProcessingKeywords(description)) {
|
|
96
|
+
decision = 'execution';
|
|
97
|
+
reason = 'Task involves data processing';
|
|
98
|
+
confidence = 0.7;
|
|
99
|
+
}
|
|
100
|
+
// Default to passthrough for simple tasks
|
|
101
|
+
else {
|
|
102
|
+
decision = 'passthrough';
|
|
103
|
+
reason = 'Simple task suitable for direct tool calls';
|
|
104
|
+
confidence = 0.6;
|
|
105
|
+
}
|
|
106
|
+
// Update metrics
|
|
107
|
+
if (decision === 'execution') {
|
|
108
|
+
this.metrics.hybridAutoExecutions++;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
this.metrics.hybridAutoPassthroughs++;
|
|
112
|
+
}
|
|
113
|
+
const result = {
|
|
114
|
+
task: description || 'Unknown task',
|
|
115
|
+
decision,
|
|
116
|
+
reason,
|
|
117
|
+
confidence,
|
|
118
|
+
};
|
|
119
|
+
this.emit('hybridDecision', result);
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Check if description contains data processing keywords
|
|
124
|
+
*/
|
|
125
|
+
containsProcessingKeywords(description) {
|
|
126
|
+
const keywords = [
|
|
127
|
+
'filter',
|
|
128
|
+
'aggregate',
|
|
129
|
+
'summarise',
|
|
130
|
+
'summarize',
|
|
131
|
+
'analyse',
|
|
132
|
+
'analyze',
|
|
133
|
+
'process',
|
|
134
|
+
'transform',
|
|
135
|
+
'combine',
|
|
136
|
+
'merge',
|
|
137
|
+
'calculate',
|
|
138
|
+
'compute',
|
|
139
|
+
'iterate',
|
|
140
|
+
'loop',
|
|
141
|
+
'multiple',
|
|
142
|
+
'batch',
|
|
143
|
+
'bulk',
|
|
144
|
+
];
|
|
145
|
+
const lower = description.toLowerCase();
|
|
146
|
+
return keywords.some((k) => lower.includes(k));
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Record an execution mode call
|
|
150
|
+
*/
|
|
151
|
+
recordExecutionCall(tokensSaved = 0) {
|
|
152
|
+
this.metrics.executionCalls++;
|
|
153
|
+
this.metrics.tokensSavedEstimate += tokensSaved;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Record a passthrough mode call
|
|
157
|
+
*/
|
|
158
|
+
recordPassthroughCall(call) {
|
|
159
|
+
this.metrics.passthroughCalls++;
|
|
160
|
+
const record = {
|
|
161
|
+
...call,
|
|
162
|
+
timestamp: new Date(),
|
|
163
|
+
};
|
|
164
|
+
this.recentPassthroughCalls.push(record);
|
|
165
|
+
// Trim old calls
|
|
166
|
+
if (this.recentPassthroughCalls.length > this.maxRecentCalls) {
|
|
167
|
+
this.recentPassthroughCalls.shift();
|
|
168
|
+
}
|
|
169
|
+
this.emit('passthroughCall', record);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get mode metrics
|
|
173
|
+
*/
|
|
174
|
+
getMetrics() {
|
|
175
|
+
return { ...this.metrics };
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Reset metrics
|
|
179
|
+
*/
|
|
180
|
+
resetMetrics() {
|
|
181
|
+
this.metrics = {
|
|
182
|
+
executionCalls: 0,
|
|
183
|
+
passthroughCalls: 0,
|
|
184
|
+
hybridAutoExecutions: 0,
|
|
185
|
+
hybridAutoPassthroughs: 0,
|
|
186
|
+
tokensSavedEstimate: 0,
|
|
187
|
+
};
|
|
188
|
+
this.recentPassthroughCalls = [];
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Get recent passthrough calls
|
|
192
|
+
*/
|
|
193
|
+
getRecentPassthroughCalls() {
|
|
194
|
+
return [...this.recentPassthroughCalls];
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Generate tool prefix for passthrough mode
|
|
198
|
+
*/
|
|
199
|
+
generatePassthroughToolName(serverName, toolName) {
|
|
200
|
+
return `${serverName}__${toolName}`;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Parse a passthrough tool name back to server and tool
|
|
204
|
+
*/
|
|
205
|
+
parsePassthroughToolName(combinedName) {
|
|
206
|
+
const parts = combinedName.split('__');
|
|
207
|
+
if (parts.length !== 2)
|
|
208
|
+
return null;
|
|
209
|
+
const server = parts[0];
|
|
210
|
+
const tool = parts[1];
|
|
211
|
+
if (!server || !tool)
|
|
212
|
+
return null;
|
|
213
|
+
return { server, tool };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Get effective mode for a request (handles hybrid auto-selection)
|
|
217
|
+
*/
|
|
218
|
+
getEffectiveMode(task) {
|
|
219
|
+
if (this.currentMode === 'execution')
|
|
220
|
+
return 'execution';
|
|
221
|
+
if (this.currentMode === 'passthrough')
|
|
222
|
+
return 'passthrough';
|
|
223
|
+
// Hybrid mode - decide automatically
|
|
224
|
+
if (task) {
|
|
225
|
+
const decision = this.decideMode(task);
|
|
226
|
+
return decision.decision;
|
|
227
|
+
}
|
|
228
|
+
// Default to execution for hybrid without task info
|
|
229
|
+
return 'execution';
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// Global mode handler instance
|
|
233
|
+
let globalModeHandler = null;
|
|
234
|
+
/**
|
|
235
|
+
* Get or create the global mode handler
|
|
236
|
+
*/
|
|
237
|
+
export function getModeHandler(config) {
|
|
238
|
+
if (!globalModeHandler) {
|
|
239
|
+
globalModeHandler = new ModeHandler(config);
|
|
240
|
+
}
|
|
241
|
+
return globalModeHandler;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Shutdown the global mode handler
|
|
245
|
+
*/
|
|
246
|
+
export function shutdownModeHandler() {
|
|
247
|
+
if (globalModeHandler) {
|
|
248
|
+
globalModeHandler.removeAllListeners();
|
|
249
|
+
globalModeHandler = null;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=mode-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode-handler.js","sourceRoot":"","sources":["../../src/modes/mode-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deno Sandbox Executor
|
|
3
|
+
*
|
|
4
|
+
* Executes user code in an isolated Deno subprocess with access to the MCP API.
|
|
5
|
+
*/
|
|
6
|
+
import type { SandboxConfig } from '../config/index.js';
|
|
7
|
+
export interface ExecutionResult {
|
|
8
|
+
/** Unique execution ID for tracking and streaming */
|
|
9
|
+
executionId: string;
|
|
10
|
+
success: boolean;
|
|
11
|
+
result?: unknown;
|
|
12
|
+
error?: {
|
|
13
|
+
type: 'syntax' | 'runtime' | 'timeout' | 'security';
|
|
14
|
+
message: string;
|
|
15
|
+
stack?: string;
|
|
16
|
+
line?: number;
|
|
17
|
+
};
|
|
18
|
+
logs: string[];
|
|
19
|
+
metrics: {
|
|
20
|
+
executionTimeMs: number;
|
|
21
|
+
toolCalls: number;
|
|
22
|
+
dataProcessedBytes: number;
|
|
23
|
+
resultSizeBytes: number;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export interface ExecutionOptions {
|
|
27
|
+
timeoutMs: number;
|
|
28
|
+
bridgeUrl: string;
|
|
29
|
+
servers: string[];
|
|
30
|
+
/** Enable streaming mode for real-time progress updates */
|
|
31
|
+
stream?: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Deno Sandbox Executor
|
|
35
|
+
*/
|
|
36
|
+
export declare class DenoExecutor {
|
|
37
|
+
private config;
|
|
38
|
+
private tempDir;
|
|
39
|
+
constructor(config: SandboxConfig);
|
|
40
|
+
/**
|
|
41
|
+
* Check if Deno is available
|
|
42
|
+
*/
|
|
43
|
+
checkDeno(): Promise<boolean>;
|
|
44
|
+
/**
|
|
45
|
+
* Execute code in the Deno sandbox
|
|
46
|
+
*/
|
|
47
|
+
execute(code: string, options: ExecutionOptions): Promise<ExecutionResult>;
|
|
48
|
+
/**
|
|
49
|
+
* Get an execution ID without executing (for pre-creating streams)
|
|
50
|
+
*/
|
|
51
|
+
generateExecutionId(): string;
|
|
52
|
+
/**
|
|
53
|
+
* Run Deno subprocess
|
|
54
|
+
*/
|
|
55
|
+
private runDeno;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/runtime/executor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;QACpD,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE;QACP,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA+aD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,aAAa;IAUjC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAQnC;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IA6DhF;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;OAEG;IACH,OAAO,CAAC,OAAO;CAkMhB"}
|