Skip to main content
Glama
intent-sanitizer.js4.15 kB
"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

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/czlonkowski/n8n-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server