mcp-image 0.1.0 → 0.2.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 (178) hide show
  1. package/README.md +41 -17
  2. package/dist/api/geminiClient.d.ts +2 -12
  3. package/dist/api/geminiClient.d.ts.map +1 -1
  4. package/dist/api/geminiClient.js +28 -56
  5. package/dist/api/geminiClient.js.map +1 -1
  6. package/dist/api/geminiTextClient.d.ts +42 -0
  7. package/dist/api/geminiTextClient.d.ts.map +1 -0
  8. package/dist/api/geminiTextClient.js +198 -0
  9. package/dist/api/geminiTextClient.js.map +1 -0
  10. package/dist/business/__tests__/mocks/mcpSamplingClient.mock.d.ts +84 -0
  11. package/dist/business/__tests__/mocks/mcpSamplingClient.mock.d.ts.map +1 -0
  12. package/dist/business/__tests__/mocks/mcpSamplingClient.mock.js +100 -0
  13. package/dist/business/__tests__/mocks/mcpSamplingClient.mock.js.map +1 -0
  14. package/dist/business/bestPracticesEngine.d.ts +149 -0
  15. package/dist/business/bestPracticesEngine.d.ts.map +1 -0
  16. package/dist/business/bestPracticesEngine.js +781 -0
  17. package/dist/business/bestPracticesEngine.js.map +1 -0
  18. package/dist/business/complexityAssessment.d.ts +132 -0
  19. package/dist/business/complexityAssessment.d.ts.map +1 -0
  20. package/dist/business/complexityAssessment.js +488 -0
  21. package/dist/business/complexityAssessment.js.map +1 -0
  22. package/dist/business/fallbackStrategies.d.ts +177 -0
  23. package/dist/business/fallbackStrategies.d.ts.map +1 -0
  24. package/dist/business/fallbackStrategies.js +368 -0
  25. package/dist/business/fallbackStrategies.js.map +1 -0
  26. package/dist/business/imageGenerator.d.ts.map +1 -1
  27. package/dist/business/imageGenerator.js +26 -5
  28. package/dist/business/imageGenerator.js.map +1 -1
  29. package/dist/business/multiImage/aspectRatioController.d.ts +77 -0
  30. package/dist/business/multiImage/aspectRatioController.d.ts.map +1 -0
  31. package/dist/business/multiImage/aspectRatioController.js +580 -0
  32. package/dist/business/multiImage/aspectRatioController.js.map +1 -0
  33. package/dist/business/multiImage/multiImageCoordinator.d.ts +142 -0
  34. package/dist/business/multiImage/multiImageCoordinator.d.ts.map +1 -0
  35. package/dist/business/multiImage/multiImageCoordinator.js +801 -0
  36. package/dist/business/multiImage/multiImageCoordinator.js.map +1 -0
  37. package/dist/business/pomlTemplateEngine.d.ts +206 -0
  38. package/dist/business/pomlTemplateEngine.d.ts.map +1 -0
  39. package/dist/business/pomlTemplateEngine.js +737 -0
  40. package/dist/business/pomlTemplateEngine.js.map +1 -0
  41. package/dist/business/promptOrchestrator.d.ts +173 -0
  42. package/dist/business/promptOrchestrator.d.ts.map +1 -0
  43. package/dist/business/promptOrchestrator.js +490 -0
  44. package/dist/business/promptOrchestrator.js.map +1 -0
  45. package/dist/business/responseBuilder.d.ts +2 -2
  46. package/dist/business/responseBuilder.d.ts.map +1 -1
  47. package/dist/business/responseBuilder.js +6 -1
  48. package/dist/business/responseBuilder.js.map +1 -1
  49. package/dist/business/structuredPromptGenerator.d.ts +54 -0
  50. package/dist/business/structuredPromptGenerator.d.ts.map +1 -0
  51. package/dist/business/structuredPromptGenerator.js +208 -0
  52. package/dist/business/structuredPromptGenerator.js.map +1 -0
  53. package/dist/business/templateNormalizer.d.ts +81 -0
  54. package/dist/business/templateNormalizer.d.ts.map +1 -0
  55. package/dist/business/templateNormalizer.js +659 -0
  56. package/dist/business/templateNormalizer.js.map +1 -0
  57. package/dist/documentation/apiContractValidation.d.ts +62 -0
  58. package/dist/documentation/apiContractValidation.d.ts.map +1 -0
  59. package/dist/documentation/apiContractValidation.js +305 -0
  60. package/dist/documentation/apiContractValidation.js.map +1 -0
  61. package/dist/infrastructure/concurrency/concurrencyManager.d.ts +101 -0
  62. package/dist/infrastructure/concurrency/concurrencyManager.d.ts.map +1 -0
  63. package/dist/infrastructure/concurrency/concurrencyManager.js +345 -0
  64. package/dist/infrastructure/concurrency/concurrencyManager.js.map +1 -0
  65. package/dist/infrastructure/config/secureConfigManager.d.ts +319 -0
  66. package/dist/infrastructure/config/secureConfigManager.d.ts.map +1 -0
  67. package/dist/infrastructure/config/secureConfigManager.js +600 -0
  68. package/dist/infrastructure/config/secureConfigManager.js.map +1 -0
  69. package/dist/infrastructure/errorHandling/orchestrationErrorHandler.d.ts +229 -0
  70. package/dist/infrastructure/errorHandling/orchestrationErrorHandler.d.ts.map +1 -0
  71. package/dist/infrastructure/errorHandling/orchestrationErrorHandler.js +61 -0
  72. package/dist/infrastructure/errorHandling/orchestrationErrorHandler.js.map +1 -0
  73. package/dist/infrastructure/errorHandling/orchestrationErrorHandlerImpl.d.ts +133 -0
  74. package/dist/infrastructure/errorHandling/orchestrationErrorHandlerImpl.d.ts.map +1 -0
  75. package/dist/infrastructure/errorHandling/orchestrationErrorHandlerImpl.js +569 -0
  76. package/dist/infrastructure/errorHandling/orchestrationErrorHandlerImpl.js.map +1 -0
  77. package/dist/infrastructure/mcp/MCPSamplingClient.d.ts +19 -0
  78. package/dist/infrastructure/mcp/MCPSamplingClient.d.ts.map +1 -0
  79. package/dist/infrastructure/mcp/MCPSamplingClient.js +31 -0
  80. package/dist/infrastructure/mcp/MCPSamplingClient.js.map +1 -0
  81. package/dist/infrastructure/mcp/RealMCPSamplingClient.d.ts +59 -0
  82. package/dist/infrastructure/mcp/RealMCPSamplingClient.d.ts.map +1 -0
  83. package/dist/infrastructure/mcp/RealMCPSamplingClient.js +271 -0
  84. package/dist/infrastructure/mcp/RealMCPSamplingClient.js.map +1 -0
  85. package/dist/infrastructure/metadata/generationMetadata.d.ts +72 -0
  86. package/dist/infrastructure/metadata/generationMetadata.d.ts.map +1 -0
  87. package/dist/infrastructure/metadata/generationMetadata.js +228 -0
  88. package/dist/infrastructure/metadata/generationMetadata.js.map +1 -0
  89. package/dist/infrastructure/monitoring/OrchestrationMetrics.d.ts +106 -0
  90. package/dist/infrastructure/monitoring/OrchestrationMetrics.d.ts.map +1 -0
  91. package/dist/infrastructure/monitoring/OrchestrationMetrics.js +456 -0
  92. package/dist/infrastructure/monitoring/OrchestrationMetrics.js.map +1 -0
  93. package/dist/infrastructure/monitoring/alertingSystem.d.ts +135 -0
  94. package/dist/infrastructure/monitoring/alertingSystem.d.ts.map +1 -0
  95. package/dist/infrastructure/monitoring/alertingSystem.js +549 -0
  96. package/dist/infrastructure/monitoring/alertingSystem.js.map +1 -0
  97. package/dist/infrastructure/optimization/performanceOptimizer.d.ts +89 -0
  98. package/dist/infrastructure/optimization/performanceOptimizer.d.ts.map +1 -0
  99. package/dist/infrastructure/optimization/performanceOptimizer.js +375 -0
  100. package/dist/infrastructure/optimization/performanceOptimizer.js.map +1 -0
  101. package/dist/infrastructure/security/AdvancedContentFilter.d.ts +99 -0
  102. package/dist/infrastructure/security/AdvancedContentFilter.d.ts.map +1 -0
  103. package/dist/infrastructure/security/AdvancedContentFilter.js +363 -0
  104. package/dist/infrastructure/security/AdvancedContentFilter.js.map +1 -0
  105. package/dist/infrastructure/security/MCPSecurityValidator.d.ts +62 -0
  106. package/dist/infrastructure/security/MCPSecurityValidator.d.ts.map +1 -0
  107. package/dist/infrastructure/security/MCPSecurityValidator.js +129 -0
  108. package/dist/infrastructure/security/MCPSecurityValidator.js.map +1 -0
  109. package/dist/infrastructure/security/OrchestrationSecurityMiddleware.d.ts +304 -0
  110. package/dist/infrastructure/security/OrchestrationSecurityMiddleware.d.ts.map +1 -0
  111. package/dist/infrastructure/security/OrchestrationSecurityMiddleware.js +61 -0
  112. package/dist/infrastructure/security/OrchestrationSecurityMiddleware.js.map +1 -0
  113. package/dist/infrastructure/security/OrchestrationSecurityMiddlewareImpl.d.ts +62 -0
  114. package/dist/infrastructure/security/OrchestrationSecurityMiddlewareImpl.d.ts.map +1 -0
  115. package/dist/infrastructure/security/OrchestrationSecurityMiddlewareImpl.js +591 -0
  116. package/dist/infrastructure/security/OrchestrationSecurityMiddlewareImpl.js.map +1 -0
  117. package/dist/infrastructure/security/SecureMCPClient.d.ts +154 -0
  118. package/dist/infrastructure/security/SecureMCPClient.d.ts.map +1 -0
  119. package/dist/infrastructure/security/SecureMCPClient.js +292 -0
  120. package/dist/infrastructure/security/SecureMCPClient.js.map +1 -0
  121. package/dist/infrastructure/security/SecurityIncidentManager.d.ts +142 -0
  122. package/dist/infrastructure/security/SecurityIncidentManager.d.ts.map +1 -0
  123. package/dist/infrastructure/security/SecurityIncidentManager.js +260 -0
  124. package/dist/infrastructure/security/SecurityIncidentManager.js.map +1 -0
  125. package/dist/infrastructure/security/apiKeyManager.d.ts +297 -0
  126. package/dist/infrastructure/security/apiKeyManager.d.ts.map +1 -0
  127. package/dist/infrastructure/security/apiKeyManager.js +254 -0
  128. package/dist/infrastructure/security/apiKeyManager.js.map +1 -0
  129. package/dist/infrastructure/security/dataSanitizer.d.ts +157 -0
  130. package/dist/infrastructure/security/dataSanitizer.d.ts.map +1 -0
  131. package/dist/infrastructure/security/dataSanitizer.js +525 -0
  132. package/dist/infrastructure/security/dataSanitizer.js.map +1 -0
  133. package/dist/infrastructure/validation/inputValidator.d.ts +54 -0
  134. package/dist/infrastructure/validation/inputValidator.d.ts.map +1 -0
  135. package/dist/infrastructure/validation/inputValidator.js +362 -0
  136. package/dist/infrastructure/validation/inputValidator.js.map +1 -0
  137. package/dist/integration/parameterOptimizer.d.ts +69 -0
  138. package/dist/integration/parameterOptimizer.d.ts.map +1 -0
  139. package/dist/integration/parameterOptimizer.js +317 -0
  140. package/dist/integration/parameterOptimizer.js.map +1 -0
  141. package/dist/integration/twoStageProcessor.d.ts +66 -0
  142. package/dist/integration/twoStageProcessor.d.ts.map +1 -0
  143. package/dist/integration/twoStageProcessor.js +348 -0
  144. package/dist/integration/twoStageProcessor.js.map +1 -0
  145. package/dist/server/handlers/structuredPromptHandler.d.ts +65 -0
  146. package/dist/server/handlers/structuredPromptHandler.d.ts.map +1 -0
  147. package/dist/server/handlers/structuredPromptHandler.js +314 -0
  148. package/dist/server/handlers/structuredPromptHandler.js.map +1 -0
  149. package/dist/server/mcpServer.d.ts +16 -35
  150. package/dist/server/mcpServer.d.ts.map +1 -1
  151. package/dist/server/mcpServer.js +111 -150
  152. package/dist/server/mcpServer.js.map +1 -1
  153. package/dist/server/mcpServerWithOrchestration.d.ts +98 -0
  154. package/dist/server/mcpServerWithOrchestration.d.ts.map +1 -0
  155. package/dist/server/mcpServerWithOrchestration.js +284 -0
  156. package/dist/server/mcpServerWithOrchestration.js.map +1 -0
  157. package/dist/types/mcpOrchestrationTypes.d.ts +135 -0
  158. package/dist/types/mcpOrchestrationTypes.d.ts.map +1 -0
  159. package/dist/types/mcpOrchestrationTypes.js +28 -0
  160. package/dist/types/mcpOrchestrationTypes.js.map +1 -0
  161. package/dist/types/multiImageTypes.d.ts +328 -0
  162. package/dist/types/multiImageTypes.d.ts.map +1 -0
  163. package/dist/types/multiImageTypes.js +27 -0
  164. package/dist/types/multiImageTypes.js.map +1 -0
  165. package/dist/types/performanceTypes.d.ts +300 -0
  166. package/dist/types/performanceTypes.d.ts.map +1 -0
  167. package/dist/types/performanceTypes.js +50 -0
  168. package/dist/types/performanceTypes.js.map +1 -0
  169. package/dist/types/twoStageTypes.d.ts +123 -0
  170. package/dist/types/twoStageTypes.d.ts.map +1 -0
  171. package/dist/types/twoStageTypes.js +7 -0
  172. package/dist/types/twoStageTypes.js.map +1 -0
  173. package/dist/utils/config.d.ts +1 -0
  174. package/dist/utils/config.d.ts.map +1 -1
  175. package/dist/utils/config.js +1 -0
  176. package/dist/utils/config.js.map +1 -1
  177. package/package.json +11 -4
  178. package/vitest.config.mjs +0 -47
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+ /**
3
+ * API Key Manager - Secure API key management with rotation and access control
4
+ * Provides separation, protection, and automated management of API keys
5
+ * Addresses SECURITY1 test case requirements
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.APIKeyManager = exports.UnauthorizedAPIAccessError = exports.RestrictionType = exports.SuspiciousActivityType = void 0;
9
+ /**
10
+ * Types of suspicious activity
11
+ */
12
+ var SuspiciousActivityType;
13
+ (function (SuspiciousActivityType) {
14
+ SuspiciousActivityType["UNUSUAL_ACCESS_PATTERN"] = "unusual_access_pattern";
15
+ SuspiciousActivityType["EXCESSIVE_USAGE"] = "excessive_usage";
16
+ SuspiciousActivityType["UNAUTHORIZED_LOCATION"] = "unauthorized_location";
17
+ SuspiciousActivityType["INVALID_PERMISSIONS"] = "invalid_permissions";
18
+ SuspiciousActivityType["RAPID_SUCCESSION_REQUESTS"] = "rapid_succession_requests";
19
+ })(SuspiciousActivityType || (exports.SuspiciousActivityType = SuspiciousActivityType = {}));
20
+ /**
21
+ * Types of authorization restrictions
22
+ */
23
+ var RestrictionType;
24
+ (function (RestrictionType) {
25
+ RestrictionType["TIME_BASED"] = "time_based";
26
+ RestrictionType["IP_BASED"] = "ip_based";
27
+ RestrictionType["RATE_LIMIT"] = "rate_limit";
28
+ RestrictionType["OPERATION_BASED"] = "operation_based";
29
+ RestrictionType["USER_BASED"] = "user_based";
30
+ })(RestrictionType || (exports.RestrictionType = RestrictionType = {}));
31
+ /**
32
+ * Unauthorized API access error
33
+ */
34
+ class UnauthorizedAPIAccessError extends Error {
35
+ constructor(reason) {
36
+ super(`Unauthorized API access: ${reason}`);
37
+ this.name = 'UnauthorizedAPIAccessError';
38
+ }
39
+ }
40
+ exports.UnauthorizedAPIAccessError = UnauthorizedAPIAccessError;
41
+ /**
42
+ * API Key Manager implementation
43
+ */
44
+ class APIKeyManager {
45
+ constructor(keyVault, rotationScheduler, accessLogger) {
46
+ this.keyVault = keyVault;
47
+ this.rotationScheduler = rotationScheduler;
48
+ this.accessLogger = accessLogger;
49
+ }
50
+ /**
51
+ * Get secure API key with authorization validation
52
+ */
53
+ async getAPIKey(service, operation, sessionId) {
54
+ // Validate operation is authorized for this key
55
+ const authorization = await this.validateKeyAuthorization(service, operation);
56
+ if (!authorization.allowed) {
57
+ throw new UnauthorizedAPIAccessError(authorization.reason || 'Access denied');
58
+ }
59
+ // Get appropriate key for service
60
+ const keyInfo = await this.keyVault.retrieveKey(service);
61
+ // Check if key is expired
62
+ if (keyInfo.expiresAt < Date.now()) {
63
+ throw new UnauthorizedAPIAccessError('API key has expired');
64
+ }
65
+ // Log access for security monitoring
66
+ await this.accessLogger.logKeyAccess({
67
+ service,
68
+ operation,
69
+ timestamp: Date.now(),
70
+ keyId: keyInfo.keyId,
71
+ ...(sessionId && { sessionId }),
72
+ success: true,
73
+ });
74
+ return {
75
+ key: keyInfo.key,
76
+ expiresAt: keyInfo.expiresAt,
77
+ permissions: keyInfo.permissions,
78
+ keyId: keyInfo.keyId,
79
+ usageTracking: this.createUsageTracker(keyInfo.keyId),
80
+ };
81
+ }
82
+ /**
83
+ * Rotate API keys according to schedule
84
+ */
85
+ async rotateAPIKeys(schedule) {
86
+ const results = [];
87
+ for (const service of schedule.services) {
88
+ try {
89
+ const oldKey = await this.keyVault.retrieveKey(service);
90
+ const newKey = await this.generateNewKey(service, oldKey.permissions);
91
+ // Gradual rotation with fallback period
92
+ await this.initiateGradualRotation(oldKey, newKey);
93
+ results.push({
94
+ service,
95
+ success: true,
96
+ newKeyId: newKey.keyId,
97
+ rotationTimestamp: Date.now(),
98
+ fallbackPeriodMs: 300000, // 5 minutes fallback
99
+ });
100
+ }
101
+ catch (error) {
102
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
103
+ results.push({
104
+ service,
105
+ success: false,
106
+ error: errorMessage,
107
+ });
108
+ }
109
+ }
110
+ return {
111
+ rotations: results,
112
+ overallSuccess: results.every((r) => r.success),
113
+ timestamp: Date.now(),
114
+ errors: results
115
+ .filter((r) => !r.success)
116
+ .map((r) => r.error)
117
+ .filter(Boolean),
118
+ };
119
+ }
120
+ /**
121
+ * Validate key authorization for operation
122
+ */
123
+ async validateKeyAuthorization(service, operation) {
124
+ try {
125
+ const keyInfo = await this.keyVault.retrieveKey(service);
126
+ // Check if operation is allowed for this key
127
+ if (!keyInfo.permissions.includes(operation) && !keyInfo.permissions.includes('*')) {
128
+ return {
129
+ allowed: false,
130
+ reason: `Operation '${operation}' not permitted for service '${service}'`,
131
+ permissions: keyInfo.permissions,
132
+ restrictions: [],
133
+ };
134
+ }
135
+ return {
136
+ allowed: true,
137
+ permissions: keyInfo.permissions,
138
+ restrictions: [],
139
+ };
140
+ }
141
+ catch (error) {
142
+ return {
143
+ allowed: false,
144
+ reason: `Key not found for service '${service}'`,
145
+ permissions: [],
146
+ restrictions: [],
147
+ };
148
+ }
149
+ }
150
+ /**
151
+ * Generate new key for service
152
+ */
153
+ async generateNewKey(service, permissions) {
154
+ // In a real implementation, this would generate a secure key
155
+ const newKey = this.generateSecureKey();
156
+ const keyId = this.generateKeyId();
157
+ const expiresAt = Date.now() + 90 * 24 * 60 * 60 * 1000; // 90 days
158
+ await this.keyVault.storeKey(service, newKey, permissions, expiresAt);
159
+ return {
160
+ keyId,
161
+ key: newKey,
162
+ permissions,
163
+ createdAt: Date.now(),
164
+ expiresAt,
165
+ usageCount: 0,
166
+ };
167
+ }
168
+ /**
169
+ * Initiate gradual rotation with fallback period
170
+ */
171
+ async initiateGradualRotation(oldKey, newKey) {
172
+ // Implementation would handle gradual transition
173
+ // For now, just log the rotation
174
+ console.log(`Rotating key ${oldKey.keyId} to ${newKey.keyId}`);
175
+ }
176
+ /**
177
+ * Create usage tracker for key
178
+ */
179
+ createUsageTracker(keyId) {
180
+ return {
181
+ trackUsage: (operation, _metadata) => {
182
+ // Implementation would track usage statistics
183
+ console.log(`Tracking usage for key ${keyId}, operation: ${operation}`);
184
+ },
185
+ getUsageStats: (_timeRange) => ({
186
+ totalRequests: 0,
187
+ successfulRequests: 0,
188
+ failedRequests: 0,
189
+ averageResponseTime: 0,
190
+ rateLimitHits: 0,
191
+ costEstimate: 0,
192
+ }),
193
+ resetStats: () => {
194
+ console.log(`Reset stats for key ${keyId}`);
195
+ },
196
+ isRateLimited: () => false,
197
+ };
198
+ }
199
+ /**
200
+ * Generate secure random key
201
+ */
202
+ generateSecureKey() {
203
+ // In production, use cryptographically secure random generation
204
+ return Array.from({ length: 32 }, () => Math.random().toString(36).charAt(2)).join('');
205
+ }
206
+ /**
207
+ * Generate unique key identifier
208
+ */
209
+ generateKeyId() {
210
+ return `key_${Date.now()}_${Math.random().toString(36).slice(2)}`;
211
+ }
212
+ /**
213
+ * Get key rotation status
214
+ */
215
+ async getRotationStatus(service) {
216
+ const schedule = await this.rotationScheduler.getRotationSchedule(service);
217
+ return {
218
+ scheduled: schedule !== null,
219
+ ...(schedule?.nextRotationAt && { nextRotation: schedule.nextRotationAt }),
220
+ // lastRotation would be tracked in real implementation
221
+ };
222
+ }
223
+ /**
224
+ * Security audit of key usage
225
+ */
226
+ async auditKeyUsage(service, timeRange) {
227
+ const keyInfo = await this.keyVault.retrieveKey(service);
228
+ const accessHistory = await this.accessLogger.getAccessHistory(keyInfo.keyId, timeRange);
229
+ const suspiciousActivity = await this.accessLogger.detectSuspiciousActivity(keyInfo.keyId);
230
+ return {
231
+ totalAccess: accessHistory.length,
232
+ suspiciousActivity,
233
+ accessHistory,
234
+ };
235
+ }
236
+ /**
237
+ * Emergency key revocation
238
+ */
239
+ async emergencyRevocation(service, reason) {
240
+ await this.keyVault.removeKey(service);
241
+ await this.rotationScheduler.cancelRotation(service);
242
+ // Log security event
243
+ await this.accessLogger.logKeyAccess({
244
+ service,
245
+ operation: 'EMERGENCY_REVOCATION',
246
+ timestamp: Date.now(),
247
+ keyId: `revoked_${Date.now()}`,
248
+ success: true,
249
+ });
250
+ console.log(`Emergency revocation completed for service ${service}: ${reason}`);
251
+ }
252
+ }
253
+ exports.APIKeyManager = APIKeyManager;
254
+ //# sourceMappingURL=apiKeyManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiKeyManager.js","sourceRoot":"","sources":["../../../src/infrastructure/security/apiKeyManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Data Sanitizer - Comprehensive threat detection and prompt sanitization
3
+ * Detects and mitigates security threats in user prompts and data
4
+ * Addresses SECURITY2 test case requirements
5
+ */
6
+ import { type SanitizedPrompt, SecurityAction, SecuritySeverity, ThreatType } from './OrchestrationSecurityMiddleware';
7
+ /**
8
+ * Threat detection result
9
+ */
10
+ export interface ThreatDetectionResult {
11
+ threatType: ThreatType;
12
+ threatsFound: ThreatMatch[];
13
+ confidence: number;
14
+ severity: SecuritySeverity;
15
+ }
16
+ /**
17
+ * Individual threat match
18
+ */
19
+ export interface ThreatMatch {
20
+ pattern: string;
21
+ severity: SecuritySeverity;
22
+ location: ThreatLocation;
23
+ matchedText: string;
24
+ context: string;
25
+ }
26
+ /**
27
+ * Location of threat in content
28
+ */
29
+ export interface ThreatLocation {
30
+ start: number;
31
+ end: number;
32
+ line?: number;
33
+ column?: number;
34
+ }
35
+ /**
36
+ * Threat detector interface
37
+ */
38
+ export interface ThreatDetector {
39
+ detect(content: string): Promise<ThreatDetectionResult>;
40
+ getPatterns(): SecurityPattern[];
41
+ updatePatterns(patterns: SecurityPattern[]): void;
42
+ }
43
+ /**
44
+ * Security pattern for threat detection
45
+ */
46
+ export interface SecurityPattern {
47
+ id: string;
48
+ pattern: RegExp;
49
+ threatType: ThreatType;
50
+ severity: SecuritySeverity;
51
+ description: string;
52
+ action: SecurityAction;
53
+ confidence: number;
54
+ }
55
+ /**
56
+ * Sanitization rule for content cleaning
57
+ */
58
+ export interface SanitizationRule {
59
+ id: string;
60
+ threatType: ThreatType;
61
+ pattern: RegExp;
62
+ replacement: string | ((match: string) => string);
63
+ preserveContext: boolean;
64
+ logModification: boolean;
65
+ }
66
+ /**
67
+ * Content policy validator
68
+ */
69
+ export interface ContentPolicyValidator {
70
+ validate(content: string): Promise<ContentPolicyResult>;
71
+ getViolations(content: string): Promise<PolicyViolation[]>;
72
+ }
73
+ /**
74
+ * Content policy validation result
75
+ */
76
+ export interface ContentPolicyResult {
77
+ allowed: boolean;
78
+ violations: PolicyViolation[];
79
+ score: number;
80
+ recommendations: string[];
81
+ }
82
+ /**
83
+ * Individual policy violation
84
+ */
85
+ export interface PolicyViolation {
86
+ type: string;
87
+ severity: SecuritySeverity;
88
+ description: string;
89
+ location: ThreatLocation;
90
+ suggestedFix: string;
91
+ }
92
+ /**
93
+ * Data Sanitizer - Main implementation
94
+ */
95
+ export declare class DataSanitizer {
96
+ private threatDetectors;
97
+ private sanitizationRules;
98
+ private contentPolicyValidator;
99
+ constructor();
100
+ /**
101
+ * Sanitize prompt data with comprehensive threat detection
102
+ */
103
+ sanitizePromptData(prompt: string): Promise<SanitizedPrompt>;
104
+ /**
105
+ * Detect prompt injection attempts
106
+ */
107
+ private detectPromptInjection;
108
+ /**
109
+ * Detect sensitive data exposure
110
+ */
111
+ private detectSensitiveData;
112
+ /**
113
+ * Detect malicious patterns
114
+ */
115
+ private detectMaliciousPatterns;
116
+ /**
117
+ * Validate content policy
118
+ */
119
+ private validateContentPolicy;
120
+ /**
121
+ * Apply sanitization for specific threat type
122
+ */
123
+ private applySanitizationForThreatType;
124
+ /**
125
+ * Create sanitization rules
126
+ */
127
+ private createSanitizationRules;
128
+ /**
129
+ * Create content policy validator
130
+ */
131
+ private createContentPolicyValidator;
132
+ /**
133
+ * Get policy violations
134
+ */
135
+ private getViolations;
136
+ /**
137
+ * Compare security severities
138
+ */
139
+ private compareSeverity;
140
+ /**
141
+ * Quick threat check after sanitization
142
+ */
143
+ private quickThreatCheck;
144
+ /**
145
+ * Get sanitization statistics
146
+ */
147
+ getSanitizationStats(): {
148
+ totalRules: number;
149
+ detectors: string[];
150
+ supportedThreatTypes: ThreatType[];
151
+ };
152
+ /**
153
+ * Update threat detection patterns
154
+ */
155
+ updateThreatPatterns(threatType: ThreatType, patterns: SecurityPattern[]): void;
156
+ }
157
+ //# sourceMappingURL=dataSanitizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataSanitizer.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/security/dataSanitizer.ts"],"names":[],"mappings":"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"}