@floatingsidewal/bulkhead-core 0.3.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/README.md +142 -0
- package/dist/cascade/bert-worker.js +84 -0
- package/dist/cascade/bert-worker.js.map +1 -0
- package/dist/cascade/index.d.mts +1 -0
- package/dist/cascade/index.d.ts +1 -0
- package/dist/cascade/index.js +386 -0
- package/dist/cascade/index.js.map +1 -0
- package/dist/cascade/index.mjs +11 -0
- package/dist/cascade/index.mjs.map +1 -0
- package/dist/chunk-4KUXRYNS.mjs +358 -0
- package/dist/chunk-4KUXRYNS.mjs.map +1 -0
- package/dist/index-BNiM_sPB.d.mts +237 -0
- package/dist/index-BNiM_sPB.d.ts +237 -0
- package/dist/index.d.mts +265 -0
- package/dist/index.d.ts +265 -0
- package/dist/index.js +3470 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +3082 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/policy/risk.ts","../src/engine/engine.ts","../src/guards/base.guard.ts","../src/validators/checksums.ts","../src/patterns/pii/generic.ts","../src/patterns/pii/us.ts","../src/patterns/pii/uk.ts","../src/patterns/pii/eu.ts","../src/validators/verhoeff.ts","../src/patterns/pii/apac.ts","../src/patterns/pii/index.ts","../src/guards/pii.guard.ts","../src/patterns/secrets/cloud.ts","../src/patterns/secrets/source-control.ts","../src/patterns/secrets/cicd.ts","../src/patterns/secrets/communication.ts","../src/patterns/secrets/payment.ts","../src/patterns/secrets/database.ts","../src/patterns/secrets/infrastructure.ts","../src/patterns/secrets/saas.ts","../src/patterns/secrets/ai-ml.ts","../src/patterns/secrets/auth.ts","../src/patterns/secrets/cdn-hosting.ts","../src/patterns/secrets/social.ts","../src/patterns/secrets/generic.ts","../src/patterns/secrets/index.ts","../src/guards/secret.guard.ts","../src/patterns/injection.ts","../src/guards/injection.guard.ts","../src/guards/leakage.guard.ts","../src/guards/testdata.guard.ts","../src/policy/presets.ts","../src/policy/resolve.ts","../src/index.ts"],"sourcesContent":["import type { GuardResult } from \"../types\";\nimport type {\n PolicyDefinition,\n RiskAssessment,\n RiskLevel,\n ClassifiedIssue,\n TestDataFlag,\n} from \"./types\";\n\n/**\n * Compute a risk assessment from guard results and a policy definition.\n * Pure function — no side effects, no engine mutation.\n */\nexport function assessRisk(\n results: GuardResult[],\n policy: PolicyDefinition\n): RiskAssessment {\n const allDetections = results.flatMap((r) => r.detections);\n\n // Separate test-data detections from real detections\n const testDetections = allDetections.filter((d) =>\n d.entityType.startsWith(\"TEST_DATA_\")\n );\n const realDetections = allDetections.filter(\n (d) => !d.entityType.startsWith(\"TEST_DATA_\")\n );\n\n // Build test data flags\n const testDataFlags: TestDataFlag[] = testDetections.map((d) => ({\n value: d.text,\n reason: d.entityType.toLowerCase().replace(\"test_data_\", \"\") + \"-pattern\",\n start: d.start,\n end: d.end,\n }));\n\n // Aggregate score from real detections only\n // (test data shouldn't inflate the risk score)\n const score =\n realDetections.length > 0\n ? Math.max(...realDetections.map((d) => d.score))\n : 0;\n\n const level = scoreToLevel(score, policy.riskThresholds);\n\n // Per-guard breakdown (excluding testdata guard)\n const guards: RiskAssessment[\"guards\"] = {};\n for (const result of results) {\n if (result.guardName === \"testdata\") continue;\n const guardDetections = result.detections.filter(\n (d) => !d.entityType.startsWith(\"TEST_DATA_\")\n );\n guards[result.guardName] = {\n level: scoreToLevel(result.score, policy.riskThresholds),\n score: result.score,\n detectionCount: guardDetections.length,\n };\n }\n\n // Classify issues by entity type\n const issues = classifyIssues(realDetections, testDetections, policy);\n\n return { level, score, guards, issues, testDataFlags };\n}\n\nfunction scoreToLevel(\n score: number,\n thresholds: PolicyDefinition[\"riskThresholds\"]\n): RiskLevel {\n if (score >= thresholds.critical) return \"critical\";\n if (score >= thresholds.high) return \"high\";\n if (score >= thresholds.medium) return \"medium\";\n if (score >= thresholds.low) return \"low\";\n return \"none\";\n}\n\nfunction classifyIssues(\n realDetections: GuardResult[\"detections\"],\n testDetections: GuardResult[\"detections\"],\n policy: PolicyDefinition\n): ClassifiedIssue[] {\n // Group real detections by guardName + entityType\n const groups = new Map<\n string,\n { detections: typeof realDetections; guardName: string; entityType: string }\n >();\n\n for (const d of realDetections) {\n const key = `${d.guardName}:${d.entityType}`;\n const group = groups.get(key);\n if (group) {\n group.detections.push(d);\n } else {\n groups.set(key, {\n detections: [d],\n guardName: d.guardName,\n entityType: d.entityType,\n });\n }\n }\n\n const issues: ClassifiedIssue[] = [];\n\n for (const [, group] of groups) {\n const maxScore = Math.max(...group.detections.map((d) => d.score));\n const severity = scoreToLevel(maxScore, policy.riskThresholds);\n\n // Check if any detection in this group overlaps with test data\n const isTestData = group.detections.some((d) =>\n testDetections.some(\n (td) => d.start < td.end && d.end > td.start\n )\n );\n\n const category = guardNameToCategory(group.guardName);\n const sample = group.detections[0]?.text?.slice(0, 50);\n\n issues.push({\n category,\n entityType: group.entityType,\n severity,\n count: group.detections.length,\n isTestData,\n sample,\n });\n }\n\n // Sort: critical first, then by count\n return issues.sort((a, b) => {\n const levelOrder: Record<RiskLevel, number> = {\n critical: 0,\n high: 1,\n medium: 2,\n low: 3,\n none: 4,\n };\n const levelDiff = levelOrder[a.severity] - levelOrder[b.severity];\n if (levelDiff !== 0) return levelDiff;\n return b.count - a.count;\n });\n}\n\nfunction guardNameToCategory(\n guardName: string\n): ClassifiedIssue[\"category\"] {\n switch (guardName) {\n case \"pii\":\n return \"pii\";\n case \"secret\":\n return \"secret\";\n case \"injection\":\n return \"injection\";\n case \"leakage\":\n return \"leakage\";\n default:\n return \"pii\"; // fallback for cascade-bert etc\n }\n}\n","import type { Guard, GuardResult, EngineConfig, GuardConfig } from \"../types\";\nimport {\n CascadeClassifier,\n type CascadeConfig,\n} from \"../cascade/cascade\";\nimport type { PolicyDefinition, RiskAssessment } from \"../policy/types\";\nimport { assessRisk } from \"../policy/risk\";\n\n/** Orchestrates multiple guards and aggregates results */\nexport class GuardrailsEngine {\n private guards: Guard[] = [];\n private config: EngineConfig;\n private cascade: CascadeClassifier | null = null;\n\n constructor(config?: Partial<EngineConfig>) {\n this.config = {\n guards: {},\n ...config,\n };\n }\n\n /** Register a guard with the engine */\n addGuard(guard: Guard): this {\n this.guards.push(guard);\n return this;\n }\n\n /** Register multiple guards */\n addGuards(guards: Guard[]): this {\n for (const guard of guards) {\n this.addGuard(guard);\n }\n return this;\n }\n\n /** Get configuration for a specific guard */\n private getGuardConfig(guardName: string): Partial<GuardConfig> | undefined {\n return this.config.guards[guardName];\n }\n\n /** Run all enabled guards against the input text */\n async analyze(text: string): Promise<GuardResult[]> {\n const results: GuardResult[] = [];\n\n for (const guard of this.guards) {\n const guardConfig = this.getGuardConfig(guard.name);\n\n // Skip disabled guards\n if (guardConfig?.enabled === false) {\n continue;\n }\n\n const result = await guard.analyze(text, guardConfig);\n results.push(result);\n }\n\n return results;\n }\n\n /** Run all guards and return a single pass/fail with all detections */\n async scan(text: string): Promise<{\n passed: boolean;\n results: GuardResult[];\n redactedText?: string;\n }> {\n const results = await this.analyze(text);\n const passed = results.every((r) => r.passed);\n\n // Build redacted text by applying all redactions\n let redactedText: string | undefined;\n for (const result of results) {\n if (result.redactedText) {\n redactedText = result.redactedText;\n }\n }\n\n return { passed, results, redactedText };\n }\n\n /** Get list of registered guard names */\n get guardNames(): string[] {\n return this.guards.map((g) => g.name);\n }\n\n /** Whether the cascade is ready (BERT model loaded if enabled) */\n get cascadeReady(): boolean {\n if (!this.cascade) return true; // No cascade = regex only, always ready\n return this.cascade.ready;\n }\n\n /** Initialize or update the cascade classifier */\n initCascade(config?: Partial<CascadeConfig>): CascadeClassifier {\n this.cascade = new CascadeClassifier(config);\n for (const guard of this.guards) {\n this.cascade.addRegexGuard(guard);\n }\n return this.cascade;\n }\n\n /** Run the full cascade (regex + BERT + optional LLM) */\n async deepScan(text: string): Promise<GuardResult[]> {\n if (!this.cascade) {\n // Fall back to regex-only if cascade not initialized\n return this.analyze(text);\n }\n const cascadeResult = await this.cascade.deepScan(text);\n return [cascadeResult];\n }\n\n /** Run regex + BERT only (no LLM) */\n async modelScan(text: string): Promise<GuardResult[]> {\n if (!this.cascade) {\n return this.analyze(text);\n }\n const cascadeResult = await this.cascade.modelScan(text);\n return [cascadeResult];\n }\n\n /** Update engine configuration */\n updateConfig(config: Partial<EngineConfig>): void {\n this.config = { ...this.config, ...config };\n if (config.guards) {\n this.config.guards = { ...this.config.guards, ...config.guards };\n }\n }\n\n /** Run all guards and return risk assessment alongside results */\n async policyScan(\n text: string,\n policy: PolicyDefinition\n ): Promise<{\n passed: boolean;\n risk: RiskAssessment;\n results: GuardResult[];\n redactedText?: string;\n }> {\n const { passed, results, redactedText } = await this.scan(text);\n const risk = assessRisk(results, policy);\n return { passed, risk, results, redactedText };\n }\n\n /** Clean up resources (terminate BERT worker, etc.) */\n async dispose(): Promise<void> {\n if (this.cascade) {\n await this.cascade.dispose();\n this.cascade = null;\n }\n }\n}\n","import type {\n Guard,\n GuardResult,\n GuardConfig,\n Detection,\n GuardMode,\n DetectionSource,\n Disposition,\n} from \"../types\";\n\nconst CONTEXT_RADIUS = 150;\n\nconst DEFAULT_CONFIG: GuardConfig = {\n enabled: true,\n threshold: 0.5,\n mode: \"redact\",\n};\n\n/** Base class for guards that detect patterns in text */\nexport abstract class BaseGuard implements Guard {\n abstract readonly name: string;\n\n protected mergeConfig(config?: Partial<GuardConfig>): GuardConfig {\n return { ...DEFAULT_CONFIG, ...config };\n }\n\n abstract analyze(\n text: string,\n config?: Partial<GuardConfig>\n ): Promise<GuardResult>;\n\n /** Build a GuardResult from detections */\n protected buildResult(\n text: string,\n detections: Detection[],\n mode: GuardMode\n ): GuardResult {\n const passed = detections.length === 0;\n const score =\n detections.length > 0\n ? Math.max(...detections.map((d) => d.score))\n : 0;\n\n let reason: string;\n if (passed) {\n reason = \"No issues detected\";\n } else {\n const types = [...new Set(detections.map((d) => d.entityType))];\n reason = `Detected: ${types.join(\", \")}`;\n }\n\n const result: GuardResult = {\n passed,\n reason,\n guardName: this.name,\n score,\n detections,\n };\n\n if (mode === \"redact\" && !passed) {\n result.redactedText = this.applyRedactions(text, detections);\n }\n\n return result;\n }\n\n /** Extract surrounding context for a detection */\n protected extractContext(\n text: string,\n start: number,\n end: number\n ): string {\n const ctxStart = Math.max(0, start - CONTEXT_RADIUS);\n const ctxEnd = Math.min(text.length, end + CONTEXT_RADIUS);\n return text.slice(ctxStart, ctxEnd);\n }\n\n /** Create a detection with provenance fields pre-filled for regex source */\n protected makeDetection(\n text: string,\n partial: Omit<Detection, \"source\" | \"context\" | \"disposition\">,\n source: DetectionSource = \"regex\",\n disposition: Disposition = \"confirmed\"\n ): Detection {\n return {\n ...partial,\n source,\n context: this.extractContext(text, partial.start, partial.end),\n disposition,\n };\n }\n\n /** Replace detected text with [REDACTED-TYPE] markers */\n protected applyRedactions(text: string, detections: Detection[]): string {\n // Sort detections by start position descending so replacements don't shift offsets\n const sorted = [...detections].sort((a, b) => b.start - a.start);\n let result = text;\n for (const detection of sorted) {\n const replacement = `[REDACTED-${detection.entityType}]`;\n result =\n result.slice(0, detection.start) +\n replacement +\n result.slice(detection.end);\n }\n return result;\n }\n}\n","/**\n * Checksum validation algorithms ported from Microsoft Presidio.\n * See ATTRIBUTION.md for details.\n */\n\n/** Luhn algorithm for credit card validation */\nexport function luhn(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length === 0) return false;\n\n let sum = 0;\n let alternate = false;\n for (let i = digits.length - 1; i >= 0; i--) {\n let n = parseInt(digits[i], 10);\n if (alternate) {\n n *= 2;\n if (n > 9) n -= 9;\n }\n sum += n;\n alternate = !alternate;\n }\n return sum % 10 === 0;\n}\n\n/** IBAN mod-97 checksum validation */\nexport function ibanMod97(iban: string): boolean {\n const cleaned = iban.replace(/[\\s-]/g, \"\").toUpperCase();\n if (cleaned.length < 4) return false;\n\n // Move first 4 chars to end\n const rearranged = cleaned.slice(4) + cleaned.slice(0, 4);\n\n // Convert letters to numbers (A=10, B=11, ..., Z=35)\n let numeric = \"\";\n for (const char of rearranged) {\n const code = char.charCodeAt(0);\n if (code >= 65 && code <= 90) {\n numeric += (code - 55).toString();\n } else {\n numeric += char;\n }\n }\n\n // Mod 97 in chunks (to avoid BigInt for most cases)\n let remainder = 0;\n for (const char of numeric) {\n remainder = (remainder * 10 + parseInt(char, 10)) % 97;\n }\n\n return remainder === 1;\n}\n\n/** ABA routing number checksum: weights [3,7,1,3,7,1,3,7,1] mod 10 */\nexport function abaRouting(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 9) return false;\n\n const weights = [3, 7, 1, 3, 7, 1, 3, 7, 1];\n let sum = 0;\n for (let i = 0; i < 9; i++) {\n sum += parseInt(digits[i], 10) * weights[i];\n }\n return sum % 10 === 0;\n}\n\n/** NPI Luhn checksum with \"80840\" prefix per CMS spec */\nexport function npiLuhn(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 10) return false;\n\n const prefixed = \"80840\" + digits;\n const nums = prefixed.split(\"\").map(Number);\n\n let checksum = 0;\n for (let i = nums.length - 1; i >= 0; i--) {\n const pos = nums.length - 1 - i;\n let n = nums[i];\n if (pos % 2 === 1) {\n n *= 2;\n if (n > 9) n -= 9;\n }\n checksum += n;\n }\n return checksum % 10 === 0;\n}\n\n/** DEA medical license checksum (modified Luhn) */\nexport function deaChecksum(value: string): boolean {\n const cleaned = value.replace(/[\\s-]/g, \"\");\n if (cleaned.length < 3) return false;\n\n const numericPart = cleaned.slice(2);\n const digits = numericPart.split(\"\").map(Number);\n if (digits.some(isNaN)) return false;\n\n const check = digits.pop()!;\n const even = digits.filter((_, i) => i % 2 === 0);\n const odd = digits.filter((_, i) => i % 2 === 1);\n\n const sum =\n 2 * even.reduce((a, b) => a + b, 0) + odd.reduce((a, b) => a + b, 0);\n return (sum - check) % 10 === 0;\n}\n\n/** Shannon entropy calculation for secret detection */\nexport function shannonEntropy(value: string): number {\n if (value.length === 0) return 0;\n\n const freq = new Map<string, number>();\n for (const char of value) {\n freq.set(char, (freq.get(char) || 0) + 1);\n }\n\n let entropy = 0;\n for (const count of freq.values()) {\n const p = count / value.length;\n if (p > 0) {\n entropy -= p * Math.log2(p);\n }\n }\n return entropy;\n}\n\n/** US SSN validation — rejects known invalid patterns */\nexport function validateSsn(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 9) return false;\n\n // All same digit\n if (digits.split(\"\").every((c) => c === digits[0])) return false;\n\n // Group cannot be all zeros\n if (digits.slice(3, 5) === \"00\") return false;\n if (digits.slice(5) === \"0000\") return false;\n\n // Known invalid prefixes\n const invalidPrefixes = [\"000\", \"666\", \"123456789\", \"98765432\", \"078051120\"];\n for (const prefix of invalidPrefixes) {\n if (digits.startsWith(prefix)) return false;\n }\n\n // Area number cannot start with 9 (reserved for ITIN)\n if (digits[0] === \"9\") return false;\n\n return true;\n}\n\n/** Validate MAC address — reject broadcast and null */\nexport function validateMac(value: string): boolean {\n const cleaned = value.replace(/[:\\-.]/g, \"\").toUpperCase();\n if (!/^[0-9A-F]{12}$/.test(cleaned)) return false;\n if (cleaned === \"FFFFFFFFFFFF\") return false; // broadcast\n if (cleaned === \"000000000000\") return false; // null\n return true;\n}\n","/**\n * Generic PII patterns — not country-specific.\n * Ported from Microsoft Presidio. See ATTRIBUTION.md.\n */\n\nimport type { PiiPattern } from \"../../types\";\nimport { luhn, ibanMod97, validateMac } from \"../../validators/checksums\";\n\nexport const CREDIT_CARD: PiiPattern = {\n entityType: \"CREDIT_CARD\",\n patterns: [\n /\\b(?!1\\d{12}(?!\\d))((4\\d{3})|(5[0-5]\\d{2})|(6\\d{3})|(1\\d{3})|(3\\d{3}))[- ]?(\\d{3,4})[- ]?(\\d{3,4})[- ]?(\\d{3,5})\\b/g,\n ],\n validate: (match) => luhn(match.replace(/[\\s-]/g, \"\")),\n contextWords: [\n \"credit\",\n \"card\",\n \"visa\",\n \"mastercard\",\n \"cc\",\n \"amex\",\n \"discover\",\n \"jcb\",\n \"diners\",\n \"maestro\",\n \"instapayment\",\n ],\n baseConfidence: \"medium\",\n baseScore: 0.3,\n};\n\nexport const EMAIL_ADDRESS: PiiPattern = {\n entityType: \"EMAIL_ADDRESS\",\n patterns: [\n /\\b(?:[a-zA-Z0-9!#$%&'*+\\-/=?^_`{|}~](?:[a-zA-Z0-9!#$%&'*+\\-/=?^_`{|}~.]{0,62}[a-zA-Z0-9!#$%&'*+\\-/=?^_`{|}~])?)@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\\.[a-zA-Z]{2,}\\b/g,\n ],\n contextWords: [\"email\", \"e-mail\", \"mail\"],\n baseConfidence: \"medium\",\n baseScore: 0.5,\n};\n\nexport const IBAN_CODE: PiiPattern = {\n entityType: \"IBAN_CODE\",\n patterns: [\n /(?<![A-Z0-9])([A-Z]{2}[0-9]{2}(?:[ -]?[A-Z0-9]{4}){2,7}(?:[ -]?[A-Z0-9]{1,4})?)(?![A-Z0-9])/g,\n ],\n validate: (match) => ibanMod97(match),\n contextWords: [\"iban\", \"bank\", \"transaction\"],\n baseConfidence: \"medium\",\n baseScore: 0.5,\n};\n\nexport const IP_ADDRESS: PiiPattern = {\n entityType: \"IP_ADDRESS\",\n patterns: [\n // IPv4\n /\\b(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\b/g,\n // IPv6 (simplified — common formats)\n /\\b(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\\b/g,\n /\\b(?:[0-9a-fA-F]{1,4}:){1,7}:\\b/g,\n /\\b(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}\\b/g,\n ],\n contextWords: [\"ip\", \"ipv4\", \"ipv6\", \"address\"],\n baseConfidence: \"medium\",\n baseScore: 0.6,\n};\n\nexport const MAC_ADDRESS: PiiPattern = {\n entityType: \"MAC_ADDRESS\",\n patterns: [\n // Colon or hyphen separated\n /\\b[0-9A-Fa-f]{2}([:-])(?:[0-9A-Fa-f]{2}\\1){4}[0-9A-Fa-f]{2}\\b/g,\n // Cisco dot format\n /\\b[0-9A-Fa-f]{4}\\.[0-9A-Fa-f]{4}\\.[0-9A-Fa-f]{4}\\b/g,\n ],\n validate: validateMac,\n contextWords: [\n \"mac\",\n \"mac address\",\n \"hardware address\",\n \"physical address\",\n \"ethernet\",\n ],\n baseConfidence: \"medium\",\n baseScore: 0.6,\n};\n\nexport const PHONE_NUMBER: PiiPattern = {\n entityType: \"PHONE_NUMBER\",\n patterns: [\n // International format\n /\\b\\+?1?[\\s.-]?\\(?\\d{3}\\)?[\\s.-]?\\d{3}[\\s.-]?\\d{4}\\b/g,\n // International with country code\n /\\b\\+\\d{1,3}[\\s.-]?\\(?\\d{1,4}\\)?[\\s.-]?\\d{2,4}[\\s.-]?\\d{2,4}[\\s.-]?\\d{0,4}\\b/g,\n ],\n contextWords: [\n \"phone\",\n \"number\",\n \"telephone\",\n \"cell\",\n \"cellphone\",\n \"mobile\",\n \"call\",\n \"tel\",\n \"fax\",\n ],\n baseConfidence: \"low\",\n baseScore: 0.4,\n};\n\nexport const URL: PiiPattern = {\n entityType: \"URL\",\n patterns: [\n /\\bhttps?:\\/\\/[^\\s<>\"']+/gi,\n /\\bwww\\.[^\\s<>\"']+/gi,\n ],\n contextWords: [\"url\", \"website\", \"link\", \"href\"],\n baseConfidence: \"medium\",\n baseScore: 0.6,\n};\n\nexport const CRYPTO: PiiPattern = {\n entityType: \"CRYPTO\",\n patterns: [\n // Bitcoin addresses (P2PKH, P2SH, Bech32)\n /(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,59}/g,\n ],\n contextWords: [\"wallet\", \"btc\", \"bitcoin\", \"crypto\", \"blockchain\"],\n baseConfidence: \"medium\",\n baseScore: 0.5,\n};\n\nexport const DATE_TIME: PiiPattern = {\n entityType: \"DATE_TIME\",\n patterns: [\n // ISO 8601\n /\\b\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[+-][0-2]\\d:[0-5]\\d|Z)\\b/g,\n // mm/dd/yyyy or dd/mm/yyyy\n /\\b(?:[0-3]?\\d[/.-][0-3]?\\d[/.-](?:\\d{4}|\\d{2}))\\b/g,\n // yyyy-mm-dd\n /\\b\\d{4}[/.-](?:0?[1-9]|1[0-2])[/.-](?:0?[1-9]|[12]\\d|3[01])\\b/g,\n ],\n contextWords: [\"date\", \"birthday\", \"born\", \"dob\"],\n baseConfidence: \"low\",\n baseScore: 0.3,\n};\n\n/** All generic PII patterns */\nexport const GENERIC_PATTERNS: PiiPattern[] = [\n CREDIT_CARD,\n EMAIL_ADDRESS,\n IBAN_CODE,\n IP_ADDRESS,\n MAC_ADDRESS,\n PHONE_NUMBER,\n URL,\n CRYPTO,\n DATE_TIME,\n];\n","/**\n * US-specific PII patterns.\n * Ported from Microsoft Presidio. See ATTRIBUTION.md.\n */\n\nimport type { PiiPattern } from \"../../types\";\nimport {\n validateSsn,\n luhn,\n npiLuhn,\n abaRouting,\n deaChecksum,\n} from \"../../validators/checksums\";\n\nexport const US_SSN: PiiPattern = {\n entityType: \"US_SSN\",\n patterns: [\n // SSN with delimiters (medium confidence)\n /\\b(\\d{3})[- .](\\d{2})[- .](\\d{4})\\b/g,\n // SSN without delimiters (very weak — needs context)\n /\\b\\d{9}\\b/g,\n ],\n validate: validateSsn,\n contextWords: [\"social\", \"security\", \"ssn\", \"ssns\", \"ssid\"],\n baseConfidence: \"medium\",\n baseScore: 0.5,\n};\n\nexport const US_DRIVER_LICENSE: PiiPattern = {\n entityType: \"US_DRIVER_LICENSE\",\n patterns: [\n // State-specific alphanumeric formats\n /\\b(?:[A-Z]\\d{3,6}|[A-Z]\\d{5,9}|[A-Z]\\d{6,8}|[A-Z]\\d{4,8}|[A-Z]\\d{9,11}|[A-Z]{1,2}\\d{5,6}|H\\d{8}|V\\d{6}|X\\d{8}|[A-Z]{2}\\d{2,5}|[A-Z]{2}\\d{3,7}|\\d{2}[A-Z]{3}\\d{5,6}|[A-Z]\\d{13,14}|[A-Z]\\d{18}|[A-Z]\\d{6}R|[A-Z]\\d{9}|[A-Z]\\d{1,12}|\\d{9}[A-Z]|[A-Z]{2}\\d{6}[A-Z]|\\d{8}[A-Z]{2}|\\d{3}[A-Z]{2}\\d{4}|[A-Z]\\d[A-Z]\\d[A-Z]|\\d{7,8}[A-Z])\\b/g,\n ],\n contextWords: [\n \"driver\",\n \"license\",\n \"permit\",\n \"lic\",\n \"identification\",\n \"dls\",\n \"cdls\",\n \"driving\",\n ],\n baseConfidence: \"low\",\n baseScore: 0.3,\n};\n\nexport const US_PASSPORT: PiiPattern = {\n entityType: \"US_PASSPORT\",\n patterns: [\n // Next generation passport (letter + 8 digits)\n /\\b[A-Z]\\d{8}\\b/g,\n // Standard passport (9 digits)\n /\\b\\d{9}\\b/g,\n ],\n contextWords: [\n \"us\",\n \"united\",\n \"states\",\n \"passport\",\n \"travel\",\n \"document\",\n ],\n baseConfidence: \"low\",\n baseScore: 0.1,\n};\n\nexport const US_BANK_NUMBER: PiiPattern = {\n entityType: \"US_BANK_NUMBER\",\n patterns: [/\\b\\d{8,17}\\b/g],\n contextWords: [\n \"check\",\n \"account\",\n \"acct\",\n \"bank\",\n \"save\",\n \"debit\",\n \"routing\",\n ],\n baseConfidence: \"low\",\n baseScore: 0.05,\n};\n\nexport const US_ITIN: PiiPattern = {\n entityType: \"US_ITIN\",\n patterns: [\n // With delimiters (medium)\n /\\b9\\d{2}[- ](5\\d|6[0-5]|7\\d|8[0-8]|9[0-24-9])[- ]\\d{4}\\b/g,\n // Without delimiters (weak)\n /\\b9\\d{2}(5\\d|6[0-5]|7\\d|8[0-8]|9[0-24-9])\\d{4}\\b/g,\n ],\n contextWords: [\n \"individual\",\n \"taxpayer\",\n \"itin\",\n \"tax\",\n \"payer\",\n \"taxid\",\n \"tin\",\n ],\n baseConfidence: \"medium\",\n baseScore: 0.5,\n};\n\nexport const US_MBI: PiiPattern = {\n entityType: \"US_MBI\",\n patterns: (() => {\n // MBI format: C A AN N A AN N A A N N\n // Valid letters: A-Z excluding S, L, O, I, B, Z\n const A = \"[ACDEFGHJKMNPQRTUVWXY]\";\n const AN = \"[0-9ACDEFGHJKMNPQRTUVWXY]\";\n const N = \"[0-9]\";\n const base = `${N}${A}${AN}${N}${A}${AN}${N}${A}${A}${N}${N}`;\n const withDash = `${N}${A}${AN}${N}-${A}${AN}${N}-${A}${A}${N}${N}`;\n return [new RegExp(`\\\\b${base}\\\\b`, \"g\"), new RegExp(`\\\\b${withDash}\\\\b`, \"g\")];\n })(),\n contextWords: [\n \"medicare\",\n \"mbi\",\n \"beneficiary\",\n \"cms\",\n \"medicaid\",\n \"hic\",\n \"hicn\",\n ],\n baseConfidence: \"medium\",\n baseScore: 0.5,\n};\n\nexport const US_NPI: PiiPattern = {\n entityType: \"US_NPI\",\n patterns: [\n // With delimiters\n /\\b[12]\\d{3}[ -]\\d{3}[ -]\\d{3}\\b/g,\n // Without delimiters\n /\\b[12]\\d{9}\\b/g,\n ],\n validate: (match) => {\n const digits = match.replace(/\\D/g, \"\");\n // Reject all same digits\n if (digits.length > 1 && new Set(digits.slice(0, -1)).size === 1) return false;\n return npiLuhn(match);\n },\n contextWords: [\n \"npi\",\n \"national provider\",\n \"provider\",\n \"provider id\",\n \"provider identifier\",\n \"taxonomy\",\n ],\n baseConfidence: \"low\",\n baseScore: 0.1,\n};\n\nexport const ABA_ROUTING_NUMBER: PiiPattern = {\n entityType: \"ABA_ROUTING_NUMBER\",\n patterns: [\n // With dashes\n /\\b[0123678]\\d{3}-\\d{4}-\\d\\b/g,\n // Without dashes\n /\\b[0123678]\\d{8}\\b/g,\n ],\n validate: abaRouting,\n contextWords: [\n \"aba\",\n \"routing\",\n \"abarouting\",\n \"association\",\n \"bankrouting\",\n ],\n baseConfidence: \"low\",\n baseScore: 0.05,\n};\n\nexport const MEDICAL_LICENSE: PiiPattern = {\n entityType: \"MEDICAL_LICENSE\",\n patterns: [\n /[abcdefghjklmprstuxABCDEFGHJKLMPRSTUX][a-zA-Z]\\d{7}/g,\n /[abcdefghjklmprstuxABCDEFGHJKLMPRSTUX]9\\d{7}/g,\n ],\n validate: deaChecksum,\n contextWords: [\"medical\", \"certificate\", \"DEA\", \"dea\"],\n baseConfidence: \"low\",\n baseScore: 0.4,\n};\n\n/** All US-specific PII patterns */\nexport const US_PATTERNS: PiiPattern[] = [\n US_SSN,\n US_DRIVER_LICENSE,\n US_PASSPORT,\n US_BANK_NUMBER,\n US_ITIN,\n US_MBI,\n US_NPI,\n ABA_ROUTING_NUMBER,\n MEDICAL_LICENSE,\n];\n","/**\n * UK-specific PII patterns.\n * Ported from Microsoft Presidio. See ATTRIBUTION.md.\n */\n\nimport type { PiiPattern } from \"../../types\";\n\nexport const UK_NHS: PiiPattern = {\n entityType: \"UK_NHS\",\n patterns: [/\\b(\\d{3})[- ]?(\\d{3})[- ]?(\\d{4})\\b/g],\n validate: (match) => {\n const digits = match.replace(/\\D/g, \"\");\n if (digits.length !== 10) return false;\n let total = 0;\n for (let i = 0; i < 10; i++) {\n total += parseInt(digits[i], 10) * (10 - i);\n }\n return total % 11 === 0;\n },\n contextWords: [\n \"national health service\",\n \"nhs\",\n \"health services authority\",\n \"health authority\",\n ],\n baseConfidence: \"medium\",\n baseScore: 0.5,\n};\n\nexport const UK_NINO: PiiPattern = {\n entityType: \"UK_NINO\",\n patterns: [\n /\\b(?!BG|GB|NK|KN|NT|TN|ZZ)(?:[A-CEGHJ-PR-TW-Z][A-CEGHJ-NPR-TW-Z])\\s?\\d{2}\\s?\\d{2}\\s?\\d{2}\\s?[A-D]\\b/gi,\n ],\n contextWords: [\"national insurance\", \"ni number\", \"nino\"],\n baseConfidence: \"medium\",\n baseScore: 0.5,\n};\n\nexport const UK_PASSPORT: PiiPattern = {\n entityType: \"UK_PASSPORT\",\n patterns: [/\\b[A-Z]{2}\\d{7}\\b/g],\n contextWords: [\n \"passport\",\n \"passport number\",\n \"travel document\",\n \"uk passport\",\n \"british passport\",\n \"her majesty\",\n \"his majesty\",\n \"hm passport\",\n \"hmpo\",\n ],\n baseConfidence: \"low\",\n baseScore: 0.1,\n};\n\nexport const UK_POSTCODE: PiiPattern = {\n entityType: \"UK_POSTCODE\",\n patterns: [\n /\\b(?:GIR\\s?0AA|[A-PR-UWYZ]\\d[A-HJKPSTUW]?\\s?\\d[ABD-HJLNP-UW-Z]{2}|[A-PR-UWYZ]\\d{2}\\s?\\d[ABD-HJLNP-UW-Z]{2}|[A-PR-UWYZ][A-HK-Y]\\d[ABEHMNPRVWXY]?\\s?\\d[ABD-HJLNP-UW-Z]{2}|[A-PR-UWYZ][A-HK-Y]\\d{2}\\s?\\d[ABD-HJLNP-UW-Z]{2})\\b/g,\n ],\n contextWords: [\n \"postcode\",\n \"post code\",\n \"postal code\",\n \"zip\",\n \"address\",\n \"delivery\",\n \"mailing\",\n \"shipping\",\n ],\n baseConfidence: \"low\",\n baseScore: 0.1,\n};\n\nexport const UK_VEHICLE_REGISTRATION: PiiPattern = {\n entityType: \"UK_VEHICLE_REGISTRATION\",\n patterns: [\n // Current format\n /\\b[A-HJ-PR-Y]{2}(?:0[1-9]|[1-7]\\d)[- ]?[A-HJ-PR-Z]{3}\\b/g,\n // Prefix format\n /\\b[A-HJ-NPR-TV-Y]\\d{1,3}[- ]?[A-HJ-PR-Y][A-HJ-PR-Z]{2}\\b/g,\n // Suffix format\n /\\b[A-HJ-PR-Z]{3}[- ]?\\d{1,3}[- ]?[A-HJ-NPR-TV-Y]\\b/g,\n ],\n contextWords: [\n \"vehicle\",\n \"registration\",\n \"number plate\",\n \"licence plate\",\n \"license plate\",\n \"reg\",\n \"vrn\",\n \"dvla\",\n \"v5c\",\n \"mot\",\n \"car\",\n ],\n baseConfidence: \"low\",\n baseScore: 0.2,\n};\n\n/** All UK-specific PII patterns */\nexport const UK_PATTERNS: PiiPattern[] = [\n UK_NHS,\n UK_NINO,\n UK_PASSPORT,\n UK_POSTCODE,\n UK_VEHICLE_REGISTRATION,\n];\n","/**\n * EU-specific PII patterns (Spain, Italy, Poland, Finland, Sweden, Germany).\n * Ported from Microsoft Presidio. See ATTRIBUTION.md.\n */\n\nimport type { PiiPattern } from \"../../types\";\n\n// --- Spain ---\n\nexport const ES_NIF: PiiPattern = {\n entityType: \"ES_NIF\",\n patterns: [/\\b\\d{7,8}[-]?[A-Z]\\b/g],\n validate: (match) => {\n const cleaned = match.replace(/-/g, \"\");\n const letter = cleaned.slice(-1);\n const number = parseInt(cleaned.replace(/[^0-9]/g, \"\"), 10);\n const letters = \"TRWAGMYFPDXBNJZSQVHLCKE\";\n return letter === letters[number % 23];\n },\n contextWords: [\"documento nacional de identidad\", \"dni\", \"nif\", \"identificación\"],\n baseConfidence: \"medium\",\n baseScore: 0.5,\n};\n\nexport const ES_NIE: PiiPattern = {\n entityType: \"ES_NIE\",\n patterns: [/\\b[XYZ]\\d{7}[-]?[A-Z]\\b/g],\n validate: (match) => {\n const cleaned = match.replace(/-/g, \"\");\n if (cleaned.length < 8 || cleaned.length > 9) return false;\n const letter = cleaned.slice(-1);\n const prefix = \"XYZ\".indexOf(cleaned[0]);\n if (prefix === -1) return false;\n const number = parseInt(prefix.toString() + cleaned.slice(1, -1), 10);\n const letters = \"TRWAGMYFPDXBNJZSQVHLCKE\";\n return letter === letters[number % 23];\n },\n contextWords: [\"número de identificación de extranjero\", \"nie\"],\n baseConfidence: \"medium\",\n baseScore: 0.5,\n};\n\n// --- Italy ---\n\nexport const IT_FISCAL_CODE: PiiPattern = {\n entityType: \"IT_FISCAL_CODE\",\n patterns: [\n /(?:[A-Z][AEIOU][AEIOUX]|[AEIOU]X{2}|[B-DF-HJ-NP-TV-Z]{2}[A-Z]){2}(?:[\\dLMNP-V]{2}(?:[A-EHLMPR-T](?:[04LQ][1-9MNP-V]|[15MR][\\dLMNP-V]|[26NS][0-8LMNP-U])|[DHPS][37PT][0L]|[ACELMRT][37PT][01LM]|[AC-EHLMPR-T][26NS][9V])|(?:[02468LNQSU][048LQU]|[13579MPRTV][26NS])B[26NS][9V])(?:[A-MZ][1-9MNP-V][\\dLMNP-V]{2}|[A-M][0L](?:[1-9MNP-V][\\dLMNP-V]|[0L][1-9MNP-V]))[A-Z]/gi,\n ],\n validate: (match) => {\n const text = match.toUpperCase();\n if (text.length !== 16) return false;\n const control = text[15];\n const toValidate = text.slice(0, 15);\n\n const mapOdd: Record<string, number> = {\n \"0\": 1, \"1\": 0, \"2\": 5, \"3\": 7, \"4\": 9, \"5\": 13, \"6\": 15, \"7\": 17,\n \"8\": 19, \"9\": 21, A: 1, B: 0, C: 5, D: 7, E: 9, F: 13, G: 15, H: 17,\n I: 19, J: 21, K: 2, L: 4, M: 18, N: 20, O: 11, P: 3, Q: 6, R: 8,\n S: 12, T: 14, U: 16, V: 10, W: 22, X: 25, Y: 24, Z: 23,\n };\n const mapEven: Record<string, number> = {\n \"0\": 0, \"1\": 1, \"2\": 2, \"3\": 3, \"4\": 4, \"5\": 5, \"6\": 6, \"7\": 7,\n \"8\": 8, \"9\": 9, A: 0, B: 1, C: 2, D: 3, E: 4, F: 5, G: 6, H: 7,\n I: 8, J: 9, K: 10, L: 11, M: 12, N: 13, O: 14, P: 15, Q: 16, R: 17,\n S: 18, T: 19, U: 20, V: 21, W: 22, X: 23, Y: 24, Z: 25,\n };\n\n let oddSum = 0;\n let evenSum = 0;\n for (let i = 0; i < toValidate.length; i++) {\n if (i % 2 === 0) {\n oddSum += mapOdd[toValidate[i]] ?? 0;\n } else {\n evenSum += mapEven[toValidate[i]] ?? 0;\n }\n }\n\n const expected = String.fromCharCode(65 + ((oddSum + evenSum) % 26));\n return expected === control;\n },\n contextWords: [\"codice fiscale\", \"cf\"],\n baseConfidence: \"medium\",\n baseScore: 0.3,\n};\n\nexport const IT_DRIVER_LICENSE: PiiPattern = {\n entityType: \"IT_DRIVER_LICENSE\",\n patterns: [\n /\\b(?:[A-Z]{2}\\d{7}[A-Z]|U1[BCDEFGHLJKMNPRSTUWYXZ0-9]{7}[A-Z])\\b/gi,\n ],\n contextWords: [\"patente\", \"patente di guida\", \"licenza\", \"licenza di guida\"],\n baseConfidence: \"low\",\n baseScore: 0.2,\n};\n\nexport const IT_VAT_CODE: PiiPattern = {\n entityType: \"IT_VAT_CODE\",\n patterns: [/\\b\\d{11}\\b/g],\n validate: (match) => {\n const digits = match.replace(/[\\s_]/g, \"\");\n if (digits.length !== 11) return false;\n if (digits === \"00000000000\") return false;\n\n let x = 0;\n let y = 0;\n for (let i = 0; i < 5; i++) {\n x += parseInt(digits[2 * i], 10);\n let tmpY = parseInt(digits[2 * i + 1], 10) * 2;\n if (tmpY > 9) tmpY -= 9;\n y += tmpY;\n }\n const t = (x + y) % 10;\n const c = (10 - t) % 10;\n return c === parseInt(digits[10], 10);\n },\n contextWords: [\"piva\", \"partita iva\", \"pi\"],\n baseConfidence: \"low\",\n baseScore: 0.1,\n};\n\nexport const IT_PASSPORT: PiiPattern = {\n entityType: \"IT_PASSPORT\",\n patterns: [/\\b[A-Z]{2}\\d{7}\\b/gi],\n contextWords: [\"passaporto\", \"elettronico\", \"italiano\", \"viaggio\", \"documento\"],\n baseConfidence: \"low\",\n baseScore: 0.01,\n};\n\nexport const IT_IDENTITY_CARD: PiiPattern = {\n entityType: \"IT_IDENTITY_CARD\",\n patterns: [\n /\\b[A-Z]{2}\\s?\\d{7}\\b/gi,\n /\\b\\d{7}[A-Z]{2}\\b/gi,\n /\\b[A-Z]{2}\\d{5}[A-Z]{2}\\b/gi,\n ],\n contextWords: [\"carta\", \"identità\", \"elettronica\", \"cie\", \"documento\"],\n baseConfidence: \"low\",\n baseScore: 0.01,\n};\n\n// --- Poland ---\n\nexport const PL_PESEL: PiiPattern = {\n entityType: \"PL_PESEL\",\n patterns: [\n /\\b\\d{2}(?:[02468][1-9]|[13579][012])(?:0[1-9]|[12]\\d|3[01])\\d{5}\\b/g,\n ],\n validate: (match) => {\n if (match.length !== 11) return false;\n const digits = match.split(\"\").map(Number);\n const weights = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3];\n let checksum = 0;\n for (let i = 0; i < 10; i++) {\n checksum += digits[i] * weights[i];\n }\n return (checksum % 10) === digits[10];\n },\n contextWords: [\"pesel\"],\n baseConfidence: \"medium\",\n baseScore: 0.4,\n};\n\n// --- Finland ---\n\nexport const FI_PERSONAL_IDENTITY_CODE: PiiPattern = {\n entityType: \"FI_PERSONAL_IDENTITY_CODE\",\n patterns: [\n /\\b(\\d{6})([+\\-ABCDEFYXWVU])(\\d{3})([0-9ABCDEFHJKLMNPRSTUVWXY])\\b/g,\n ],\n validate: (match) => {\n if (match.length !== 11) return false;\n const datePart = match.slice(0, 6);\n const individual = match.slice(7, 10);\n const control = match[10];\n const validChars = \"0123456789ABCDEFHJKLMNPRSTUVWXY\";\n const num = parseInt(datePart + individual, 10);\n return validChars[num % 31] === control;\n },\n contextWords: [\"hetu\", \"henkilötunnus\", \"personal identity code\"],\n baseConfidence: \"medium\",\n baseScore: 0.5,\n};\n\n// --- Sweden ---\n\nexport const SE_PERSONNUMMER: PiiPattern = {\n entityType: \"SE_PERSONNUMMER\",\n patterns: [/\\b(\\d{6,8})([-+]?)\\d{4}\\b/g],\n validate: (match) => {\n const digits = match.replace(/[-+]/g, \"\");\n const last10 = digits.slice(-10);\n if (last10.length !== 10) return false;\n\n // Validate month/day\n const month = parseInt(last10.slice(2, 4), 10);\n let day = parseInt(last10.slice(4, 6), 10);\n if (day >= 61) day -= 60; // samordningsnummer\n if (month < 1 || month > 12 || day < 1 || day > 31) return false;\n\n // Luhn on 10 digits\n const nums = last10.split(\"\").map(Number);\n const check = nums[9];\n let sum = 0;\n for (let i = 0; i < 9; i++) {\n let d = nums[i];\n if (i % 2 === 0) {\n d *= 2;\n if (d > 9) d -= 9;\n }\n sum += d;\n }\n return (sum + check) % 10 === 0;\n },\n contextWords: [\n \"personnummer\",\n \"svenskt personnummer\",\n \"svensk id\",\n \"personal identity number\",\n \"samordningsnummer\",\n ],\n baseConfidence: \"medium\",\n baseScore: 0.5,\n};\n\n// --- Germany ---\n\nexport const DE_TAX_ID: PiiPattern = {\n entityType: \"DE_TAX_ID\",\n patterns: [/\\b[1-9]\\d{10}\\b/g],\n validate: (match) => {\n if (match.length !== 11 || !/^\\d+$/.test(match)) return false;\n const digits = match.split(\"\").map(Number);\n\n // All first 10 digits same = invalid\n if (new Set(digits.slice(0, 10)).size === 1) return false;\n\n // ISO 7064 Mod 11,10 checksum\n let product = 10;\n for (let i = 0; i < 10; i++) {\n let total = (digits[i] + product) % 10;\n if (total === 0) total = 10;\n product = (total * 2) % 11;\n }\n let check = 11 - product;\n if (check === 10) check = 0;\n return check === digits[10];\n },\n contextWords: [\n \"steueridentifikationsnummer\",\n \"steuer-id\",\n \"steuerid\",\n \"idnr\",\n \"steuer-idnr\",\n \"steuernummer\",\n ],\n baseConfidence: \"medium\",\n baseScore: 0.5,\n};\n\nexport const DE_PASSPORT: PiiPattern = {\n entityType: \"DE_PASSPORT\",\n patterns: [\n /\\b[CFGHJKLMNPRTVWXYZ][CFGHJKLMNPRTVWXYZ0-9]{7}[CFGHJKLMNPRTVWXYZ0-9]\\b/g,\n /\\bT\\d{8}\\b/g,\n ],\n contextWords: [\n \"personalausweis\",\n \"ausweis\",\n \"reisepass\",\n \"pass\",\n \"dokumentennummer\",\n \"seriennummer\",\n ],\n baseConfidence: \"low\",\n baseScore: 0.4,\n};\n\n/** All EU PII patterns */\nexport const EU_PATTERNS: PiiPattern[] = [\n ES_NIF,\n ES_NIE,\n IT_FISCAL_CODE,\n IT_DRIVER_LICENSE,\n IT_VAT_CODE,\n IT_PASSPORT,\n IT_IDENTITY_CARD,\n PL_PESEL,\n FI_PERSONAL_IDENTITY_CODE,\n SE_PERSONNUMMER,\n DE_TAX_ID,\n DE_PASSPORT,\n];\n","/**\n * Verhoeff checksum algorithm.\n * Used by Indian Aadhaar and Nigerian NIN.\n * Ported from Microsoft Presidio. See ATTRIBUTION.md.\n */\n\nconst D: number[][] = [\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n [1, 2, 3, 4, 0, 6, 7, 8, 9, 5],\n [2, 3, 4, 0, 1, 7, 8, 9, 5, 6],\n [3, 4, 0, 1, 2, 8, 9, 5, 6, 7],\n [4, 0, 1, 2, 3, 9, 5, 6, 7, 8],\n [5, 9, 8, 7, 6, 0, 4, 3, 2, 1],\n [6, 5, 9, 8, 7, 1, 0, 4, 3, 2],\n [7, 6, 5, 9, 8, 2, 1, 0, 4, 3],\n [8, 7, 6, 5, 9, 3, 2, 1, 0, 4],\n [9, 8, 7, 6, 5, 4, 3, 2, 1, 0],\n];\n\nconst P: number[][] = [\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n [1, 5, 7, 6, 2, 8, 3, 0, 9, 4],\n [5, 8, 0, 3, 7, 9, 6, 1, 4, 2],\n [8, 9, 1, 6, 0, 4, 3, 5, 2, 7],\n [9, 4, 5, 3, 1, 2, 6, 8, 7, 0],\n [4, 2, 8, 6, 5, 7, 3, 9, 0, 1],\n [2, 7, 9, 3, 8, 0, 6, 4, 1, 5],\n [7, 0, 4, 6, 9, 1, 3, 2, 5, 8],\n];\n\nconst INV = [0, 4, 3, 2, 1, 5, 6, 7, 8, 9];\n\n/** Validate a number using the Verhoeff checksum algorithm */\nexport function verhoeff(input: number): boolean {\n const digits = String(input).split(\"\").map(Number).reverse();\n let c = 0;\n for (let i = 0; i < digits.length; i++) {\n c = D[c][P[i % 8][digits[i]]];\n }\n return INV[c] === 0;\n}\n","/**\n * APAC + Africa PII patterns (SG, AU, IN, KR, TH, NG).\n * Ported from Microsoft Presidio. See ATTRIBUTION.md.\n */\n\nimport type { PiiPattern } from \"../../types\";\nimport { luhn } from \"../../validators/checksums\";\nimport { verhoeff } from \"../../validators/verhoeff\";\n\n// --- Singapore ---\n\nexport const SG_NRIC_FIN: PiiPattern = {\n entityType: \"SG_NRIC_FIN\",\n patterns: [/\\b[STFGM]\\d{7}[A-Z]\\b/gi],\n contextWords: [\"fin\", \"nric\"],\n baseConfidence: \"medium\",\n baseScore: 0.5,\n};\n\nexport const SG_UEN: PiiPattern = {\n entityType: \"SG_UEN\",\n patterns: [\n /\\b\\d{8}[A-Z]\\b/g,\n /\\b\\d{9}[A-Z]\\b/g,\n /\\b[TS]\\d{2}[A-Z]{2}\\d{4}[A-Z]\\b/g,\n ],\n contextWords: [\"uen\", \"unique entity number\", \"business registration\", \"acra\"],\n baseConfidence: \"low\",\n baseScore: 0.3,\n};\n\n// --- Australia ---\n\nexport const AU_ABN: PiiPattern = {\n entityType: \"AU_ABN\",\n patterns: [\n /\\b\\d{2}\\s\\d{3}\\s\\d{3}\\s\\d{3}\\b/g,\n /\\b\\d{11}\\b/g,\n ],\n validate: (match) => {\n const digits = match.replace(/\\s/g, \"\").split(\"\").map(Number);\n if (digits.length !== 11) return false;\n const weights = [10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19];\n digits[0] = digits[0] === 0 ? 9 : digits[0] - 1;\n let sum = 0;\n for (let i = 0; i < 11; i++) {\n sum += digits[i] * weights[i];\n }\n return sum % 89 === 0;\n },\n contextWords: [\"australian business number\", \"abn\"],\n baseConfidence: \"low\",\n baseScore: 0.1,\n};\n\nexport const AU_ACN: PiiPattern = {\n entityType: \"AU_ACN\",\n patterns: [\n /\\b\\d{3}\\s\\d{3}\\s\\d{3}\\b/g,\n /\\b\\d{9}\\b/g,\n ],\n validate: (match) => {\n const digits = match.replace(/\\s/g, \"\").split(\"\").map(Number);\n if (digits.length !== 9) return false;\n const weights = [8, 7, 6, 5, 4, 3, 2, 1];\n let sum = 0;\n for (let i = 0; i < 8; i++) {\n sum += digits[i] * weights[i];\n }\n const complement = (10 - (sum % 10)) % 10;\n return complement === digits[8];\n },\n contextWords: [\"australian company number\", \"acn\"],\n baseConfidence: \"low\",\n baseScore: 0.1,\n};\n\nexport const AU_TFN: PiiPattern = {\n entityType: \"AU_TFN\",\n patterns: [\n /\\b\\d{3}\\s\\d{3}\\s\\d{3}\\b/g,\n /\\b\\d{9}\\b/g,\n ],\n validate: (match) => {\n const digits = match.replace(/\\s/g, \"\").split(\"\").map(Number);\n if (digits.length !== 9) return false;\n const weights = [1, 4, 3, 7, 5, 8, 6, 9, 10];\n let sum = 0;\n for (let i = 0; i < 9; i++) {\n sum += digits[i] * weights[i];\n }\n return sum % 11 === 0;\n },\n contextWords: [\"tax file number\", \"tfn\"],\n baseConfidence: \"low\",\n baseScore: 0.1,\n};\n\nexport const AU_MEDICARE: PiiPattern = {\n entityType: \"AU_MEDICARE\",\n patterns: [\n /\\b[2-6]\\d{3}\\s\\d{5}\\s\\d\\b/g,\n /\\b[2-6]\\d{9}\\b/g,\n ],\n validate: (match) => {\n const digits = match.replace(/\\s/g, \"\").split(\"\").map(Number);\n if (digits.length !== 10) return false;\n const weights = [1, 3, 7, 9, 1, 3, 7, 9];\n let sum = 0;\n for (let i = 0; i < 8; i++) {\n sum += digits[i] * weights[i];\n }\n return (sum % 10) === digits[8];\n },\n contextWords: [\"medicare\"],\n baseConfidence: \"low\",\n baseScore: 0.1,\n};\n\n// --- India ---\n\nexport const IN_PAN: PiiPattern = {\n entityType: \"IN_PAN\",\n patterns: [\n /\\b[A-Z]{3}[ABCFGHHJLPT][A-Z]\\d{4}[A-Z]\\b/gi,\n /\\b[A-Z]{5}\\d{4}[A-Z]\\b/gi,\n ],\n contextWords: [\"permanent account number\", \"pan\"],\n baseConfidence: \"medium\",\n baseScore: 0.5,\n};\n\nexport const IN_AADHAAR: PiiPattern = {\n entityType: \"IN_AADHAAR\",\n patterns: [\n /\\b\\d{4}[- :]\\d{4}[- :]\\d{4}\\b/g,\n /\\b\\d{12}\\b/g,\n ],\n validate: (match) => {\n const digits = match.replace(/\\D/g, \"\");\n if (digits.length !== 12) return false;\n if (parseInt(digits[0], 10) < 2) return false;\n // Check palindrome\n if (digits === digits.split(\"\").reverse().join(\"\")) return false;\n return verhoeff(parseInt(digits, 10));\n },\n contextWords: [\"aadhaar\", \"uidai\"],\n baseConfidence: \"low\",\n baseScore: 0.01,\n};\n\nexport const IN_VEHICLE_REGISTRATION: PiiPattern = {\n entityType: \"IN_VEHICLE_REGISTRATION\",\n patterns: [\n /\\b[A-Z]{2}\\d{2}[A-Z]{1,2}\\d{4}\\b/g,\n /\\b[A-Z]{2}\\d[A-Z]{1,3}\\d{4}\\b/g,\n ],\n contextWords: [\"rto\", \"vehicle\", \"plate\", \"registration\"],\n baseConfidence: \"medium\",\n baseScore: 0.5,\n};\n\nexport const IN_VOTER: PiiPattern = {\n entityType: \"IN_VOTER\",\n patterns: [\n /\\b[A-Z]{3}\\d{7}\\b/gi,\n ],\n contextWords: [\"voter\", \"epic\", \"elector photo identity card\"],\n baseConfidence: \"low\",\n baseScore: 0.3,\n};\n\nexport const IN_PASSPORT: PiiPattern = {\n entityType: \"IN_PASSPORT\",\n patterns: [/\\b[A-Z][1-9]\\d\\s?\\d{4}[1-9]\\b/g],\n contextWords: [\"passport\", \"indian passport\", \"passport number\"],\n baseConfidence: \"low\",\n baseScore: 0.1,\n};\n\n// --- Korea ---\n\nexport const KR_RRN: PiiPattern = {\n entityType: \"KR_RRN\",\n patterns: [\n /(?<!\\d)\\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])-?[1-4]\\d{6}(?!\\d)/g,\n ],\n validate: (match) => {\n const digits = match.replace(/-/g, \"\");\n if (digits.length !== 13 || !/^\\d+$/.test(digits)) return false;\n const regionCode = parseInt(digits.slice(7, 9), 10);\n if (regionCode > 95) return false;\n const weights = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5];\n let sum = 0;\n for (let i = 0; i < 12; i++) {\n sum += parseInt(digits[i], 10) * weights[i];\n }\n const checksum = (11 - (sum % 11)) % 10;\n return checksum === parseInt(digits[12], 10);\n },\n contextWords: [\n \"resident registration number\",\n \"rrn\",\n \"korean rrn\",\n ],\n baseConfidence: \"medium\",\n baseScore: 0.5,\n};\n\nexport const KR_PASSPORT: PiiPattern = {\n entityType: \"KR_PASSPORT\",\n patterns: [\n /(?<![A-Z0-9])[MSROD]\\d{3}[A-Z]\\d{4}(?!\\d)/gi,\n /(?<![A-Z0-9])[MSROD]\\d{8}(?!\\d)/gi,\n ],\n contextWords: [\"passport\", \"korean passport\", \"여권\"],\n baseConfidence: \"low\",\n baseScore: 0.1,\n};\n\n// --- Thailand ---\n\nexport const TH_TNIN: PiiPattern = {\n entityType: \"TH_TNIN\",\n patterns: [\n /\\b[1-9](?:[134]\\d|[25][0134567]|[67][01234567]|[89][0123456])\\d{10}\\b/g,\n ],\n validate: (match) => {\n if (match.length !== 13 || !/^\\d+$/.test(match)) return false;\n const weights = [13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2];\n let sum = 0;\n for (let i = 0; i < 12; i++) {\n sum += weights[i] * parseInt(match[i], 10);\n }\n const x = sum % 11;\n const expected = x <= 1 ? 1 - x : 11 - x;\n return expected === parseInt(match[12], 10);\n },\n contextWords: [\"thai national id\", \"thai id number\", \"tnin\"],\n baseConfidence: \"medium\",\n baseScore: 0.5,\n};\n\n// --- Nigeria ---\n\nexport const NG_NIN: PiiPattern = {\n entityType: \"NG_NIN\",\n patterns: [/\\b\\d{11}\\b/g],\n validate: (match) => {\n if (match.length !== 11 || !/^\\d+$/.test(match)) return false;\n return verhoeff(parseInt(match, 10));\n },\n contextWords: [\n \"nin\",\n \"national identification number\",\n \"national identity number\",\n \"nimc\",\n ],\n baseConfidence: \"low\",\n baseScore: 0.01,\n};\n\n/** All APAC + Africa PII patterns */\nexport const APAC_PATTERNS: PiiPattern[] = [\n SG_NRIC_FIN,\n SG_UEN,\n AU_ABN,\n AU_ACN,\n AU_TFN,\n AU_MEDICARE,\n IN_PAN,\n IN_AADHAAR,\n IN_VEHICLE_REGISTRATION,\n IN_VOTER,\n IN_PASSPORT,\n KR_RRN,\n KR_PASSPORT,\n TH_TNIN,\n NG_NIN,\n];\n","/**\n * PII Pattern Registry — aggregates all regional patterns.\n * Patterns ported from Microsoft Presidio. See ATTRIBUTION.md.\n */\n\nimport type { PiiPattern } from \"../../types\";\nimport { GENERIC_PATTERNS } from \"./generic\";\nimport { US_PATTERNS } from \"./us\";\nimport { UK_PATTERNS } from \"./uk\";\nimport { EU_PATTERNS } from \"./eu\";\nimport { APAC_PATTERNS } from \"./apac\";\n\nexport { GENERIC_PATTERNS } from \"./generic\";\nexport { US_PATTERNS } from \"./us\";\nexport { UK_PATTERNS } from \"./uk\";\nexport { EU_PATTERNS } from \"./eu\";\nexport { APAC_PATTERNS } from \"./apac\";\n\n/** All available PII patterns */\nexport const ALL_PII_PATTERNS: PiiPattern[] = [\n ...GENERIC_PATTERNS,\n ...US_PATTERNS,\n ...UK_PATTERNS,\n ...EU_PATTERNS,\n ...APAC_PATTERNS,\n];\n\n/** Get patterns by entity type */\nexport function getPatternsByEntity(entityType: string): PiiPattern | undefined {\n return ALL_PII_PATTERNS.find((p) => p.entityType === entityType);\n}\n\n/** Get all available entity type names */\nexport function getAllEntityTypes(): string[] {\n return ALL_PII_PATTERNS.map((p) => p.entityType);\n}\n","/**\n * PII Guard — detects personally identifiable information using regex patterns.\n * Pattern library ported from Microsoft Presidio. See ATTRIBUTION.md.\n */\n\nimport { BaseGuard } from \"./base.guard\";\nimport type { GuardConfig, GuardResult, Detection, PiiPattern } from \"../types\";\nimport { ALL_PII_PATTERNS } from \"../patterns/pii\";\n\nconst CONTEXT_WINDOW = 100; // characters before/after match to search for context words\nconst CONTEXT_SCORE_BOOST = 0.35;\n\nexport interface PiiGuardOptions {\n /** Specific entity types to detect. If empty, all are enabled. */\n entityTypes?: string[];\n /** Additional custom patterns */\n customPatterns?: PiiPattern[];\n}\n\nexport class PiiGuard extends BaseGuard {\n readonly name = \"pii\";\n private patterns: PiiPattern[];\n\n constructor(options?: PiiGuardOptions) {\n super();\n\n let patterns = ALL_PII_PATTERNS;\n if (options?.entityTypes && options.entityTypes.length > 0) {\n const allowed = new Set(options.entityTypes);\n patterns = patterns.filter((p) => allowed.has(p.entityType));\n }\n if (options?.customPatterns) {\n patterns = [...patterns, ...options.customPatterns];\n }\n this.patterns = patterns;\n }\n\n async analyze(\n text: string,\n config?: Partial<GuardConfig>\n ): Promise<GuardResult> {\n const cfg = this.mergeConfig(config);\n const detections = this.detectAll(text, cfg.threshold);\n return this.buildResult(text, detections, cfg.mode);\n }\n\n private detectAll(text: string, threshold: number): Detection[] {\n const allDetections: Detection[] = [];\n const textLower = text.toLowerCase();\n\n for (const pattern of this.patterns) {\n for (const regex of pattern.patterns) {\n // Reset regex state for global patterns\n const re = new RegExp(regex.source, regex.flags);\n let match: RegExpExecArray | null;\n\n while ((match = re.exec(text)) !== null) {\n const matchText = match[0];\n const start = match.index;\n const end = start + matchText.length;\n\n // Run validation if available\n if (pattern.validate && !pattern.validate(matchText)) {\n continue;\n }\n\n // Calculate score with context boost\n let score = pattern.baseScore;\n let confidence = pattern.baseConfidence;\n\n if (pattern.contextWords && pattern.contextWords.length > 0) {\n const contextStart = Math.max(0, start - CONTEXT_WINDOW);\n const contextEnd = Math.min(text.length, end + CONTEXT_WINDOW);\n const context = textLower.slice(contextStart, contextEnd);\n\n const hasContext = pattern.contextWords.some((word) =>\n context.includes(word.toLowerCase())\n );\n\n if (hasContext) {\n score = Math.min(1, score + CONTEXT_SCORE_BOOST);\n if (confidence === \"low\") confidence = \"medium\";\n else if (confidence === \"medium\") confidence = \"high\";\n }\n }\n\n if (score < threshold) continue;\n\n allDetections.push(\n this.makeDetection(text, {\n entityType: pattern.entityType,\n start,\n end,\n text: matchText,\n confidence,\n score,\n guardName: this.name,\n })\n );\n }\n }\n }\n\n // Remove overlapping detections (keep highest score)\n return this.deduplicateDetections(allDetections);\n }\n\n private deduplicateDetections(detections: Detection[]): Detection[] {\n if (detections.length <= 1) return detections;\n\n // Sort by score descending\n const sorted = [...detections].sort((a, b) => b.score - a.score);\n const result: Detection[] = [];\n\n for (const detection of sorted) {\n const overlaps = result.some(\n (existing) =>\n detection.start < existing.end && detection.end > existing.start\n );\n if (!overlaps) {\n result.push(detection);\n }\n }\n\n // Sort by position for consistent output\n return result.sort((a, b) => a.start - b.start);\n }\n}\n","/**\n * Cloud provider secret patterns.\n * AWS patterns ported from HAI-Guardrails (MIT). See ATTRIBUTION.md.\n * Additional patterns derived from GitLeaks (MIT) and public documentation.\n */\n\nimport type { SecretPattern } from \"../../types\";\n\nexport const AWS_ACCESS_KEY: SecretPattern = {\n secretType: \"AWS_ACCESS_KEY\",\n patterns: [/(?<![A-Z0-9])AKIA[0-9A-Z]{16}(?![A-Z0-9])/g],\n};\n\nexport const AWS_SECRET_KEY: SecretPattern = {\n secretType: \"AWS_SECRET_KEY\",\n patterns: [\n /(?<![A-Za-z0-9/+=])[A-Za-z0-9/+=]{40}(?![A-Za-z0-9/+=])/g,\n ],\n minEntropy: 4.5,\n};\n\nexport const AWS_SESSION_TOKEN: SecretPattern = {\n secretType: \"AWS_SESSION_TOKEN\",\n patterns: [/(?:aws_session_token|AWS_SESSION_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9/+=]{100,})[\"']?/g],\n minEntropy: 4.0,\n};\n\nexport const AWS_MWS_KEY: SecretPattern = {\n secretType: \"AWS_MWS_KEY\",\n patterns: [/amzn\\.mws\\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/g],\n};\n\nexport const AZURE_CONNECTION_STRING: SecretPattern = {\n secretType: \"AZURE_CONNECTION_STRING\",\n patterns: [\n /DefaultEndpointsProtocol=https?;AccountName=[^;]+;AccountKey=[A-Za-z0-9+/=]+;?/g,\n /(?:AccountKey|SharedAccessKey|SharedAccessSignature)=[A-Za-z0-9+/=]{20,}/g,\n ],\n};\n\nexport const AZURE_AD_CLIENT_SECRET: SecretPattern = {\n secretType: \"AZURE_AD_CLIENT_SECRET\",\n patterns: [/(?:client_secret|AZURE_CLIENT_SECRET)\\s*[:=]\\s*[\"']?([A-Za-z0-9~._-]{34,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const AZURE_STORAGE_KEY: SecretPattern = {\n secretType: \"AZURE_STORAGE_KEY\",\n patterns: [/[A-Za-z0-9+/]{86}==/g],\n minEntropy: 5.0,\n};\n\nexport const AZURE_FUNCTION_KEY: SecretPattern = {\n secretType: \"AZURE_FUNCTION_KEY\",\n patterns: [/(?:x-functions-key|functionkey)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{40,})[\"']?/gi],\n minEntropy: 3.5,\n};\n\nexport const GCP_SERVICE_ACCOUNT: SecretPattern = {\n secretType: \"GCP_SERVICE_ACCOUNT\",\n patterns: [/\"private_key\"\\s*:\\s*\"-----BEGIN (?:RSA )?PRIVATE KEY-----/g],\n};\n\nexport const GCP_API_KEY: SecretPattern = {\n secretType: \"GCP_API_KEY\",\n patterns: [/AIza[0-9A-Za-z_-]{35}/g],\n};\n\nexport const GCP_OAUTH_SECRET: SecretPattern = {\n secretType: \"GCP_OAUTH_SECRET\",\n patterns: [/GOCSPX-[A-Za-z0-9_-]{28}/g],\n};\n\nexport const IBM_CLOUD_API_KEY: SecretPattern = {\n secretType: \"IBM_CLOUD_API_KEY\",\n patterns: [/(?:ibm[-_]?(?:cloud)?[-_]?api[-_]?key)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{44})[\"']?/gi],\n};\n\nexport const IBM_COS_HMAC: SecretPattern = {\n secretType: \"IBM_COS_HMAC\",\n patterns: [/(?:cos_hmac_keys|ibm_cos)\\s*[:=]\\s*[\"']?([A-Za-z0-9]{32,})[\"']?/gi],\n minEntropy: 3.5,\n};\n\nexport const DIGITALOCEAN_TOKEN: SecretPattern = {\n secretType: \"DIGITALOCEAN_TOKEN\",\n patterns: [\n /dop_v1_[a-f0-9]{64}/g,\n /doo_v1_[a-f0-9]{64}/g,\n /dor_v1_[a-f0-9]{64}/g,\n ],\n};\n\nexport const DIGITALOCEAN_SPACES_KEY: SecretPattern = {\n secretType: \"DIGITALOCEAN_SPACES_KEY\",\n patterns: [/(?:SPACES_ACCESS_KEY_ID|DO_SPACES_KEY)\\s*[:=]\\s*[\"']?([A-Z0-9]{20})[\"']?/g],\n};\n\nexport const LINODE_TOKEN: SecretPattern = {\n secretType: \"LINODE_TOKEN\",\n patterns: [/(?:LINODE_TOKEN|LINODE_API_TOKEN)\\s*[:=]\\s*[\"']?([a-f0-9]{64})[\"']?/g],\n};\n\nexport const VULTR_API_KEY: SecretPattern = {\n secretType: \"VULTR_API_KEY\",\n patterns: [/(?:VULTR_API_KEY)\\s*[:=]\\s*[\"']?([A-Z0-9]{36})[\"']?/g],\n};\n\nexport const ORACLE_CLOUD_KEY: SecretPattern = {\n secretType: \"ORACLE_CLOUD_KEY\",\n patterns: [/(?:OCI_API_KEY|ORACLE_CLOUD_KEY)\\s*[:=]\\s*[\"']?([A-Za-z0-9/+=]{40,})[\"']?/g],\n minEntropy: 4.0,\n};\n\nexport const ALIBABA_CLOUD_KEY: SecretPattern = {\n secretType: \"ALIBABA_CLOUD_KEY\",\n patterns: [/LTAI[A-Za-z0-9]{12,20}/g],\n};\n\nexport const CLOUD_PATTERNS: SecretPattern[] = [\n AWS_ACCESS_KEY,\n AWS_SECRET_KEY,\n AWS_SESSION_TOKEN,\n AWS_MWS_KEY,\n AZURE_CONNECTION_STRING,\n AZURE_AD_CLIENT_SECRET,\n AZURE_STORAGE_KEY,\n AZURE_FUNCTION_KEY,\n GCP_SERVICE_ACCOUNT,\n GCP_API_KEY,\n GCP_OAUTH_SECRET,\n IBM_CLOUD_API_KEY,\n IBM_COS_HMAC,\n DIGITALOCEAN_TOKEN,\n DIGITALOCEAN_SPACES_KEY,\n LINODE_TOKEN,\n VULTR_API_KEY,\n ORACLE_CLOUD_KEY,\n ALIBABA_CLOUD_KEY,\n];\n","/**\n * Source control platform secret patterns.\n * GitHub/GitLab patterns ported from HAI-Guardrails (MIT). See ATTRIBUTION.md.\n * Additional patterns from GitLeaks (MIT) and public documentation.\n */\n\nimport type { SecretPattern } from \"../../types\";\n\nexport const GITHUB_TOKEN: SecretPattern = {\n secretType: \"GITHUB_TOKEN\",\n patterns: [\n /ghp_[A-Za-z0-9]{36}/g,\n /gho_[A-Za-z0-9]{36}/g,\n /ghu_[A-Za-z0-9]{36}/g,\n /ghs_[A-Za-z0-9]{36}/g,\n /ghr_[A-Za-z0-9]{36}/g,\n /github_pat_[A-Za-z0-9]{22}_[A-Za-z0-9]{59}/g,\n ],\n};\n\nexport const GITHUB_APP_TOKEN: SecretPattern = {\n secretType: \"GITHUB_APP_TOKEN\",\n patterns: [/(?:ghu|ghs)_[A-Za-z0-9]{36}/g],\n};\n\nexport const GITHUB_FINE_GRAINED_TOKEN: SecretPattern = {\n secretType: \"GITHUB_FINE_GRAINED_TOKEN\",\n patterns: [/github_pat_[A-Za-z0-9]{22}_[A-Za-z0-9]{59}/g],\n};\n\nexport const GITLAB_TOKEN: SecretPattern = {\n secretType: \"GITLAB_TOKEN\",\n patterns: [\n /glpat-[A-Za-z0-9\\-_]{20}/g,\n /glcbt-[A-Za-z0-9]{1,5}_[A-Za-z0-9_\\-]{20}/g,\n /gldt-[A-Za-z0-9_\\-]{20}/g,\n /glft-[A-Za-z0-9_\\-]{20}/g,\n /glsoat-[A-Za-z0-9_\\-]{20}/g,\n /GR1348941[A-Za-z0-9_\\-]{20}/g,\n ],\n};\n\nexport const GITLAB_PIPELINE_TOKEN: SecretPattern = {\n secretType: \"GITLAB_PIPELINE_TOKEN\",\n patterns: [/glptt-[A-Za-z0-9]{20}/g],\n};\n\nexport const BITBUCKET_APP_PASSWORD: SecretPattern = {\n secretType: \"BITBUCKET_APP_PASSWORD\",\n patterns: [/(?:BITBUCKET_APP_PASSWORD|BB_APP_PASSWORD)\\s*[:=]\\s*[\"']?([A-Za-z0-9]{18,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const BITBUCKET_CLIENT_SECRET: SecretPattern = {\n secretType: \"BITBUCKET_CLIENT_SECRET\",\n patterns: [/(?:BITBUCKET_CLIENT_SECRET|BB_CLIENT_SECRET)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{32,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const AZURE_DEVOPS_TOKEN: SecretPattern = {\n secretType: \"AZURE_DEVOPS_TOKEN\",\n patterns: [/(?:AZURE_DEVOPS_PAT|ADO_TOKEN|SYSTEM_ACCESSTOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9]{52,})[\"']?/g],\n minEntropy: 4.0,\n};\n\nexport const GITEA_TOKEN: SecretPattern = {\n secretType: \"GITEA_TOKEN\",\n patterns: [/(?:GITEA_TOKEN)\\s*[:=]\\s*[\"']?([a-f0-9]{40})[\"']?/g],\n};\n\nexport const SOURCE_CONTROL_PATTERNS: SecretPattern[] = [\n GITHUB_TOKEN,\n GITHUB_APP_TOKEN,\n GITHUB_FINE_GRAINED_TOKEN,\n GITLAB_TOKEN,\n GITLAB_PIPELINE_TOKEN,\n BITBUCKET_APP_PASSWORD,\n BITBUCKET_CLIENT_SECRET,\n AZURE_DEVOPS_TOKEN,\n GITEA_TOKEN,\n];\n","/**\n * CI/CD platform secret patterns.\n * Derived from GitLeaks (MIT) and public documentation.\n */\n\nimport type { SecretPattern } from \"../../types\";\n\nexport const JENKINS_API_TOKEN: SecretPattern = {\n secretType: \"JENKINS_API_TOKEN\",\n patterns: [/(?:JENKINS_TOKEN|JENKINS_API_TOKEN)\\s*[:=]\\s*[\"']?([a-f0-9]{32,})[\"']?/gi],\n};\n\nexport const JENKINS_CRUMB: SecretPattern = {\n secretType: \"JENKINS_CRUMB\",\n patterns: [/Jenkins-Crumb:\\s*([a-f0-9]{32,})/g],\n};\n\nexport const CIRCLECI_TOKEN: SecretPattern = {\n secretType: \"CIRCLECI_TOKEN\",\n patterns: [\n /(?:CIRCLECI_TOKEN|CIRCLE_TOKEN)\\s*[:=]\\s*[\"']?([a-f0-9]{40})[\"']?/g,\n /circle-token\\s*[:=]\\s*[\"']?([a-f0-9]{40})[\"']?/g,\n ],\n};\n\nexport const TRAVIS_CI_TOKEN: SecretPattern = {\n secretType: \"TRAVIS_CI_TOKEN\",\n patterns: [/(?:TRAVIS_TOKEN|TRAVIS_API_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{20,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const GITHUB_ACTIONS_SECRET: SecretPattern = {\n secretType: \"GITHUB_ACTIONS_SECRET\",\n patterns: [/(?:ACTIONS_SECRET|GH_ACTION_SECRET)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{20,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const BUILDKITE_TOKEN: SecretPattern = {\n secretType: \"BUILDKITE_TOKEN\",\n patterns: [/bkua_[A-Za-z0-9]{40}/g],\n};\n\nexport const BUILDKITE_AGENT_TOKEN: SecretPattern = {\n secretType: \"BUILDKITE_AGENT_TOKEN\",\n patterns: [/(?:BUILDKITE_AGENT_TOKEN)\\s*[:=]\\s*[\"']?([a-f0-9]{40,})[\"']?/g],\n};\n\nexport const DRONE_CI_TOKEN: SecretPattern = {\n secretType: \"DRONE_CI_TOKEN\",\n patterns: [/(?:DRONE_TOKEN|DRONE_SERVER_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9]{32,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const CODECOV_TOKEN: SecretPattern = {\n secretType: \"CODECOV_TOKEN\",\n patterns: [/(?:CODECOV_TOKEN)\\s*[:=]\\s*[\"']?([a-f0-9-]{36})[\"']?/g],\n};\n\nexport const SONARQUBE_TOKEN: SecretPattern = {\n secretType: \"SONARQUBE_TOKEN\",\n patterns: [\n /squ_[A-Za-z0-9]{40}/g,\n /sqp_[A-Za-z0-9]{40}/g,\n ],\n};\n\nexport const TEAMCITY_TOKEN: SecretPattern = {\n secretType: \"TEAMCITY_TOKEN\",\n patterns: [/(?:TEAMCITY_TOKEN|TC_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{20,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const CICD_PATTERNS: SecretPattern[] = [\n JENKINS_API_TOKEN,\n JENKINS_CRUMB,\n CIRCLECI_TOKEN,\n TRAVIS_CI_TOKEN,\n GITHUB_ACTIONS_SECRET,\n BUILDKITE_TOKEN,\n BUILDKITE_AGENT_TOKEN,\n DRONE_CI_TOKEN,\n CODECOV_TOKEN,\n SONARQUBE_TOKEN,\n TEAMCITY_TOKEN,\n];\n","/**\n * Communication platform secret patterns.\n * Slack pattern ported from HAI-Guardrails (MIT). See ATTRIBUTION.md.\n * Additional patterns from GitLeaks (MIT) and public documentation.\n */\n\nimport type { SecretPattern } from \"../../types\";\n\nexport const SLACK_TOKEN: SecretPattern = {\n secretType: \"SLACK_TOKEN\",\n patterns: [/xox[bporas]-[A-Za-z0-9-]{10,}/g],\n};\n\nexport const SLACK_WEBHOOK: SecretPattern = {\n secretType: \"SLACK_WEBHOOK\",\n patterns: [/https:\\/\\/hooks\\.slack\\.com\\/services\\/T[A-Z0-9]{8,}\\/B[A-Z0-9]{8,}\\/[A-Za-z0-9]{24}/g],\n};\n\nexport const SLACK_APP_TOKEN: SecretPattern = {\n secretType: \"SLACK_APP_TOKEN\",\n patterns: [/xapp-[0-9]+-[A-Za-z0-9]+-[0-9]+-[A-Za-z0-9]+/g],\n};\n\nexport const DISCORD_TOKEN: SecretPattern = {\n secretType: \"DISCORD_TOKEN\",\n patterns: [/(?:DISCORD_TOKEN|DISCORD_BOT_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{24}\\.[A-Za-z0-9_-]{6}\\.[A-Za-z0-9_-]{27,})[\"']?/g],\n};\n\nexport const DISCORD_WEBHOOK: SecretPattern = {\n secretType: \"DISCORD_WEBHOOK\",\n patterns: [/https:\\/\\/(?:ptb\\.|canary\\.)?discord(?:app)?\\.com\\/api\\/webhooks\\/\\d+\\/[A-Za-z0-9_-]+/g],\n};\n\nexport const TELEGRAM_BOT_TOKEN: SecretPattern = {\n secretType: \"TELEGRAM_BOT_TOKEN\",\n patterns: [/[0-9]{8,10}:[A-Za-z0-9_-]{35}/g],\n};\n\nexport const TWILIO_KEY: SecretPattern = {\n secretType: \"TWILIO_KEY\",\n patterns: [/SK[0-9a-fA-F]{32}/g],\n};\n\nexport const TWILIO_ACCOUNT_SID: SecretPattern = {\n secretType: \"TWILIO_ACCOUNT_SID\",\n patterns: [/AC[a-f0-9]{32}/g],\n};\n\nexport const TWILIO_AUTH_TOKEN: SecretPattern = {\n secretType: \"TWILIO_AUTH_TOKEN\",\n patterns: [/(?:TWILIO_AUTH_TOKEN)\\s*[:=]\\s*[\"']?([a-f0-9]{32})[\"']?/g],\n};\n\nexport const SENDGRID_KEY: SecretPattern = {\n secretType: \"SENDGRID_KEY\",\n patterns: [/SG\\.[A-Za-z0-9_-]{22}\\.[A-Za-z0-9_-]{43}/g],\n};\n\nexport const MAILGUN_KEY: SecretPattern = {\n secretType: \"MAILGUN_KEY\",\n patterns: [\n /key-[A-Za-z0-9]{32}/g,\n /(?:MAILGUN_API_KEY)\\s*[:=]\\s*[\"']?([A-Za-z0-9-]{32,})[\"']?/g,\n ],\n};\n\nexport const MAILCHIMP_KEY: SecretPattern = {\n secretType: \"MAILCHIMP_KEY\",\n patterns: [/[a-f0-9]{32}-us[0-9]{1,2}/g],\n};\n\nexport const POSTMARK_TOKEN: SecretPattern = {\n secretType: \"POSTMARK_TOKEN\",\n patterns: [/(?:POSTMARK_API_TOKEN|POSTMARK_SERVER_TOKEN)\\s*[:=]\\s*[\"']?([a-f0-9-]{36})[\"']?/g],\n};\n\nexport const TEAMS_WEBHOOK: SecretPattern = {\n secretType: \"TEAMS_WEBHOOK\",\n patterns: [/https:\\/\\/[a-z0-9-]+\\.webhook\\.office\\.com\\/webhookb2\\/[A-Za-z0-9-]+/g],\n};\n\nexport const INTERCOM_TOKEN: SecretPattern = {\n secretType: \"INTERCOM_TOKEN\",\n patterns: [/(?:INTERCOM_TOKEN|INTERCOM_API_KEY)\\s*[:=]\\s*[\"']?([A-Za-z0-9_=-]{20,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const COMMUNICATION_PATTERNS: SecretPattern[] = [\n SLACK_TOKEN,\n SLACK_WEBHOOK,\n SLACK_APP_TOKEN,\n DISCORD_TOKEN,\n DISCORD_WEBHOOK,\n TELEGRAM_BOT_TOKEN,\n TWILIO_KEY,\n TWILIO_ACCOUNT_SID,\n TWILIO_AUTH_TOKEN,\n SENDGRID_KEY,\n MAILGUN_KEY,\n MAILCHIMP_KEY,\n POSTMARK_TOKEN,\n TEAMS_WEBHOOK,\n INTERCOM_TOKEN,\n];\n","/**\n * Payment platform secret patterns.\n * Derived from GitLeaks (MIT) and public documentation.\n */\n\nimport type { SecretPattern } from \"../../types\";\n\nexport const STRIPE_KEY: SecretPattern = {\n secretType: \"STRIPE_KEY\",\n patterns: [\n /sk_live_[A-Za-z0-9]{20,}/g,\n /rk_live_[A-Za-z0-9]{20,}/g,\n /sk_test_[A-Za-z0-9]{20,}/g,\n /rk_test_[A-Za-z0-9]{20,}/g,\n ],\n};\n\nexport const STRIPE_WEBHOOK_SECRET: SecretPattern = {\n secretType: \"STRIPE_WEBHOOK_SECRET\",\n patterns: [/whsec_[A-Za-z0-9]{32,}/g],\n};\n\nexport const SQUARE_ACCESS_TOKEN: SecretPattern = {\n secretType: \"SQUARE_ACCESS_TOKEN\",\n patterns: [\n /sq0atp-[A-Za-z0-9_-]{22}/g,\n /EAAAE[A-Za-z0-9]{50,}/g,\n ],\n};\n\nexport const SQUARE_OAUTH_SECRET: SecretPattern = {\n secretType: \"SQUARE_OAUTH_SECRET\",\n patterns: [/sq0csp-[A-Za-z0-9_-]{43}/g],\n};\n\nexport const PAYPAL_CLIENT_SECRET: SecretPattern = {\n secretType: \"PAYPAL_CLIENT_SECRET\",\n patterns: [/(?:PAYPAL_CLIENT_SECRET|PAYPAL_SECRET)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{40,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const PAYPAL_BRAINTREE_TOKEN: SecretPattern = {\n secretType: \"PAYPAL_BRAINTREE_TOKEN\",\n patterns: [/access_token\\$(?:production|sandbox)\\$[a-z0-9]{16}\\$[a-f0-9]{32}/g],\n};\n\nexport const BRAINTREE_KEY: SecretPattern = {\n secretType: \"BRAINTREE_KEY\",\n patterns: [/(?:BRAINTREE_(?:PUBLIC|PRIVATE)_KEY)\\s*[:=]\\s*[\"']?([A-Za-z0-9]{32})[\"']?/g],\n};\n\nexport const ADYEN_API_KEY: SecretPattern = {\n secretType: \"ADYEN_API_KEY\",\n patterns: [/(?:ADYEN_API_KEY)\\s*[:=]\\s*[\"']?([A-Za-z0-9]{32,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const SHOPIFY_TOKEN: SecretPattern = {\n secretType: \"SHOPIFY_TOKEN\",\n patterns: [\n /shpat_[a-fA-F0-9]{32}/g,\n /shpca_[a-fA-F0-9]{32}/g,\n /shppa_[a-fA-F0-9]{32}/g,\n /shpss_[a-fA-F0-9]{32}/g,\n ],\n};\n\nexport const PLAID_KEY: SecretPattern = {\n secretType: \"PLAID_KEY\",\n patterns: [\n /(?:PLAID_CLIENT_ID)\\s*[:=]\\s*[\"']?([a-f0-9]{24})[\"']?/g,\n /(?:PLAID_SECRET)\\s*[:=]\\s*[\"']?([a-f0-9]{30})[\"']?/g,\n /access-(?:sandbox|development|production)-[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/g,\n ],\n};\n\nexport const PAYMENT_PATTERNS: SecretPattern[] = [\n STRIPE_KEY,\n STRIPE_WEBHOOK_SECRET,\n SQUARE_ACCESS_TOKEN,\n SQUARE_OAUTH_SECRET,\n PAYPAL_CLIENT_SECRET,\n PAYPAL_BRAINTREE_TOKEN,\n BRAINTREE_KEY,\n ADYEN_API_KEY,\n SHOPIFY_TOKEN,\n PLAID_KEY,\n];\n","/**\n * Database and data store secret patterns.\n * Derived from GitLeaks (MIT) and public documentation.\n */\n\nimport type { SecretPattern } from \"../../types\";\n\nexport const DATABASE_CONNECTION_STRING: SecretPattern = {\n secretType: \"DATABASE_CONNECTION_STRING\",\n patterns: [\n /(?:postgres|postgresql|mysql|mongodb|redis|amqp|mssql):\\/\\/[^\\s\"']+/gi,\n ],\n};\n\nexport const MONGODB_SRV: SecretPattern = {\n secretType: \"MONGODB_SRV\",\n patterns: [/mongodb\\+srv:\\/\\/[^\\s\"']+/g],\n};\n\nexport const REDIS_URL_WITH_PASSWORD: SecretPattern = {\n secretType: \"REDIS_URL_WITH_PASSWORD\",\n patterns: [/redis:\\/\\/:[^@\\s]+@[^\\s\"']+/g],\n};\n\nexport const ELASTICSEARCH_URL: SecretPattern = {\n secretType: \"ELASTICSEARCH_URL\",\n patterns: [/https?:\\/\\/[^:]+:[^@]+@[^/]*(?:elastic|es|elasticsearch)[^\\s\"']*/gi],\n};\n\nexport const FIREBASE_KEY: SecretPattern = {\n secretType: \"FIREBASE_KEY\",\n patterns: [/(?:FIREBASE_API_KEY|FIREBASE_KEY)\\s*[:=]\\s*[\"']?(AIza[A-Za-z0-9_-]{35})[\"']?/g],\n};\n\nexport const FIREBASE_URL: SecretPattern = {\n secretType: \"FIREBASE_URL\",\n patterns: [/https:\\/\\/[a-z0-9-]+\\.firebaseio\\.com/g],\n};\n\nexport const SUPABASE_KEY: SecretPattern = {\n secretType: \"SUPABASE_KEY\",\n patterns: [\n /(?:SUPABASE_KEY|SUPABASE_ANON_KEY|SUPABASE_SERVICE_KEY)\\s*[:=]\\s*[\"']?(eyJ[A-Za-z0-9_-]{100,})[\"']?/g,\n ],\n};\n\nexport const PLANETSCALE_TOKEN: SecretPattern = {\n secretType: \"PLANETSCALE_TOKEN\",\n patterns: [/pscale_tkn_[A-Za-z0-9_-]{40,}/g],\n};\n\nexport const PLANETSCALE_PASSWORD: SecretPattern = {\n secretType: \"PLANETSCALE_PASSWORD\",\n patterns: [/pscale_pw_[A-Za-z0-9_-]{40,}/g],\n};\n\nexport const COCKROACHDB_CONNECTION: SecretPattern = {\n secretType: \"COCKROACHDB_CONNECTION\",\n patterns: [/(?:COCKROACH_URL|DATABASE_URL)\\s*[:=]\\s*[\"']?(postgresql:\\/\\/[^\\s\"']+\\.cockroachlabs\\.cloud[^\\s\"']*)[\"']?/g],\n};\n\nexport const NEON_DB_TOKEN: SecretPattern = {\n secretType: \"NEON_DB_TOKEN\",\n patterns: [/(?:NEON_API_KEY|NEON_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{40,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const DATABASE_PATTERNS: SecretPattern[] = [\n DATABASE_CONNECTION_STRING,\n MONGODB_SRV,\n REDIS_URL_WITH_PASSWORD,\n ELASTICSEARCH_URL,\n FIREBASE_KEY,\n FIREBASE_URL,\n SUPABASE_KEY,\n PLANETSCALE_TOKEN,\n PLANETSCALE_PASSWORD,\n COCKROACHDB_CONNECTION,\n NEON_DB_TOKEN,\n];\n","/**\n * Infrastructure and DevOps secret patterns.\n * Derived from GitLeaks (MIT) and public documentation.\n */\n\nimport type { SecretPattern } from \"../../types\";\n\nexport const DOCKER_HUB_TOKEN: SecretPattern = {\n secretType: \"DOCKER_HUB_TOKEN\",\n patterns: [\n /dckr_pat_[A-Za-z0-9_-]{27,}/g,\n /(?:DOCKER_PASSWORD|DOCKERHUB_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{36,})[\"']?/g,\n ],\n};\n\nexport const DOCKER_REGISTRY_AUTH: SecretPattern = {\n secretType: \"DOCKER_REGISTRY_AUTH\",\n patterns: [/\"auth\"\\s*:\\s*\"([A-Za-z0-9+/=]{20,})\"/g],\n minEntropy: 3.5,\n};\n\nexport const KUBERNETES_SERVICE_TOKEN: SecretPattern = {\n secretType: \"KUBERNETES_SERVICE_TOKEN\",\n patterns: [/(?:KUBERNETES_TOKEN|K8S_TOKEN|KUBE_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{100,})[\"']?/g],\n minEntropy: 4.0,\n};\n\nexport const TERRAFORM_TOKEN: SecretPattern = {\n secretType: \"TERRAFORM_TOKEN\",\n patterns: [\n /[A-Za-z0-9]{14}\\.atlasv1\\.[A-Za-z0-9_-]{60,}/g,\n /(?:TF_TOKEN|TFC_TOKEN|TERRAFORM_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9._-]{40,})[\"']?/g,\n ],\n};\n\nexport const VAULT_TOKEN: SecretPattern = {\n secretType: \"VAULT_TOKEN\",\n patterns: [\n /hvs\\.[A-Za-z0-9_-]{24,}/g,\n /(?:VAULT_TOKEN)\\s*[:=]\\s*[\"']?([a-z0-9.-]{20,})[\"']?/g,\n ],\n};\n\nexport const CONSUL_TOKEN: SecretPattern = {\n secretType: \"CONSUL_TOKEN\",\n patterns: [/(?:CONSUL_TOKEN|CONSUL_HTTP_TOKEN)\\s*[:=]\\s*[\"']?([a-f0-9-]{36})[\"']?/g],\n};\n\nexport const PULUMI_TOKEN: SecretPattern = {\n secretType: \"PULUMI_TOKEN\",\n patterns: [/pul-[A-Za-z0-9]{40}/g],\n};\n\nexport const ANSIBLE_VAULT_PASSWORD: SecretPattern = {\n secretType: \"ANSIBLE_VAULT_PASSWORD\",\n patterns: [/\\$ANSIBLE_VAULT;[0-9.]+;AES256/g],\n};\n\nexport const HELM_REPO_TOKEN: SecretPattern = {\n secretType: \"HELM_REPO_TOKEN\",\n patterns: [/(?:HELM_REPO_PASSWORD|HELM_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{20,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const GRAFANA_API_KEY: SecretPattern = {\n secretType: \"GRAFANA_API_KEY\",\n patterns: [\n /eyJrIjoi[A-Za-z0-9_-]{30,}/g,\n /glsa_[A-Za-z0-9]{32}_[A-Fa-f0-9]{8}/g,\n /glc_[A-Za-z0-9+/]{32,}={0,2}/g,\n ],\n};\n\nexport const INFRASTRUCTURE_PATTERNS: SecretPattern[] = [\n DOCKER_HUB_TOKEN,\n DOCKER_REGISTRY_AUTH,\n KUBERNETES_SERVICE_TOKEN,\n TERRAFORM_TOKEN,\n VAULT_TOKEN,\n CONSUL_TOKEN,\n PULUMI_TOKEN,\n ANSIBLE_VAULT_PASSWORD,\n HELM_REPO_TOKEN,\n GRAFANA_API_KEY,\n];\n","/**\n * SaaS platform secret patterns.\n * Derived from GitLeaks (MIT) and public documentation.\n */\n\nimport type { SecretPattern } from \"../../types\";\n\nexport const SALESFORCE_TOKEN: SecretPattern = {\n secretType: \"SALESFORCE_TOKEN\",\n patterns: [/(?:SALESFORCE_TOKEN|SF_ACCESS_TOKEN|SFDC_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9!]{40,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const HUBSPOT_API_KEY: SecretPattern = {\n secretType: \"HUBSPOT_API_KEY\",\n patterns: [\n /(?:HUBSPOT_API_KEY|HAPI_KEY)\\s*[:=]\\s*[\"']?([a-f0-9-]{36})[\"']?/g,\n /pat-(?:na|eu)1-[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/g,\n ],\n};\n\nexport const ZENDESK_TOKEN: SecretPattern = {\n secretType: \"ZENDESK_TOKEN\",\n patterns: [/(?:ZENDESK_TOKEN|ZENDESK_API_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9]{40})[\"']?/g],\n};\n\nexport const DATADOG_API_KEY: SecretPattern = {\n secretType: \"DATADOG_API_KEY\",\n patterns: [\n /(?:DD_API_KEY|DATADOG_API_KEY)\\s*[:=]\\s*[\"']?([a-f0-9]{32})[\"']?/g,\n /(?:DD_APP_KEY|DATADOG_APP_KEY)\\s*[:=]\\s*[\"']?([a-f0-9]{40})[\"']?/g,\n ],\n};\n\nexport const NEW_RELIC_KEY: SecretPattern = {\n secretType: \"NEW_RELIC_KEY\",\n patterns: [\n /NRAK-[A-Z0-9]{27}/g,\n /(?:NEW_RELIC_LICENSE_KEY|NEWRELIC_KEY)\\s*[:=]\\s*[\"']?([a-f0-9]{40})[\"']?/g,\n /NRII-[A-Za-z0-9_-]{32}/g,\n /NRIQ-[A-Za-z0-9_-]{32}/g,\n ],\n};\n\nexport const PAGERDUTY_KEY: SecretPattern = {\n secretType: \"PAGERDUTY_KEY\",\n patterns: [/(?:PAGERDUTY_TOKEN|PD_API_KEY)\\s*[:=]\\s*[\"']?([A-Za-z0-9_+-]{20})[\"']?/g],\n};\n\nexport const LAUNCHDARKLY_KEY: SecretPattern = {\n secretType: \"LAUNCHDARKLY_KEY\",\n patterns: [\n /(?:sdk|mob|api)-[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/g,\n ],\n};\n\nexport const SENTRY_DSN: SecretPattern = {\n secretType: \"SENTRY_DSN\",\n patterns: [/https:\\/\\/[a-f0-9]{32}@[a-z0-9.]+\\.ingest\\.sentry\\.io\\/[0-9]+/g],\n};\n\nexport const SENTRY_AUTH_TOKEN: SecretPattern = {\n secretType: \"SENTRY_AUTH_TOKEN\",\n patterns: [\n /sntrys_[A-Za-z0-9]{60,}/g,\n /(?:SENTRY_AUTH_TOKEN)\\s*[:=]\\s*[\"']?([a-f0-9]{64})[\"']?/g,\n ],\n};\n\nexport const SEGMENT_KEY: SecretPattern = {\n secretType: \"SEGMENT_KEY\",\n patterns: [/(?:SEGMENT_WRITE_KEY|SEGMENT_API_KEY)\\s*[:=]\\s*[\"']?([A-Za-z0-9]{32})[\"']?/g],\n};\n\nexport const AIRTABLE_KEY: SecretPattern = {\n secretType: \"AIRTABLE_KEY\",\n patterns: [\n /key[A-Za-z0-9]{14}/g,\n /pat[A-Za-z0-9]{14}\\.[a-f0-9]{64}/g,\n ],\n};\n\nexport const NOTION_TOKEN: SecretPattern = {\n secretType: \"NOTION_TOKEN\",\n patterns: [\n /secret_[A-Za-z0-9]{43}/g,\n /ntn_[A-Za-z0-9]{40,}/g,\n ],\n};\n\nexport const ASANA_TOKEN: SecretPattern = {\n secretType: \"ASANA_TOKEN\",\n patterns: [/(?:ASANA_TOKEN|ASANA_ACCESS_TOKEN)\\s*[:=]\\s*[\"']?([0-9]\\/[0-9]{16}:[A-Za-z0-9]{32})[\"']?/g],\n};\n\nexport const JIRA_TOKEN: SecretPattern = {\n secretType: \"JIRA_TOKEN\",\n patterns: [/(?:JIRA_TOKEN|JIRA_API_TOKEN|ATLASSIAN_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9]{24,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const LINEAR_API_KEY: SecretPattern = {\n secretType: \"LINEAR_API_KEY\",\n patterns: [/lin_api_[A-Za-z0-9]{40}/g],\n};\n\nexport const CONTENTFUL_TOKEN: SecretPattern = {\n secretType: \"CONTENTFUL_TOKEN\",\n patterns: [/(?:CONTENTFUL_ACCESS_TOKEN|CONTENTFUL_DELIVERY_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{43})[\"']?/g],\n};\n\nexport const ALGOLIA_KEY: SecretPattern = {\n secretType: \"ALGOLIA_KEY\",\n patterns: [/(?:ALGOLIA_ADMIN_KEY|ALGOLIA_API_KEY)\\s*[:=]\\s*[\"']?([a-f0-9]{32})[\"']?/g],\n};\n\nexport const SAAS_PATTERNS: SecretPattern[] = [\n SALESFORCE_TOKEN,\n HUBSPOT_API_KEY,\n ZENDESK_TOKEN,\n DATADOG_API_KEY,\n NEW_RELIC_KEY,\n PAGERDUTY_KEY,\n LAUNCHDARKLY_KEY,\n SENTRY_DSN,\n SENTRY_AUTH_TOKEN,\n SEGMENT_KEY,\n AIRTABLE_KEY,\n NOTION_TOKEN,\n ASANA_TOKEN,\n JIRA_TOKEN,\n LINEAR_API_KEY,\n CONTENTFUL_TOKEN,\n ALGOLIA_KEY,\n];\n","/**\n * AI/ML platform secret patterns.\n * OpenAI/Anthropic patterns from original Bulkhead.\n * Additional patterns from public documentation.\n */\n\nimport type { SecretPattern } from \"../../types\";\n\nexport const OPENAI_KEY: SecretPattern = {\n secretType: \"OPENAI_KEY\",\n patterns: [\n /sk-[A-Za-z0-9]{20}T3BlbkFJ[A-Za-z0-9]{20}/g,\n /sk-proj-[A-Za-z0-9_-]{40,}/g,\n /sk-[A-Za-z0-9_-]{40,}/g,\n ],\n};\n\nexport const ANTHROPIC_KEY: SecretPattern = {\n secretType: \"ANTHROPIC_KEY\",\n patterns: [/sk-ant-[A-Za-z0-9_-]{40,}/g],\n};\n\nexport const COHERE_KEY: SecretPattern = {\n secretType: \"COHERE_KEY\",\n patterns: [\n /(?:COHERE_API_KEY|CO_API_KEY)\\s*[:=]\\s*[\"']?([A-Za-z0-9]{40})[\"']?/g,\n ],\n};\n\nexport const HUGGINGFACE_TOKEN: SecretPattern = {\n secretType: \"HUGGINGFACE_TOKEN\",\n patterns: [/hf_[A-Za-z0-9]{34}/g],\n};\n\nexport const REPLICATE_TOKEN: SecretPattern = {\n secretType: \"REPLICATE_TOKEN\",\n patterns: [\n /r8_[A-Za-z0-9]{37}/g,\n /(?:REPLICATE_API_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{40})[\"']?/g,\n ],\n};\n\nexport const GOOGLE_AI_KEY: SecretPattern = {\n secretType: \"GOOGLE_AI_KEY\",\n patterns: [/(?:GOOGLE_AI_KEY|GEMINI_API_KEY)\\s*[:=]\\s*[\"']?(AIza[A-Za-z0-9_-]{35})[\"']?/g],\n};\n\nexport const MISTRAL_KEY: SecretPattern = {\n secretType: \"MISTRAL_KEY\",\n patterns: [/(?:MISTRAL_API_KEY)\\s*[:=]\\s*[\"']?([A-Za-z0-9]{32})[\"']?/g],\n};\n\nexport const PINECONE_KEY: SecretPattern = {\n secretType: \"PINECONE_KEY\",\n patterns: [/(?:PINECONE_API_KEY)\\s*[:=]\\s*[\"']?([a-f0-9-]{36})[\"']?/g],\n};\n\nexport const WEAVIATE_KEY: SecretPattern = {\n secretType: \"WEAVIATE_KEY\",\n patterns: [/(?:WEAVIATE_API_KEY)\\s*[:=]\\s*[\"']?([A-Za-z0-9]{40,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const WANDB_KEY: SecretPattern = {\n secretType: \"WANDB_KEY\",\n patterns: [/(?:WANDB_API_KEY)\\s*[:=]\\s*[\"']?([a-f0-9]{40})[\"']?/g],\n};\n\nexport const DEEPSEEK_KEY: SecretPattern = {\n secretType: \"DEEPSEEK_KEY\",\n patterns: [/(?:DEEPSEEK_API_KEY)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{40,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const GROQ_KEY: SecretPattern = {\n secretType: \"GROQ_KEY\",\n patterns: [/gsk_[A-Za-z0-9]{52}/g],\n};\n\nexport const AI_ML_PATTERNS: SecretPattern[] = [\n OPENAI_KEY,\n ANTHROPIC_KEY,\n COHERE_KEY,\n HUGGINGFACE_TOKEN,\n REPLICATE_TOKEN,\n GOOGLE_AI_KEY,\n MISTRAL_KEY,\n PINECONE_KEY,\n WEAVIATE_KEY,\n WANDB_KEY,\n DEEPSEEK_KEY,\n GROQ_KEY,\n];\n","/**\n * Authentication platform secret patterns.\n * Derived from GitLeaks (MIT) and public documentation.\n */\n\nimport type { SecretPattern } from \"../../types\";\n\nexport const AUTH0_CLIENT_SECRET: SecretPattern = {\n secretType: \"AUTH0_CLIENT_SECRET\",\n patterns: [/(?:AUTH0_CLIENT_SECRET)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{32,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const AUTH0_MANAGEMENT_TOKEN: SecretPattern = {\n secretType: \"AUTH0_MANAGEMENT_TOKEN\",\n patterns: [/(?:AUTH0_MANAGEMENT_API_TOKEN|AUTH0_TOKEN)\\s*[:=]\\s*[\"']?(eyJ[A-Za-z0-9_-]{100,})[\"']?/g],\n};\n\nexport const OKTA_TOKEN: SecretPattern = {\n secretType: \"OKTA_TOKEN\",\n patterns: [\n /(?:OKTA_TOKEN|OKTA_API_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{42})[\"']?/g,\n /00[A-Za-z0-9_-]{40}/g,\n ],\n};\n\nexport const CLERK_SECRET_KEY: SecretPattern = {\n secretType: \"CLERK_SECRET_KEY\",\n patterns: [/sk_(?:live|test)_[A-Za-z0-9]{24,}/g],\n};\n\nexport const CLERK_PUBLISHABLE_KEY: SecretPattern = {\n secretType: \"CLERK_PUBLISHABLE_KEY\",\n patterns: [/pk_(?:live|test)_[A-Za-z0-9]{24,}/g],\n};\n\nexport const FIREBASE_AUTH_KEY: SecretPattern = {\n secretType: \"FIREBASE_AUTH_KEY\",\n patterns: [/(?:FIREBASE_AUTH_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{100,})[\"']?/g],\n minEntropy: 4.0,\n};\n\nexport const SUPABASE_SERVICE_KEY: SecretPattern = {\n secretType: \"SUPABASE_SERVICE_KEY\",\n patterns: [/(?:SUPABASE_SERVICE_ROLE_KEY)\\s*[:=]\\s*[\"']?(eyJ[A-Za-z0-9_-]{100,})[\"']?/g],\n};\n\nexport const STYTCH_SECRET: SecretPattern = {\n secretType: \"STYTCH_SECRET\",\n patterns: [/secret-(?:live|test)-[A-Za-z0-9_-]{36,}/g],\n};\n\nexport const PROPELAUTH_KEY: SecretPattern = {\n secretType: \"PROPELAUTH_KEY\",\n patterns: [/(?:PROPELAUTH_API_KEY)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{40,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const KEYCLOAK_SECRET: SecretPattern = {\n secretType: \"KEYCLOAK_SECRET\",\n patterns: [/(?:KEYCLOAK_CLIENT_SECRET|KC_CLIENT_SECRET)\\s*[:=]\\s*[\"']?([A-Za-z0-9-]{36})[\"']?/g],\n};\n\nexport const AUTH_PATTERNS: SecretPattern[] = [\n AUTH0_CLIENT_SECRET,\n AUTH0_MANAGEMENT_TOKEN,\n OKTA_TOKEN,\n CLERK_SECRET_KEY,\n CLERK_PUBLISHABLE_KEY,\n FIREBASE_AUTH_KEY,\n SUPABASE_SERVICE_KEY,\n STYTCH_SECRET,\n PROPELAUTH_KEY,\n KEYCLOAK_SECRET,\n];\n","/**\n * CDN and hosting platform secret patterns.\n * Derived from GitLeaks (MIT) and public documentation.\n */\n\nimport type { SecretPattern } from \"../../types\";\n\nexport const CLOUDFLARE_API_KEY: SecretPattern = {\n secretType: \"CLOUDFLARE_API_KEY\",\n patterns: [\n /(?:CLOUDFLARE_API_KEY|CF_API_KEY)\\s*[:=]\\s*[\"']?([a-f0-9]{37})[\"']?/g,\n /(?:CLOUDFLARE_API_TOKEN|CF_API_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{40})[\"']?/g,\n ],\n};\n\nexport const CLOUDFLARE_CA_KEY: SecretPattern = {\n secretType: \"CLOUDFLARE_CA_KEY\",\n patterns: [/v1\\.0-[a-f0-9]{24}-[a-f0-9]{146}/g],\n};\n\nexport const FASTLY_API_KEY: SecretPattern = {\n secretType: \"FASTLY_API_KEY\",\n patterns: [/(?:FASTLY_API_TOKEN|FASTLY_KEY)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{32})[\"']?/g],\n};\n\nexport const NETLIFY_TOKEN: SecretPattern = {\n secretType: \"NETLIFY_TOKEN\",\n patterns: [/(?:NETLIFY_AUTH_TOKEN|NETLIFY_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{40,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const VERCEL_TOKEN: SecretPattern = {\n secretType: \"VERCEL_TOKEN\",\n patterns: [/(?:VERCEL_TOKEN|NOW_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9]{24})[\"']?/g],\n};\n\nexport const HEROKU_API_KEY: SecretPattern = {\n secretType: \"HEROKU_API_KEY\",\n patterns: [\n /(?:HEROKU_API_KEY)\\s*[:=]\\s*[\"']?([a-f0-9-]{36})[\"']?/g,\n /[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/g,\n ],\n};\n\nexport const RENDER_TOKEN: SecretPattern = {\n secretType: \"RENDER_TOKEN\",\n patterns: [/rnd_[A-Za-z0-9]{32,}/g],\n};\n\nexport const FLY_IO_TOKEN: SecretPattern = {\n secretType: \"FLY_IO_TOKEN\",\n patterns: [/(?:FLY_ACCESS_TOKEN|FLY_API_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{40,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const RAILWAY_TOKEN: SecretPattern = {\n secretType: \"RAILWAY_TOKEN\",\n patterns: [/(?:RAILWAY_TOKEN)\\s*[:=]\\s*[\"']?([a-f0-9-]{36})[\"']?/g],\n};\n\nexport const SURGE_TOKEN: SecretPattern = {\n secretType: \"SURGE_TOKEN\",\n patterns: [/(?:SURGE_TOKEN|SURGE_LOGIN)\\s*[:=]\\s*[\"']?([A-Za-z0-9._-]{20,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const CDN_HOSTING_PATTERNS: SecretPattern[] = [\n CLOUDFLARE_API_KEY,\n CLOUDFLARE_CA_KEY,\n FASTLY_API_KEY,\n NETLIFY_TOKEN,\n VERCEL_TOKEN,\n HEROKU_API_KEY,\n RENDER_TOKEN,\n FLY_IO_TOKEN,\n RAILWAY_TOKEN,\n SURGE_TOKEN,\n];\n","/**\n * Social media platform secret patterns.\n * Derived from GitLeaks (MIT) and public documentation.\n */\n\nimport type { SecretPattern } from \"../../types\";\n\nexport const TWITTER_API_KEY: SecretPattern = {\n secretType: \"TWITTER_API_KEY\",\n patterns: [\n /(?:TWITTER_API_KEY|TWITTER_CONSUMER_KEY)\\s*[:=]\\s*[\"']?([A-Za-z0-9]{25})[\"']?/g,\n ],\n};\n\nexport const TWITTER_API_SECRET: SecretPattern = {\n secretType: \"TWITTER_API_SECRET\",\n patterns: [\n /(?:TWITTER_API_SECRET|TWITTER_CONSUMER_SECRET)\\s*[:=]\\s*[\"']?([A-Za-z0-9]{50})[\"']?/g,\n ],\n};\n\nexport const TWITTER_BEARER_TOKEN: SecretPattern = {\n secretType: \"TWITTER_BEARER_TOKEN\",\n patterns: [/AAAAAAAAAAAAAAAAAAA[A-Za-z0-9%]{30,}/g],\n};\n\nexport const FACEBOOK_TOKEN: SecretPattern = {\n secretType: \"FACEBOOK_TOKEN\",\n patterns: [\n /EAA[A-Za-z0-9]{100,}/g,\n /(?:FACEBOOK_TOKEN|FB_ACCESS_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9|_-]{40,})[\"']?/g,\n ],\n};\n\nexport const FACEBOOK_SECRET: SecretPattern = {\n secretType: \"FACEBOOK_SECRET\",\n patterns: [/(?:FACEBOOK_SECRET|FB_APP_SECRET)\\s*[:=]\\s*[\"']?([a-f0-9]{32})[\"']?/g],\n};\n\nexport const INSTAGRAM_TOKEN: SecretPattern = {\n secretType: \"INSTAGRAM_TOKEN\",\n patterns: [/(?:INSTAGRAM_TOKEN|IG_ACCESS_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9.]{100,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const LINKEDIN_SECRET: SecretPattern = {\n secretType: \"LINKEDIN_SECRET\",\n patterns: [/(?:LINKEDIN_CLIENT_SECRET|LINKEDIN_SECRET)\\s*[:=]\\s*[\"']?([A-Za-z0-9]{16})[\"']?/g],\n};\n\nexport const YOUTUBE_API_KEY: SecretPattern = {\n secretType: \"YOUTUBE_API_KEY\",\n patterns: [/(?:YOUTUBE_API_KEY)\\s*[:=]\\s*[\"']?(AIza[A-Za-z0-9_-]{35})[\"']?/g],\n};\n\nexport const TIKTOK_TOKEN: SecretPattern = {\n secretType: \"TIKTOK_TOKEN\",\n patterns: [/(?:TIKTOK_TOKEN|TIKTOK_ACCESS_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9._-]{40,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const PINTEREST_TOKEN: SecretPattern = {\n secretType: \"PINTEREST_TOKEN\",\n patterns: [/(?:PINTEREST_TOKEN|PINTEREST_ACCESS_TOKEN)\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]{40,})[\"']?/g],\n minEntropy: 3.5,\n};\n\nexport const SOCIAL_PATTERNS: SecretPattern[] = [\n TWITTER_API_KEY,\n TWITTER_API_SECRET,\n TWITTER_BEARER_TOKEN,\n FACEBOOK_TOKEN,\n FACEBOOK_SECRET,\n INSTAGRAM_TOKEN,\n LINKEDIN_SECRET,\n YOUTUBE_API_KEY,\n TIKTOK_TOKEN,\n PINTEREST_TOKEN,\n];\n","/**\n * Generic secret patterns — catch-all detectors.\n * Inspired by HAI-Guardrails (MIT). See ATTRIBUTION.md.\n */\n\nimport type { SecretPattern } from \"../../types\";\n\nexport const JWT_TOKEN: SecretPattern = {\n secretType: \"JWT_TOKEN\",\n patterns: [\n /eyJ[A-Za-z0-9_-]{10,}\\.eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}/g,\n ],\n};\n\nexport const PRIVATE_KEY: SecretPattern = {\n secretType: \"PRIVATE_KEY\",\n patterns: [\n /-----BEGIN (?:RSA |EC |ED25519 |OPENSSH |DSA |PGP )?PRIVATE KEY(?: BLOCK)?-----/g,\n ],\n};\n\nexport const NPM_TOKEN: SecretPattern = {\n secretType: \"NPM_TOKEN\",\n patterns: [\n /npm_[A-Za-z0-9]{36}/g,\n /\\/\\/registry\\.npmjs\\.org\\/:_authToken=[A-Za-z0-9-]+/g,\n ],\n};\n\nexport const PYPI_TOKEN: SecretPattern = {\n secretType: \"PYPI_TOKEN\",\n patterns: [/pypi-AgEIcHlwaS5vcmc[A-Za-z0-9_-]{50,}/g],\n};\n\nexport const RUBYGEMS_KEY: SecretPattern = {\n secretType: \"RUBYGEMS_KEY\",\n patterns: [/rubygems_[a-f0-9]{48}/g],\n};\n\nexport const NUGET_KEY: SecretPattern = {\n secretType: \"NUGET_KEY\",\n patterns: [/oy2[A-Za-z0-9]{43}/g],\n};\n\nexport const CRATES_IO_TOKEN: SecretPattern = {\n secretType: \"CRATES_IO_TOKEN\",\n patterns: [/cio[A-Za-z0-9]{32}/g],\n};\n\nexport const GENERIC_HIGH_ENTROPY: SecretPattern = {\n secretType: \"GENERIC_SECRET\",\n patterns: [\n /(?:api[_-]?key|secret|token|password|passwd|credential|auth)[_\\s]*[:=]\\s*[\"']([A-Za-z0-9+/=_\\-]{16,})[\"']/gi,\n ],\n minEntropy: 3.5,\n};\n\nexport const GENERIC_BEARER_TOKEN: SecretPattern = {\n secretType: \"BEARER_TOKEN\",\n patterns: [\n /(?:Authorization|Bearer)\\s*[:=]\\s*[\"']?Bearer\\s+([A-Za-z0-9._~+/=-]{20,})[\"']?/g,\n ],\n minEntropy: 3.5,\n};\n\nexport const BASIC_AUTH_HEADER: SecretPattern = {\n secretType: \"BASIC_AUTH\",\n patterns: [\n /(?:Authorization)\\s*[:=]\\s*[\"']?Basic\\s+([A-Za-z0-9+/=]{20,})[\"']?/g,\n ],\n};\n\nexport const GENERIC_PATTERNS: SecretPattern[] = [\n JWT_TOKEN,\n PRIVATE_KEY,\n NPM_TOKEN,\n PYPI_TOKEN,\n RUBYGEMS_KEY,\n NUGET_KEY,\n CRATES_IO_TOKEN,\n GENERIC_HIGH_ENTROPY,\n GENERIC_BEARER_TOKEN,\n BASIC_AUTH_HEADER,\n];\n","/**\n * Secret pattern registry — aggregates all category patterns.\n *\n * Pattern sources:\n * - HAI-Guardrails (MIT): AWS, GitHub, GitLab, Slack, JWT, Private Key, Generic\n * - GitLeaks (MIT): CI/CD, SaaS, Infrastructure, CDN, Social, and others\n * - Public documentation: AI/ML, Auth, Payment, Database providers\n *\n * See ATTRIBUTION.md for full attribution details.\n */\n\nimport type { SecretPattern } from \"../../types\";\nimport { CLOUD_PATTERNS } from \"./cloud\";\nimport { SOURCE_CONTROL_PATTERNS } from \"./source-control\";\nimport { CICD_PATTERNS } from \"./cicd\";\nimport { COMMUNICATION_PATTERNS } from \"./communication\";\nimport { PAYMENT_PATTERNS } from \"./payment\";\nimport { DATABASE_PATTERNS } from \"./database\";\nimport { INFRASTRUCTURE_PATTERNS } from \"./infrastructure\";\nimport { SAAS_PATTERNS } from \"./saas\";\nimport { AI_ML_PATTERNS } from \"./ai-ml\";\nimport { AUTH_PATTERNS } from \"./auth\";\nimport { CDN_HOSTING_PATTERNS } from \"./cdn-hosting\";\nimport { SOCIAL_PATTERNS } from \"./social\";\nimport { GENERIC_PATTERNS } from \"./generic\";\n\n// Re-export categories for selective use\nexport { CLOUD_PATTERNS } from \"./cloud\";\nexport { SOURCE_CONTROL_PATTERNS } from \"./source-control\";\nexport { CICD_PATTERNS } from \"./cicd\";\nexport { COMMUNICATION_PATTERNS } from \"./communication\";\nexport { PAYMENT_PATTERNS } from \"./payment\";\nexport { DATABASE_PATTERNS } from \"./database\";\nexport { INFRASTRUCTURE_PATTERNS } from \"./infrastructure\";\nexport { SAAS_PATTERNS } from \"./saas\";\nexport { AI_ML_PATTERNS } from \"./ai-ml\";\nexport { AUTH_PATTERNS } from \"./auth\";\nexport { CDN_HOSTING_PATTERNS } from \"./cdn-hosting\";\nexport { SOCIAL_PATTERNS } from \"./social\";\nexport { GENERIC_PATTERNS } from \"./generic\";\n\n/** All secret patterns across all categories */\nexport const ALL_SECRET_PATTERNS: SecretPattern[] = [\n ...CLOUD_PATTERNS,\n ...SOURCE_CONTROL_PATTERNS,\n ...CICD_PATTERNS,\n ...COMMUNICATION_PATTERNS,\n ...PAYMENT_PATTERNS,\n ...DATABASE_PATTERNS,\n ...INFRASTRUCTURE_PATTERNS,\n ...SAAS_PATTERNS,\n ...AI_ML_PATTERNS,\n ...AUTH_PATTERNS,\n ...CDN_HOSTING_PATTERNS,\n ...SOCIAL_PATTERNS,\n ...GENERIC_PATTERNS,\n];\n","/**\n * Secret Guard — detects API keys, tokens, credentials, and connection strings.\n * Pattern approach inspired by HAI-Guardrails. See ATTRIBUTION.md.\n */\n\nimport { BaseGuard } from \"./base.guard\";\nimport type { GuardConfig, GuardResult, Detection } from \"../types\";\nimport { ALL_SECRET_PATTERNS } from \"../patterns/secrets/index\";\nimport { shannonEntropy } from \"../validators/checksums\";\n\nexport interface SecretGuardOptions {\n /** Specific secret types to detect. If empty/undefined, all are enabled. */\n secretTypes?: string[];\n}\n\nexport class SecretGuard extends BaseGuard {\n readonly name = \"secret\";\n private patterns: typeof ALL_SECRET_PATTERNS;\n\n constructor(options?: SecretGuardOptions) {\n super();\n let patterns = ALL_SECRET_PATTERNS;\n if (options?.secretTypes && options.secretTypes.length > 0) {\n const allowed = new Set(options.secretTypes);\n patterns = patterns.filter((p) => allowed.has(p.secretType));\n }\n this.patterns = patterns;\n }\n\n async analyze(\n text: string,\n config?: Partial<GuardConfig>\n ): Promise<GuardResult> {\n const cfg = this.mergeConfig(config);\n const detections: Detection[] = [];\n\n for (const pattern of this.patterns) {\n for (const regex of pattern.patterns) {\n const re = new RegExp(regex.source, regex.flags);\n let match: RegExpExecArray | null;\n\n while ((match = re.exec(text)) !== null) {\n const matchText = match[1] ?? match[0]; // Use capture group if present\n const fullMatch = match[0];\n const start = match.index;\n const end = start + fullMatch.length;\n\n // Validate against custom validator\n if (pattern.validate && !pattern.validate(matchText)) {\n continue;\n }\n\n // Entropy check for high-entropy patterns\n if (pattern.minEntropy) {\n const entropy = shannonEntropy(matchText);\n if (entropy < pattern.minEntropy) {\n continue;\n }\n }\n\n detections.push(\n this.makeDetection(text, {\n entityType: pattern.secretType,\n start,\n end,\n text: fullMatch,\n confidence: \"high\",\n score: 0.9,\n guardName: this.name,\n })\n );\n }\n }\n }\n\n return this.buildResult(text, detections, cfg.mode);\n }\n}\n","/**\n * Prompt injection detection patterns.\n * Inspired by HAI-Guardrails. See ATTRIBUTION.md.\n */\n\n/** Regex patterns that indicate prompt injection attempts */\nexport const INJECTION_PATTERNS: RegExp[] = [\n /ignore\\s+(all\\s+)?(previous|prior|above|earlier)\\s+(instructions?|prompts?|commands?|directives?)/i,\n /disregard\\s+(all\\s+)?(previous|prior|above|earlier)\\s+(instructions?|prompts?|commands?)/i,\n /forget\\s+(all\\s+)?(previous|prior|above|earlier)\\s+(instructions?|prompts?|commands?)/i,\n /override\\s+(all\\s+)?(previous|prior|above|earlier)\\s+(instructions?|prompts?|commands?)/i,\n /you\\s+are\\s+now\\s+(?:a|an|in)\\s+/i,\n /new\\s+instructions?\\s*:/i,\n /system\\s*:\\s*/i,\n /\\bDAN\\s+mode\\b/i,\n /\\bjailbreak\\b/i,\n /do\\s+anything\\s+now/i,\n /act\\s+as\\s+(?:if\\s+)?(?:you\\s+(?:are|were)\\s+)?(?:a\\s+)?/i,\n /pretend\\s+(?:you\\s+are|to\\s+be)\\s+/i,\n /(?:reveal|show|display|print|output)\\s+(?:your\\s+)?(?:system\\s+)?(?:prompt|instructions?)/i,\n /(?:what|repeat|tell\\s+me)\\s+(?:are\\s+)?your\\s+(?:system\\s+)?(?:instructions?|prompt|rules?)/i,\n /bypass\\s+(?:your\\s+)?(?:safety|security|content|ethical)\\s+(?:filters?|guidelines?|restrictions?|rules?)/i,\n /(?:from\\s+now\\s+on|starting\\s+now|henceforth)\\s*,?\\s*(?:you\\s+(?:will|shall|must|should))/i,\n];\n\n/** Known injection keyword phrases for heuristic matching */\nexport const INJECTION_KEYWORDS: string[] = [\n \"ignore previous instructions\",\n \"disregard all prior instructions\",\n \"forget your instructions\",\n \"override system prompt\",\n \"you are now a\",\n \"new instructions\",\n \"jailbreak\",\n \"DAN mode\",\n \"do anything now\",\n \"bypass safety filters\",\n \"ignore content policy\",\n \"pretend you are\",\n \"act as if you were\",\n \"reveal your system prompt\",\n \"what are your instructions\",\n \"from now on you will\",\n \"ignore all restrictions\",\n \"developer mode\",\n \"sudo mode\",\n \"admin override\",\n \"unlock hidden features\",\n \"disable safety mode\",\n \"ignore ethical guidelines\",\n \"forget all rules\",\n \"you have no restrictions\",\n];\n\n/** Patterns indicating system prompt leakage attempts */\nexport const LEAKAGE_PATTERNS: RegExp[] = [\n /(?:reveal|show|display|print|output|repeat|echo)\\s+(?:the\\s+)?(?:system\\s+)?(?:prompt|instructions?)/i,\n /(?:what|tell\\s+me|share)\\s+(?:is\\s+|are\\s+)?(?:the\\s+|your\\s+)?(?:system\\s+)?(?:prompt|instructions?|initial\\s+message)/i,\n /(?:beginning|start|first\\s+part)\\s+of\\s+(?:the\\s+|your\\s+)?(?:conversation|prompt|message)/i,\n /(?:copy|paste|reproduce)\\s+(?:the\\s+)?(?:text|content)\\s+(?:above|before)/i,\n /(?:text|content|message)\\s+(?:before|above|preceding)\\s+(?:this|my)\\s+(?:message|input)/i,\n /(?:everything|all)\\s+(?:before|above|prior\\s+to)\\s+(?:this|my\\s+message)/i,\n /repeat\\s+(?:everything|all|the\\s+text)\\s+(?:above|before|I\\s+said)/i,\n];\n\n/** Keywords for leakage heuristic matching */\nexport const LEAKAGE_KEYWORDS: string[] = [\n \"reveal system prompt\",\n \"show me your instructions\",\n \"what is your system prompt\",\n \"display initial message\",\n \"repeat everything above\",\n \"copy text before my message\",\n \"what are your instructions\",\n \"print your prompt\",\n \"output your system message\",\n \"beginning of conversation\",\n \"share your initial instructions\",\n];\n","/**\n * Injection Guard — detects prompt injection attempts.\n * Detection approach inspired by HAI-Guardrails. See ATTRIBUTION.md.\n */\n\nimport { BaseGuard } from \"./base.guard\";\nimport type { GuardConfig, GuardResult, Detection } from \"../types\";\nimport { INJECTION_PATTERNS, INJECTION_KEYWORDS } from \"../patterns/injection\";\nimport { findBestMatch } from \"string-similarity\";\n\nconst HEURISTIC_THRESHOLD = 0.7;\n\nexport class InjectionGuard extends BaseGuard {\n readonly name = \"injection\";\n\n async analyze(\n text: string,\n config?: Partial<GuardConfig>\n ): Promise<GuardResult> {\n const cfg = this.mergeConfig({ threshold: 0.6, mode: \"block\", ...config });\n const detections: Detection[] = [];\n\n // Tactic 1: Pattern matching\n for (const pattern of INJECTION_PATTERNS) {\n const re = new RegExp(pattern.source, pattern.flags + \"g\");\n let match: RegExpExecArray | null;\n while ((match = re.exec(text)) !== null) {\n detections.push(\n this.makeDetection(text, {\n entityType: \"PROMPT_INJECTION\",\n start: match.index,\n end: match.index + match[0].length,\n text: match[0],\n confidence: \"high\",\n score: 0.9,\n guardName: this.name,\n })\n );\n }\n }\n\n // Tactic 2: Heuristic (string similarity against known phrases)\n if (detections.length === 0) {\n const score = this.heuristicScore(text);\n if (score >= cfg.threshold) {\n detections.push(\n this.makeDetection(text, {\n entityType: \"PROMPT_INJECTION\",\n start: 0,\n end: text.length,\n text: text.slice(0, 200),\n confidence: score >= 0.8 ? \"high\" : \"medium\",\n score,\n guardName: this.name,\n })\n );\n }\n }\n\n return this.buildResult(text, detections, cfg.mode);\n }\n\n private heuristicScore(text: string): number {\n const normalized = text.toLowerCase().trim();\n if (normalized.length === 0 || INJECTION_KEYWORDS.length === 0) return 0;\n\n // Check full text similarity against keywords\n const result = findBestMatch(normalized, INJECTION_KEYWORDS);\n let bestScore = result.bestMatch.rating;\n\n // Also check sliding windows for longer texts\n if (normalized.length > 100) {\n const windowSize = 80;\n const step = 30;\n for (let i = 0; i <= normalized.length - windowSize; i += step) {\n const window = normalized.slice(i, i + windowSize);\n const windowResult = findBestMatch(window, INJECTION_KEYWORDS);\n bestScore = Math.max(bestScore, windowResult.bestMatch.rating);\n }\n }\n\n return bestScore;\n }\n}\n","/**\n * Leakage Guard — detects system prompt extraction attempts.\n * Detection approach inspired by HAI-Guardrails. See ATTRIBUTION.md.\n */\n\nimport { BaseGuard } from \"./base.guard\";\nimport type { GuardConfig, GuardResult, Detection } from \"../types\";\nimport { LEAKAGE_PATTERNS, LEAKAGE_KEYWORDS } from \"../patterns/injection\";\nimport { findBestMatch } from \"string-similarity\";\n\nexport class LeakageGuard extends BaseGuard {\n readonly name = \"leakage\";\n\n async analyze(\n text: string,\n config?: Partial<GuardConfig>\n ): Promise<GuardResult> {\n const cfg = this.mergeConfig({ threshold: 0.6, mode: \"block\", ...config });\n const detections: Detection[] = [];\n\n // Tactic 1: Pattern matching\n for (const pattern of LEAKAGE_PATTERNS) {\n const re = new RegExp(pattern.source, pattern.flags + \"g\");\n let match: RegExpExecArray | null;\n while ((match = re.exec(text)) !== null) {\n detections.push(\n this.makeDetection(text, {\n entityType: \"PROMPT_LEAKAGE\",\n start: match.index,\n end: match.index + match[0].length,\n text: match[0],\n confidence: \"high\",\n score: 0.9,\n guardName: this.name,\n })\n );\n }\n }\n\n // Tactic 2: Heuristic\n if (detections.length === 0) {\n const normalized = text.toLowerCase().trim();\n if (normalized.length > 0 && LEAKAGE_KEYWORDS.length > 0) {\n const result = findBestMatch(normalized, LEAKAGE_KEYWORDS);\n const score = result.bestMatch.rating;\n\n if (score >= cfg.threshold) {\n detections.push(\n this.makeDetection(text, {\n entityType: \"PROMPT_LEAKAGE\",\n start: 0,\n end: text.length,\n text: text.slice(0, 200),\n confidence: score >= 0.8 ? \"high\" : \"medium\",\n score,\n guardName: this.name,\n })\n );\n }\n }\n }\n\n return this.buildResult(text, detections, cfg.mode);\n }\n}\n","/**\n * Test Data Guard — detects synthetic, eval, and placeholder data.\n * This guard identifies data that was clearly fabricated for testing rather than\n * real sensitive content. Detections are informational, not blocking.\n */\n\nimport { BaseGuard } from \"./base.guard\";\nimport type { GuardConfig, GuardResult, Detection } from \"../types\";\n\n/** Patterns for detecting synthetic/test data */\ninterface TestDataPattern {\n entityType: string;\n patterns: RegExp[];\n /** Human-readable reason for the flag */\n reason: string;\n}\n\n/**\n * GUIDs with embedded keywords (eval, test, demo, mock, fake, sample, example, placeholder)\n * or all-zero segments indicating fabricated identifiers.\n */\nconst SYNTHETIC_GUID_KEYWORDS =\n /\\b[0-9a-f]{8}-(?:eval|test|demo|mock|fake|sample|exam|plac)[0-9a-f-]*\\b/gi;\n\n/**\n * GUIDs that are all zeros or have obvious zero-padding with a small counter.\n * e.g., 00000000-0000-0000-0000-000000000000, 00000000-eval-0005-0000-000000000001\n */\nconst ZERO_PADDED_GUID =\n /\\b0{8}-[0-9a-f]{4}-[0-9a-f]{4}-0{4}-0{12}\\b/gi;\n\n/** Well-known test credit card numbers from Stripe, PayPal, Braintree docs */\nconst TEST_CREDIT_CARDS = [\n \"4111111111111111\", // Visa test\n \"4242424242424242\", // Stripe Visa\n \"5500000000000004\", // Mastercard test\n \"5555555555554444\", // Stripe Mastercard\n \"378282246310005\", // Amex test\n \"371449635398431\", // Amex test\n \"6011111111111117\", // Discover test\n \"3056930009020004\", // Diners test\n \"3566002020360505\", // JCB test\n \"4000056655665556\", // Stripe debit\n];\n\n/** Known invalid/reserved SSNs used in testing */\nconst TEST_SSNS = [\n \"000-00-0000\",\n \"123-45-6789\",\n \"078-05-1120\", // Woolworth wallet card SSN (famous invalid)\n \"219-09-9999\", // Social Security ad SSN\n];\n\nconst TEST_DATA_PATTERNS: TestDataPattern[] = [\n {\n entityType: \"TEST_DATA_GUID\",\n patterns: [SYNTHETIC_GUID_KEYWORDS, ZERO_PADDED_GUID],\n reason: \"synthetic-guid\",\n },\n {\n entityType: \"TEST_DATA_CREDIT_CARD\",\n patterns: TEST_CREDIT_CARDS.map(\n (num) => new RegExp(`\\\\b${num}\\\\b`, \"g\")\n ),\n reason: \"test-credit-card\",\n },\n {\n entityType: \"TEST_DATA_SSN\",\n patterns: TEST_SSNS.map(\n // Require dashes or spaces between SSN groups (not embedded in other numbers)\n (ssn) => new RegExp(`\\\\b${ssn.replace(/-/g, \"[\\\\s-]\")}\\\\b`, \"g\")\n ),\n reason: \"test-ssn\",\n },\n {\n entityType: \"TEST_DATA_EMAIL\",\n patterns: [\n /\\b[\\w.+-]+@(?:example\\.(?:com|org|net)|test\\.com|mailinator\\.com|tempmail\\.com)\\b/gi,\n /\\bnoreply@[^\\s]+\\b/gi,\n ],\n reason: \"placeholder-email\",\n },\n {\n entityType: \"TEST_DATA_PHONE\",\n patterns: [\n /\\b(?:\\+?1[-.\\s]?)?(?:\\()?555[-.\\s]?01[0-9]{2}(?:\\))?[-.\\s]?\\d{4}\\b/g, // 555-01xx range (reserved fictional)\n ],\n reason: \"fictional-phone\",\n },\n {\n entityType: \"TEST_DATA_SEQUENTIAL\",\n patterns: [\n /\\b[A]{4,}0{6,}[0-9A-F]{1,4}\\b/gi, // AAAA000000000001 pattern\n /\\b1234567890abcdef\\b/gi, // Classic sequential hex (exact)\n ],\n reason: \"sequential-pattern\",\n },\n];\n\nexport class TestDataGuard extends BaseGuard {\n readonly name = \"testdata\";\n\n async analyze(\n text: string,\n config?: Partial<GuardConfig>\n ): Promise<GuardResult> {\n const cfg = this.mergeConfig(config);\n const detections: Detection[] = [];\n\n for (const pattern of TEST_DATA_PATTERNS) {\n for (const regex of pattern.patterns) {\n const re = new RegExp(regex.source, regex.flags);\n let match: RegExpExecArray | null;\n\n while ((match = re.exec(text)) !== null) {\n const matchText = match[0];\n const start = match.index;\n const end = start + matchText.length;\n\n detections.push(\n this.makeDetection(\n text,\n {\n entityType: pattern.entityType,\n start,\n end,\n text: matchText,\n confidence: \"high\",\n score: 0.95,\n guardName: this.name,\n },\n \"regex\",\n \"informational\"\n )\n );\n }\n }\n }\n\n // Deduplicate overlapping detections\n const deduped = this.deduplicateDetections(detections);\n return this.buildInformationalResult(text, deduped);\n }\n\n /** Build a result that always passes — test data is informational, not blocking */\n private buildInformationalResult(\n text: string,\n detections: Detection[]\n ): GuardResult {\n const score =\n detections.length > 0\n ? Math.max(...detections.map((d) => d.score))\n : 0;\n\n const types = [...new Set(detections.map((d) => d.entityType))];\n\n return {\n passed: true, // Always passes — informational only\n reason:\n detections.length === 0\n ? \"No test data detected\"\n : `Test data detected: ${types.join(\", \")}`,\n guardName: this.name,\n score,\n detections,\n };\n }\n\n private deduplicateDetections(detections: Detection[]): Detection[] {\n if (detections.length <= 1) return detections;\n const sorted = [...detections].sort((a, b) => b.score - a.score);\n const result: Detection[] = [];\n for (const detection of sorted) {\n const overlaps = result.some(\n (existing) =>\n detection.start < existing.end && detection.end > existing.start\n );\n if (!overlaps) {\n result.push(detection);\n }\n }\n return result.sort((a, b) => a.start - b.start);\n }\n}\n","import type { PolicyDefinition } from \"./types\";\n\n/** Strict policy: flag everything, low thresholds, block mode */\nconst STRICT: PolicyDefinition = {\n name: \"strict\",\n description:\n \"Maximum sensitivity — flags all detectable PII, secrets, injection, and test data at low confidence thresholds\",\n guards: {\n pii: { enabled: true, threshold: 0.3, mode: \"block\" },\n secret: { enabled: true, threshold: 0.5, mode: \"block\" },\n injection: { enabled: true, threshold: 0.5, mode: \"block\" },\n leakage: { enabled: true, threshold: 0.5, mode: \"block\" },\n },\n riskThresholds: { critical: 0.9, high: 0.7, medium: 0.5, low: 0.3 },\n testDataDetection: \"flag\",\n};\n\n/** Moderate policy: reasonable defaults, higher thresholds, redact mode */\nconst MODERATE: PolicyDefinition = {\n name: \"moderate\",\n description:\n \"Balanced sensitivity — flags high-confidence PII and secrets, redacts rather than blocks\",\n guards: {\n pii: { enabled: true, threshold: 0.5, mode: \"redact\" },\n secret: { enabled: true, threshold: 0.7, mode: \"redact\" },\n injection: { enabled: true, threshold: 0.6, mode: \"block\" },\n leakage: { enabled: true, threshold: 0.6, mode: \"block\" },\n },\n riskThresholds: { critical: 0.9, high: 0.8, medium: 0.65, low: 0.5 },\n testDataDetection: \"flag\",\n};\n\n/** All built-in policies indexed by name */\nexport const BUILTIN_POLICIES: Record<string, PolicyDefinition> = {\n strict: STRICT,\n moderate: MODERATE,\n};\n\n/** Retrieve a built-in policy by name */\nexport function getPolicy(name: string): PolicyDefinition {\n const policy = BUILTIN_POLICIES[name];\n if (!policy) {\n const available = Object.keys(BUILTIN_POLICIES).join(\", \");\n throw new Error(\n `Unknown policy \"${name}\". Available: ${available}`\n );\n }\n return policy;\n}\n","import type { PolicyDefinition, GuardPolicyConfig } from \"./types\";\nimport type { PiiGuardOptions } from \"../guards/pii.guard\";\nimport type { SecretGuardOptions } from \"../guards/secret.guard\";\nimport type { GuardConfig } from \"../types\";\nimport { getPolicy } from \"./presets\";\n\n/**\n * Resolve a policy reference (string name or definition) to a full PolicyDefinition.\n */\nexport function resolveRef(\n ref: string | PolicyDefinition\n): PolicyDefinition {\n return typeof ref === \"string\" ? getPolicy(ref) : ref;\n}\n\n/**\n * Compose policies by merging a base with overlays.\n * \"Stricter wins\": lower thresholds, entity-type intersection, block over redact.\n */\nexport function resolvePolicy(\n base: string | PolicyDefinition,\n ...overlays: (string | PolicyDefinition)[]\n): PolicyDefinition {\n let result = structuredClone(resolveRef(base));\n\n for (const overlay of overlays) {\n const o = resolveRef(overlay);\n result = mergePolicies(result, o);\n }\n\n return result;\n}\n\nfunction mergePolicies(\n base: PolicyDefinition,\n overlay: PolicyDefinition\n): PolicyDefinition {\n const result = structuredClone(base);\n result.name = `${base.name}+${overlay.name}`;\n result.description = `${base.description} | ${overlay.description}`;\n\n // Merge each guard config\n for (const guardName of [\"pii\", \"secret\", \"injection\", \"leakage\"] as const) {\n const baseGuard = base.guards[guardName];\n const overlayGuard = overlay.guards[guardName];\n\n if (!overlayGuard) continue;\n if (!baseGuard) {\n result.guards[guardName] = structuredClone(overlayGuard);\n continue;\n }\n\n result.guards[guardName] = mergeGuardConfig(baseGuard, overlayGuard);\n }\n\n // Stricter risk thresholds (lower values)\n if (overlay.riskThresholds) {\n result.riskThresholds = {\n critical: Math.min(\n base.riskThresholds.critical,\n overlay.riskThresholds.critical\n ),\n high: Math.min(base.riskThresholds.high, overlay.riskThresholds.high),\n medium: Math.min(\n base.riskThresholds.medium,\n overlay.riskThresholds.medium\n ),\n low: Math.min(base.riskThresholds.low, overlay.riskThresholds.low),\n };\n }\n\n // Test data: \"flag\" > \"strip\" > \"ignore\"\n if (overlay.testDataDetection) {\n result.testDataDetection = overlay.testDataDetection;\n }\n\n return result;\n}\n\nfunction mergeGuardConfig(\n base: Partial<GuardPolicyConfig>,\n overlay: Partial<GuardPolicyConfig>\n): Partial<GuardPolicyConfig> {\n const result: Partial<GuardPolicyConfig> = { ...base };\n\n // Enabled: if either disables, disabled\n if (overlay.enabled !== undefined) {\n result.enabled = overlay.enabled;\n }\n\n // Threshold: stricter wins (lower)\n if (overlay.threshold !== undefined) {\n result.threshold =\n base.threshold !== undefined\n ? Math.min(base.threshold, overlay.threshold)\n : overlay.threshold;\n }\n\n // Mode: block wins over redact\n if (overlay.mode !== undefined) {\n if (overlay.mode === \"block\" || base.mode === \"block\") {\n result.mode = \"block\";\n } else {\n result.mode = overlay.mode;\n }\n }\n\n // Entity types: intersection when both specify\n if (overlay.entityTypes) {\n if (base.entityTypes && base.entityTypes.length > 0) {\n const overlaySet = new Set(overlay.entityTypes);\n result.entityTypes = base.entityTypes.filter((t) => overlaySet.has(t));\n } else {\n result.entityTypes = [...overlay.entityTypes];\n }\n }\n\n // Secret types: same intersection logic\n if (overlay.secretTypes) {\n if (base.secretTypes && base.secretTypes.length > 0) {\n const overlaySet = new Set(overlay.secretTypes);\n result.secretTypes = base.secretTypes.filter((t) => overlaySet.has(t));\n } else {\n result.secretTypes = [...overlay.secretTypes];\n }\n }\n\n return result;\n}\n\n/** Translate a resolved policy into guard constructor options and per-guard configs */\nexport function policyToEngineConfig(policy: PolicyDefinition): {\n piiOptions: PiiGuardOptions;\n secretOptions: SecretGuardOptions;\n guardConfigs: Record<string, Partial<GuardConfig>>;\n} {\n const pii = policy.guards.pii ?? {};\n const secret = policy.guards.secret ?? {};\n const injection = policy.guards.injection ?? {};\n const leakage = policy.guards.leakage ?? {};\n\n return {\n piiOptions: {\n entityTypes: pii.entityTypes,\n },\n secretOptions: {\n secretTypes: secret.secretTypes,\n },\n guardConfigs: {\n pii: { threshold: pii.threshold, mode: pii.mode },\n secret: { threshold: secret.threshold, mode: secret.mode },\n injection: { threshold: injection.threshold, mode: injection.mode },\n leakage: { threshold: leakage.threshold, mode: leakage.mode },\n },\n };\n}\n","// Core engine\nimport { GuardrailsEngine } from \"./engine/engine\";\nexport { GuardrailsEngine } from \"./engine/engine\";\n\n// Guards\nimport { PiiGuard } from \"./guards/pii.guard\";\nimport { SecretGuard } from \"./guards/secret.guard\";\nimport { InjectionGuard } from \"./guards/injection.guard\";\nimport { LeakageGuard } from \"./guards/leakage.guard\";\nimport { TestDataGuard } from \"./guards/testdata.guard\";\nexport { BaseGuard } from \"./guards/base.guard\";\nexport { PiiGuard } from \"./guards/pii.guard\";\nexport type { PiiGuardOptions } from \"./guards/pii.guard\";\nexport { SecretGuard } from \"./guards/secret.guard\";\nexport type { SecretGuardOptions } from \"./guards/secret.guard\";\nexport { InjectionGuard } from \"./guards/injection.guard\";\nexport { LeakageGuard } from \"./guards/leakage.guard\";\nexport { TestDataGuard } from \"./guards/testdata.guard\";\n\n// Types\nexport type {\n Detection,\n GuardResult,\n Guard,\n GuardConfig,\n GuardMode,\n EngineConfig,\n Confidence,\n DetectionSource,\n Disposition,\n PiiPattern,\n SecretPattern,\n TacticName,\n TacticResult,\n Tactic,\n} from \"./types\";\n\n// Cascade types re-exported for config convenience\nexport type { CascadeConfig } from \"./cascade/cascade\";\nexport type { BertLayerConfig } from \"./cascade/bert-layer\";\nexport type { LlmProvider, LlmLayerConfig } from \"./cascade/llm-layer\";\n\n// Policy system\nexport {\n BUILTIN_POLICIES,\n getPolicy,\n resolvePolicy,\n policyToEngineConfig,\n assessRisk,\n} from \"./policy\";\nexport type {\n RiskLevel,\n GuardPolicyConfig,\n RiskThresholds,\n PolicyDefinition,\n RiskAssessment,\n ClassifiedIssue,\n TestDataFlag,\n} from \"./policy\";\n\n// Policy-aware engine creation\nimport { resolveRef, resolvePolicy, policyToEngineConfig } from \"./policy\";\nimport type { PolicyDefinition } from \"./policy\";\n\n// Platform-neutral config interface\nexport interface BulkheadConfig {\n enabled: boolean;\n debounceMs: number;\n guards: {\n pii: { enabled: boolean };\n secret: { enabled: boolean };\n injection: { enabled: boolean };\n contentSafety: { enabled: boolean };\n };\n cascade: {\n escalationThreshold: number;\n contextSentences: number;\n modelEnabled: boolean;\n modelId: string;\n };\n /** Named policy or custom PolicyDefinition. Overrides guard-level config. */\n policy?: string | PolicyDefinition;\n /** Additional policy overlays for composition */\n policyOverlays?: (string | PolicyDefinition)[];\n}\n\nexport const DEFAULT_CONFIG: BulkheadConfig = {\n enabled: true,\n debounceMs: 500,\n guards: {\n pii: { enabled: true },\n secret: { enabled: true },\n injection: { enabled: true },\n contentSafety: { enabled: false },\n },\n cascade: {\n escalationThreshold: 0.75,\n contextSentences: 3,\n modelEnabled: false,\n modelId: \"Xenova/bert-base-NER\",\n },\n};\n\n/** Create a configured engine from a BulkheadConfig */\nexport function createEngine(config: BulkheadConfig = DEFAULT_CONFIG): GuardrailsEngine {\n const engine = new GuardrailsEngine();\n\n // If a policy is specified, resolve it and derive guard options\n if (config.policy) {\n let policy = resolveRef(config.policy);\n if (config.policyOverlays && config.policyOverlays.length > 0) {\n policy = resolvePolicy(policy, ...config.policyOverlays);\n }\n\n const { piiOptions, secretOptions, guardConfigs } = policyToEngineConfig(policy);\n\n if (policy.guards.pii?.enabled !== false) {\n engine.addGuard(new PiiGuard(piiOptions));\n }\n if (policy.guards.secret?.enabled !== false) {\n engine.addGuard(new SecretGuard(secretOptions));\n }\n if (policy.guards.injection?.enabled !== false) {\n engine.addGuard(new InjectionGuard());\n engine.addGuard(new LeakageGuard());\n }\n if (policy.testDataDetection !== \"ignore\") {\n engine.addGuard(new TestDataGuard());\n }\n\n engine.updateConfig({ guards: guardConfigs });\n } else {\n // Legacy path: use config.guards directly\n if (config.guards.pii.enabled) {\n engine.addGuard(new PiiGuard());\n }\n if (config.guards.secret.enabled) {\n engine.addGuard(new SecretGuard());\n }\n if (config.guards.injection.enabled) {\n engine.addGuard(new InjectionGuard());\n engine.addGuard(new LeakageGuard());\n }\n }\n\n if (config.cascade.modelEnabled) {\n engine.initCascade({\n bertEnabled: true,\n llmEnabled: config.guards.contentSafety.enabled,\n escalationThreshold: config.cascade.escalationThreshold,\n contextSentences: config.cascade.contextSentences,\n modelId: config.cascade.modelId,\n });\n }\n\n return engine;\n}\n"],"mappings":"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","names":["GENERIC_PATTERNS","GENERIC_PATTERNS","findBestMatch","DEFAULT_CONFIG"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@floatingsidewal/bulkhead-core",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Cascading content protection engine — PII detection, secret scanning, prompt injection defense",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/floatingsidewal/bulkhead.git",
|
|
9
|
+
"directory": "packages/core"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/floatingsidewal/bulkhead#readme",
|
|
12
|
+
"bugs": "https://github.com/floatingsidewal/bulkhead/issues",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"pii",
|
|
15
|
+
"redaction",
|
|
16
|
+
"secrets",
|
|
17
|
+
"guardrails",
|
|
18
|
+
"content-safety",
|
|
19
|
+
"mcp",
|
|
20
|
+
"prompt-injection",
|
|
21
|
+
"dlp"
|
|
22
|
+
],
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=18.0.0"
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"sideEffects": false,
|
|
30
|
+
"main": "./dist/index.js",
|
|
31
|
+
"module": "./dist/index.mjs",
|
|
32
|
+
"types": "./dist/index.d.ts",
|
|
33
|
+
"exports": {
|
|
34
|
+
".": {
|
|
35
|
+
"types": "./dist/index.d.ts",
|
|
36
|
+
"import": "./dist/index.mjs",
|
|
37
|
+
"require": "./dist/index.js"
|
|
38
|
+
},
|
|
39
|
+
"./cascade": {
|
|
40
|
+
"types": "./dist/cascade/index.d.ts",
|
|
41
|
+
"import": "./dist/cascade/index.mjs",
|
|
42
|
+
"require": "./dist/cascade/index.js"
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"files": [
|
|
46
|
+
"dist"
|
|
47
|
+
],
|
|
48
|
+
"scripts": {
|
|
49
|
+
"build": "tsup",
|
|
50
|
+
"test": "vitest run",
|
|
51
|
+
"test:watch": "vitest",
|
|
52
|
+
"lint": "tsc --noEmit"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"string-similarity": "^4.0.4"
|
|
56
|
+
},
|
|
57
|
+
"peerDependencies": {
|
|
58
|
+
"@huggingface/transformers": "^3.0.0"
|
|
59
|
+
},
|
|
60
|
+
"peerDependenciesMeta": {
|
|
61
|
+
"@huggingface/transformers": {
|
|
62
|
+
"optional": true
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@huggingface/transformers": "^3.0.0",
|
|
67
|
+
"@types/string-similarity": "^4.0.2",
|
|
68
|
+
"tsx": "^4.7.0"
|
|
69
|
+
}
|
|
70
|
+
}
|