sdd-mcp-server 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 +256 -0
- package/dist/__tests__/setup.d.ts +44 -0
- package/dist/__tests__/setup.js +178 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/__tests__/test-helpers/mock-factories.d.ts +26 -0
- package/dist/__tests__/test-helpers/mock-factories.js +466 -0
- package/dist/__tests__/test-helpers/mock-factories.js.map +1 -0
- package/dist/adapters/cli/SDDToolAdapter.d.ts +26 -0
- package/dist/adapters/cli/SDDToolAdapter.js +273 -0
- package/dist/adapters/cli/SDDToolAdapter.js.map +1 -0
- package/dist/application/services/CodebaseAnalysisService.d.ts +38 -0
- package/dist/application/services/CodebaseAnalysisService.js +737 -0
- package/dist/application/services/CodebaseAnalysisService.js.map +1 -0
- package/dist/application/services/LocalizationService.d.ts +184 -0
- package/dist/application/services/LocalizationService.js +536 -0
- package/dist/application/services/LocalizationService.js.map +1 -0
- package/dist/application/services/ProjectContextService.d.ts +61 -0
- package/dist/application/services/ProjectContextService.js +550 -0
- package/dist/application/services/ProjectContextService.js.map +1 -0
- package/dist/application/services/ProjectInitializationService.d.ts +57 -0
- package/dist/application/services/ProjectInitializationService.js +485 -0
- package/dist/application/services/ProjectInitializationService.js.map +1 -0
- package/dist/application/services/ProjectService.d.ts +19 -0
- package/dist/application/services/ProjectService.js +159 -0
- package/dist/application/services/ProjectService.js.map +1 -0
- package/dist/application/services/QualityGateService.d.ts +62 -0
- package/dist/application/services/QualityGateService.js +428 -0
- package/dist/application/services/QualityGateService.js.map +1 -0
- package/dist/application/services/QualityService.d.ts +43 -0
- package/dist/application/services/QualityService.js +245 -0
- package/dist/application/services/QualityService.js.map +1 -0
- package/dist/application/services/SteeringDocumentService.d.ts +62 -0
- package/dist/application/services/SteeringDocumentService.js +694 -0
- package/dist/application/services/SteeringDocumentService.js.map +1 -0
- package/dist/application/services/TemplateService.d.ts +47 -0
- package/dist/application/services/TemplateService.js +438 -0
- package/dist/application/services/TemplateService.js.map +1 -0
- package/dist/application/services/WorkflowEngineService.d.ts +56 -0
- package/dist/application/services/WorkflowEngineService.js +348 -0
- package/dist/application/services/WorkflowEngineService.js.map +1 -0
- package/dist/application/services/WorkflowService.d.ts +22 -0
- package/dist/application/services/WorkflowService.js +147 -0
- package/dist/application/services/WorkflowService.js.map +1 -0
- package/dist/application/services/WorkflowValidationService.d.ts +51 -0
- package/dist/application/services/WorkflowValidationService.js +665 -0
- package/dist/application/services/WorkflowValidationService.js.map +1 -0
- package/dist/domain/context/ProjectContext.d.ts +350 -0
- package/dist/domain/context/ProjectContext.js +138 -0
- package/dist/domain/context/ProjectContext.js.map +1 -0
- package/dist/domain/i18n/index.d.ts +286 -0
- package/dist/domain/i18n/index.js +97 -0
- package/dist/domain/i18n/index.js.map +1 -0
- package/dist/domain/plugins/index.d.ts +498 -0
- package/dist/domain/plugins/index.js +157 -0
- package/dist/domain/plugins/index.js.map +1 -0
- package/dist/domain/ports.d.ts +54 -0
- package/dist/domain/ports.js +3 -0
- package/dist/domain/ports.js.map +1 -0
- package/dist/domain/quality/index.d.ts +361 -0
- package/dist/domain/quality/index.js +113 -0
- package/dist/domain/quality/index.js.map +1 -0
- package/dist/domain/services/DomainService.d.ts +18 -0
- package/dist/domain/services/DomainService.js +71 -0
- package/dist/domain/services/DomainService.js.map +1 -0
- package/dist/domain/templates/index.d.ts +158 -0
- package/dist/domain/templates/index.js +22 -0
- package/dist/domain/templates/index.js.map +1 -0
- package/dist/domain/types.d.ts +115 -0
- package/dist/domain/types.js +37 -0
- package/dist/domain/types.js.map +1 -0
- package/dist/domain/workflow/WorkflowStateMachine.d.ts +62 -0
- package/dist/domain/workflow/WorkflowStateMachine.js +286 -0
- package/dist/domain/workflow/WorkflowStateMachine.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +97 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/adapters/AjvValidationAdapter.d.ts +7 -0
- package/dist/infrastructure/adapters/AjvValidationAdapter.js +37 -0
- package/dist/infrastructure/adapters/AjvValidationAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/ConsoleLoggerAdapter.d.ts +8 -0
- package/dist/infrastructure/adapters/ConsoleLoggerAdapter.js +41 -0
- package/dist/infrastructure/adapters/ConsoleLoggerAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/FileBasedTaskTracker.d.ts +9 -0
- package/dist/infrastructure/adapters/FileBasedTaskTracker.js +41 -0
- package/dist/infrastructure/adapters/FileBasedTaskTracker.js.map +1 -0
- package/dist/infrastructure/adapters/HandlebarsTemplateEngine.d.ts +8 -0
- package/dist/infrastructure/adapters/HandlebarsTemplateEngine.js +38 -0
- package/dist/infrastructure/adapters/HandlebarsTemplateEngine.js.map +1 -0
- package/dist/infrastructure/adapters/JsonConfigurationAdapter.d.ts +7 -0
- package/dist/infrastructure/adapters/JsonConfigurationAdapter.js +24 -0
- package/dist/infrastructure/adapters/JsonConfigurationAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/LinusQualityAnalyzer.d.ts +9 -0
- package/dist/infrastructure/adapters/LinusQualityAnalyzer.js +75 -0
- package/dist/infrastructure/adapters/LinusQualityAnalyzer.js.map +1 -0
- package/dist/infrastructure/adapters/NodeFileSystemAdapter.d.ts +12 -0
- package/dist/infrastructure/adapters/NodeFileSystemAdapter.js +39 -0
- package/dist/infrastructure/adapters/NodeFileSystemAdapter.js.map +1 -0
- package/dist/infrastructure/di/container.d.ts +3 -0
- package/dist/infrastructure/di/container.js +98 -0
- package/dist/infrastructure/di/container.js.map +1 -0
- package/dist/infrastructure/di/types.d.ts +39 -0
- package/dist/infrastructure/di/types.js +45 -0
- package/dist/infrastructure/di/types.js.map +1 -0
- package/dist/infrastructure/i18n/I18nextService.d.ts +27 -0
- package/dist/infrastructure/i18n/I18nextService.js +357 -0
- package/dist/infrastructure/i18n/I18nextService.js.map +1 -0
- package/dist/infrastructure/mcp/CapabilityNegotiator.d.ts +21 -0
- package/dist/infrastructure/mcp/CapabilityNegotiator.js +75 -0
- package/dist/infrastructure/mcp/CapabilityNegotiator.js.map +1 -0
- package/dist/infrastructure/mcp/ErrorHandler.d.ts +29 -0
- package/dist/infrastructure/mcp/ErrorHandler.js +101 -0
- package/dist/infrastructure/mcp/ErrorHandler.js.map +1 -0
- package/dist/infrastructure/mcp/MCPServer.d.ts +25 -0
- package/dist/infrastructure/mcp/MCPServer.js +246 -0
- package/dist/infrastructure/mcp/MCPServer.js.map +1 -0
- package/dist/infrastructure/mcp/PromptManager.d.ts +18 -0
- package/dist/infrastructure/mcp/PromptManager.js +373 -0
- package/dist/infrastructure/mcp/PromptManager.js.map +1 -0
- package/dist/infrastructure/mcp/ResourceManager.d.ts +15 -0
- package/dist/infrastructure/mcp/ResourceManager.js +229 -0
- package/dist/infrastructure/mcp/ResourceManager.js.map +1 -0
- package/dist/infrastructure/mcp/SessionManager.d.ts +64 -0
- package/dist/infrastructure/mcp/SessionManager.js +221 -0
- package/dist/infrastructure/mcp/SessionManager.js.map +1 -0
- package/dist/infrastructure/mcp/ToolRegistry.d.ts +48 -0
- package/dist/infrastructure/mcp/ToolRegistry.js +235 -0
- package/dist/infrastructure/mcp/ToolRegistry.js.map +1 -0
- package/dist/infrastructure/platform/PlatformAdapter.d.ts +46 -0
- package/dist/infrastructure/platform/PlatformAdapter.js +355 -0
- package/dist/infrastructure/platform/PlatformAdapter.js.map +1 -0
- package/dist/infrastructure/plugins/HookSystem.d.ts +40 -0
- package/dist/infrastructure/plugins/HookSystem.js +415 -0
- package/dist/infrastructure/plugins/HookSystem.js.map +1 -0
- package/dist/infrastructure/plugins/PluginManager.d.ts +51 -0
- package/dist/infrastructure/plugins/PluginManager.js +650 -0
- package/dist/infrastructure/plugins/PluginManager.js.map +1 -0
- package/dist/infrastructure/plugins/PluginSteeringRegistry.d.ts +63 -0
- package/dist/infrastructure/plugins/PluginSteeringRegistry.js +439 -0
- package/dist/infrastructure/plugins/PluginSteeringRegistry.js.map +1 -0
- package/dist/infrastructure/plugins/PluginToolRegistry.d.ts +54 -0
- package/dist/infrastructure/plugins/PluginToolRegistry.js +490 -0
- package/dist/infrastructure/plugins/PluginToolRegistry.js.map +1 -0
- package/dist/infrastructure/quality/ASTAnalyzer.d.ts +65 -0
- package/dist/infrastructure/quality/ASTAnalyzer.js +439 -0
- package/dist/infrastructure/quality/ASTAnalyzer.js.map +1 -0
- package/dist/infrastructure/quality/LinusCodeReviewer.d.ts +52 -0
- package/dist/infrastructure/quality/LinusCodeReviewer.js +551 -0
- package/dist/infrastructure/quality/LinusCodeReviewer.js.map +1 -0
- package/dist/infrastructure/repositories/InMemoryProjectRepository.d.ts +10 -0
- package/dist/infrastructure/repositories/InMemoryProjectRepository.js +35 -0
- package/dist/infrastructure/repositories/InMemoryProjectRepository.js.map +1 -0
- package/dist/infrastructure/schemas/project.schema.d.ts +192 -0
- package/dist/infrastructure/schemas/project.schema.js +114 -0
- package/dist/infrastructure/schemas/project.schema.js.map +1 -0
- package/dist/infrastructure/templates/FileGenerator.d.ts +15 -0
- package/dist/infrastructure/templates/FileGenerator.js +385 -0
- package/dist/infrastructure/templates/FileGenerator.js.map +1 -0
- package/dist/infrastructure/templates/HandlebarsRenderer.d.ts +16 -0
- package/dist/infrastructure/templates/HandlebarsRenderer.js +252 -0
- package/dist/infrastructure/templates/HandlebarsRenderer.js.map +1 -0
- package/dist/infrastructure/templates/TemplateManager.d.ts +36 -0
- package/dist/infrastructure/templates/TemplateManager.js +777 -0
- package/dist/infrastructure/templates/TemplateManager.js.map +1 -0
- package/package.json +89 -0
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
// Plugin tool registry implementation for custom tool integration
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
import { injectable, inject } from 'inversify';
|
|
15
|
+
import { EventEmitter } from 'events';
|
|
16
|
+
import { TYPES } from '../di/types.js';
|
|
17
|
+
let PluginToolRegistry = class PluginToolRegistry {
|
|
18
|
+
logger;
|
|
19
|
+
tools = new Map();
|
|
20
|
+
categories = new Map();
|
|
21
|
+
eventEmitter = new EventEmitter();
|
|
22
|
+
metrics = [];
|
|
23
|
+
maxMetricsHistory = 1000;
|
|
24
|
+
securityEnabled = true;
|
|
25
|
+
constructor(logger) {
|
|
26
|
+
this.logger = logger;
|
|
27
|
+
this.initializeCategories();
|
|
28
|
+
}
|
|
29
|
+
async register(pluginId, tool) {
|
|
30
|
+
const toolName = tool.name;
|
|
31
|
+
// Check for conflicts
|
|
32
|
+
if (this.tools.has(toolName)) {
|
|
33
|
+
const existingTool = this.tools.get(toolName);
|
|
34
|
+
if (existingTool.pluginId !== pluginId) {
|
|
35
|
+
throw new Error(`Tool '${toolName}' is already registered by plugin '${existingTool.pluginId}'`);
|
|
36
|
+
}
|
|
37
|
+
this.logger.warn('Tool already registered, replacing', {
|
|
38
|
+
toolName,
|
|
39
|
+
pluginId,
|
|
40
|
+
previousPlugin: existingTool.pluginId
|
|
41
|
+
});
|
|
42
|
+
// Remove from category index
|
|
43
|
+
const categoryTools = this.categories.get(existingTool.category);
|
|
44
|
+
if (categoryTools) {
|
|
45
|
+
categoryTools.delete(toolName);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Validate tool registration
|
|
49
|
+
await this.validateToolRegistration(tool);
|
|
50
|
+
const internalTool = {
|
|
51
|
+
...tool,
|
|
52
|
+
pluginId,
|
|
53
|
+
registeredAt: new Date(),
|
|
54
|
+
executionCount: 0,
|
|
55
|
+
successCount: 0,
|
|
56
|
+
errorCount: 0,
|
|
57
|
+
averageExecutionTime: 0
|
|
58
|
+
};
|
|
59
|
+
this.tools.set(toolName, internalTool);
|
|
60
|
+
// Add to category index
|
|
61
|
+
if (!this.categories.has(tool.category)) {
|
|
62
|
+
this.categories.set(tool.category, new Set());
|
|
63
|
+
}
|
|
64
|
+
this.categories.get(tool.category).add(toolName);
|
|
65
|
+
this.logger.info('Tool registered successfully', {
|
|
66
|
+
toolName,
|
|
67
|
+
pluginId,
|
|
68
|
+
category: tool.category,
|
|
69
|
+
permissions: tool.permissions.length,
|
|
70
|
+
totalTools: this.tools.size
|
|
71
|
+
});
|
|
72
|
+
this.eventEmitter.emit('tool-registered', { toolName, pluginId, tool });
|
|
73
|
+
}
|
|
74
|
+
async unregister(pluginId, toolName) {
|
|
75
|
+
const tool = this.tools.get(toolName);
|
|
76
|
+
if (!tool) {
|
|
77
|
+
this.logger.warn('Tool not found for unregistration', { toolName, pluginId });
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (tool.pluginId !== pluginId) {
|
|
81
|
+
throw new Error(`Tool '${toolName}' is registered by plugin '${tool.pluginId}', not '${pluginId}'`);
|
|
82
|
+
}
|
|
83
|
+
// Remove from tools map
|
|
84
|
+
this.tools.delete(toolName);
|
|
85
|
+
// Remove from category index
|
|
86
|
+
const categoryTools = this.categories.get(tool.category);
|
|
87
|
+
if (categoryTools) {
|
|
88
|
+
categoryTools.delete(toolName);
|
|
89
|
+
}
|
|
90
|
+
this.logger.info('Tool unregistered successfully', {
|
|
91
|
+
toolName,
|
|
92
|
+
pluginId,
|
|
93
|
+
category: tool.category,
|
|
94
|
+
remainingTools: this.tools.size
|
|
95
|
+
});
|
|
96
|
+
this.eventEmitter.emit('tool-unregistered', { toolName, pluginId });
|
|
97
|
+
}
|
|
98
|
+
async execute(toolName, input, context) {
|
|
99
|
+
const tool = this.tools.get(toolName);
|
|
100
|
+
if (!tool) {
|
|
101
|
+
const error = new Error(`Tool '${toolName}' not found`);
|
|
102
|
+
this.logger.error('Tool execution failed - tool not found', { toolName });
|
|
103
|
+
return { success: false, error };
|
|
104
|
+
}
|
|
105
|
+
const startTime = Date.now();
|
|
106
|
+
const inputSize = this.calculateObjectSize(input);
|
|
107
|
+
this.logger.debug('Executing tool', {
|
|
108
|
+
toolName,
|
|
109
|
+
pluginId: tool.pluginId,
|
|
110
|
+
inputSize,
|
|
111
|
+
user: context.user,
|
|
112
|
+
session: context.session
|
|
113
|
+
});
|
|
114
|
+
try {
|
|
115
|
+
// Security checks
|
|
116
|
+
if (this.securityEnabled) {
|
|
117
|
+
const securityCheck = await this.performSecurityChecks(tool, input, context);
|
|
118
|
+
if (!securityCheck.allowed) {
|
|
119
|
+
throw new Error(`Tool execution denied: ${securityCheck.reason}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Input validation
|
|
123
|
+
const inputValidation = await this.validateToolInput(tool, input);
|
|
124
|
+
if (!inputValidation.valid) {
|
|
125
|
+
throw new Error(`Input validation failed: ${inputValidation.errors.join(', ')}`);
|
|
126
|
+
}
|
|
127
|
+
// Execute tool
|
|
128
|
+
const result = await tool.handler(input, context);
|
|
129
|
+
const executionTime = Date.now() - startTime;
|
|
130
|
+
const outputSize = result.data ? this.calculateObjectSize(result.data) : 0;
|
|
131
|
+
// Update metrics
|
|
132
|
+
this.updateToolMetrics(tool, executionTime, true);
|
|
133
|
+
this.recordExecutionMetrics({
|
|
134
|
+
toolName,
|
|
135
|
+
pluginId: tool.pluginId,
|
|
136
|
+
executionTime,
|
|
137
|
+
success: result.success,
|
|
138
|
+
inputSize,
|
|
139
|
+
outputSize,
|
|
140
|
+
error: result.error,
|
|
141
|
+
timestamp: new Date()
|
|
142
|
+
});
|
|
143
|
+
// Output validation
|
|
144
|
+
if (result.success && result.data) {
|
|
145
|
+
const outputValidation = await this.validateToolOutput(tool, result.data);
|
|
146
|
+
if (!outputValidation.valid) {
|
|
147
|
+
this.logger.warn('Tool output validation failed', {
|
|
148
|
+
toolName,
|
|
149
|
+
errors: outputValidation.errors
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
this.logger.info('Tool executed successfully', {
|
|
154
|
+
toolName,
|
|
155
|
+
pluginId: tool.pluginId,
|
|
156
|
+
executionTime,
|
|
157
|
+
success: result.success,
|
|
158
|
+
inputSize,
|
|
159
|
+
outputSize
|
|
160
|
+
});
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
const executionTime = Date.now() - startTime;
|
|
165
|
+
const executionError = error instanceof Error ? error : new Error(String(error));
|
|
166
|
+
// Update metrics
|
|
167
|
+
this.updateToolMetrics(tool, executionTime, false);
|
|
168
|
+
this.recordExecutionMetrics({
|
|
169
|
+
toolName,
|
|
170
|
+
pluginId: tool.pluginId,
|
|
171
|
+
executionTime,
|
|
172
|
+
success: false,
|
|
173
|
+
inputSize,
|
|
174
|
+
outputSize: 0,
|
|
175
|
+
error: executionError,
|
|
176
|
+
timestamp: new Date()
|
|
177
|
+
});
|
|
178
|
+
this.logger.error('Tool execution failed', {
|
|
179
|
+
toolName,
|
|
180
|
+
pluginId: tool.pluginId,
|
|
181
|
+
executionTime,
|
|
182
|
+
error: executionError.message
|
|
183
|
+
});
|
|
184
|
+
return {
|
|
185
|
+
success: false,
|
|
186
|
+
error: executionError,
|
|
187
|
+
metadata: {
|
|
188
|
+
executionTime,
|
|
189
|
+
inputSize,
|
|
190
|
+
pluginId: tool.pluginId
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
async getTool(toolName) {
|
|
196
|
+
const tool = this.tools.get(toolName);
|
|
197
|
+
return tool ? { ...tool } : null;
|
|
198
|
+
}
|
|
199
|
+
async getAllTools() {
|
|
200
|
+
const result = {};
|
|
201
|
+
for (const [toolName, tool] of this.tools.entries()) {
|
|
202
|
+
result[toolName] = { ...tool };
|
|
203
|
+
}
|
|
204
|
+
return result;
|
|
205
|
+
}
|
|
206
|
+
async getToolsByCategory(category) {
|
|
207
|
+
const toolNames = this.categories.get(category);
|
|
208
|
+
if (!toolNames) {
|
|
209
|
+
return [];
|
|
210
|
+
}
|
|
211
|
+
const tools = [];
|
|
212
|
+
for (const toolName of toolNames) {
|
|
213
|
+
const tool = this.tools.get(toolName);
|
|
214
|
+
if (tool) {
|
|
215
|
+
tools.push({ ...tool });
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return tools.sort((a, b) => a.name.localeCompare(b.name));
|
|
219
|
+
}
|
|
220
|
+
// Additional utility methods
|
|
221
|
+
async getToolMetrics(toolName) {
|
|
222
|
+
if (toolName) {
|
|
223
|
+
return this.metrics.filter(m => m.toolName === toolName);
|
|
224
|
+
}
|
|
225
|
+
return [...this.metrics];
|
|
226
|
+
}
|
|
227
|
+
async getToolStatistics(toolName) {
|
|
228
|
+
const tool = this.tools.get(toolName);
|
|
229
|
+
const metrics = this.metrics.filter(m => m.toolName === toolName);
|
|
230
|
+
if (!tool || metrics.length === 0) {
|
|
231
|
+
return {
|
|
232
|
+
totalExecutions: 0,
|
|
233
|
+
successRate: 0,
|
|
234
|
+
averageExecutionTime: 0,
|
|
235
|
+
averageInputSize: 0,
|
|
236
|
+
averageOutputSize: 0,
|
|
237
|
+
errorRate: 0
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
const totalExecutions = metrics.length;
|
|
241
|
+
const successCount = metrics.filter(m => m.success).length;
|
|
242
|
+
const successRate = successCount / totalExecutions;
|
|
243
|
+
const averageExecutionTime = metrics.reduce((sum, m) => sum + m.executionTime, 0) / totalExecutions;
|
|
244
|
+
const averageInputSize = metrics.reduce((sum, m) => sum + m.inputSize, 0) / totalExecutions;
|
|
245
|
+
const averageOutputSize = metrics.reduce((sum, m) => sum + m.outputSize, 0) / totalExecutions;
|
|
246
|
+
const errorRate = (totalExecutions - successCount) / totalExecutions;
|
|
247
|
+
return {
|
|
248
|
+
totalExecutions,
|
|
249
|
+
successRate,
|
|
250
|
+
averageExecutionTime,
|
|
251
|
+
averageInputSize,
|
|
252
|
+
averageOutputSize,
|
|
253
|
+
errorRate,
|
|
254
|
+
lastExecuted: tool.lastExecuted
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
async getToolsByPlugin(pluginId) {
|
|
258
|
+
const tools = [];
|
|
259
|
+
for (const tool of this.tools.values()) {
|
|
260
|
+
if (tool.pluginId === pluginId) {
|
|
261
|
+
tools.push({ ...tool });
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return tools.sort((a, b) => a.name.localeCompare(b.name));
|
|
265
|
+
}
|
|
266
|
+
async clearTools(pluginId) {
|
|
267
|
+
if (pluginId) {
|
|
268
|
+
// Clear all tools for a specific plugin
|
|
269
|
+
const toolsToRemove = [];
|
|
270
|
+
for (const [toolName, tool] of this.tools.entries()) {
|
|
271
|
+
if (tool.pluginId === pluginId) {
|
|
272
|
+
toolsToRemove.push(toolName);
|
|
273
|
+
// Remove from category index
|
|
274
|
+
const categoryTools = this.categories.get(tool.category);
|
|
275
|
+
if (categoryTools) {
|
|
276
|
+
categoryTools.delete(toolName);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
for (const toolName of toolsToRemove) {
|
|
281
|
+
this.tools.delete(toolName);
|
|
282
|
+
}
|
|
283
|
+
this.logger.info('Plugin tools cleared', { pluginId, toolsRemoved: toolsToRemove.length });
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
// Clear all tools
|
|
287
|
+
this.tools.clear();
|
|
288
|
+
for (const categoryTools of this.categories.values()) {
|
|
289
|
+
categoryTools.clear();
|
|
290
|
+
}
|
|
291
|
+
this.logger.info('All tools cleared');
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
// Private helper methods
|
|
295
|
+
initializeCategories() {
|
|
296
|
+
for (const category of Object.values(ToolCategory)) {
|
|
297
|
+
this.categories.set(category, new Set());
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
async validateToolRegistration(tool) {
|
|
301
|
+
if (!tool.name) {
|
|
302
|
+
throw new Error('Tool name is required');
|
|
303
|
+
}
|
|
304
|
+
if (!tool.description) {
|
|
305
|
+
throw new Error('Tool description is required');
|
|
306
|
+
}
|
|
307
|
+
if (!tool.handler || typeof tool.handler !== 'function') {
|
|
308
|
+
throw new Error('Tool handler must be a function');
|
|
309
|
+
}
|
|
310
|
+
// Validate permissions
|
|
311
|
+
for (const permission of tool.permissions) {
|
|
312
|
+
if (!Object.values(PermissionType).includes(permission.type)) {
|
|
313
|
+
throw new Error(`Invalid permission type: ${permission.type}`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
async performSecurityChecks(tool, input, context) {
|
|
318
|
+
// Check tool permissions
|
|
319
|
+
for (const permission of tool.permissions) {
|
|
320
|
+
const hasPermission = await this.checkPermission(permission, context);
|
|
321
|
+
if (!hasPermission) {
|
|
322
|
+
return {
|
|
323
|
+
allowed: false,
|
|
324
|
+
reason: `Missing required permission: ${permission.type} for resource: ${permission.resource}`
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// Check input for security issues
|
|
329
|
+
const securityContext = this.createSecurityContext(context);
|
|
330
|
+
const inputSecurityCheck = await this.checkInputSecurity(input, securityContext);
|
|
331
|
+
if (!inputSecurityCheck.safe) {
|
|
332
|
+
return {
|
|
333
|
+
allowed: false,
|
|
334
|
+
reason: `Input security check failed: ${inputSecurityCheck.reason}`
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
return { allowed: true };
|
|
338
|
+
}
|
|
339
|
+
async checkPermission(permission, context) {
|
|
340
|
+
// In a production environment, this would integrate with a proper permission system
|
|
341
|
+
// For now, we'll do basic checks
|
|
342
|
+
switch (permission.type) {
|
|
343
|
+
case PermissionType.FILE_READ:
|
|
344
|
+
case PermissionType.FILE_WRITE:
|
|
345
|
+
case PermissionType.FILE_EXECUTE:
|
|
346
|
+
// Check if the resource path is allowed
|
|
347
|
+
return this.isPathAllowed(permission.resource);
|
|
348
|
+
case PermissionType.NETWORK_REQUEST:
|
|
349
|
+
// Check if the network request is allowed
|
|
350
|
+
return this.isNetworkRequestAllowed(permission.resource);
|
|
351
|
+
case PermissionType.SYSTEM_INFO:
|
|
352
|
+
case PermissionType.ENVIRONMENT:
|
|
353
|
+
case PermissionType.STORAGE:
|
|
354
|
+
// These might require elevated permissions
|
|
355
|
+
return true; // Allow for now
|
|
356
|
+
default:
|
|
357
|
+
return false;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
isPathAllowed(resourcePath) {
|
|
361
|
+
// Prevent access to sensitive system paths
|
|
362
|
+
const restrictedPaths = [
|
|
363
|
+
'/etc',
|
|
364
|
+
'/System',
|
|
365
|
+
'/var/log',
|
|
366
|
+
'C:\\Windows',
|
|
367
|
+
'C:\\System32'
|
|
368
|
+
];
|
|
369
|
+
return !restrictedPaths.some(restricted => resourcePath.startsWith(restricted));
|
|
370
|
+
}
|
|
371
|
+
isNetworkRequestAllowed(resource) {
|
|
372
|
+
try {
|
|
373
|
+
const url = new URL(resource);
|
|
374
|
+
// Block private/local networks
|
|
375
|
+
const hostname = url.hostname;
|
|
376
|
+
const blockedHosts = ['localhost', '127.0.0.1', '::1'];
|
|
377
|
+
const blockedPatterns = [/^192\.168\./, /^10\./, /^172\.(1[6-9]|2[0-9]|3[0-1])\./];
|
|
378
|
+
if (blockedHosts.includes(hostname)) {
|
|
379
|
+
return false;
|
|
380
|
+
}
|
|
381
|
+
return !blockedPatterns.some(pattern => pattern.test(hostname));
|
|
382
|
+
}
|
|
383
|
+
catch {
|
|
384
|
+
return false;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
createSecurityContext(context) {
|
|
388
|
+
return {
|
|
389
|
+
user: context.user,
|
|
390
|
+
session: context.session,
|
|
391
|
+
permissions: new Set(),
|
|
392
|
+
restrictions: []
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
async checkInputSecurity(input, context) {
|
|
396
|
+
// Check for potential code injection
|
|
397
|
+
const inputString = JSON.stringify(input);
|
|
398
|
+
const dangerousPatterns = [
|
|
399
|
+
/eval\s*\(/i,
|
|
400
|
+
/function\s*\(/i,
|
|
401
|
+
/__proto__/i,
|
|
402
|
+
/constructor/i,
|
|
403
|
+
/prototype/i,
|
|
404
|
+
/<script/i,
|
|
405
|
+
/javascript:/i
|
|
406
|
+
];
|
|
407
|
+
for (const pattern of dangerousPatterns) {
|
|
408
|
+
if (pattern.test(inputString)) {
|
|
409
|
+
return {
|
|
410
|
+
safe: false,
|
|
411
|
+
reason: `Potentially dangerous pattern detected: ${pattern.source}`
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return { safe: true };
|
|
416
|
+
}
|
|
417
|
+
async validateToolInput(tool, input) {
|
|
418
|
+
const errors = [];
|
|
419
|
+
try {
|
|
420
|
+
// Basic JSON schema validation would go here
|
|
421
|
+
// For now, just check that input is an object
|
|
422
|
+
if (typeof input !== 'object' || input === null) {
|
|
423
|
+
errors.push('Input must be an object');
|
|
424
|
+
}
|
|
425
|
+
// Check against tool's input schema if available
|
|
426
|
+
if (tool.inputSchema) {
|
|
427
|
+
// Schema validation would be implemented here
|
|
428
|
+
// This is a simplified version
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
catch (error) {
|
|
432
|
+
errors.push(`Validation error: ${error instanceof Error ? error.message : String(error)}`);
|
|
433
|
+
}
|
|
434
|
+
return {
|
|
435
|
+
valid: errors.length === 0,
|
|
436
|
+
errors
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
async validateToolOutput(tool, output) {
|
|
440
|
+
const errors = [];
|
|
441
|
+
try {
|
|
442
|
+
// Check against tool's output schema if available
|
|
443
|
+
if (tool.outputSchema) {
|
|
444
|
+
// Schema validation would be implemented here
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
catch (error) {
|
|
448
|
+
errors.push(`Output validation error: ${error instanceof Error ? error.message : String(error)}`);
|
|
449
|
+
}
|
|
450
|
+
return {
|
|
451
|
+
valid: errors.length === 0,
|
|
452
|
+
errors
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
calculateObjectSize(obj) {
|
|
456
|
+
try {
|
|
457
|
+
return JSON.stringify(obj).length;
|
|
458
|
+
}
|
|
459
|
+
catch {
|
|
460
|
+
return 0;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
updateToolMetrics(tool, executionTime, success) {
|
|
464
|
+
tool.executionCount++;
|
|
465
|
+
tool.lastExecuted = new Date();
|
|
466
|
+
if (success) {
|
|
467
|
+
tool.successCount++;
|
|
468
|
+
}
|
|
469
|
+
else {
|
|
470
|
+
tool.errorCount++;
|
|
471
|
+
}
|
|
472
|
+
// Update rolling average execution time
|
|
473
|
+
tool.averageExecutionTime =
|
|
474
|
+
(tool.averageExecutionTime * (tool.executionCount - 1) + executionTime) / tool.executionCount;
|
|
475
|
+
}
|
|
476
|
+
recordExecutionMetrics(metrics) {
|
|
477
|
+
this.metrics.push(metrics);
|
|
478
|
+
// Keep only the most recent metrics to prevent memory issues
|
|
479
|
+
if (this.metrics.length > this.maxMetricsHistory) {
|
|
480
|
+
this.metrics.splice(0, this.metrics.length - this.maxMetricsHistory);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
};
|
|
484
|
+
PluginToolRegistry = __decorate([
|
|
485
|
+
injectable(),
|
|
486
|
+
__param(0, inject(TYPES.LoggerPort)),
|
|
487
|
+
__metadata("design:paramtypes", [Object])
|
|
488
|
+
], PluginToolRegistry);
|
|
489
|
+
export { PluginToolRegistry };
|
|
490
|
+
//# sourceMappingURL=PluginToolRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginToolRegistry.js","sourceRoot":"","sources":["../../../src/infrastructure/plugins/PluginToolRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { LoggerPort } from '../../domain/ports.js';
|
|
2
|
+
import type { ProgrammingLanguage, ComplexityHotspot } from '../../domain/quality/index.js';
|
|
3
|
+
export interface ASTNode {
|
|
4
|
+
readonly type: string;
|
|
5
|
+
readonly start?: number;
|
|
6
|
+
readonly end?: number;
|
|
7
|
+
readonly loc?: {
|
|
8
|
+
start: {
|
|
9
|
+
line: number;
|
|
10
|
+
column: number;
|
|
11
|
+
};
|
|
12
|
+
end: {
|
|
13
|
+
line: number;
|
|
14
|
+
column: number;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
readonly [key: string]: unknown;
|
|
18
|
+
}
|
|
19
|
+
export interface ParsedAST {
|
|
20
|
+
readonly ast: ASTNode;
|
|
21
|
+
readonly language: ProgrammingLanguage;
|
|
22
|
+
readonly errors: ParseError[];
|
|
23
|
+
readonly metrics: BasicMetrics;
|
|
24
|
+
}
|
|
25
|
+
export interface ParseError {
|
|
26
|
+
readonly message: string;
|
|
27
|
+
readonly line?: number;
|
|
28
|
+
readonly column?: number;
|
|
29
|
+
readonly severity: 'error' | 'warning';
|
|
30
|
+
}
|
|
31
|
+
export interface BasicMetrics {
|
|
32
|
+
readonly linesOfCode: number;
|
|
33
|
+
readonly linesOfComments: number;
|
|
34
|
+
readonly functionCount: number;
|
|
35
|
+
readonly classCount: number;
|
|
36
|
+
readonly cyclomaticComplexity: number;
|
|
37
|
+
readonly nestingDepth: number;
|
|
38
|
+
}
|
|
39
|
+
export interface ComplexityCalculator {
|
|
40
|
+
calculateCyclomatic(ast: ASTNode): number;
|
|
41
|
+
calculateCognitive(ast: ASTNode): number;
|
|
42
|
+
calculateNesting(ast: ASTNode): number;
|
|
43
|
+
findHotspots(ast: ASTNode): ComplexityHotspot[];
|
|
44
|
+
}
|
|
45
|
+
export declare class ASTAnalyzer {
|
|
46
|
+
private readonly logger;
|
|
47
|
+
constructor(logger: LoggerPort);
|
|
48
|
+
parseFile(content: string, language: ProgrammingLanguage, filePath?: string): Promise<ParsedAST>;
|
|
49
|
+
private parseTypeScript;
|
|
50
|
+
private parseJavaScript;
|
|
51
|
+
private calculateMetrics;
|
|
52
|
+
private countLinesOfCode;
|
|
53
|
+
private countLinesOfComments;
|
|
54
|
+
private countNodes;
|
|
55
|
+
private countFunctions;
|
|
56
|
+
private countClasses;
|
|
57
|
+
private countNodeTypes;
|
|
58
|
+
private calculateCyclomaticComplexity;
|
|
59
|
+
private countLogicalOperators;
|
|
60
|
+
private calculateMaxNestingDepth;
|
|
61
|
+
findComplexityHotspots(ast: ASTNode, filePath?: string): ComplexityHotspot[];
|
|
62
|
+
private findHotspotsRecursive;
|
|
63
|
+
private getFunctionName;
|
|
64
|
+
private getEmptyMetrics;
|
|
65
|
+
}
|