{"version":3,"sources":["../src/data/syntheticPatterns.ts","../src/intelligence/fraudSignals.ts","../src/intelligence/kycBundle.ts"],"names":["clampScore"],"mappings":"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","file":"chunk-IRLTMTOA.mjs","sourcesContent":["export const KNOWN_TEST_AADHAAR_PREFIXES: ReadonlySet<string> = new Set(['9999']);\r\n\r\nexport const KNOWN_TEST_AADHAAR_NUMBERS: ReadonlySet<string> = new Set([\r\n    '999941057058',\r\n    '999971658847',\r\n    '999933119405',\r\n    '999955183433',\r\n    '999990501894',\r\n]);\r\n\r\nexport const KNOWN_TEST_PAN_PATTERNS: RegExp[] = [\r\n    /^AAAAA\\d{4}A$/,\r\n    /^([A-Z])\\1{4}\\d{4}[A-Z]$/,\r\n    /^[A-Z]{5}0{4}[A-Z]$/,\r\n];\r\n\r\nexport const KNOWN_TEST_GSTIN_PREFIXES: ReadonlySet<string> = new Set(['99']);\r\n\r\nexport const KNOWN_TEST_GSTIN_PATTERNS: RegExp[] = [\r\n    /^99[A-Z]{5}\\d{4}[A-Z][1-9A-Z]Z[0-9A-Z]$/,\r\n    /^\\d{2}AAAAA0{4}A[1-9A-Z]Z[0-9A-Z]$/,\r\n];\r\n","import {\r\n    KNOWN_TEST_AADHAAR_NUMBERS,\r\n    KNOWN_TEST_AADHAAR_PREFIXES,\r\n    KNOWN_TEST_GSTIN_PATTERNS,\r\n    KNOWN_TEST_GSTIN_PREFIXES,\r\n    KNOWN_TEST_PAN_PATTERNS,\r\n} from '../data/syntheticPatterns';\r\n\r\nexport type FraudSignalType =\r\n    | 'sequential_ascending'\r\n    | 'sequential_descending'\r\n    | 'repeated_digit'\r\n    | 'repeated_block'\r\n    | 'known_test_range'\r\n    | 'known_test_number'\r\n    | 'round_number'\r\n    | 'mirror_pattern'\r\n    | 'arithmetic_progression'\r\n    | 'majority_same_digit';\r\n\r\nexport type FraudRisk = 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';\r\n\r\nexport interface FraudSignal {\r\n    type: FraudSignalType;\r\n    description: string;\r\n    weight: number;\r\n}\r\n\r\nexport interface FraudDetectionResult {\r\n    input: string;\r\n    normalized: string;\r\n    documentType: string;\r\n    suspicionScore: number;\r\n    risk: FraudRisk;\r\n    signals: FraudSignal[];\r\n    isKnownTestNumber: boolean;\r\n    recommendation: 'ACCEPT' | 'MANUAL_REVIEW' | 'REJECT';\r\n    note: string;\r\n}\r\n\r\ntype SupportedDocumentType =\r\n    | 'aadhaar'\r\n    | 'pan'\r\n    | 'gstin'\r\n    | 'ifsc'\r\n    | 'pincode'\r\n    | 'tan'\r\n    | 'uan'\r\n    | 'phone'\r\n    | 'upi'\r\n    | 'msme';\r\n\r\nconst SIGNAL_WEIGHTS: Record<FraudSignalType, number> = {\r\n    sequential_ascending: 0.40,\r\n    sequential_descending: 0.40,\r\n    repeated_digit: 0.45,\r\n    repeated_block: 0.35,\r\n    known_test_range: 0.75,\r\n    known_test_number: 0.95,\r\n    round_number: 0.20,\r\n    mirror_pattern: 0.30,\r\n    arithmetic_progression: 0.30,\r\n    majority_same_digit: 0.25,\r\n};\r\n\r\nconst KNOWN_DOC_TYPES: ReadonlySet<SupportedDocumentType> = new Set([\r\n    'aadhaar',\r\n    'pan',\r\n    'gstin',\r\n    'ifsc',\r\n    'pincode',\r\n    'tan',\r\n    'uan',\r\n    'phone',\r\n    'upi',\r\n    'msme',\r\n]);\r\n\r\nconst isSupportedDocumentType = (documentType: string): documentType is SupportedDocumentType => (\r\n    KNOWN_DOC_TYPES.has(documentType as SupportedDocumentType)\r\n);\r\n\r\nconst clampScore = (score: number): number => Math.max(0, Math.min(1, score));\r\n\r\nconst normalizeInput = (documentType: SupportedDocumentType, input: string): string => {\r\n    const base = input.trim();\r\n\r\n    switch (documentType) {\r\n        case 'aadhaar':\r\n        case 'pincode':\r\n        case 'uan':\r\n        case 'phone':\r\n            return base.replace(/\\D/g, '');\r\n        case 'upi':\r\n            return base.toLowerCase().replace(/\\s+/g, '');\r\n        default:\r\n            return base.toUpperCase().replace(/[\\s-]/g, '');\r\n    }\r\n};\r\n\r\nconst getDigitSequence = (normalized: string): string => normalized.replace(/\\D/g, '');\r\n\r\nconst isSequentialAscending = (digits: string): boolean => {\r\n    if (!/^\\d+$/.test(digits)) return false;\r\n    if (digits.length < 4) return false;\r\n\r\n    for (let i = 1; i < digits.length; i += 1) {\r\n        const prev = Number(digits[i - 1]);\r\n        const current = Number(digits[i]);\r\n        if (current !== ((prev + 1) % 10)) return false;\r\n    }\r\n\r\n    return true;\r\n};\r\n\r\nconst isSequentialDescending = (digits: string): boolean => {\r\n    if (!/^\\d+$/.test(digits)) return false;\r\n    if (digits.length < 4) return false;\r\n\r\n    for (let i = 1; i < digits.length; i += 1) {\r\n        const prev = Number(digits[i - 1]);\r\n        const current = Number(digits[i]);\r\n        if (current !== ((prev + 9) % 10)) return false;\r\n    }\r\n\r\n    return true;\r\n};\r\n\r\nconst isRepeatedSingleDigit = (digits: string): boolean => {\r\n    if (!/^\\d+$/.test(digits)) return false;\r\n    if (digits.length < 2) return false;\r\n\r\n    return /^(\\d)\\1+$/.test(digits);\r\n};\r\n\r\nconst isRepeatedBlock = (digits: string): boolean => {\r\n    if (!/^\\d+$/.test(digits)) return false;\r\n    if (digits.length < 4) return false;\r\n\r\n    for (let blockSize = 2; blockSize <= Math.floor(digits.length / 2); blockSize += 1) {\r\n        if (digits.length % blockSize !== 0) continue;\r\n        const block = digits.slice(0, blockSize);\r\n        const repeated = block.repeat(digits.length / blockSize);\r\n        if (repeated === digits) return true;\r\n    }\r\n\r\n    return false;\r\n};\r\n\r\nconst isMirrorPattern = (digits: string): boolean => {\r\n    if (!/^\\d+$/.test(digits)) return false;\r\n    if (digits.length < 6) return false;\r\n\r\n    const middle = Math.floor(digits.length / 2);\r\n    const left = digits.slice(0, middle);\r\n    const right = digits.slice(digits.length % 2 === 0 ? middle : middle + 1);\r\n\r\n    return right === left.split('').reverse().join('');\r\n};\r\n\r\nconst isMajoritySameDigit = (digits: string, threshold: number): boolean => {\r\n    if (!/^\\d+$/.test(digits)) return false;\r\n    if (digits.length < 4) return false;\r\n    if (threshold <= 0 || threshold > 1) return false;\r\n\r\n    const counts: Record<string, number> = {};\r\n    for (const digit of digits) {\r\n        counts[digit] = (counts[digit] || 0) + 1;\r\n    }\r\n\r\n    const maxCount = Math.max(...Object.values(counts));\r\n    return (maxCount / digits.length) >= threshold;\r\n};\r\n\r\nconst isArithmeticProgression = (digits: string): boolean => {\r\n    if (!/^\\d+$/.test(digits)) return false;\r\n    if (digits.length < 4) return false;\r\n\r\n    const step = ((Number(digits[1]) - Number(digits[0])) + 10) % 10;\r\n    if (step === 0) return false;\r\n\r\n    for (let i = 2; i < digits.length; i += 1) {\r\n        const prev = Number(digits[i - 1]);\r\n        const current = Number(digits[i]);\r\n        if (current !== ((prev + step) % 10)) return false;\r\n    }\r\n\r\n    return true;\r\n};\r\n\r\nconst isRoundNumber = (digits: string): boolean => {\r\n    if (!/^\\d+$/.test(digits)) return false;\r\n    if (digits.length < 4) return false;\r\n\r\n    const trailingZeros = digits.match(/0+$/)?.[0].length || 0;\r\n    const minTrailingZeros = Math.max(3, Math.floor(digits.length / 2));\r\n    const prefixLength = digits.length - trailingZeros;\r\n\r\n    if (trailingZeros < minTrailingZeros) return false;\r\n    if (prefixLength <= 0) return false;\r\n\r\n    return Number(digits.slice(0, prefixLength)) > 0;\r\n};\r\n\r\nconst buildSignal = (type: FraudSignalType, description: string): FraudSignal => ({\r\n    type,\r\n    description,\r\n    weight: SIGNAL_WEIGHTS[type],\r\n});\r\n\r\nconst getRisk = (score: number): FraudRisk => {\r\n    if (score <= 0.25) return 'LOW';\r\n    if (score <= 0.60) return 'MEDIUM';\r\n    if (score <= 0.85) return 'HIGH';\r\n    return 'CRITICAL';\r\n};\r\n\r\nconst getRecommendation = (risk: FraudRisk): 'ACCEPT' | 'MANUAL_REVIEW' | 'REJECT' => {\r\n    switch (risk) {\r\n        case 'LOW':\r\n        case 'MEDIUM':\r\n            return 'ACCEPT';\r\n        case 'HIGH':\r\n            return 'MANUAL_REVIEW';\r\n        case 'CRITICAL':\r\n            return 'REJECT';\r\n        default:\r\n            return 'ACCEPT';\r\n    }\r\n};\r\n\r\nconst getSummaryNote = (\r\n    risk: FraudRisk,\r\n    recommendation: 'ACCEPT' | 'MANUAL_REVIEW' | 'REJECT',\r\n    signals: FraudSignal[],\r\n    unknownDocType: boolean\r\n): string => {\r\n    if (unknownDocType) {\r\n        return 'Document type not recognized; only generic synthetic pattern checks were applied.';\r\n    }\r\n    if (signals.length === 0) {\r\n        return 'No synthetic or known test-pattern fraud signals were detected.';\r\n    }\r\n    if (risk === 'MEDIUM') {\r\n        return `Detected ${signals.length} low-to-moderate synthetic signal(s); accepted with caution.`;\r\n    }\r\n    return `Detected ${signals.length} fraud signal(s); recommendation is ${recommendation}.`;\r\n};\r\n\r\nconst addGenericNumericSignals = (signals: FraudSignal[], digits: string): void => {\r\n    if (digits.length < 4) return;\r\n\r\n    if (isSequentialAscending(digits)) {\r\n        signals.push(buildSignal('sequential_ascending', 'Digits follow a cyclic ascending sequence.'));\r\n    }\r\n    if (isSequentialDescending(digits)) {\r\n        signals.push(buildSignal('sequential_descending', 'Digits follow a cyclic descending sequence.'));\r\n    }\r\n    if (isRepeatedSingleDigit(digits)) {\r\n        signals.push(buildSignal('repeated_digit', 'All digits are the same.'));\r\n    }\r\n    if (!isRepeatedSingleDigit(digits) && isRepeatedBlock(digits)) {\r\n        signals.push(buildSignal('repeated_block', 'Digit block repeats uniformly across the number.'));\r\n    }\r\n    if (isMirrorPattern(digits)) {\r\n        signals.push(buildSignal('mirror_pattern', 'Digits form a mirrored pattern around the center.'));\r\n    }\r\n    if (isArithmeticProgression(digits)) {\r\n        signals.push(buildSignal('arithmetic_progression', 'Digits form a constant-step arithmetic progression.'));\r\n    }\r\n    if (isMajoritySameDigit(digits, 0.75)) {\r\n        signals.push(buildSignal('majority_same_digit', 'One digit dominates at least 75% of positions.'));\r\n    }\r\n    if (isRoundNumber(digits)) {\r\n        signals.push(buildSignal('round_number', 'Value appears to be a rounded number with many trailing zeros.'));\r\n    }\r\n};\r\n\r\nconst addDocumentSpecificSignals = (\r\n    docType: SupportedDocumentType,\r\n    normalized: string,\r\n    signals: FraudSignal[]\r\n): void => {\r\n    if (docType === 'aadhaar') {\r\n        if (KNOWN_TEST_AADHAAR_NUMBERS.has(normalized)) {\r\n            signals.push(buildSignal('known_test_number', 'Matches a known UIDAI sandbox test Aadhaar number.'));\r\n        }\r\n        const prefix = normalized.slice(0, 4);\r\n        if (prefix.length === 4 && KNOWN_TEST_AADHAAR_PREFIXES.has(prefix)) {\r\n            signals.push(buildSignal('known_test_range', 'Aadhaar starts with a known UIDAI test prefix.'));\r\n        }\r\n    }\r\n\r\n    if (docType === 'pan') {\r\n        for (const pattern of KNOWN_TEST_PAN_PATTERNS) {\r\n            if (pattern.test(normalized)) {\r\n                signals.push(buildSignal('known_test_number', 'PAN matches a known synthetic/test placeholder pattern.'));\r\n                break;\r\n            }\r\n        }\r\n    }\r\n\r\n    if (docType === 'gstin') {\r\n        const prefix = normalized.slice(0, 2);\r\n        if (prefix.length === 2 && KNOWN_TEST_GSTIN_PREFIXES.has(prefix)) {\r\n            signals.push(buildSignal('known_test_range', 'GSTIN starts with a known test/special prefix.'));\r\n        }\r\n        for (const pattern of KNOWN_TEST_GSTIN_PATTERNS) {\r\n            if (pattern.test(normalized)) {\r\n                signals.push(buildSignal('known_test_number', 'GSTIN matches a known synthetic/test placeholder pattern.'));\r\n                break;\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\nconst dedupeSignals = (signals: FraudSignal[]): FraudSignal[] => {\r\n    const seen = new Set<FraudSignalType>();\r\n    const deduped: FraudSignal[] = [];\r\n\r\n    for (const signal of signals) {\r\n        if (seen.has(signal.type)) continue;\r\n        seen.add(signal.type);\r\n        deduped.push(signal);\r\n    }\r\n\r\n    return deduped;\r\n};\r\n\r\nexport const detectFraudSignals = (documentType: string, input: string): FraudDetectionResult => {\r\n    const safeInput = typeof input === 'string' ? input : String(input || '');\r\n    const normalizedDocType = (documentType || '').toLowerCase();\r\n    const supportedType = isSupportedDocumentType(normalizedDocType) ? normalizedDocType : null;\r\n\r\n    const normalized = supportedType\r\n        ? normalizeInput(supportedType, safeInput)\r\n        : safeInput.trim().replace(/\\s+/g, '');\r\n    const digits = getDigitSequence(normalized);\r\n\r\n    const rawSignals: FraudSignal[] = [];\r\n    addGenericNumericSignals(rawSignals, digits);\r\n\r\n    if (supportedType) {\r\n        addDocumentSpecificSignals(supportedType, normalized, rawSignals);\r\n    }\r\n\r\n    const signals = dedupeSignals(rawSignals);\r\n    const suspicionScore = clampScore(signals.reduce((sum, signal) => sum + signal.weight, 0));\r\n    const risk = getRisk(suspicionScore);\r\n    const recommendation = getRecommendation(risk);\r\n    const isKnownTestNumber = signals.some((signal) => (\r\n        signal.type === 'known_test_number' || signal.type === 'known_test_range'\r\n    ));\r\n\r\n    return {\r\n        input: safeInput,\r\n        normalized,\r\n        documentType: normalizedDocType || documentType,\r\n        suspicionScore,\r\n        risk,\r\n        signals,\r\n        isKnownTestNumber,\r\n        recommendation,\r\n        note: getSummaryNote(risk, recommendation, signals, supportedType == null),\r\n    };\r\n};\r\n\r\nexport const detectAadhaarFraud = (input: string): FraudDetectionResult => detectFraudSignals('aadhaar', input);\r\nexport const detectPANFraud = (input: string): FraudDetectionResult => detectFraudSignals('pan', input);\r\nexport const detectGSTINFraud = (input: string): FraudDetectionResult => detectFraudSignals('gstin', input);\r\nexport const detectIFSCFraud = (input: string): FraudDetectionResult => detectFraudSignals('ifsc', input);\r\nexport const detectPincodeFraud = (input: string): FraudDetectionResult => detectFraudSignals('pincode', input);\r\nexport const detectTANFraud = (input: string): FraudDetectionResult => detectFraudSignals('tan', input);\r\nexport const detectUANFraud = (input: string): FraudDetectionResult => detectFraudSignals('uan', input);\r\nexport const detectPhoneFraud = (input: string): FraudDetectionResult => detectFraudSignals('phone', input);\r\nexport const detectUPIFraud = (input: string): FraudDetectionResult => detectFraudSignals('upi', input);\r\nexport const detectMSMEFraud = (input: string): FraudDetectionResult => detectFraudSignals('msme', input);\r\n","import { detectFraudSignals, type FraudRisk, type FraudSignal } from './fraudSignals';\r\nimport { suggestCorrection } from './correction';\r\nimport { isValidAadhaar } from '../validators/aadhaar';\r\nimport { getGSTINInfo, isValidGSTIN } from '../validators/gstin';\r\nimport { getPANInfo, isValidPAN } from '../validators/pan';\r\nimport { getTANInfo, isValidTAN } from '../validators/tan';\r\nimport { getUANInfo, isValidUAN } from '../validators/uan';\r\nimport { getPassportInfo, isValidPassport } from '../validators/passport';\r\nimport { getVoterIDInfo, isValidVoterID } from '../validators/voterId';\r\nimport { getDrivingLicenseInfo, isValidDrivingLicense } from '../validators/drivingLicense';\r\nimport { getPhoneInfo, isValidIndianPhone, normalisePhone } from '../validators/phone';\r\nimport { getUPIInfo, isValidUPI } from '../validators/upi';\r\n\r\nexport interface KYCBundleInput {\r\n    aadhaar?: string;\r\n    pan?: string;\r\n    gstin?: string;\r\n    tan?: string;\r\n    uan?: string;\r\n    passport?: string;\r\n    voterId?: string;\r\n    drivingLicense?: string;\r\n    phone?: string;\r\n    upi?: string;\r\n}\r\n\r\nexport interface DocumentValidationDetail {\r\n    provided: boolean;\r\n    value: string | null;\r\n    normalized: string | null;\r\n    valid: boolean;\r\n    errors: string[];\r\n    metadata: Record<string, unknown> | null;\r\n    fraudRisk: FraudRisk | null;\r\n}\r\n\r\nexport interface CrossCheckResult {\r\n    checkName: string;\r\n    passed: boolean;\r\n    description: string;\r\n    finding: string;\r\n}\r\n\r\nexport interface KYCBundleResult {\r\n    overallResult: 'PASS' | 'FAIL' | 'MANUAL_REVIEW';\r\n    kycScore: number;\r\n    documents: Record<string, DocumentValidationDetail>;\r\n    crossChecks: CrossCheckResult[];\r\n    fraudSignals: FraudSignal[];\r\n    entityType: 'Individual' | 'Company' | 'LLP' | 'HUF' | 'Firm' | 'Trust' | 'Govt' | 'Unknown';\r\n    entityState: string | null;\r\n    summary: string;\r\n    validDocuments: string[];\r\n    invalidDocuments: string[];\r\n    inconsistencies: string[];\r\n}\r\n\r\ntype BundleDocumentKey = keyof KYCBundleInput;\r\n\r\ntype EntityType = KYCBundleResult['entityType'];\r\n\r\nconst DOCUMENT_ORDER: readonly BundleDocumentKey[] = [\r\n    'aadhaar',\r\n    'pan',\r\n    'gstin',\r\n    'tan',\r\n    'uan',\r\n    'passport',\r\n    'voterId',\r\n    'drivingLicense',\r\n    'phone',\r\n    'upi',\r\n];\r\n\r\nconst DOCUMENT_LABELS: Record<BundleDocumentKey, string> = {\r\n    aadhaar: 'Aadhaar',\r\n    pan: 'PAN',\r\n    gstin: 'GSTIN',\r\n    tan: 'TAN',\r\n    uan: 'UAN',\r\n    passport: 'Passport',\r\n    voterId: 'Voter ID',\r\n    drivingLicense: 'Driving License',\r\n    phone: 'Phone',\r\n    upi: 'UPI',\r\n};\r\n\r\nconst normalizeUpperAlnum = (value: string): string => value.trim().toUpperCase().replace(/[\\s-]/g, '');\r\nconst normalizeDigitsOnly = (value: string): string => value.trim().replace(/\\D/g, '');\r\nconst normalizeDrivingLicense = (value: string): string => value.trim().toUpperCase().replace(/[\\s\\-/]/g, '');\r\nconst normalizeUPI = (value: string): string => value.trim().toLowerCase();\r\n\r\nconst toRecord = (value: unknown): Record<string, unknown> | null => {\r\n    if (value == null || typeof value !== 'object') return null;\r\n    return value as Record<string, unknown>;\r\n};\r\n\r\nconst getPANEntityType = (panCode: string): EntityType => {\r\n    switch (panCode) {\r\n        case 'P':\r\n            return 'Individual';\r\n        case 'C':\r\n            return 'Company';\r\n        case 'H':\r\n            return 'HUF';\r\n        case 'F':\r\n            return 'Firm';\r\n        case 'T':\r\n            return 'Trust';\r\n        case 'G':\r\n            return 'Govt';\r\n        default:\r\n            return 'Unknown';\r\n    }\r\n};\r\n\r\nconst normalizeStateForComparison = (state: string): string => (\r\n    state\r\n        .toLowerCase()\r\n        .replace(/\\(.*?\\)/g, '')\r\n        .replace(/[^a-z0-9]+/g, ' ')\r\n        .trim()\r\n);\r\n\r\ninterface DocumentProcessor {\r\n    fraudDocType: string;\r\n    correctionDocType: string;\r\n    normalize: (value: string) => string | null;\r\n    validate: (normalized: string) => boolean;\r\n    getInfo: ((normalized: string) => unknown) | null;\r\n}\r\n\r\nconst DOCUMENT_PROCESSORS: Record<BundleDocumentKey, DocumentProcessor> = {\r\n    aadhaar: {\r\n        fraudDocType: 'aadhaar',\r\n        correctionDocType: 'aadhaar',\r\n        normalize: normalizeDigitsOnly,\r\n        validate: isValidAadhaar,\r\n        getInfo: null,\r\n    },\r\n    pan: {\r\n        fraudDocType: 'pan',\r\n        correctionDocType: 'pan',\r\n        normalize: normalizeUpperAlnum,\r\n        validate: isValidPAN,\r\n        getInfo: getPANInfo,\r\n    },\r\n    gstin: {\r\n        fraudDocType: 'gstin',\r\n        correctionDocType: 'gstin',\r\n        normalize: normalizeUpperAlnum,\r\n        validate: isValidGSTIN,\r\n        getInfo: getGSTINInfo,\r\n    },\r\n    tan: {\r\n        fraudDocType: 'tan',\r\n        correctionDocType: 'tan',\r\n        normalize: normalizeUpperAlnum,\r\n        validate: isValidTAN,\r\n        getInfo: getTANInfo,\r\n    },\r\n    uan: {\r\n        fraudDocType: 'uan',\r\n        correctionDocType: 'uan',\r\n        normalize: normalizeDigitsOnly,\r\n        validate: isValidUAN,\r\n        getInfo: getUANInfo,\r\n    },\r\n    passport: {\r\n        fraudDocType: 'passport',\r\n        correctionDocType: 'passport',\r\n        normalize: (value) => value.trim().toUpperCase().replace(/\\s+/g, ''),\r\n        validate: isValidPassport,\r\n        getInfo: getPassportInfo,\r\n    },\r\n    voterId: {\r\n        fraudDocType: 'voterid',\r\n        correctionDocType: 'voterid',\r\n        normalize: normalizeUpperAlnum,\r\n        validate: isValidVoterID,\r\n        getInfo: getVoterIDInfo,\r\n    },\r\n    drivingLicense: {\r\n        fraudDocType: 'drivinglicense',\r\n        correctionDocType: 'drivinglicense',\r\n        normalize: normalizeDrivingLicense,\r\n        validate: isValidDrivingLicense,\r\n        getInfo: getDrivingLicenseInfo,\r\n    },\r\n    phone: {\r\n        fraudDocType: 'phone',\r\n        correctionDocType: 'phone',\r\n        normalize: normalisePhone,\r\n        validate: isValidIndianPhone,\r\n        getInfo: getPhoneInfo,\r\n    },\r\n    upi: {\r\n        fraudDocType: 'upi',\r\n        correctionDocType: 'upi',\r\n        normalize: normalizeUPI,\r\n        validate: isValidUPI,\r\n        getInfo: getUPIInfo,\r\n    },\r\n};\r\n\r\nconst emptyDocumentDetail = (): DocumentValidationDetail => ({\r\n    provided: false,\r\n    value: null,\r\n    normalized: null,\r\n    valid: false,\r\n    errors: [],\r\n    metadata: null,\r\n    fraudRisk: null,\r\n});\r\n\r\nconst buildValidationErrors = (\r\n    documentKey: BundleDocumentKey,\r\n    rawValue: string,\r\n    normalized: string | null\r\n): string[] => {\r\n    const label = DOCUMENT_LABELS[documentKey];\r\n\r\n    if (rawValue.trim().length === 0) {\r\n        return [`${label} is empty.`];\r\n    }\r\n\r\n    if (normalized == null || normalized.length === 0) {\r\n        return [`${label} could not be normalized for validation.`];\r\n    }\r\n\r\n    const correctionResult = suggestCorrection(DOCUMENT_PROCESSORS[documentKey].correctionDocType, rawValue);\r\n    if (\r\n        correctionResult.note.length > 0\r\n        && !correctionResult.note.startsWith('Unsupported document type')\r\n        && !correctionResult.note.startsWith('Input is already valid')\r\n    ) {\r\n        return [correctionResult.note];\r\n    }\r\n\r\n    return [`${label} failed format and checksum validation.`];\r\n};\r\n\r\nconst inferEntityType = (documents: Record<string, DocumentValidationDetail>): EntityType => {\r\n    const panDetail = documents.pan;\r\n    if (panDetail.valid && panDetail.normalized != null && panDetail.normalized.length >= 4) {\r\n        return getPANEntityType(panDetail.normalized.charAt(3));\r\n    }\r\n\r\n    const gstinDetail = documents.gstin;\r\n    if (gstinDetail.valid && gstinDetail.normalized != null && gstinDetail.normalized.length >= 6) {\r\n        return getPANEntityType(gstinDetail.normalized.charAt(5));\r\n    }\r\n\r\n    return 'Unknown';\r\n};\r\n\r\nconst inferEntityState = (documents: Record<string, DocumentValidationDetail>): string | null => {\r\n    const gstinState = documents.gstin.metadata?.state;\r\n    if (typeof gstinState === 'string' && gstinState.length > 0) {\r\n        return gstinState;\r\n    }\r\n\r\n    const dlState = documents.drivingLicense.metadata?.stateName;\r\n    if (typeof dlState === 'string' && dlState.length > 0) {\r\n        return dlState;\r\n    }\r\n\r\n    return null;\r\n};\r\n\r\nconst clampScore = (value: number): number => Math.max(0, Math.min(100, value));\r\n\r\nexport const validateKYCBundle = (input: KYCBundleInput): KYCBundleResult => {\r\n    const documents: Record<string, DocumentValidationDetail> = {};\r\n    const allFraudSignals: FraudSignal[] = [];\r\n    const seenFraudSignals = new Set<string>();\r\n\r\n    for (const key of DOCUMENT_ORDER) {\r\n        const raw = input[key];\r\n\r\n        if (raw == null) {\r\n            documents[key] = emptyDocumentDetail();\r\n            continue;\r\n        }\r\n\r\n        const rawValue = typeof raw === 'string' ? raw : String(raw);\r\n        const processor = DOCUMENT_PROCESSORS[key];\r\n        const normalized = processor.normalize(rawValue);\r\n        const valid = normalized != null && processor.validate(normalized);\r\n\r\n        let metadata: Record<string, unknown> | null = null;\r\n        let fraudRisk: FraudRisk | null = null;\r\n        let errors: string[] = [];\r\n\r\n        if (valid && normalized != null) {\r\n            metadata = processor.getInfo ? toRecord(processor.getInfo(normalized)) : null;\r\n\r\n            const fraudResult = detectFraudSignals(processor.fraudDocType, normalized);\r\n            fraudRisk = fraudResult.risk;\r\n\r\n            for (const signal of fraudResult.signals) {\r\n                const keyForSet = `${signal.type}:${signal.description}`;\r\n                if (seenFraudSignals.has(keyForSet)) continue;\r\n                seenFraudSignals.add(keyForSet);\r\n                allFraudSignals.push(signal);\r\n            }\r\n        } else {\r\n            errors = buildValidationErrors(key, rawValue, normalized);\r\n        }\r\n\r\n        documents[key] = {\r\n            provided: true,\r\n            value: rawValue,\r\n            normalized,\r\n            valid,\r\n            errors,\r\n            metadata,\r\n            fraudRisk,\r\n        };\r\n    }\r\n\r\n    const crossChecks: CrossCheckResult[] = [];\r\n\r\n    const panDetail = documents.pan;\r\n    const gstinDetail = documents.gstin;\r\n    const tanDetail = documents.tan;\r\n    const dlDetail = documents.drivingLicense;\r\n\r\n    if (panDetail.valid && gstinDetail.valid && panDetail.normalized != null && gstinDetail.normalized != null) {\r\n        const embeddedPAN = gstinDetail.normalized.substring(2, 12);\r\n        const panMatch = embeddedPAN === panDetail.normalized;\r\n\r\n        crossChecks.push({\r\n            checkName: 'gstin_pan_match',\r\n            passed: panMatch,\r\n            description: 'GSTIN positions 3-12 should match the PAN when both belong to the same entity.',\r\n            finding: panMatch\r\n                ? `GSTIN embeds PAN '${embeddedPAN}', matching provided PAN.`\r\n                : `GSTIN embeds PAN '${embeddedPAN}', which does not match provided PAN '${panDetail.normalized}'.`,\r\n        });\r\n\r\n        const panEntityType = getPANEntityType(panDetail.normalized.charAt(3));\r\n        const gstEntityType = getPANEntityType(gstinDetail.normalized.charAt(5));\r\n        const entityTypeMatch = panEntityType === gstEntityType;\r\n\r\n        crossChecks.push({\r\n            checkName: 'entity_type_consistency',\r\n            passed: entityTypeMatch,\r\n            description: 'PAN entity code (position 4) should align with the PAN segment embedded in GSTIN.',\r\n            finding: entityTypeMatch\r\n                ? `PAN and GSTIN both indicate '${panEntityType}'.`\r\n                : `PAN indicates '${panEntityType}' while GSTIN indicates '${gstEntityType}'.`,\r\n        });\r\n    }\r\n\r\n    if (gstinDetail.valid && dlDetail.valid) {\r\n        const gstState = typeof gstinDetail.metadata?.state === 'string' ? gstinDetail.metadata.state : null;\r\n        const dlState = typeof dlDetail.metadata?.stateName === 'string' ? dlDetail.metadata.stateName : null;\r\n\r\n        const stateMatch = (\r\n            gstState != null\r\n            && dlState != null\r\n            && normalizeStateForComparison(gstState) === normalizeStateForComparison(dlState)\r\n        );\r\n\r\n        crossChecks.push({\r\n            checkName: 'state_consistency',\r\n            passed: stateMatch,\r\n            description: 'GSTIN state and Driving License state should be consistent for the same subject.',\r\n            finding: stateMatch\r\n                ? `GSTIN state '${gstState}' matches Driving License state '${dlState}'.`\r\n                : `GSTIN state '${gstState ?? 'Unknown'}' does not match Driving License state '${dlState ?? 'Unknown'}'.`,\r\n        });\r\n    }\r\n\r\n    if (tanDetail.valid && panDetail.valid && tanDetail.normalized != null && panDetail.normalized != null) {\r\n        const tanInitial = tanDetail.normalized.charAt(3);\r\n        const panInitial = panDetail.normalized.charAt(4);\r\n        const initialsMatch = tanInitial === panInitial;\r\n\r\n        crossChecks.push({\r\n            checkName: 'tan_pan_structure_consistency',\r\n            passed: initialsMatch,\r\n            description: 'TAN position 4 (deductor name initial) should typically align with PAN position 5 (name initial).',\r\n            finding: initialsMatch\r\n                ? `TAN initial '${tanInitial}' matches PAN initial '${panInitial}'.`\r\n                : `TAN initial '${tanInitial}' does not match PAN initial '${panInitial}'.`,\r\n        });\r\n    }\r\n\r\n    const providedDocumentKeys = DOCUMENT_ORDER.filter((key) => documents[key].provided);\r\n    const validDocuments = providedDocumentKeys.filter((key) => documents[key].valid);\r\n    const invalidDocuments = providedDocumentKeys.filter((key) => !documents[key].valid);\r\n\r\n    const failedCrossChecks = crossChecks.filter((check) => !check.passed);\r\n    const highFraudCount = providedDocumentKeys.filter((key) => documents[key].fraudRisk === 'HIGH').length;\r\n    const criticalFraudCount = providedDocumentKeys.filter((key) => documents[key].fraudRisk === 'CRITICAL').length;\r\n\r\n    const scoreBeforeEmptyInputOverride = clampScore(\r\n        100\r\n        - (invalidDocuments.length * 15)\r\n        - (failedCrossChecks.length * 10)\r\n        - (highFraudCount * 20)\r\n        - (criticalFraudCount * 40)\r\n    );\r\n    const noDocumentsProvided = providedDocumentKeys.length === 0;\r\n    const kycScore = noDocumentsProvided ? 0 : scoreBeforeEmptyInputOverride;\r\n\r\n    const hasCriticalFraud = criticalFraudCount > 0;\r\n    const overallResult: KYCBundleResult['overallResult'] = (\r\n        noDocumentsProvided\r\n            ? 'FAIL'\r\n            : (\r\n                kycScore >= 80 && failedCrossChecks.length === 0\r\n                    ? 'PASS'\r\n                    : (kycScore >= 50 && !hasCriticalFraud ? 'MANUAL_REVIEW' : 'FAIL')\r\n            )\r\n    );\r\n\r\n    const inconsistencies = failedCrossChecks.map((check) => `${check.checkName}: ${check.finding}`);\r\n    const entityType = inferEntityType(documents);\r\n    const entityState = inferEntityState(documents);\r\n\r\n    const crossCheckSentence = (\r\n        crossChecks.length === 0\r\n            ? 'No applicable cross-document checks were available.'\r\n            : failedCrossChecks.length === 0\r\n                ? 'All applicable cross-document consistency checks passed.'\r\n                : `${failedCrossChecks.length} cross-document check(s) failed.`\r\n    );\r\n\r\n    const fraudSentence = (\r\n        allFraudSignals.length === 0\r\n            ? 'No fraud signals were detected in valid documents.'\r\n            : `${allFraudSignals.length} fraud signal(s) were detected, including ${criticalFraudCount} CRITICAL and ${highFraudCount} HIGH risk document assessment(s).`\r\n    );\r\n\r\n    const summary = (\r\n        `${validDocuments.length} of ${providedDocumentKeys.length} provided documents are valid. `\r\n        + `${crossCheckSentence} `\r\n        + `${fraudSentence} `\r\n        + `Entity profile indicates '${entityType}'${entityState != null ? ` in '${entityState}'` : ''}. `\r\n        + `KYC score: ${kycScore}/100 - ${overallResult}.`\r\n    );\r\n\r\n    return {\r\n        overallResult,\r\n        kycScore,\r\n        documents,\r\n        crossChecks,\r\n        fraudSignals: allFraudSignals,\r\n        entityType,\r\n        entityState,\r\n        summary,\r\n        validDocuments,\r\n        invalidDocuments,\r\n        inconsistencies,\r\n    };\r\n};\r\n"]}