mcp-agent-foundry 1.3.1 → 2.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/README.md +232 -1
- package/dist/background/index.d.ts +33 -0
- package/dist/background/index.d.ts.map +1 -0
- package/dist/background/index.js +33 -0
- package/dist/background/index.js.map +1 -0
- package/dist/background/task-runner.d.ts +177 -0
- package/dist/background/task-runner.d.ts.map +1 -0
- package/dist/background/task-runner.js +551 -0
- package/dist/background/task-runner.js.map +1 -0
- package/dist/background/types.d.ts +135 -0
- package/dist/background/types.d.ts.map +1 -0
- package/dist/background/types.js +8 -0
- package/dist/background/types.js.map +1 -0
- package/dist/failover/health-tracker.d.ts +81 -1
- package/dist/failover/health-tracker.d.ts.map +1 -1
- package/dist/failover/health-tracker.js +229 -1
- package/dist/failover/health-tracker.js.map +1 -1
- package/dist/hooks/hook-executor.d.ts +77 -0
- package/dist/hooks/hook-executor.d.ts.map +1 -0
- package/dist/hooks/hook-executor.js +308 -0
- package/dist/hooks/hook-executor.js.map +1 -0
- package/dist/hooks/hook-manager.d.ts +140 -0
- package/dist/hooks/hook-manager.d.ts.map +1 -0
- package/dist/hooks/hook-manager.js +520 -0
- package/dist/hooks/hook-manager.js.map +1 -0
- package/dist/hooks/index.d.ts +10 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +10 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/types.d.ts +221 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +31 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/mcp/auto-mode.d.ts +221 -0
- package/dist/mcp/auto-mode.d.ts.map +1 -0
- package/dist/mcp/auto-mode.js +436 -0
- package/dist/mcp/auto-mode.js.map +1 -0
- package/dist/mcp/index.d.ts +14 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +22 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools/tasks/delete-task.d.ts +25 -0
- package/dist/mcp/tools/tasks/delete-task.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/delete-task.js +148 -0
- package/dist/mcp/tools/tasks/delete-task.js.map +1 -0
- package/dist/mcp/tools/tasks/index.d.ts +2 -0
- package/dist/mcp/tools/tasks/index.d.ts.map +1 -1
- package/dist/mcp/tools/tasks/index.js +6 -0
- package/dist/mcp/tools/tasks/index.js.map +1 -1
- package/dist/observability/debug-logger.d.ts +209 -0
- package/dist/observability/debug-logger.d.ts.map +1 -0
- package/dist/observability/debug-logger.js +430 -0
- package/dist/observability/debug-logger.js.map +1 -0
- package/dist/observability/index.d.ts +12 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +12 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/logger.d.ts +180 -0
- package/dist/observability/logger.d.ts.map +1 -1
- package/dist/observability/logger.js +158 -0
- package/dist/observability/logger.js.map +1 -1
- package/dist/router/context-manager.d.ts +214 -1
- package/dist/router/context-manager.d.ts.map +1 -1
- package/dist/router/context-manager.js +759 -2
- package/dist/router/context-manager.js.map +1 -1
- package/dist/router/context-types.d.ts +182 -0
- package/dist/router/context-types.d.ts.map +1 -0
- package/dist/router/context-types.js +8 -0
- package/dist/router/context-types.js.map +1 -0
- package/dist/server.d.ts +41 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +165 -0
- package/dist/server.js.map +1 -1
- package/dist/skills/hot-reloader.d.ts +104 -0
- package/dist/skills/hot-reloader.d.ts.map +1 -0
- package/dist/skills/hot-reloader.js +314 -0
- package/dist/skills/hot-reloader.js.map +1 -0
- package/dist/skills/index.d.ts +14 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +16 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/skill-executor.d.ts +96 -0
- package/dist/skills/skill-executor.d.ts.map +1 -0
- package/dist/skills/skill-executor.js +289 -0
- package/dist/skills/skill-executor.js.map +1 -0
- package/dist/skills/skill-loader.d.ts +147 -0
- package/dist/skills/skill-loader.d.ts.map +1 -0
- package/dist/skills/skill-loader.js +579 -0
- package/dist/skills/skill-loader.js.map +1 -0
- package/dist/skills/types.d.ts +198 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +21 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/tasks/coordinator.d.ts +22 -1
- package/dist/tasks/coordinator.d.ts.map +1 -1
- package/dist/tasks/coordinator.js +83 -0
- package/dist/tasks/coordinator.js.map +1 -1
- package/dist/tasks/state-coordinator.d.ts +19 -0
- package/dist/tasks/state-coordinator.d.ts.map +1 -1
- package/dist/tasks/state-coordinator.js +40 -0
- package/dist/tasks/state-coordinator.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Auto Mode
|
|
3
|
+
*
|
|
4
|
+
* Automatically defers tool descriptions when they would exceed a configurable
|
|
5
|
+
* percentage of the context window. This prevents context overflow in long
|
|
6
|
+
* sessions with many tools.
|
|
7
|
+
*
|
|
8
|
+
* Based on Claude Code v2.1.7's MCP Auto Mode feature.
|
|
9
|
+
*
|
|
10
|
+
* Key features:
|
|
11
|
+
* - Configurable percentage threshold for tool descriptions
|
|
12
|
+
* - Priority-based tool selection
|
|
13
|
+
* - Always-include and always-defer lists
|
|
14
|
+
* - On-demand fetching of deferred tool descriptions
|
|
15
|
+
* - Force-include override for user requests
|
|
16
|
+
*/
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Default Configuration
|
|
19
|
+
// ============================================================================
|
|
20
|
+
const DEFAULT_CONFIG = {
|
|
21
|
+
enabled: true,
|
|
22
|
+
maxToolDescriptionPercent: 10,
|
|
23
|
+
minToolsToInclude: 5,
|
|
24
|
+
alwaysInclude: [],
|
|
25
|
+
alwaysDefer: [],
|
|
26
|
+
};
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// MCPAutoMode Class
|
|
29
|
+
// ============================================================================
|
|
30
|
+
/**
|
|
31
|
+
* MCP Auto Mode - Intelligent tool description management
|
|
32
|
+
*
|
|
33
|
+
* Automatically defers tool descriptions that would exceed context limits.
|
|
34
|
+
* This is based on Claude Code v2.1.7's MCP Auto Mode feature.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* const autoMode = new MCPAutoMode(
|
|
39
|
+
* { maxToolDescriptionPercent: 15 },
|
|
40
|
+
* contextManager,
|
|
41
|
+
* logger
|
|
42
|
+
* );
|
|
43
|
+
*
|
|
44
|
+
* // Register tools
|
|
45
|
+
* autoMode.registerTool({
|
|
46
|
+
* name: 'invoke_agent',
|
|
47
|
+
* description: 'Invoke a specialized agent...',
|
|
48
|
+
* estimatedTokens: 150,
|
|
49
|
+
* priority: 10,
|
|
50
|
+
* });
|
|
51
|
+
*
|
|
52
|
+
* // Before each request, process tools
|
|
53
|
+
* const contextState = contextManager.getState('openai', 'gpt-4o', messages);
|
|
54
|
+
* const result = autoMode.processForRequest(contextState);
|
|
55
|
+
*
|
|
56
|
+
* // Use result.includedTools for this request
|
|
57
|
+
* if (result.hadDeferrals) {
|
|
58
|
+
* console.log(result.deferralMessage);
|
|
59
|
+
* }
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export class MCPAutoMode {
|
|
63
|
+
config;
|
|
64
|
+
contextManager;
|
|
65
|
+
logger;
|
|
66
|
+
toolRegistry = new Map();
|
|
67
|
+
forcedIncludes = new Set();
|
|
68
|
+
/**
|
|
69
|
+
* Create a new MCPAutoMode instance.
|
|
70
|
+
*
|
|
71
|
+
* @param config - Partial configuration (merged with defaults)
|
|
72
|
+
* @param contextManager - ContextManager for token estimation
|
|
73
|
+
* @param logger - Logger instance for observability
|
|
74
|
+
*/
|
|
75
|
+
constructor(config, contextManager, logger) {
|
|
76
|
+
this.config = {
|
|
77
|
+
...DEFAULT_CONFIG,
|
|
78
|
+
...config,
|
|
79
|
+
alwaysInclude: config.alwaysInclude ?? DEFAULT_CONFIG.alwaysInclude,
|
|
80
|
+
alwaysDefer: config.alwaysDefer ?? DEFAULT_CONFIG.alwaysDefer,
|
|
81
|
+
};
|
|
82
|
+
this.contextManager = contextManager;
|
|
83
|
+
this.logger = logger;
|
|
84
|
+
this.logger.debug('MCPAutoMode initialized', {
|
|
85
|
+
enabled: this.config.enabled,
|
|
86
|
+
maxToolDescriptionPercent: this.config.maxToolDescriptionPercent,
|
|
87
|
+
minToolsToInclude: this.config.minToolsToInclude,
|
|
88
|
+
alwaysIncludeCount: this.config.alwaysInclude?.length ?? 0,
|
|
89
|
+
alwaysDeferCount: this.config.alwaysDefer?.length ?? 0,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// ==========================================================================
|
|
93
|
+
// Tool Registration
|
|
94
|
+
// ==========================================================================
|
|
95
|
+
/**
|
|
96
|
+
* Register a tool with its description.
|
|
97
|
+
*
|
|
98
|
+
* @param tool - Tool descriptor to register
|
|
99
|
+
*/
|
|
100
|
+
registerTool(tool) {
|
|
101
|
+
// Validate tool
|
|
102
|
+
if (!tool.name) {
|
|
103
|
+
this.logger.warn('Attempted to register tool without name', { tool });
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// Set defaults
|
|
107
|
+
const normalizedTool = {
|
|
108
|
+
...tool,
|
|
109
|
+
priority: tool.priority ?? 0,
|
|
110
|
+
deferred: false,
|
|
111
|
+
estimatedTokens: tool.estimatedTokens > 0
|
|
112
|
+
? tool.estimatedTokens
|
|
113
|
+
: this.estimateToolTokens(tool),
|
|
114
|
+
};
|
|
115
|
+
this.toolRegistry.set(tool.name, normalizedTool);
|
|
116
|
+
this.logger.debug('Tool registered', {
|
|
117
|
+
name: tool.name,
|
|
118
|
+
estimatedTokens: normalizedTool.estimatedTokens,
|
|
119
|
+
priority: normalizedTool.priority,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Unregister a tool.
|
|
124
|
+
*
|
|
125
|
+
* @param name - Name of tool to unregister
|
|
126
|
+
*/
|
|
127
|
+
unregisterTool(name) {
|
|
128
|
+
if (this.toolRegistry.has(name)) {
|
|
129
|
+
this.toolRegistry.delete(name);
|
|
130
|
+
this.forcedIncludes.delete(name);
|
|
131
|
+
this.logger.debug('Tool unregistered', { name });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get all registered tools.
|
|
136
|
+
*
|
|
137
|
+
* @returns Array of all tool descriptors
|
|
138
|
+
*/
|
|
139
|
+
getAllTools() {
|
|
140
|
+
return Array.from(this.toolRegistry.values());
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Calculate total tokens for all tool descriptions.
|
|
144
|
+
*
|
|
145
|
+
* @returns Total estimated tokens
|
|
146
|
+
*/
|
|
147
|
+
getTotalToolTokens() {
|
|
148
|
+
let total = 0;
|
|
149
|
+
for (const tool of this.toolRegistry.values()) {
|
|
150
|
+
total += tool.estimatedTokens;
|
|
151
|
+
}
|
|
152
|
+
return total;
|
|
153
|
+
}
|
|
154
|
+
// ==========================================================================
|
|
155
|
+
// Request Processing
|
|
156
|
+
// ==========================================================================
|
|
157
|
+
/**
|
|
158
|
+
* Process tools for a request given current context state.
|
|
159
|
+
* Returns which tools to include and which to defer.
|
|
160
|
+
*
|
|
161
|
+
* @param contextState - Current context state from ContextManager
|
|
162
|
+
* @param requestedTools - Optional list of specifically requested tool names
|
|
163
|
+
* @returns AutoModeResult with included/deferred tools
|
|
164
|
+
*/
|
|
165
|
+
processForRequest(contextState, requestedTools) {
|
|
166
|
+
// If auto mode is disabled, include all tools
|
|
167
|
+
if (!this.config.enabled) {
|
|
168
|
+
const allTools = Array.from(this.toolRegistry.keys());
|
|
169
|
+
return {
|
|
170
|
+
includedTools: allTools,
|
|
171
|
+
deferredTools: [],
|
|
172
|
+
tokensSaved: 0,
|
|
173
|
+
hadDeferrals: false,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
// Calculate how many tokens we can use for tools
|
|
177
|
+
const maxToolTokens = Math.floor(contextState.maxTokens * (this.config.maxToolDescriptionPercent / 100));
|
|
178
|
+
this.logger.debug('Processing tools for request', {
|
|
179
|
+
maxToolTokens,
|
|
180
|
+
totalRegisteredTools: this.toolRegistry.size,
|
|
181
|
+
requestedToolsCount: requestedTools?.length ?? 0,
|
|
182
|
+
});
|
|
183
|
+
// Sort tools by priority
|
|
184
|
+
const sortedTools = this.getSortedTools(requestedTools);
|
|
185
|
+
// Greedily include tools until we hit the limit
|
|
186
|
+
const included = [];
|
|
187
|
+
const deferred = [];
|
|
188
|
+
let usedTokens = 0;
|
|
189
|
+
for (const tool of sortedTools) {
|
|
190
|
+
// Always include first
|
|
191
|
+
if (this.config.alwaysInclude?.includes(tool.name)) {
|
|
192
|
+
included.push(tool.name);
|
|
193
|
+
usedTokens += tool.estimatedTokens;
|
|
194
|
+
tool.deferred = false;
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
// Always defer
|
|
198
|
+
if (this.config.alwaysDefer?.includes(tool.name) && !this.forcedIncludes.has(tool.name)) {
|
|
199
|
+
deferred.push(tool.name);
|
|
200
|
+
tool.deferred = true;
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
// Forced includes from user override
|
|
204
|
+
if (this.forcedIncludes.has(tool.name)) {
|
|
205
|
+
included.push(tool.name);
|
|
206
|
+
usedTokens += tool.estimatedTokens;
|
|
207
|
+
tool.deferred = false;
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
// Check if we have room (always include minimum tools)
|
|
211
|
+
if (usedTokens + tool.estimatedTokens <= maxToolTokens ||
|
|
212
|
+
included.length < this.config.minToolsToInclude) {
|
|
213
|
+
included.push(tool.name);
|
|
214
|
+
usedTokens += tool.estimatedTokens;
|
|
215
|
+
tool.deferred = false;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
deferred.push(tool.name);
|
|
219
|
+
tool.deferred = true;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Calculate tokens saved
|
|
223
|
+
const tokensSaved = this.calculateTokensSaved(deferred);
|
|
224
|
+
const result = {
|
|
225
|
+
includedTools: included,
|
|
226
|
+
deferredTools: deferred,
|
|
227
|
+
tokensSaved,
|
|
228
|
+
hadDeferrals: deferred.length > 0,
|
|
229
|
+
deferralMessage: deferred.length > 0
|
|
230
|
+
? `${deferred.length} tool${deferred.length !== 1 ? 's' : ''} deferred to save context (${tokensSaved} tokens saved). Use tool explicitly to include.`
|
|
231
|
+
: undefined,
|
|
232
|
+
};
|
|
233
|
+
this.logger.debug('Tool processing completed', {
|
|
234
|
+
includedCount: included.length,
|
|
235
|
+
deferredCount: deferred.length,
|
|
236
|
+
tokensSaved,
|
|
237
|
+
usedTokens,
|
|
238
|
+
maxToolTokens,
|
|
239
|
+
});
|
|
240
|
+
return result;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Get deferred tool description on demand.
|
|
244
|
+
* (When user explicitly requests a deferred tool)
|
|
245
|
+
*
|
|
246
|
+
* @param name - Name of deferred tool
|
|
247
|
+
* @returns Tool descriptor if found, undefined otherwise
|
|
248
|
+
*/
|
|
249
|
+
getDeferredToolDescription(name) {
|
|
250
|
+
const tool = this.toolRegistry.get(name);
|
|
251
|
+
if (tool?.deferred) {
|
|
252
|
+
this.logger.debug('Fetching deferred tool description', { name });
|
|
253
|
+
return tool;
|
|
254
|
+
}
|
|
255
|
+
return undefined;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Check if a specific tool is currently deferred.
|
|
259
|
+
*
|
|
260
|
+
* @param name - Tool name to check
|
|
261
|
+
* @returns True if tool is deferred
|
|
262
|
+
*/
|
|
263
|
+
isDeferred(name) {
|
|
264
|
+
return this.toolRegistry.get(name)?.deferred ?? false;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Force include a deferred tool (user override).
|
|
268
|
+
* This tool will be included in subsequent requests until reset.
|
|
269
|
+
*
|
|
270
|
+
* @param name - Tool name to force include
|
|
271
|
+
*/
|
|
272
|
+
forceInclude(name) {
|
|
273
|
+
if (this.toolRegistry.has(name)) {
|
|
274
|
+
this.forcedIncludes.add(name);
|
|
275
|
+
const tool = this.toolRegistry.get(name);
|
|
276
|
+
if (tool) {
|
|
277
|
+
tool.deferred = false;
|
|
278
|
+
}
|
|
279
|
+
this.logger.debug('Tool force-included', { name });
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
this.logger.warn('Attempted to force-include unknown tool', { name });
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Reset all deferrals and force-includes.
|
|
287
|
+
*/
|
|
288
|
+
resetDeferrals() {
|
|
289
|
+
this.forcedIncludes.clear();
|
|
290
|
+
for (const tool of this.toolRegistry.values()) {
|
|
291
|
+
tool.deferred = false;
|
|
292
|
+
}
|
|
293
|
+
this.logger.debug('Deferrals reset');
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Mark a tool as recently used (for recency-based prioritization).
|
|
297
|
+
*
|
|
298
|
+
* @param name - Tool name that was used
|
|
299
|
+
*/
|
|
300
|
+
markToolUsed(name) {
|
|
301
|
+
const tool = this.toolRegistry.get(name);
|
|
302
|
+
if (tool) {
|
|
303
|
+
tool.lastUsedAt = Date.now();
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
// ==========================================================================
|
|
307
|
+
// Configuration
|
|
308
|
+
// ==========================================================================
|
|
309
|
+
/**
|
|
310
|
+
* Get current configuration.
|
|
311
|
+
*
|
|
312
|
+
* @returns Current MCPAutoModeConfig
|
|
313
|
+
*/
|
|
314
|
+
getConfig() {
|
|
315
|
+
return { ...this.config };
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Update configuration.
|
|
319
|
+
*
|
|
320
|
+
* @param config - Partial configuration to merge
|
|
321
|
+
*/
|
|
322
|
+
updateConfig(config) {
|
|
323
|
+
this.config = {
|
|
324
|
+
...this.config,
|
|
325
|
+
...config,
|
|
326
|
+
alwaysInclude: config.alwaysInclude ?? this.config.alwaysInclude,
|
|
327
|
+
alwaysDefer: config.alwaysDefer ?? this.config.alwaysDefer,
|
|
328
|
+
};
|
|
329
|
+
this.logger.debug('MCPAutoMode config updated', {
|
|
330
|
+
enabled: this.config.enabled,
|
|
331
|
+
maxToolDescriptionPercent: this.config.maxToolDescriptionPercent,
|
|
332
|
+
minToolsToInclude: this.config.minToolsToInclude,
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
// ==========================================================================
|
|
336
|
+
// Private Methods
|
|
337
|
+
// ==========================================================================
|
|
338
|
+
/**
|
|
339
|
+
* Sort tools by priority for inclusion decisions.
|
|
340
|
+
*
|
|
341
|
+
* Priority order:
|
|
342
|
+
* 1. Tools in alwaysInclude
|
|
343
|
+
* 2. Tools explicitly requested for this call
|
|
344
|
+
* 3. Tools that were force-included by user
|
|
345
|
+
* 4. Recently used tools
|
|
346
|
+
* 5. Tools with higher priority scores
|
|
347
|
+
* 6. Other tools
|
|
348
|
+
* 7. Tools in alwaysDefer (lowest priority)
|
|
349
|
+
*/
|
|
350
|
+
getSortedTools(requestedTools) {
|
|
351
|
+
const tools = Array.from(this.toolRegistry.values());
|
|
352
|
+
const requestedSet = new Set(requestedTools ?? []);
|
|
353
|
+
const alwaysIncludeSet = new Set(this.config.alwaysInclude ?? []);
|
|
354
|
+
const alwaysDeferSet = new Set(this.config.alwaysDefer ?? []);
|
|
355
|
+
const now = Date.now();
|
|
356
|
+
return tools.sort((a, b) => {
|
|
357
|
+
// 1. alwaysInclude tools first
|
|
358
|
+
const aAlwaysInclude = alwaysIncludeSet.has(a.name) ? 1 : 0;
|
|
359
|
+
const bAlwaysInclude = alwaysIncludeSet.has(b.name) ? 1 : 0;
|
|
360
|
+
if (aAlwaysInclude !== bAlwaysInclude) {
|
|
361
|
+
return bAlwaysInclude - aAlwaysInclude;
|
|
362
|
+
}
|
|
363
|
+
// 2. Explicitly requested tools
|
|
364
|
+
const aRequested = requestedSet.has(a.name) ? 1 : 0;
|
|
365
|
+
const bRequested = requestedSet.has(b.name) ? 1 : 0;
|
|
366
|
+
if (aRequested !== bRequested) {
|
|
367
|
+
return bRequested - aRequested;
|
|
368
|
+
}
|
|
369
|
+
// 3. Force-included tools
|
|
370
|
+
const aForced = this.forcedIncludes.has(a.name) ? 1 : 0;
|
|
371
|
+
const bForced = this.forcedIncludes.has(b.name) ? 1 : 0;
|
|
372
|
+
if (aForced !== bForced) {
|
|
373
|
+
return bForced - aForced;
|
|
374
|
+
}
|
|
375
|
+
// 4. Recently used tools (within last 5 minutes)
|
|
376
|
+
const recentThreshold = 5 * 60 * 1000; // 5 minutes
|
|
377
|
+
const aRecent = a.lastUsedAt && (now - a.lastUsedAt) < recentThreshold ? 1 : 0;
|
|
378
|
+
const bRecent = b.lastUsedAt && (now - b.lastUsedAt) < recentThreshold ? 1 : 0;
|
|
379
|
+
if (aRecent !== bRecent) {
|
|
380
|
+
return bRecent - aRecent;
|
|
381
|
+
}
|
|
382
|
+
// 5. Priority score (higher = more important)
|
|
383
|
+
const priorityDiff = (b.priority ?? 0) - (a.priority ?? 0);
|
|
384
|
+
if (priorityDiff !== 0) {
|
|
385
|
+
return priorityDiff;
|
|
386
|
+
}
|
|
387
|
+
// 6. alwaysDefer tools last
|
|
388
|
+
const aAlwaysDefer = alwaysDeferSet.has(a.name) ? 1 : 0;
|
|
389
|
+
const bAlwaysDefer = alwaysDeferSet.has(b.name) ? 1 : 0;
|
|
390
|
+
if (aAlwaysDefer !== bAlwaysDefer) {
|
|
391
|
+
return aAlwaysDefer - bAlwaysDefer;
|
|
392
|
+
}
|
|
393
|
+
// 7. Alphabetical as tie-breaker for consistency
|
|
394
|
+
return a.name.localeCompare(b.name);
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Calculate total tokens saved by deferring tools.
|
|
399
|
+
*/
|
|
400
|
+
calculateTokensSaved(deferredTools) {
|
|
401
|
+
let total = 0;
|
|
402
|
+
for (const name of deferredTools) {
|
|
403
|
+
const tool = this.toolRegistry.get(name);
|
|
404
|
+
if (tool) {
|
|
405
|
+
total += tool.estimatedTokens;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
return total;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Estimate token count for a tool based on its description.
|
|
412
|
+
* Uses the context manager's estimation logic.
|
|
413
|
+
*/
|
|
414
|
+
estimateToolTokens(tool) {
|
|
415
|
+
// Base estimate from description
|
|
416
|
+
const descriptionTokens = this.contextManager.estimateTokens(tool.description);
|
|
417
|
+
// Add overhead for tool schema (name, parameters structure)
|
|
418
|
+
const schemaOverhead = 20;
|
|
419
|
+
return descriptionTokens + schemaOverhead;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
// ============================================================================
|
|
423
|
+
// Factory Function
|
|
424
|
+
// ============================================================================
|
|
425
|
+
/**
|
|
426
|
+
* Create an MCPAutoMode instance.
|
|
427
|
+
*
|
|
428
|
+
* @param config - Partial configuration (merged with defaults)
|
|
429
|
+
* @param contextManager - ContextManager instance
|
|
430
|
+
* @param logger - Logger instance
|
|
431
|
+
* @returns Configured MCPAutoMode instance
|
|
432
|
+
*/
|
|
433
|
+
export function createMCPAutoMode(config, contextManager, logger) {
|
|
434
|
+
return new MCPAutoMode(config, contextManager, logger);
|
|
435
|
+
}
|
|
436
|
+
//# sourceMappingURL=auto-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-mode.js","sourceRoot":"","sources":["../../src/mcp/auto-mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Module Index
|
|
3
|
+
*
|
|
4
|
+
* Exports MCP-related functionality including:
|
|
5
|
+
* - Auto Mode for intelligent tool description management
|
|
6
|
+
* - Tool registration utilities
|
|
7
|
+
* - Transport implementations
|
|
8
|
+
*/
|
|
9
|
+
export { MCPAutoMode, createMCPAutoMode, } from './auto-mode.js';
|
|
10
|
+
export type { MCPAutoModeConfig, ToolDescriptor, AutoModeResult, } from './auto-mode.js';
|
|
11
|
+
export { registerTools } from './tools/index.js';
|
|
12
|
+
export { registerInvokeAgentTool, registerCompareAgentsTool, registerCritiquePlanTool, registerDesignFeedbackTool, registerReviewCodeTool, registerWorktreeTools, registerWorktreeManagementTools, registerResolveConflictsTool, registerListWorktreesTool, registerCleanupWorktreesTool, registerGetWorktreeStatusTool, } from './tools/index.js';
|
|
13
|
+
export { createStdioTransport } from './transport/stdio.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EACL,WAAW,EACX,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,iBAAiB,EACjB,cAAc,EACd,cAAc,GACf,MAAM,gBAAgB,CAAC;AAMxB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,0BAA0B,EAC1B,sBAAsB,EACtB,qBAAqB,EACrB,+BAA+B,EAC/B,4BAA4B,EAC5B,yBAAyB,EACzB,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAM1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Module Index
|
|
3
|
+
*
|
|
4
|
+
* Exports MCP-related functionality including:
|
|
5
|
+
* - Auto Mode for intelligent tool description management
|
|
6
|
+
* - Tool registration utilities
|
|
7
|
+
* - Transport implementations
|
|
8
|
+
*/
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Auto Mode
|
|
11
|
+
// ============================================================================
|
|
12
|
+
export { MCPAutoMode, createMCPAutoMode, } from './auto-mode.js';
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Tools
|
|
15
|
+
// ============================================================================
|
|
16
|
+
export { registerTools } from './tools/index.js';
|
|
17
|
+
export { registerInvokeAgentTool, registerCompareAgentsTool, registerCritiquePlanTool, registerDesignFeedbackTool, registerReviewCodeTool, registerWorktreeTools, registerWorktreeManagementTools, registerResolveConflictsTool, registerListWorktreesTool, registerCleanupWorktreesTool, registerGetWorktreeStatusTool, } from './tools/index.js';
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Transport
|
|
20
|
+
// ============================================================================
|
|
21
|
+
export { createStdioTransport } from './transport/stdio.js';
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,OAAO,EACL,WAAW,EACX,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAQxB,+EAA+E;AAC/E,QAAQ;AACR,+EAA+E;AAE/E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,0BAA0B,EAC1B,sBAAsB,EACtB,qBAAqB,EACrB,+BAA+B,EAC/B,4BAA4B,EAC5B,yBAAyB,EACzB,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAE1B,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* delete_task MCP Tool
|
|
3
|
+
*
|
|
4
|
+
* Deletes a task from the state coordinator and optionally cleans up
|
|
5
|
+
* any associated worktree resources.
|
|
6
|
+
*/
|
|
7
|
+
import { type McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
8
|
+
import type { Logger } from "../../../observability/logger.js";
|
|
9
|
+
import type { TaskCoordinator } from "../../../tasks/coordinator.js";
|
|
10
|
+
/**
|
|
11
|
+
* Registers the delete_task tool with the MCP server
|
|
12
|
+
*
|
|
13
|
+
* @param server - MCP server instance
|
|
14
|
+
* @param coordinator - TaskCoordinator for task lifecycle management
|
|
15
|
+
* @param logger - Logger instance for structured logging
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const server = new McpServer({ name: 'agent-foundry', version: '1.0.0' });
|
|
20
|
+
* const coordinator = new TaskCoordinator({ logger });
|
|
21
|
+
* registerDeleteTaskTool(server, coordinator, logger);
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function registerDeleteTaskTool(server: McpServer, coordinator: TaskCoordinator, logger: Logger): void;
|
|
25
|
+
//# sourceMappingURL=delete-task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-task.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/tasks/delete-task.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,+BAA+B,CAAC;AAsFvF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,eAAe,EAC5B,MAAM,EAAE,MAAM,GACb,IAAI,CAkFN"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* delete_task MCP Tool
|
|
3
|
+
*
|
|
4
|
+
* Deletes a task from the state coordinator and optionally cleans up
|
|
5
|
+
* any associated worktree resources.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Constants
|
|
10
|
+
// ============================================================================
|
|
11
|
+
/**
|
|
12
|
+
* Tool description for delete_task
|
|
13
|
+
*/
|
|
14
|
+
const TOOL_DESCRIPTION = "Delete a task from the state coordinator. " +
|
|
15
|
+
"By default, running tasks cannot be deleted unless force is set to true. " +
|
|
16
|
+
"Optionally cleans up any associated git worktree.";
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Input Schema
|
|
19
|
+
// ============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* Zod schema shape for delete_task input validation.
|
|
22
|
+
*/
|
|
23
|
+
const deleteTaskInputSchemaShape = {
|
|
24
|
+
taskId: z.string().min(1).describe("The task ID to delete"),
|
|
25
|
+
force: z
|
|
26
|
+
.boolean()
|
|
27
|
+
.optional()
|
|
28
|
+
.default(false)
|
|
29
|
+
.describe("Force deletion even if the task is currently running (default: false)"),
|
|
30
|
+
deleteWorktree: z
|
|
31
|
+
.boolean()
|
|
32
|
+
.optional()
|
|
33
|
+
.default(true)
|
|
34
|
+
.describe("Delete the associated worktree if one exists (default: true)"),
|
|
35
|
+
reason: z
|
|
36
|
+
.string()
|
|
37
|
+
.optional()
|
|
38
|
+
.describe("Optional reason for deletion (logged for audit purposes)"),
|
|
39
|
+
};
|
|
40
|
+
// ============================================================================
|
|
41
|
+
// Response Formatter
|
|
42
|
+
// ============================================================================
|
|
43
|
+
/**
|
|
44
|
+
* Formats the task deletion response for MCP text output
|
|
45
|
+
*/
|
|
46
|
+
function formatDeleteTaskResponse(taskId, result, reason) {
|
|
47
|
+
if (!result.success) {
|
|
48
|
+
return (`## Task Deletion Failed\n\n` +
|
|
49
|
+
`**Task ID:** ${taskId}\n` +
|
|
50
|
+
`**Error:** ${result.error ?? "Unknown error"}\n`);
|
|
51
|
+
}
|
|
52
|
+
let response = `## Task Deleted Successfully\n\n` +
|
|
53
|
+
`**Task ID:** ${taskId}\n` +
|
|
54
|
+
`**Task Removed:** ${result.taskDeleted ? "Yes" : "No"}\n` +
|
|
55
|
+
`**Worktree Removed:** ${result.worktreeDeleted ? "Yes" : "No"}\n`;
|
|
56
|
+
if (reason) {
|
|
57
|
+
response += `**Reason:** ${reason}\n`;
|
|
58
|
+
}
|
|
59
|
+
return response;
|
|
60
|
+
}
|
|
61
|
+
// ============================================================================
|
|
62
|
+
// Tool Registration
|
|
63
|
+
// ============================================================================
|
|
64
|
+
/**
|
|
65
|
+
* Registers the delete_task tool with the MCP server
|
|
66
|
+
*
|
|
67
|
+
* @param server - MCP server instance
|
|
68
|
+
* @param coordinator - TaskCoordinator for task lifecycle management
|
|
69
|
+
* @param logger - Logger instance for structured logging
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* const server = new McpServer({ name: 'agent-foundry', version: '1.0.0' });
|
|
74
|
+
* const coordinator = new TaskCoordinator({ logger });
|
|
75
|
+
* registerDeleteTaskTool(server, coordinator, logger);
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export function registerDeleteTaskTool(server, coordinator, logger) {
|
|
79
|
+
// Use type assertion to work around Zod version compatibility issues
|
|
80
|
+
/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment */
|
|
81
|
+
const inputSchema = deleteTaskInputSchemaShape;
|
|
82
|
+
server.registerTool("delete_task", {
|
|
83
|
+
title: "Delete Task",
|
|
84
|
+
description: TOOL_DESCRIPTION,
|
|
85
|
+
inputSchema,
|
|
86
|
+
},
|
|
87
|
+
/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment */
|
|
88
|
+
async (args) => {
|
|
89
|
+
const { taskId, force, deleteWorktree, reason } = args;
|
|
90
|
+
logger.info("delete_task called", {
|
|
91
|
+
taskId,
|
|
92
|
+
force,
|
|
93
|
+
deleteWorktree,
|
|
94
|
+
reason,
|
|
95
|
+
});
|
|
96
|
+
try {
|
|
97
|
+
const result = await coordinator.deleteTask(taskId, {
|
|
98
|
+
force,
|
|
99
|
+
deleteWorktree,
|
|
100
|
+
reason,
|
|
101
|
+
});
|
|
102
|
+
if (result.success) {
|
|
103
|
+
logger.info("delete_task completed", {
|
|
104
|
+
taskId,
|
|
105
|
+
taskDeleted: result.taskDeleted,
|
|
106
|
+
worktreeDeleted: result.worktreeDeleted,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
logger.warn("delete_task failed", {
|
|
111
|
+
taskId,
|
|
112
|
+
error: result.error,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
content: [
|
|
117
|
+
{
|
|
118
|
+
type: "text",
|
|
119
|
+
text: formatDeleteTaskResponse(taskId, result, reason),
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
126
|
+
logger.error("delete_task failed with exception", {
|
|
127
|
+
taskId,
|
|
128
|
+
error: error instanceof Error ? error : undefined,
|
|
129
|
+
errorMessage,
|
|
130
|
+
});
|
|
131
|
+
return {
|
|
132
|
+
content: [
|
|
133
|
+
{
|
|
134
|
+
type: "text",
|
|
135
|
+
text: formatDeleteTaskResponse(taskId, {
|
|
136
|
+
success: false,
|
|
137
|
+
taskDeleted: false,
|
|
138
|
+
worktreeDeleted: false,
|
|
139
|
+
error: errorMessage,
|
|
140
|
+
}, reason),
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
logger.debug("Registered delete_task tool");
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=delete-task.js.map
|