mirror of
https://github.com/czlonkowski/n8n-mcp.git
synced 2026-01-30 06:22:04 +00:00
103 lines
4.1 KiB
JavaScript
103 lines
4.1 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.intentSanitizer = exports.IntentSanitizer = void 0;
|
|
const PII_PATTERNS = {
|
|
email: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/gi,
|
|
url: /https?:\/\/[^\s]+/gi,
|
|
ip: /\b(?:\d{1,3}\.){3}\d{1,3}\b/g,
|
|
phone: /\b(?:\+?\d{1,3}[-.\s]?)?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}\b/g,
|
|
creditCard: /\b\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}\b/g,
|
|
apiKey: /\b[A-Za-z0-9_-]{32,}\b/g,
|
|
uuid: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi,
|
|
filePath: /(?:\/[\w.-]+)+\/?|(?:[A-Z]:\\(?:[\w.-]+\\)*[\w.-]+)/g,
|
|
secret: /\b(?:password|passwd|pwd|secret|token|key)[:=\s]+[^\s]+/gi,
|
|
};
|
|
const COMPANY_PATTERNS = {
|
|
companySuffix: /\b\w+(?:\s+(?:Inc|LLC|Corp|Corporation|Ltd|Limited|GmbH|AG)\.?)\b/gi,
|
|
businessContext: /\b(?:company|organization|client|customer)\s+(?:named?|called)\s+\w+/gi,
|
|
};
|
|
class IntentSanitizer {
|
|
sanitize(intent) {
|
|
if (!intent) {
|
|
return intent;
|
|
}
|
|
let sanitized = intent;
|
|
sanitized = sanitized.replace(PII_PATTERNS.email, '[EMAIL]');
|
|
sanitized = sanitized.replace(PII_PATTERNS.url, '[URL]');
|
|
sanitized = sanitized.replace(PII_PATTERNS.ip, '[IP_ADDRESS]');
|
|
sanitized = sanitized.replace(PII_PATTERNS.phone, '[PHONE]');
|
|
sanitized = sanitized.replace(PII_PATTERNS.creditCard, '[CARD_NUMBER]');
|
|
sanitized = sanitized.replace(PII_PATTERNS.apiKey, '[API_KEY]');
|
|
sanitized = sanitized.replace(PII_PATTERNS.uuid, '[UUID]');
|
|
sanitized = sanitized.replace(PII_PATTERNS.filePath, '[FILE_PATH]');
|
|
sanitized = sanitized.replace(PII_PATTERNS.secret, '[SECRET]');
|
|
sanitized = sanitized.replace(COMPANY_PATTERNS.companySuffix, '[COMPANY]');
|
|
sanitized = sanitized.replace(COMPANY_PATTERNS.businessContext, '[COMPANY_CONTEXT]');
|
|
sanitized = sanitized.replace(/\s{2,}/g, ' ').trim();
|
|
return sanitized;
|
|
}
|
|
containsPII(intent) {
|
|
if (!intent) {
|
|
return false;
|
|
}
|
|
return Object.values(PII_PATTERNS).some((pattern) => pattern.test(intent));
|
|
}
|
|
detectPIITypes(intent) {
|
|
if (!intent) {
|
|
return [];
|
|
}
|
|
const detected = [];
|
|
if (PII_PATTERNS.email.test(intent))
|
|
detected.push('email');
|
|
if (PII_PATTERNS.url.test(intent))
|
|
detected.push('url');
|
|
if (PII_PATTERNS.ip.test(intent))
|
|
detected.push('ip_address');
|
|
if (PII_PATTERNS.phone.test(intent))
|
|
detected.push('phone');
|
|
if (PII_PATTERNS.creditCard.test(intent))
|
|
detected.push('credit_card');
|
|
if (PII_PATTERNS.apiKey.test(intent))
|
|
detected.push('api_key');
|
|
if (PII_PATTERNS.uuid.test(intent))
|
|
detected.push('uuid');
|
|
if (PII_PATTERNS.filePath.test(intent))
|
|
detected.push('file_path');
|
|
if (PII_PATTERNS.secret.test(intent))
|
|
detected.push('secret');
|
|
Object.values(PII_PATTERNS).forEach((pattern) => {
|
|
pattern.lastIndex = 0;
|
|
});
|
|
return detected;
|
|
}
|
|
truncate(intent, maxLength = 1000) {
|
|
if (!intent || intent.length <= maxLength) {
|
|
return intent;
|
|
}
|
|
const truncated = intent.substring(0, maxLength);
|
|
const lastSentence = truncated.lastIndexOf('.');
|
|
const lastSpace = truncated.lastIndexOf(' ');
|
|
if (lastSentence > maxLength * 0.8) {
|
|
return truncated.substring(0, lastSentence + 1);
|
|
}
|
|
else if (lastSpace > maxLength * 0.9) {
|
|
return truncated.substring(0, lastSpace) + '...';
|
|
}
|
|
return truncated + '...';
|
|
}
|
|
isSafeForTelemetry(intent) {
|
|
if (!intent) {
|
|
return true;
|
|
}
|
|
if (intent.length > 5000) {
|
|
return false;
|
|
}
|
|
if (/[\x00-\x08\x0B\x0C\x0E-\x1F]/.test(intent)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
exports.IntentSanitizer = IntentSanitizer;
|
|
exports.intentSanitizer = new IntentSanitizer();
|
|
//# sourceMappingURL=intent-sanitizer.js.map
|