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.
Files changed (165) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +256 -0
  3. package/dist/__tests__/setup.d.ts +44 -0
  4. package/dist/__tests__/setup.js +178 -0
  5. package/dist/__tests__/setup.js.map +1 -0
  6. package/dist/__tests__/test-helpers/mock-factories.d.ts +26 -0
  7. package/dist/__tests__/test-helpers/mock-factories.js +466 -0
  8. package/dist/__tests__/test-helpers/mock-factories.js.map +1 -0
  9. package/dist/adapters/cli/SDDToolAdapter.d.ts +26 -0
  10. package/dist/adapters/cli/SDDToolAdapter.js +273 -0
  11. package/dist/adapters/cli/SDDToolAdapter.js.map +1 -0
  12. package/dist/application/services/CodebaseAnalysisService.d.ts +38 -0
  13. package/dist/application/services/CodebaseAnalysisService.js +737 -0
  14. package/dist/application/services/CodebaseAnalysisService.js.map +1 -0
  15. package/dist/application/services/LocalizationService.d.ts +184 -0
  16. package/dist/application/services/LocalizationService.js +536 -0
  17. package/dist/application/services/LocalizationService.js.map +1 -0
  18. package/dist/application/services/ProjectContextService.d.ts +61 -0
  19. package/dist/application/services/ProjectContextService.js +550 -0
  20. package/dist/application/services/ProjectContextService.js.map +1 -0
  21. package/dist/application/services/ProjectInitializationService.d.ts +57 -0
  22. package/dist/application/services/ProjectInitializationService.js +485 -0
  23. package/dist/application/services/ProjectInitializationService.js.map +1 -0
  24. package/dist/application/services/ProjectService.d.ts +19 -0
  25. package/dist/application/services/ProjectService.js +159 -0
  26. package/dist/application/services/ProjectService.js.map +1 -0
  27. package/dist/application/services/QualityGateService.d.ts +62 -0
  28. package/dist/application/services/QualityGateService.js +428 -0
  29. package/dist/application/services/QualityGateService.js.map +1 -0
  30. package/dist/application/services/QualityService.d.ts +43 -0
  31. package/dist/application/services/QualityService.js +245 -0
  32. package/dist/application/services/QualityService.js.map +1 -0
  33. package/dist/application/services/SteeringDocumentService.d.ts +62 -0
  34. package/dist/application/services/SteeringDocumentService.js +694 -0
  35. package/dist/application/services/SteeringDocumentService.js.map +1 -0
  36. package/dist/application/services/TemplateService.d.ts +47 -0
  37. package/dist/application/services/TemplateService.js +438 -0
  38. package/dist/application/services/TemplateService.js.map +1 -0
  39. package/dist/application/services/WorkflowEngineService.d.ts +56 -0
  40. package/dist/application/services/WorkflowEngineService.js +348 -0
  41. package/dist/application/services/WorkflowEngineService.js.map +1 -0
  42. package/dist/application/services/WorkflowService.d.ts +22 -0
  43. package/dist/application/services/WorkflowService.js +147 -0
  44. package/dist/application/services/WorkflowService.js.map +1 -0
  45. package/dist/application/services/WorkflowValidationService.d.ts +51 -0
  46. package/dist/application/services/WorkflowValidationService.js +665 -0
  47. package/dist/application/services/WorkflowValidationService.js.map +1 -0
  48. package/dist/domain/context/ProjectContext.d.ts +350 -0
  49. package/dist/domain/context/ProjectContext.js +138 -0
  50. package/dist/domain/context/ProjectContext.js.map +1 -0
  51. package/dist/domain/i18n/index.d.ts +286 -0
  52. package/dist/domain/i18n/index.js +97 -0
  53. package/dist/domain/i18n/index.js.map +1 -0
  54. package/dist/domain/plugins/index.d.ts +498 -0
  55. package/dist/domain/plugins/index.js +157 -0
  56. package/dist/domain/plugins/index.js.map +1 -0
  57. package/dist/domain/ports.d.ts +54 -0
  58. package/dist/domain/ports.js +3 -0
  59. package/dist/domain/ports.js.map +1 -0
  60. package/dist/domain/quality/index.d.ts +361 -0
  61. package/dist/domain/quality/index.js +113 -0
  62. package/dist/domain/quality/index.js.map +1 -0
  63. package/dist/domain/services/DomainService.d.ts +18 -0
  64. package/dist/domain/services/DomainService.js +71 -0
  65. package/dist/domain/services/DomainService.js.map +1 -0
  66. package/dist/domain/templates/index.d.ts +158 -0
  67. package/dist/domain/templates/index.js +22 -0
  68. package/dist/domain/templates/index.js.map +1 -0
  69. package/dist/domain/types.d.ts +115 -0
  70. package/dist/domain/types.js +37 -0
  71. package/dist/domain/types.js.map +1 -0
  72. package/dist/domain/workflow/WorkflowStateMachine.d.ts +62 -0
  73. package/dist/domain/workflow/WorkflowStateMachine.js +286 -0
  74. package/dist/domain/workflow/WorkflowStateMachine.js.map +1 -0
  75. package/dist/index.d.ts +19 -0
  76. package/dist/index.js +97 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/infrastructure/adapters/AjvValidationAdapter.d.ts +7 -0
  79. package/dist/infrastructure/adapters/AjvValidationAdapter.js +37 -0
  80. package/dist/infrastructure/adapters/AjvValidationAdapter.js.map +1 -0
  81. package/dist/infrastructure/adapters/ConsoleLoggerAdapter.d.ts +8 -0
  82. package/dist/infrastructure/adapters/ConsoleLoggerAdapter.js +41 -0
  83. package/dist/infrastructure/adapters/ConsoleLoggerAdapter.js.map +1 -0
  84. package/dist/infrastructure/adapters/FileBasedTaskTracker.d.ts +9 -0
  85. package/dist/infrastructure/adapters/FileBasedTaskTracker.js +41 -0
  86. package/dist/infrastructure/adapters/FileBasedTaskTracker.js.map +1 -0
  87. package/dist/infrastructure/adapters/HandlebarsTemplateEngine.d.ts +8 -0
  88. package/dist/infrastructure/adapters/HandlebarsTemplateEngine.js +38 -0
  89. package/dist/infrastructure/adapters/HandlebarsTemplateEngine.js.map +1 -0
  90. package/dist/infrastructure/adapters/JsonConfigurationAdapter.d.ts +7 -0
  91. package/dist/infrastructure/adapters/JsonConfigurationAdapter.js +24 -0
  92. package/dist/infrastructure/adapters/JsonConfigurationAdapter.js.map +1 -0
  93. package/dist/infrastructure/adapters/LinusQualityAnalyzer.d.ts +9 -0
  94. package/dist/infrastructure/adapters/LinusQualityAnalyzer.js +75 -0
  95. package/dist/infrastructure/adapters/LinusQualityAnalyzer.js.map +1 -0
  96. package/dist/infrastructure/adapters/NodeFileSystemAdapter.d.ts +12 -0
  97. package/dist/infrastructure/adapters/NodeFileSystemAdapter.js +39 -0
  98. package/dist/infrastructure/adapters/NodeFileSystemAdapter.js.map +1 -0
  99. package/dist/infrastructure/di/container.d.ts +3 -0
  100. package/dist/infrastructure/di/container.js +98 -0
  101. package/dist/infrastructure/di/container.js.map +1 -0
  102. package/dist/infrastructure/di/types.d.ts +39 -0
  103. package/dist/infrastructure/di/types.js +45 -0
  104. package/dist/infrastructure/di/types.js.map +1 -0
  105. package/dist/infrastructure/i18n/I18nextService.d.ts +27 -0
  106. package/dist/infrastructure/i18n/I18nextService.js +357 -0
  107. package/dist/infrastructure/i18n/I18nextService.js.map +1 -0
  108. package/dist/infrastructure/mcp/CapabilityNegotiator.d.ts +21 -0
  109. package/dist/infrastructure/mcp/CapabilityNegotiator.js +75 -0
  110. package/dist/infrastructure/mcp/CapabilityNegotiator.js.map +1 -0
  111. package/dist/infrastructure/mcp/ErrorHandler.d.ts +29 -0
  112. package/dist/infrastructure/mcp/ErrorHandler.js +101 -0
  113. package/dist/infrastructure/mcp/ErrorHandler.js.map +1 -0
  114. package/dist/infrastructure/mcp/MCPServer.d.ts +25 -0
  115. package/dist/infrastructure/mcp/MCPServer.js +246 -0
  116. package/dist/infrastructure/mcp/MCPServer.js.map +1 -0
  117. package/dist/infrastructure/mcp/PromptManager.d.ts +18 -0
  118. package/dist/infrastructure/mcp/PromptManager.js +373 -0
  119. package/dist/infrastructure/mcp/PromptManager.js.map +1 -0
  120. package/dist/infrastructure/mcp/ResourceManager.d.ts +15 -0
  121. package/dist/infrastructure/mcp/ResourceManager.js +229 -0
  122. package/dist/infrastructure/mcp/ResourceManager.js.map +1 -0
  123. package/dist/infrastructure/mcp/SessionManager.d.ts +64 -0
  124. package/dist/infrastructure/mcp/SessionManager.js +221 -0
  125. package/dist/infrastructure/mcp/SessionManager.js.map +1 -0
  126. package/dist/infrastructure/mcp/ToolRegistry.d.ts +48 -0
  127. package/dist/infrastructure/mcp/ToolRegistry.js +235 -0
  128. package/dist/infrastructure/mcp/ToolRegistry.js.map +1 -0
  129. package/dist/infrastructure/platform/PlatformAdapter.d.ts +46 -0
  130. package/dist/infrastructure/platform/PlatformAdapter.js +355 -0
  131. package/dist/infrastructure/platform/PlatformAdapter.js.map +1 -0
  132. package/dist/infrastructure/plugins/HookSystem.d.ts +40 -0
  133. package/dist/infrastructure/plugins/HookSystem.js +415 -0
  134. package/dist/infrastructure/plugins/HookSystem.js.map +1 -0
  135. package/dist/infrastructure/plugins/PluginManager.d.ts +51 -0
  136. package/dist/infrastructure/plugins/PluginManager.js +650 -0
  137. package/dist/infrastructure/plugins/PluginManager.js.map +1 -0
  138. package/dist/infrastructure/plugins/PluginSteeringRegistry.d.ts +63 -0
  139. package/dist/infrastructure/plugins/PluginSteeringRegistry.js +439 -0
  140. package/dist/infrastructure/plugins/PluginSteeringRegistry.js.map +1 -0
  141. package/dist/infrastructure/plugins/PluginToolRegistry.d.ts +54 -0
  142. package/dist/infrastructure/plugins/PluginToolRegistry.js +490 -0
  143. package/dist/infrastructure/plugins/PluginToolRegistry.js.map +1 -0
  144. package/dist/infrastructure/quality/ASTAnalyzer.d.ts +65 -0
  145. package/dist/infrastructure/quality/ASTAnalyzer.js +439 -0
  146. package/dist/infrastructure/quality/ASTAnalyzer.js.map +1 -0
  147. package/dist/infrastructure/quality/LinusCodeReviewer.d.ts +52 -0
  148. package/dist/infrastructure/quality/LinusCodeReviewer.js +551 -0
  149. package/dist/infrastructure/quality/LinusCodeReviewer.js.map +1 -0
  150. package/dist/infrastructure/repositories/InMemoryProjectRepository.d.ts +10 -0
  151. package/dist/infrastructure/repositories/InMemoryProjectRepository.js +35 -0
  152. package/dist/infrastructure/repositories/InMemoryProjectRepository.js.map +1 -0
  153. package/dist/infrastructure/schemas/project.schema.d.ts +192 -0
  154. package/dist/infrastructure/schemas/project.schema.js +114 -0
  155. package/dist/infrastructure/schemas/project.schema.js.map +1 -0
  156. package/dist/infrastructure/templates/FileGenerator.d.ts +15 -0
  157. package/dist/infrastructure/templates/FileGenerator.js +385 -0
  158. package/dist/infrastructure/templates/FileGenerator.js.map +1 -0
  159. package/dist/infrastructure/templates/HandlebarsRenderer.d.ts +16 -0
  160. package/dist/infrastructure/templates/HandlebarsRenderer.js +252 -0
  161. package/dist/infrastructure/templates/HandlebarsRenderer.js.map +1 -0
  162. package/dist/infrastructure/templates/TemplateManager.d.ts +36 -0
  163. package/dist/infrastructure/templates/TemplateManager.js +777 -0
  164. package/dist/infrastructure/templates/TemplateManager.js.map +1 -0
  165. 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":"AAAA,kEAAkE;;;;;;;;;;;;;AAElE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAWtC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAqChC,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IASgB;IAR5B,KAAK,GAAG,IAAI,GAAG,EAAoC,CAAC;IACpD,UAAU,GAAG,IAAI,GAAG,EAA6B,CAAC;IAClD,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IAClC,OAAO,GAA2B,EAAE,CAAC;IACrC,iBAAiB,GAAG,IAAI,CAAC;IACzB,eAAe,GAAG,IAAI,CAAC;IAExC,YAC6C,MAAkB;QAAlB,WAAM,GAAN,MAAM,CAAY;QAE7D,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,IAAsB;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;QAE3B,sBAAsB;QACtB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;YAC/C,IAAI,YAAY,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CAAC,SAAS,QAAQ,sCAAsC,YAAY,CAAC,QAAQ,GAAG,CAAC,CAAC;YACnG,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE;gBACrD,QAAQ;gBACR,QAAQ;gBACR,cAAc,EAAE,YAAY,CAAC,QAAQ;aACtC,CAAC,CAAC;YAEH,6BAA6B;YAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACjE,IAAI,aAAa,EAAE,CAAC;gBAClB,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAE1C,MAAM,YAAY,GAA6B;YAC7C,GAAG,IAAI;YACP,QAAQ;YACR,YAAY,EAAE,IAAI,IAAI,EAAE;YACxB,cAAc,EAAE,CAAC;YACjB,YAAY,EAAE,CAAC;YACf,UAAU,EAAE,CAAC;YACb,oBAAoB,EAAE,CAAC;SACxB,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAEvC,wBAAwB;QACxB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;YAC/C,QAAQ;YACR,QAAQ;YACR,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM;YACpC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;SAC5B,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,QAAgB;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC9E,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,SAAS,QAAQ,8BAA8B,IAAI,CAAC,QAAQ,WAAW,QAAQ,GAAG,CAAC,CAAC;QACtG,CAAC;QAED,wBAAwB;QACxB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE5B,6BAA6B;QAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,aAAa,EAAE,CAAC;YAClB,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE;YACjD,QAAQ;YACR,QAAQ;YACR,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;SAChC,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAgB,EAAE,KAA8B,EAAE,OAA6B;QAC3F,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,SAAS,QAAQ,aAAa,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACnC,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE;YAClC,QAAQ;YACR,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS;YACT,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,kBAAkB;YAClB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;gBAC7E,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;oBAC3B,MAAM,IAAI,KAAK,CAAC,0BAA0B,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;YAED,mBAAmB;YACnB,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAClE,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,4BAA4B,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnF,CAAC;YAED,eAAe;YACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAElD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAE3E,iBAAiB;YACjB,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;YAClD,IAAI,CAAC,sBAAsB,CAAC;gBAC1B,QAAQ;gBACR,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,aAAa;gBACb,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,SAAS;gBACT,UAAU;gBACV,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC,CAAC;YAEH,oBAAoB;YACpB,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAClC,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC1E,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;oBAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE;wBAChD,QAAQ;wBACR,MAAM,EAAE,gBAAgB,CAAC,MAAM;qBAChC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;gBAC7C,QAAQ;gBACR,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,aAAa;gBACb,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,SAAS;gBACT,UAAU;aACX,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;QAEhB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC7C,MAAM,cAAc,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAEjF,iBAAiB;YACjB,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;YACnD,IAAI,CAAC,sBAAsB,CAAC;gBAC1B,QAAQ;gBACR,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,aAAa;gBACb,OAAO,EAAE,KAAK;gBACd,SAAS;gBACT,UAAU,EAAE,CAAC;gBACb,KAAK,EAAE,cAAc;gBACrB,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;gBACzC,QAAQ;gBACR,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,aAAa;gBACb,KAAK,EAAE,cAAc,CAAC,OAAO;aAC9B,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,cAAc;gBACrB,QAAQ,EAAE;oBACR,aAAa;oBACb,SAAS;oBACT,QAAQ,EAAE,IAAI,CAAC,QAAQ;iBACxB;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAgB;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,MAAM,GAAqC,EAAE,CAAC;QAEpD,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACpD,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;QACjC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,QAAsB;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,GAAuB,EAAE,CAAC;QACrC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,IAAI,EAAE,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,6BAA6B;IAC7B,KAAK,CAAC,cAAc,CAAC,QAAiB;QACpC,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,QAAgB;QAStC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QAElE,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO;gBACL,eAAe,EAAE,CAAC;gBAClB,WAAW,EAAE,CAAC;gBACd,oBAAoB,EAAE,CAAC;gBACvB,gBAAgB,EAAE,CAAC;gBACnB,iBAAiB,EAAE,CAAC;gBACpB,SAAS,EAAE,CAAC;aACb,CAAC;QACJ,CAAC;QAED,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;QACvC,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAC3D,MAAM,WAAW,GAAG,YAAY,GAAG,eAAe,CAAC;QACnD,MAAM,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,eAAe,CAAC;QACpG,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,eAAe,CAAC;QAC5F,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,GAAG,eAAe,CAAC;QAC9F,MAAM,SAAS,GAAG,CAAC,eAAe,GAAG,YAAY,CAAC,GAAG,eAAe,CAAC;QAErE,OAAO;YACL,eAAe;YACf,WAAW;YACX,oBAAoB;YACpB,gBAAgB;YAChB,iBAAiB;YACjB,SAAS;YACT,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QACrC,MAAM,KAAK,GAAuB,EAAE,CAAC;QAErC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAiB;QAChC,IAAI,QAAQ,EAAE,CAAC;YACb,wCAAwC;YACxC,MAAM,aAAa,GAAa,EAAE,CAAC;YAEnC,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;gBACpD,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC/B,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAE7B,6BAA6B;oBAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACzD,IAAI,aAAa,EAAE,CAAC;wBAClB,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACjC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;gBACrC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7F,CAAC;aAAM,CAAC;YACN,kBAAkB;YAClB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnB,KAAK,MAAM,aAAa,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;gBACrD,aAAa,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,yBAAyB;IACjB,oBAAoB;QAC1B,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,wBAAwB,CAAC,IAAsB;QAC3D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,uBAAuB;QACvB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7D,MAAM,IAAI,KAAK,CAAC,4BAA4B,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,IAA8B,EAAE,KAA8B,EAAE,OAA6B;QAC/H,yBAAyB;QACzB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACtE,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,gCAAgC,UAAU,CAAC,IAAI,kBAAkB,UAAU,CAAC,QAAQ,EAAE;iBAC/F,CAAC;YACJ,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QACjF,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;YAC7B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,gCAAgC,kBAAkB,CAAC,MAAM,EAAE;aACpE,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,UAA0B,EAAE,OAA6B;QACrF,oFAAoF;QACpF,iCAAiC;QAEjC,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;YACxB,KAAK,cAAc,CAAC,SAAS,CAAC;YAC9B,KAAK,cAAc,CAAC,UAAU,CAAC;YAC/B,KAAK,cAAc,CAAC,YAAY;gBAC9B,wCAAwC;gBACxC,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAEjD,KAAK,cAAc,CAAC,eAAe;gBACjC,0CAA0C;gBAC1C,OAAO,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAE3D,KAAK,cAAc,CAAC,WAAW,CAAC;YAChC,KAAK,cAAc,CAAC,WAAW,CAAC;YAChC,KAAK,cAAc,CAAC,OAAO;gBACzB,2CAA2C;gBAC3C,OAAO,IAAI,CAAC,CAAC,gBAAgB;YAE/B;gBACE,OAAO,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,YAAoB;QACxC,2CAA2C;QAC3C,MAAM,eAAe,GAAG;YACtB,MAAM;YACN,SAAS;YACT,UAAU;YACV,aAAa;YACb,cAAc;SACf,CAAC;QAEF,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IAClF,CAAC;IAEO,uBAAuB,CAAC,QAAgB;QAC9C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;YAE9B,+BAA+B;YAC/B,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;YAC9B,MAAM,YAAY,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YACvD,MAAM,eAAe,GAAG,CAAC,aAAa,EAAE,OAAO,EAAE,gCAAgC,CAAC,CAAC;YAEnF,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,OAA6B;QACzD,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,WAAW,EAAE,IAAI,GAAG,EAAE;YACtB,YAAY,EAAE,EAAE;SACjB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,KAA8B,EAAE,OAA4B;QAC3F,qCAAqC;QACrC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,iBAAiB,GAAG;YACxB,YAAY;YACZ,gBAAgB;YAChB,YAAY;YACZ,cAAc;YACd,YAAY;YACZ,UAAU;YACV,cAAc;SACf,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;YACxC,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC9B,OAAO;oBACL,IAAI,EAAE,KAAK;oBACX,MAAM,EAAE,2CAA2C,OAAO,CAAC,MAAM,EAAE;iBACpE,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,IAA8B,EAAE,KAA8B;QAC5F,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC;YACH,6CAA6C;YAC7C,8CAA8C;YAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAChD,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACzC,CAAC;YAED,iDAAiD;YACjD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,8CAA8C;gBAC9C,+BAA+B;YACjC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,qBAAqB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7F,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,MAAM;SACP,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,IAA8B,EAAE,MAA+B;QAC9F,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC;YACH,kDAAkD;YAClD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,8CAA8C;YAChD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpG,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,MAAM;SACP,CAAC;IACJ,CAAC;IAEO,mBAAmB,CAAC,GAAY;QACtC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,IAA8B,EAAE,aAAqB,EAAE,OAAgB;QAC/F,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;QAE/B,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC,oBAAoB;YACvB,CAAC,IAAI,CAAC,oBAAoB,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;IAClG,CAAC;IAEO,sBAAsB,CAAC,OAA6B;QAC1D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE3B,6DAA6D;QAC7D,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACjD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;CACF,CAAA;AA3iBY,kBAAkB;IAD9B,UAAU,EAAE;IAUR,WAAA,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;;GAThB,kBAAkB,CA2iB9B"}
@@ -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
+ }