@discretion/core 0.1.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/CHANGELOG.md +117 -0
- package/LICENSE +21 -0
- package/README.md +319 -0
- package/dist/src/checksums/aba.d.ts +25 -0
- package/dist/src/checksums/aba.d.ts.map +1 -0
- package/dist/src/checksums/aba.js +47 -0
- package/dist/src/checksums/aba.js.map +1 -0
- package/dist/src/checksums/digits.d.ts +55 -0
- package/dist/src/checksums/digits.d.ts.map +1 -0
- package/dist/src/checksums/digits.js +114 -0
- package/dist/src/checksums/digits.js.map +1 -0
- package/dist/src/checksums/icao9303.d.ts +29 -0
- package/dist/src/checksums/icao9303.d.ts.map +1 -0
- package/dist/src/checksums/icao9303.js +56 -0
- package/dist/src/checksums/icao9303.js.map +1 -0
- package/dist/src/checksums/index.d.ts +21 -0
- package/dist/src/checksums/index.d.ts.map +1 -0
- package/dist/src/checksums/index.js +21 -0
- package/dist/src/checksums/index.js.map +1 -0
- package/dist/src/checksums/iso7064.d.ts +67 -0
- package/dist/src/checksums/iso7064.d.ts.map +1 -0
- package/dist/src/checksums/iso7064.js +159 -0
- package/dist/src/checksums/iso7064.js.map +1 -0
- package/dist/src/checksums/luhn.d.ts +32 -0
- package/dist/src/checksums/luhn.d.ts.map +1 -0
- package/dist/src/checksums/luhn.js +66 -0
- package/dist/src/checksums/luhn.js.map +1 -0
- package/dist/src/checksums/mod97.d.ts +55 -0
- package/dist/src/checksums/mod97.d.ts.map +1 -0
- package/dist/src/checksums/mod97.js +94 -0
- package/dist/src/checksums/mod97.js.map +1 -0
- package/dist/src/checksums/verhoeff.d.ts +28 -0
- package/dist/src/checksums/verhoeff.d.ts.map +1 -0
- package/dist/src/checksums/verhoeff.js +80 -0
- package/dist/src/checksums/verhoeff.js.map +1 -0
- package/dist/src/checksums/weighted.d.ts +64 -0
- package/dist/src/checksums/weighted.d.ts.map +1 -0
- package/dist/src/checksums/weighted.js +97 -0
- package/dist/src/checksums/weighted.js.map +1 -0
- package/dist/src/context/documentProfile.d.ts +34 -0
- package/dist/src/context/documentProfile.d.ts.map +1 -0
- package/dist/src/context/documentProfile.js +253 -0
- package/dist/src/context/documentProfile.js.map +1 -0
- package/dist/src/context/negativeRules.d.ts +60 -0
- package/dist/src/context/negativeRules.d.ts.map +1 -0
- package/dist/src/context/negativeRules.js +696 -0
- package/dist/src/context/negativeRules.js.map +1 -0
- package/dist/src/context/score.d.ts +52 -0
- package/dist/src/context/score.d.ts.map +1 -0
- package/dist/src/context/score.js +346 -0
- package/dist/src/context/score.js.map +1 -0
- package/dist/src/context/structure.d.ts +46 -0
- package/dist/src/context/structure.d.ts.map +1 -0
- package/dist/src/context/structure.js +528 -0
- package/dist/src/context/structure.js.map +1 -0
- package/dist/src/context/triggers.d.ts +73 -0
- package/dist/src/context/triggers.d.ts.map +1 -0
- package/dist/src/context/triggers.js +172 -0
- package/dist/src/context/triggers.js.map +1 -0
- package/dist/src/context/types.d.ts +137 -0
- package/dist/src/context/types.d.ts.map +1 -0
- package/dist/src/context/types.js +25 -0
- package/dist/src/context/types.js.map +1 -0
- package/dist/src/crypto/keccak256.d.ts +15 -0
- package/dist/src/crypto/keccak256.d.ts.map +1 -0
- package/dist/src/crypto/keccak256.js +89 -0
- package/dist/src/crypto/keccak256.js.map +1 -0
- package/dist/src/crypto/sha256.d.ts +16 -0
- package/dist/src/crypto/sha256.d.ts.map +1 -0
- package/dist/src/crypto/sha256.js +81 -0
- package/dist/src/crypto/sha256.js.map +1 -0
- package/dist/src/detect/detectors/bankcodes/auBsb.d.ts +11 -0
- package/dist/src/detect/detectors/bankcodes/auBsb.d.ts.map +1 -0
- package/dist/src/detect/detectors/bankcodes/auBsb.js +34 -0
- package/dist/src/detect/detectors/bankcodes/auBsb.js.map +1 -0
- package/dist/src/detect/detectors/bankcodes/brAgencia.d.ts +15 -0
- package/dist/src/detect/detectors/bankcodes/brAgencia.d.ts.map +1 -0
- package/dist/src/detect/detectors/bankcodes/brAgencia.js +43 -0
- package/dist/src/detect/detectors/bankcodes/brAgencia.js.map +1 -0
- package/dist/src/detect/detectors/bankcodes/caTransit.d.ts +13 -0
- package/dist/src/detect/detectors/bankcodes/caTransit.d.ts.map +1 -0
- package/dist/src/detect/detectors/bankcodes/caTransit.js +86 -0
- package/dist/src/detect/detectors/bankcodes/caTransit.js.map +1 -0
- package/dist/src/detect/detectors/bankcodes/inIfsc.d.ts +13 -0
- package/dist/src/detect/detectors/bankcodes/inIfsc.d.ts.map +1 -0
- package/dist/src/detect/detectors/bankcodes/inIfsc.js +37 -0
- package/dist/src/detect/detectors/bankcodes/inIfsc.js.map +1 -0
- package/dist/src/detect/detectors/bankcodes/index.d.ts +10 -0
- package/dist/src/detect/detectors/bankcodes/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/bankcodes/index.js +10 -0
- package/dist/src/detect/detectors/bankcodes/index.js.map +1 -0
- package/dist/src/detect/detectors/bankcodes/ukSortCode.d.ts +13 -0
- package/dist/src/detect/detectors/bankcodes/ukSortCode.d.ts.map +1 -0
- package/dist/src/detect/detectors/bankcodes/ukSortCode.js +36 -0
- package/dist/src/detect/detectors/bankcodes/ukSortCode.js.map +1 -0
- package/dist/src/detect/detectors/bankcodes/usRouting.d.ts +12 -0
- package/dist/src/detect/detectors/bankcodes/usRouting.d.ts.map +1 -0
- package/dist/src/detect/detectors/bankcodes/usRouting.js +45 -0
- package/dist/src/detect/detectors/bankcodes/usRouting.js.map +1 -0
- package/dist/src/detect/detectors/contact/email.d.ts +16 -0
- package/dist/src/detect/detectors/contact/email.d.ts.map +1 -0
- package/dist/src/detect/detectors/contact/email.js +111 -0
- package/dist/src/detect/detectors/contact/email.js.map +1 -0
- package/dist/src/detect/detectors/contact/index.d.ts +11 -0
- package/dist/src/detect/detectors/contact/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/contact/index.js +11 -0
- package/dist/src/detect/detectors/contact/index.js.map +1 -0
- package/dist/src/detect/detectors/contact/ipv4.d.ts +12 -0
- package/dist/src/detect/detectors/contact/ipv4.d.ts.map +1 -0
- package/dist/src/detect/detectors/contact/ipv4.js +109 -0
- package/dist/src/detect/detectors/contact/ipv4.js.map +1 -0
- package/dist/src/detect/detectors/contact/ipv6.d.ts +16 -0
- package/dist/src/detect/detectors/contact/ipv6.d.ts.map +1 -0
- package/dist/src/detect/detectors/contact/ipv6.js +187 -0
- package/dist/src/detect/detectors/contact/ipv6.js.map +1 -0
- package/dist/src/detect/detectors/contact/mac.d.ts +14 -0
- package/dist/src/detect/detectors/contact/mac.d.ts.map +1 -0
- package/dist/src/detect/detectors/contact/mac.js +64 -0
- package/dist/src/detect/detectors/contact/mac.js.map +1 -0
- package/dist/src/detect/detectors/contact/phone.d.ts +21 -0
- package/dist/src/detect/detectors/contact/phone.d.ts.map +1 -0
- package/dist/src/detect/detectors/contact/phone.js +76 -0
- package/dist/src/detect/detectors/contact/phone.js.map +1 -0
- package/dist/src/detect/detectors/contact/urlCredentials.d.ts +23 -0
- package/dist/src/detect/detectors/contact/urlCredentials.d.ts.map +1 -0
- package/dist/src/detect/detectors/contact/urlCredentials.js +123 -0
- package/dist/src/detect/detectors/contact/urlCredentials.js.map +1 -0
- package/dist/src/detect/detectors/crypto/ada.d.ts +13 -0
- package/dist/src/detect/detectors/crypto/ada.d.ts.map +1 -0
- package/dist/src/detect/detectors/crypto/ada.js +51 -0
- package/dist/src/detect/detectors/crypto/ada.js.map +1 -0
- package/dist/src/detect/detectors/crypto/btc.d.ts +15 -0
- package/dist/src/detect/detectors/crypto/btc.d.ts.map +1 -0
- package/dist/src/detect/detectors/crypto/btc.js +78 -0
- package/dist/src/detect/detectors/crypto/btc.js.map +1 -0
- package/dist/src/detect/detectors/crypto/dot.d.ts +13 -0
- package/dist/src/detect/detectors/crypto/dot.d.ts.map +1 -0
- package/dist/src/detect/detectors/crypto/dot.js +41 -0
- package/dist/src/detect/detectors/crypto/dot.js.map +1 -0
- package/dist/src/detect/detectors/crypto/eth.d.ts +15 -0
- package/dist/src/detect/detectors/crypto/eth.d.ts.map +1 -0
- package/dist/src/detect/detectors/crypto/eth.js +63 -0
- package/dist/src/detect/detectors/crypto/eth.js.map +1 -0
- package/dist/src/detect/detectors/crypto/index.d.ts +12 -0
- package/dist/src/detect/detectors/crypto/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/crypto/index.js +12 -0
- package/dist/src/detect/detectors/crypto/index.js.map +1 -0
- package/dist/src/detect/detectors/crypto/ltc.d.ts +12 -0
- package/dist/src/detect/detectors/crypto/ltc.d.ts.map +1 -0
- package/dist/src/detect/detectors/crypto/ltc.js +71 -0
- package/dist/src/detect/detectors/crypto/ltc.js.map +1 -0
- package/dist/src/detect/detectors/crypto/sol.d.ts +13 -0
- package/dist/src/detect/detectors/crypto/sol.d.ts.map +1 -0
- package/dist/src/detect/detectors/crypto/sol.js +39 -0
- package/dist/src/detect/detectors/crypto/sol.js.map +1 -0
- package/dist/src/detect/detectors/crypto/trx.d.ts +8 -0
- package/dist/src/detect/detectors/crypto/trx.d.ts.map +1 -0
- package/dist/src/detect/detectors/crypto/trx.js +34 -0
- package/dist/src/detect/detectors/crypto/trx.js.map +1 -0
- package/dist/src/detect/detectors/crypto/xmr.d.ts +10 -0
- package/dist/src/detect/detectors/crypto/xmr.d.ts.map +1 -0
- package/dist/src/detect/detectors/crypto/xmr.js +51 -0
- package/dist/src/detect/detectors/crypto/xmr.js.map +1 -0
- package/dist/src/detect/detectors/documents/driversLicense.d.ts +24 -0
- package/dist/src/detect/detectors/documents/driversLicense.d.ts.map +1 -0
- package/dist/src/detect/detectors/documents/driversLicense.js +79 -0
- package/dist/src/detect/detectors/documents/driversLicense.js.map +1 -0
- package/dist/src/detect/detectors/documents/healthData.d.ts +23 -0
- package/dist/src/detect/detectors/documents/healthData.d.ts.map +1 -0
- package/dist/src/detect/detectors/documents/healthData.js +78 -0
- package/dist/src/detect/detectors/documents/healthData.js.map +1 -0
- package/dist/src/detect/detectors/documents/index.d.ts +9 -0
- package/dist/src/detect/detectors/documents/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/documents/index.js +9 -0
- package/dist/src/detect/detectors/documents/index.js.map +1 -0
- package/dist/src/detect/detectors/documents/passportMrz.d.ts +20 -0
- package/dist/src/detect/detectors/documents/passportMrz.d.ts.map +1 -0
- package/dist/src/detect/detectors/documents/passportMrz.js +194 -0
- package/dist/src/detect/detectors/documents/passportMrz.js.map +1 -0
- package/dist/src/detect/detectors/documents/usNpi.d.ts +16 -0
- package/dist/src/detect/detectors/documents/usNpi.d.ts.map +1 -0
- package/dist/src/detect/detectors/documents/usNpi.js +48 -0
- package/dist/src/detect/detectors/documents/usNpi.js.map +1 -0
- package/dist/src/detect/detectors/documents/vin.d.ts +15 -0
- package/dist/src/detect/detectors/documents/vin.d.ts.map +1 -0
- package/dist/src/detect/detectors/documents/vin.js +64 -0
- package/dist/src/detect/detectors/documents/vin.js.map +1 -0
- package/dist/src/detect/detectors/financial/creditCard.d.ts +23 -0
- package/dist/src/detect/detectors/financial/creditCard.d.ts.map +1 -0
- package/dist/src/detect/detectors/financial/creditCard.js +157 -0
- package/dist/src/detect/detectors/financial/creditCard.js.map +1 -0
- package/dist/src/detect/detectors/financial/iban.d.ts +18 -0
- package/dist/src/detect/detectors/financial/iban.d.ts.map +1 -0
- package/dist/src/detect/detectors/financial/iban.js +80 -0
- package/dist/src/detect/detectors/financial/iban.js.map +1 -0
- package/dist/src/detect/detectors/financial/ibanRegistry.d.ts +35 -0
- package/dist/src/detect/detectors/financial/ibanRegistry.d.ts.map +1 -0
- package/dist/src/detect/detectors/financial/ibanRegistry.js +92 -0
- package/dist/src/detect/detectors/financial/ibanRegistry.js.map +1 -0
- package/dist/src/detect/detectors/financial/index.d.ts +7 -0
- package/dist/src/detect/detectors/financial/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/financial/index.js +7 -0
- package/dist/src/detect/detectors/financial/index.js.map +1 -0
- package/dist/src/detect/detectors/financial/swiftBic.d.ts +17 -0
- package/dist/src/detect/detectors/financial/swiftBic.d.ts.map +1 -0
- package/dist/src/detect/detectors/financial/swiftBic.js +55 -0
- package/dist/src/detect/detectors/financial/swiftBic.js.map +1 -0
- package/dist/src/detect/detectors/index.d.ts +15 -0
- package/dist/src/detect/detectors/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/index.js +15 -0
- package/dist/src/detect/detectors/index.js.map +1 -0
- package/dist/src/detect/detectors/location/coordinates.d.ts +14 -0
- package/dist/src/detect/detectors/location/coordinates.d.ts.map +1 -0
- package/dist/src/detect/detectors/location/coordinates.js +79 -0
- package/dist/src/detect/detectors/location/coordinates.js.map +1 -0
- package/dist/src/detect/detectors/location/index.d.ts +7 -0
- package/dist/src/detect/detectors/location/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/location/index.js +7 -0
- package/dist/src/detect/detectors/location/index.js.map +1 -0
- package/dist/src/detect/detectors/location/postalCode.d.ts +13 -0
- package/dist/src/detect/detectors/location/postalCode.d.ts.map +1 -0
- package/dist/src/detect/detectors/location/postalCode.js +53 -0
- package/dist/src/detect/detectors/location/postalCode.js.map +1 -0
- package/dist/src/detect/detectors/location/postalRegistry.d.ts +19 -0
- package/dist/src/detect/detectors/location/postalRegistry.d.ts.map +1 -0
- package/dist/src/detect/detectors/location/postalRegistry.js +73 -0
- package/dist/src/detect/detectors/location/postalRegistry.js.map +1 -0
- package/dist/src/detect/detectors/location/streetAddress.d.ts +21 -0
- package/dist/src/detect/detectors/location/streetAddress.d.ts.map +1 -0
- package/dist/src/detect/detectors/location/streetAddress.js +70 -0
- package/dist/src/detect/detectors/location/streetAddress.js.map +1 -0
- package/dist/src/detect/detectors/natid/africa.d.ts +17 -0
- package/dist/src/detect/detectors/natid/africa.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/africa.js +106 -0
- package/dist/src/detect/detectors/natid/africa.js.map +1 -0
- package/dist/src/detect/detectors/natid/ar.d.ts +14 -0
- package/dist/src/detect/detectors/natid/ar.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/ar.js +62 -0
- package/dist/src/detect/detectors/natid/ar.js.map +1 -0
- package/dist/src/detect/detectors/natid/au.d.ts +13 -0
- package/dist/src/detect/detectors/natid/au.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/au.js +100 -0
- package/dist/src/detect/detectors/natid/au.js.map +1 -0
- package/dist/src/detect/detectors/natid/be.d.ts +8 -0
- package/dist/src/detect/detectors/natid/be.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/be.js +44 -0
- package/dist/src/detect/detectors/natid/be.js.map +1 -0
- package/dist/src/detect/detectors/natid/bg.d.ts +7 -0
- package/dist/src/detect/detectors/natid/bg.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/bg.js +44 -0
- package/dist/src/detect/detectors/natid/bg.js.map +1 -0
- package/dist/src/detect/detectors/natid/br.d.ts +8 -0
- package/dist/src/detect/detectors/natid/br.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/br.js +85 -0
- package/dist/src/detect/detectors/natid/br.js.map +1 -0
- package/dist/src/detect/detectors/natid/ca.d.ts +8 -0
- package/dist/src/detect/detectors/natid/ca.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/ca.js +41 -0
- package/dist/src/detect/detectors/natid/ca.js.map +1 -0
- package/dist/src/detect/detectors/natid/cl.d.ts +9 -0
- package/dist/src/detect/detectors/natid/cl.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/cl.js +47 -0
- package/dist/src/detect/detectors/natid/cl.js.map +1 -0
- package/dist/src/detect/detectors/natid/cn.d.ts +9 -0
- package/dist/src/detect/detectors/natid/cn.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/cn.js +49 -0
- package/dist/src/detect/detectors/natid/cn.js.map +1 -0
- package/dist/src/detect/detectors/natid/co.d.ts +10 -0
- package/dist/src/detect/detectors/natid/co.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/co.js +43 -0
- package/dist/src/detect/detectors/natid/co.js.map +1 -0
- package/dist/src/detect/detectors/natid/cz.d.ts +11 -0
- package/dist/src/detect/detectors/natid/cz.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/cz.js +44 -0
- package/dist/src/detect/detectors/natid/cz.js.map +1 -0
- package/dist/src/detect/detectors/natid/de.d.ts +16 -0
- package/dist/src/detect/detectors/natid/de.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/de.js +77 -0
- package/dist/src/detect/detectors/natid/de.js.map +1 -0
- package/dist/src/detect/detectors/natid/dk.d.ts +9 -0
- package/dist/src/detect/detectors/natid/dk.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/dk.js +31 -0
- package/dist/src/detect/detectors/natid/dk.js.map +1 -0
- package/dist/src/detect/detectors/natid/es.d.ts +12 -0
- package/dist/src/detect/detectors/natid/es.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/es.js +96 -0
- package/dist/src/detect/detectors/natid/es.js.map +1 -0
- package/dist/src/detect/detectors/natid/fi.d.ts +10 -0
- package/dist/src/detect/detectors/natid/fi.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/fi.js +40 -0
- package/dist/src/detect/detectors/natid/fi.js.map +1 -0
- package/dist/src/detect/detectors/natid/fr.d.ts +12 -0
- package/dist/src/detect/detectors/natid/fr.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/fr.js +61 -0
- package/dist/src/detect/detectors/natid/fr.js.map +1 -0
- package/dist/src/detect/detectors/natid/gb.d.ts +10 -0
- package/dist/src/detect/detectors/natid/gb.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/gb.js +72 -0
- package/dist/src/detect/detectors/natid/gb.js.map +1 -0
- package/dist/src/detect/detectors/natid/gr.d.ts +7 -0
- package/dist/src/detect/detectors/natid/gr.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/gr.js +36 -0
- package/dist/src/detect/detectors/natid/gr.js.map +1 -0
- package/dist/src/detect/detectors/natid/gulf.d.ts +16 -0
- package/dist/src/detect/detectors/natid/gulf.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/gulf.js +121 -0
- package/dist/src/detect/detectors/natid/gulf.js.map +1 -0
- package/dist/src/detect/detectors/natid/hk.d.ts +9 -0
- package/dist/src/detect/detectors/natid/hk.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/hk.js +41 -0
- package/dist/src/detect/detectors/natid/hk.js.map +1 -0
- package/dist/src/detect/detectors/natid/hr.d.ts +6 -0
- package/dist/src/detect/detectors/natid/hr.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/hr.js +32 -0
- package/dist/src/detect/detectors/natid/hr.js.map +1 -0
- package/dist/src/detect/detectors/natid/hu.d.ts +7 -0
- package/dist/src/detect/detectors/natid/hu.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/hu.js +37 -0
- package/dist/src/detect/detectors/natid/hu.js.map +1 -0
- package/dist/src/detect/detectors/natid/ie.d.ts +9 -0
- package/dist/src/detect/detectors/natid/ie.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/ie.js +36 -0
- package/dist/src/detect/detectors/natid/ie.js.map +1 -0
- package/dist/src/detect/detectors/natid/il.d.ts +10 -0
- package/dist/src/detect/detectors/natid/il.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/il.js +38 -0
- package/dist/src/detect/detectors/natid/il.js.map +1 -0
- package/dist/src/detect/detectors/natid/in.d.ts +17 -0
- package/dist/src/detect/detectors/natid/in.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/in.js +67 -0
- package/dist/src/detect/detectors/natid/in.js.map +1 -0
- package/dist/src/detect/detectors/natid/index.d.ts +55 -0
- package/dist/src/detect/detectors/natid/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/index.js +55 -0
- package/dist/src/detect/detectors/natid/index.js.map +1 -0
- package/dist/src/detect/detectors/natid/is.d.ts +8 -0
- package/dist/src/detect/detectors/natid/is.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/is.js +42 -0
- package/dist/src/detect/detectors/natid/is.js.map +1 -0
- package/dist/src/detect/detectors/natid/it.d.ts +12 -0
- package/dist/src/detect/detectors/natid/it.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/it.js +62 -0
- package/dist/src/detect/detectors/natid/it.js.map +1 -0
- package/dist/src/detect/detectors/natid/jp.d.ts +9 -0
- package/dist/src/detect/detectors/natid/jp.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/jp.js +46 -0
- package/dist/src/detect/detectors/natid/jp.js.map +1 -0
- package/dist/src/detect/detectors/natid/kr.d.ts +11 -0
- package/dist/src/detect/detectors/natid/kr.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/kr.js +40 -0
- package/dist/src/detect/detectors/natid/kr.js.map +1 -0
- package/dist/src/detect/detectors/natid/kz.d.ts +8 -0
- package/dist/src/detect/detectors/natid/kz.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/kz.js +46 -0
- package/dist/src/detect/detectors/natid/kz.js.map +1 -0
- package/dist/src/detect/detectors/natid/mx.d.ts +16 -0
- package/dist/src/detect/detectors/natid/mx.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/mx.js +82 -0
- package/dist/src/detect/detectors/natid/mx.js.map +1 -0
- package/dist/src/detect/detectors/natid/nl.d.ts +8 -0
- package/dist/src/detect/detectors/natid/nl.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/nl.js +40 -0
- package/dist/src/detect/detectors/natid/nl.js.map +1 -0
- package/dist/src/detect/detectors/natid/no.d.ts +9 -0
- package/dist/src/detect/detectors/natid/no.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/no.js +52 -0
- package/dist/src/detect/detectors/natid/no.js.map +1 -0
- package/dist/src/detect/detectors/natid/nz.d.ts +9 -0
- package/dist/src/detect/detectors/natid/nz.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/nz.js +52 -0
- package/dist/src/detect/detectors/natid/nz.js.map +1 -0
- package/dist/src/detect/detectors/natid/pe.d.ts +7 -0
- package/dist/src/detect/detectors/natid/pe.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/pe.js +26 -0
- package/dist/src/detect/detectors/natid/pe.js.map +1 -0
- package/dist/src/detect/detectors/natid/pl.d.ts +11 -0
- package/dist/src/detect/detectors/natid/pl.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/pl.js +105 -0
- package/dist/src/detect/detectors/natid/pl.js.map +1 -0
- package/dist/src/detect/detectors/natid/pt.d.ts +6 -0
- package/dist/src/detect/detectors/natid/pt.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/pt.js +35 -0
- package/dist/src/detect/detectors/natid/pt.js.map +1 -0
- package/dist/src/detect/detectors/natid/ro.d.ts +8 -0
- package/dist/src/detect/detectors/natid/ro.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/ro.js +48 -0
- package/dist/src/detect/detectors/natid/ro.js.map +1 -0
- package/dist/src/detect/detectors/natid/ru.d.ts +11 -0
- package/dist/src/detect/detectors/natid/ru.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/ru.js +86 -0
- package/dist/src/detect/detectors/natid/ru.js.map +1 -0
- package/dist/src/detect/detectors/natid/se.d.ts +9 -0
- package/dist/src/detect/detectors/natid/se.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/se.js +43 -0
- package/dist/src/detect/detectors/natid/se.js.map +1 -0
- package/dist/src/detect/detectors/natid/seasia.d.ts +19 -0
- package/dist/src/detect/detectors/natid/seasia.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/seasia.js +182 -0
- package/dist/src/detect/detectors/natid/seasia.js.map +1 -0
- package/dist/src/detect/detectors/natid/sg.d.ts +8 -0
- package/dist/src/detect/detectors/natid/sg.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/sg.js +39 -0
- package/dist/src/detect/detectors/natid/sg.js.map +1 -0
- package/dist/src/detect/detectors/natid/si.d.ts +8 -0
- package/dist/src/detect/detectors/natid/si.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/si.js +44 -0
- package/dist/src/detect/detectors/natid/si.js.map +1 -0
- package/dist/src/detect/detectors/natid/tr.d.ts +14 -0
- package/dist/src/detect/detectors/natid/tr.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/tr.js +79 -0
- package/dist/src/detect/detectors/natid/tr.js.map +1 -0
- package/dist/src/detect/detectors/natid/tw.d.ts +9 -0
- package/dist/src/detect/detectors/natid/tw.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/tw.js +40 -0
- package/dist/src/detect/detectors/natid/tw.js.map +1 -0
- package/dist/src/detect/detectors/natid/ua.d.ts +7 -0
- package/dist/src/detect/detectors/natid/ua.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/ua.js +38 -0
- package/dist/src/detect/detectors/natid/ua.js.map +1 -0
- package/dist/src/detect/detectors/natid/us.d.ts +15 -0
- package/dist/src/detect/detectors/natid/us.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/us.js +119 -0
- package/dist/src/detect/detectors/natid/us.js.map +1 -0
- package/dist/src/detect/detectors/natid/za.d.ts +9 -0
- package/dist/src/detect/detectors/natid/za.d.ts.map +1 -0
- package/dist/src/detect/detectors/natid/za.js +44 -0
- package/dist/src/detect/detectors/natid/za.js.map +1 -0
- package/dist/src/detect/detectors/secrets/apiKey.d.ts +14 -0
- package/dist/src/detect/detectors/secrets/apiKey.d.ts.map +1 -0
- package/dist/src/detect/detectors/secrets/apiKey.js +103 -0
- package/dist/src/detect/detectors/secrets/apiKey.js.map +1 -0
- package/dist/src/detect/detectors/secrets/connectionString.d.ts +12 -0
- package/dist/src/detect/detectors/secrets/connectionString.d.ts.map +1 -0
- package/dist/src/detect/detectors/secrets/connectionString.js +70 -0
- package/dist/src/detect/detectors/secrets/connectionString.js.map +1 -0
- package/dist/src/detect/detectors/secrets/genericSecret.d.ts +22 -0
- package/dist/src/detect/detectors/secrets/genericSecret.d.ts.map +1 -0
- package/dist/src/detect/detectors/secrets/genericSecret.js +77 -0
- package/dist/src/detect/detectors/secrets/genericSecret.js.map +1 -0
- package/dist/src/detect/detectors/secrets/index.d.ts +9 -0
- package/dist/src/detect/detectors/secrets/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/secrets/index.js +9 -0
- package/dist/src/detect/detectors/secrets/index.js.map +1 -0
- package/dist/src/detect/detectors/secrets/jwt.d.ts +11 -0
- package/dist/src/detect/detectors/secrets/jwt.d.ts.map +1 -0
- package/dist/src/detect/detectors/secrets/jwt.js +111 -0
- package/dist/src/detect/detectors/secrets/jwt.js.map +1 -0
- package/dist/src/detect/detectors/secrets/pemPrivateKey.d.ts +16 -0
- package/dist/src/detect/detectors/secrets/pemPrivateKey.d.ts.map +1 -0
- package/dist/src/detect/detectors/secrets/pemPrivateKey.js +56 -0
- package/dist/src/detect/detectors/secrets/pemPrivateKey.js.map +1 -0
- package/dist/src/detect/detectors/vat/euVat.d.ts +17 -0
- package/dist/src/detect/detectors/vat/euVat.d.ts.map +1 -0
- package/dist/src/detect/detectors/vat/euVat.js +293 -0
- package/dist/src/detect/detectors/vat/euVat.js.map +1 -0
- package/dist/src/detect/detectors/vat/index.d.ts +5 -0
- package/dist/src/detect/detectors/vat/index.d.ts.map +1 -0
- package/dist/src/detect/detectors/vat/index.js +5 -0
- package/dist/src/detect/detectors/vat/index.js.map +1 -0
- package/dist/src/detect/entropy.d.ts +28 -0
- package/dist/src/detect/entropy.d.ts.map +1 -0
- package/dist/src/detect/entropy.js +64 -0
- package/dist/src/detect/entropy.js.map +1 -0
- package/dist/src/detect/isoCountries.d.ts +10 -0
- package/dist/src/detect/isoCountries.d.ts.map +1 -0
- package/dist/src/detect/isoCountries.js +25 -0
- package/dist/src/detect/isoCountries.js.map +1 -0
- package/dist/src/detect/registry.d.ts +50 -0
- package/dist/src/detect/registry.d.ts.map +1 -0
- package/dist/src/detect/registry.js +110 -0
- package/dist/src/detect/registry.js.map +1 -0
- package/dist/src/detect/runner.d.ts +64 -0
- package/dist/src/detect/runner.d.ts.map +1 -0
- package/dist/src/detect/runner.js +142 -0
- package/dist/src/detect/runner.js.map +1 -0
- package/dist/src/detect/types.d.ts +251 -0
- package/dist/src/detect/types.d.ts.map +1 -0
- package/dist/src/detect/types.js +59 -0
- package/dist/src/detect/types.js.map +1 -0
- package/dist/src/encoding/base58.d.ts +26 -0
- package/dist/src/encoding/base58.d.ts.map +1 -0
- package/dist/src/encoding/base58.js +77 -0
- package/dist/src/encoding/base58.js.map +1 -0
- package/dist/src/encoding/base58monero.d.ts +15 -0
- package/dist/src/encoding/base58monero.d.ts.map +1 -0
- package/dist/src/encoding/base58monero.js +87 -0
- package/dist/src/encoding/base58monero.js.map +1 -0
- package/dist/src/encoding/bech32.d.ts +28 -0
- package/dist/src/encoding/bech32.d.ts.map +1 -0
- package/dist/src/encoding/bech32.js +108 -0
- package/dist/src/encoding/bech32.js.map +1 -0
- package/dist/src/encoding/bytes.d.ts +15 -0
- package/dist/src/encoding/bytes.d.ts.map +1 -0
- package/dist/src/encoding/bytes.js +46 -0
- package/dist/src/encoding/bytes.js.map +1 -0
- package/dist/src/entityFamily.d.ts +18 -0
- package/dist/src/entityFamily.d.ts.map +1 -0
- package/dist/src/entityFamily.js +54 -0
- package/dist/src/entityFamily.js.map +1 -0
- package/dist/src/entityLabel.d.ts +18 -0
- package/dist/src/entityLabel.d.ts.map +1 -0
- package/dist/src/entityLabel.js +53 -0
- package/dist/src/entityLabel.js.map +1 -0
- package/dist/src/entityTypes.d.ts +64 -0
- package/dist/src/entityTypes.d.ts.map +1 -0
- package/dist/src/entityTypes.js +94 -0
- package/dist/src/entityTypes.js.map +1 -0
- package/dist/src/exposure/index.d.ts +86 -0
- package/dist/src/exposure/index.d.ts.map +1 -0
- package/dist/src/exposure/index.js +134 -0
- package/dist/src/exposure/index.js.map +1 -0
- package/dist/src/fuse/calibrate.d.ts +95 -0
- package/dist/src/fuse/calibrate.d.ts.map +1 -0
- package/dist/src/fuse/calibrate.js +165 -0
- package/dist/src/fuse/calibrate.js.map +1 -0
- package/dist/src/fuse/defaultCalibration.d.ts +52 -0
- package/dist/src/fuse/defaultCalibration.d.ts.map +1 -0
- package/dist/src/fuse/defaultCalibration.js +41 -0
- package/dist/src/fuse/defaultCalibration.js.map +1 -0
- package/dist/src/fuse/explain.d.ts +55 -0
- package/dist/src/fuse/explain.d.ts.map +1 -0
- package/dist/src/fuse/explain.js +91 -0
- package/dist/src/fuse/explain.js.map +1 -0
- package/dist/src/fuse/profiles.d.ts +80 -0
- package/dist/src/fuse/profiles.d.ts.map +1 -0
- package/dist/src/fuse/profiles.js +126 -0
- package/dist/src/fuse/profiles.js.map +1 -0
- package/dist/src/fuse/resolve.d.ts +73 -0
- package/dist/src/fuse/resolve.d.ts.map +1 -0
- package/dist/src/fuse/resolve.js +206 -0
- package/dist/src/fuse/resolve.js.map +1 -0
- package/dist/src/gazetteer/index.d.ts +41 -0
- package/dist/src/gazetteer/index.d.ts.map +1 -0
- package/dist/src/gazetteer/index.js +117 -0
- package/dist/src/gazetteer/index.js.map +1 -0
- package/dist/src/generate/bankcodes.d.ts +20 -0
- package/dist/src/generate/bankcodes.d.ts.map +1 -0
- package/dist/src/generate/bankcodes.js +71 -0
- package/dist/src/generate/bankcodes.js.map +1 -0
- package/dist/src/generate/contact.d.ts +31 -0
- package/dist/src/generate/contact.d.ts.map +1 -0
- package/dist/src/generate/contact.js +139 -0
- package/dist/src/generate/contact.js.map +1 -0
- package/dist/src/generate/crypto.d.ts +27 -0
- package/dist/src/generate/crypto.d.ts.map +1 -0
- package/dist/src/generate/crypto.js +88 -0
- package/dist/src/generate/crypto.js.map +1 -0
- package/dist/src/generate/documents.d.ts +24 -0
- package/dist/src/generate/documents.d.ts.map +1 -0
- package/dist/src/generate/documents.js +124 -0
- package/dist/src/generate/documents.js.map +1 -0
- package/dist/src/generate/financial.d.ts +26 -0
- package/dist/src/generate/financial.d.ts.map +1 -0
- package/dist/src/generate/financial.js +136 -0
- package/dist/src/generate/financial.js.map +1 -0
- package/dist/src/generate/index.d.ts +23 -0
- package/dist/src/generate/index.d.ts.map +1 -0
- package/dist/src/generate/index.js +23 -0
- package/dist/src/generate/index.js.map +1 -0
- package/dist/src/generate/location.d.ts +12 -0
- package/dist/src/generate/location.d.ts.map +1 -0
- package/dist/src/generate/location.js +75 -0
- package/dist/src/generate/location.js.map +1 -0
- package/dist/src/generate/natidAmOc.d.ts +22 -0
- package/dist/src/generate/natidAmOc.d.ts.map +1 -0
- package/dist/src/generate/natidAmOc.js +181 -0
- package/dist/src/generate/natidAmOc.js.map +1 -0
- package/dist/src/generate/natidAsia.d.ts +20 -0
- package/dist/src/generate/natidAsia.d.ts.map +1 -0
- package/dist/src/generate/natidAsia.js +147 -0
- package/dist/src/generate/natidAsia.js.map +1 -0
- package/dist/src/generate/natidCee.d.ts +21 -0
- package/dist/src/generate/natidCee.d.ts.map +1 -0
- package/dist/src/generate/natidCee.js +181 -0
- package/dist/src/generate/natidCee.js.map +1 -0
- package/dist/src/generate/natidMeCis.d.ts +17 -0
- package/dist/src/generate/natidMeCis.d.ts.map +1 -0
- package/dist/src/generate/natidMeCis.js +121 -0
- package/dist/src/generate/natidMeCis.js.map +1 -0
- package/dist/src/generate/natidWest.d.ts +32 -0
- package/dist/src/generate/natidWest.d.ts.map +1 -0
- package/dist/src/generate/natidWest.js +187 -0
- package/dist/src/generate/natidWest.js.map +1 -0
- package/dist/src/generate/prng.d.ts +10 -0
- package/dist/src/generate/prng.d.ts.map +1 -0
- package/dist/src/generate/prng.js +18 -0
- package/dist/src/generate/prng.js.map +1 -0
- package/dist/src/generate/secrets.d.ts +23 -0
- package/dist/src/generate/secrets.d.ts.map +1 -0
- package/dist/src/generate/secrets.js +126 -0
- package/dist/src/generate/secrets.js.map +1 -0
- package/dist/src/generate/vat.d.ts +11 -0
- package/dist/src/generate/vat.d.ts.map +1 -0
- package/dist/src/generate/vat.js +233 -0
- package/dist/src/generate/vat.js.map +1 -0
- package/dist/src/index.d.ts +81 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +76 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mask/egressGuard.d.ts +54 -0
- package/dist/src/mask/egressGuard.d.ts.map +1 -0
- package/dist/src/mask/egressGuard.js +67 -0
- package/dist/src/mask/egressGuard.js.map +1 -0
- package/dist/src/mask/masker.d.ts +76 -0
- package/dist/src/mask/masker.d.ts.map +1 -0
- package/dist/src/mask/masker.js +201 -0
- package/dist/src/mask/masker.js.map +1 -0
- package/dist/src/mask/restorer.d.ts +96 -0
- package/dist/src/mask/restorer.d.ts.map +1 -0
- package/dist/src/mask/restorer.js +263 -0
- package/dist/src/mask/restorer.js.map +1 -0
- package/dist/src/mask/surrogatePools.d.ts +33 -0
- package/dist/src/mask/surrogatePools.d.ts.map +1 -0
- package/dist/src/mask/surrogatePools.js +81 -0
- package/dist/src/mask/surrogatePools.js.map +1 -0
- package/dist/src/mask/surrogates.d.ts +45 -0
- package/dist/src/mask/surrogates.d.ts.map +1 -0
- package/dist/src/mask/surrogates.js +241 -0
- package/dist/src/mask/surrogates.js.map +1 -0
- package/dist/src/mask/vault.d.ts +76 -0
- package/dist/src/mask/vault.d.ts.map +1 -0
- package/dist/src/mask/vault.js +141 -0
- package/dist/src/mask/vault.js.map +1 -0
- package/dist/src/ner/align.d.ts +36 -0
- package/dist/src/ner/align.d.ts.map +1 -0
- package/dist/src/ner/align.js +73 -0
- package/dist/src/ner/align.js.map +1 -0
- package/dist/src/ner/chunk.d.ts +27 -0
- package/dist/src/ner/chunk.d.ts.map +1 -0
- package/dist/src/ner/chunk.js +55 -0
- package/dist/src/ner/chunk.js.map +1 -0
- package/dist/src/ner/chunkCache.d.ts +63 -0
- package/dist/src/ner/chunkCache.d.ts.map +1 -0
- package/dist/src/ner/chunkCache.js +99 -0
- package/dist/src/ner/chunkCache.js.map +1 -0
- package/dist/src/ner/engine.d.ts +53 -0
- package/dist/src/ner/engine.d.ts.map +1 -0
- package/dist/src/ner/engine.js +113 -0
- package/dist/src/ner/engine.js.map +1 -0
- package/dist/src/ner/merge.d.ts +26 -0
- package/dist/src/ner/merge.d.ts.map +1 -0
- package/dist/src/ner/merge.js +108 -0
- package/dist/src/ner/merge.js.map +1 -0
- package/dist/src/ner/runStage2.d.ts +17 -0
- package/dist/src/ner/runStage2.d.ts.map +1 -0
- package/dist/src/ner/runStage2.js +43 -0
- package/dist/src/ner/runStage2.js.map +1 -0
- package/dist/src/ner/stage2b.d.ts +59 -0
- package/dist/src/ner/stage2b.d.ts.map +1 -0
- package/dist/src/ner/stage2b.js +51 -0
- package/dist/src/ner/stage2b.js.map +1 -0
- package/dist/src/ner/transformersClassifier.d.ts +45 -0
- package/dist/src/ner/transformersClassifier.d.ts.map +1 -0
- package/dist/src/ner/transformersClassifier.js +40 -0
- package/dist/src/ner/transformersClassifier.js.map +1 -0
- package/dist/src/ner/types.d.ts +93 -0
- package/dist/src/ner/types.d.ts.map +1 -0
- package/dist/src/ner/types.js +12 -0
- package/dist/src/ner/types.js.map +1 -0
- package/dist/src/normalization.d.ts +24 -0
- package/dist/src/normalization.d.ts.map +1 -0
- package/dist/src/normalization.js +92 -0
- package/dist/src/normalization.js.map +1 -0
- package/dist/src/offsetMap.d.ts +165 -0
- package/dist/src/offsetMap.d.ts.map +1 -0
- package/dist/src/offsetMap.js +225 -0
- package/dist/src/offsetMap.js.map +1 -0
- package/dist/src/pipeline.d.ts +58 -0
- package/dist/src/pipeline.d.ts.map +1 -0
- package/dist/src/pipeline.js +57 -0
- package/dist/src/pipeline.js.map +1 -0
- package/dist/src/protect.d.ts +146 -0
- package/dist/src/protect.d.ts.map +1 -0
- package/dist/src/protect.js +161 -0
- package/dist/src/protect.js.map +1 -0
- package/dist/src/scripts.d.ts +37 -0
- package/dist/src/scripts.d.ts.map +1 -0
- package/dist/src/scripts.js +145 -0
- package/dist/src/scripts.js.map +1 -0
- package/dist/src/transforms/foldDigits.d.ts +49 -0
- package/dist/src/transforms/foldDigits.d.ts.map +1 -0
- package/dist/src/transforms/foldDigits.js +135 -0
- package/dist/src/transforms/foldDigits.js.map +1 -0
- package/dist/src/transforms/graphemes.d.ts +6 -0
- package/dist/src/transforms/graphemes.d.ts.map +1 -0
- package/dist/src/transforms/graphemes.js +6 -0
- package/dist/src/transforms/graphemes.js.map +1 -0
- package/dist/src/transforms/homoglyphFold.d.ts +5 -0
- package/dist/src/transforms/homoglyphFold.d.ts.map +1 -0
- package/dist/src/transforms/homoglyphFold.js +214 -0
- package/dist/src/transforms/homoglyphFold.js.map +1 -0
- package/dist/src/transforms/nfkc.d.ts +20 -0
- package/dist/src/transforms/nfkc.d.ts.map +1 -0
- package/dist/src/transforms/nfkc.js +48 -0
- package/dist/src/transforms/nfkc.js.map +1 -0
- package/dist/src/transforms/stripInvisibles.d.ts +37 -0
- package/dist/src/transforms/stripInvisibles.d.ts.map +1 -0
- package/dist/src/transforms/stripInvisibles.js +151 -0
- package/dist/src/transforms/stripInvisibles.js.map +1 -0
- package/dist/src/transforms/whitespacePunct.d.ts +21 -0
- package/dist/src/transforms/whitespacePunct.d.ts.map +1 -0
- package/dist/src/transforms/whitespacePunct.js +100 -0
- package/dist/src/transforms/whitespacePunct.js.map +1 -0
- package/dist/src/types.d.ts +212 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +14 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +67 -0
- package/src/checksums/aba.ts +45 -0
- package/src/checksums/digits.ts +108 -0
- package/src/checksums/icao9303.ts +53 -0
- package/src/checksums/index.ts +36 -0
- package/src/checksums/iso7064.ts +168 -0
- package/src/checksums/luhn.ts +66 -0
- package/src/checksums/mod97.ts +91 -0
- package/src/checksums/verhoeff.ts +84 -0
- package/src/checksums/weighted.ts +108 -0
- package/src/context/documentProfile.ts +293 -0
- package/src/context/negativeRules.ts +765 -0
- package/src/context/score.ts +430 -0
- package/src/context/structure.ts +611 -0
- package/src/context/triggers.ts +266 -0
- package/src/context/types.ts +150 -0
- package/src/crypto/keccak256.ts +98 -0
- package/src/crypto/sha256.ts +76 -0
- package/src/detect/AUTHORING.md +50 -0
- package/src/detect/detectors/bankcodes/auBsb.ts +36 -0
- package/src/detect/detectors/bankcodes/brAgencia.ts +46 -0
- package/src/detect/detectors/bankcodes/caTransit.ts +89 -0
- package/src/detect/detectors/bankcodes/inIfsc.ts +40 -0
- package/src/detect/detectors/bankcodes/index.ts +9 -0
- package/src/detect/detectors/bankcodes/ukSortCode.ts +38 -0
- package/src/detect/detectors/bankcodes/usRouting.ts +47 -0
- package/src/detect/detectors/contact/email.ts +113 -0
- package/src/detect/detectors/contact/index.ts +10 -0
- package/src/detect/detectors/contact/ipv4.ts +112 -0
- package/src/detect/detectors/contact/ipv6.ts +188 -0
- package/src/detect/detectors/contact/mac.ts +68 -0
- package/src/detect/detectors/contact/phone.ts +81 -0
- package/src/detect/detectors/contact/urlCredentials.ts +124 -0
- package/src/detect/detectors/crypto/ada.ts +52 -0
- package/src/detect/detectors/crypto/btc.ts +77 -0
- package/src/detect/detectors/crypto/dot.ts +42 -0
- package/src/detect/detectors/crypto/eth.ts +70 -0
- package/src/detect/detectors/crypto/index.ts +11 -0
- package/src/detect/detectors/crypto/ltc.ts +69 -0
- package/src/detect/detectors/crypto/sol.ts +41 -0
- package/src/detect/detectors/crypto/trx.ts +35 -0
- package/src/detect/detectors/crypto/xmr.ts +54 -0
- package/src/detect/detectors/documents/driversLicense.ts +83 -0
- package/src/detect/detectors/documents/healthData.ts +88 -0
- package/src/detect/detectors/documents/index.ts +8 -0
- package/src/detect/detectors/documents/passportMrz.ts +203 -0
- package/src/detect/detectors/documents/usNpi.ts +50 -0
- package/src/detect/detectors/documents/vin.ts +67 -0
- package/src/detect/detectors/financial/creditCard.ts +167 -0
- package/src/detect/detectors/financial/iban.ts +82 -0
- package/src/detect/detectors/financial/ibanRegistry.ts +112 -0
- package/src/detect/detectors/financial/index.ts +6 -0
- package/src/detect/detectors/financial/swiftBic.ts +61 -0
- package/src/detect/detectors/index.ts +14 -0
- package/src/detect/detectors/location/coordinates.ts +84 -0
- package/src/detect/detectors/location/index.ts +6 -0
- package/src/detect/detectors/location/postalCode.ts +56 -0
- package/src/detect/detectors/location/postalRegistry.ts +74 -0
- package/src/detect/detectors/location/streetAddress.ts +84 -0
- package/src/detect/detectors/natid/africa.ts +108 -0
- package/src/detect/detectors/natid/ar.ts +62 -0
- package/src/detect/detectors/natid/au.ts +99 -0
- package/src/detect/detectors/natid/be.ts +45 -0
- package/src/detect/detectors/natid/bg.ts +44 -0
- package/src/detect/detectors/natid/br.ts +81 -0
- package/src/detect/detectors/natid/ca.ts +40 -0
- package/src/detect/detectors/natid/cl.ts +47 -0
- package/src/detect/detectors/natid/cn.ts +48 -0
- package/src/detect/detectors/natid/co.ts +46 -0
- package/src/detect/detectors/natid/cz.ts +44 -0
- package/src/detect/detectors/natid/de.ts +75 -0
- package/src/detect/detectors/natid/dk.ts +31 -0
- package/src/detect/detectors/natid/es.ts +95 -0
- package/src/detect/detectors/natid/fi.ts +41 -0
- package/src/detect/detectors/natid/fr.ts +63 -0
- package/src/detect/detectors/natid/gb.ts +70 -0
- package/src/detect/detectors/natid/gr.ts +35 -0
- package/src/detect/detectors/natid/gulf.ts +116 -0
- package/src/detect/detectors/natid/hk.ts +42 -0
- package/src/detect/detectors/natid/hr.ts +32 -0
- package/src/detect/detectors/natid/hu.ts +36 -0
- package/src/detect/detectors/natid/ie.ts +37 -0
- package/src/detect/detectors/natid/il.ts +37 -0
- package/src/detect/detectors/natid/in.ts +67 -0
- package/src/detect/detectors/natid/index.ts +54 -0
- package/src/detect/detectors/natid/is.ts +42 -0
- package/src/detect/detectors/natid/it.ts +65 -0
- package/src/detect/detectors/natid/jp.ts +48 -0
- package/src/detect/detectors/natid/kr.ts +41 -0
- package/src/detect/detectors/natid/kz.ts +44 -0
- package/src/detect/detectors/natid/mx.ts +83 -0
- package/src/detect/detectors/natid/nl.ts +38 -0
- package/src/detect/detectors/natid/no.ts +50 -0
- package/src/detect/detectors/natid/nz.ts +53 -0
- package/src/detect/detectors/natid/pe.ts +28 -0
- package/src/detect/detectors/natid/pl.ts +100 -0
- package/src/detect/detectors/natid/pt.ts +36 -0
- package/src/detect/detectors/natid/ro.ts +47 -0
- package/src/detect/detectors/natid/ru.ts +82 -0
- package/src/detect/detectors/natid/se.ts +42 -0
- package/src/detect/detectors/natid/seasia.ts +174 -0
- package/src/detect/detectors/natid/sg.ts +39 -0
- package/src/detect/detectors/natid/si.ts +42 -0
- package/src/detect/detectors/natid/tr.ts +76 -0
- package/src/detect/detectors/natid/tw.ts +41 -0
- package/src/detect/detectors/natid/ua.ts +38 -0
- package/src/detect/detectors/natid/us.ts +118 -0
- package/src/detect/detectors/natid/za.ts +42 -0
- package/src/detect/detectors/secrets/apiKey.ts +115 -0
- package/src/detect/detectors/secrets/connectionString.ts +71 -0
- package/src/detect/detectors/secrets/genericSecret.ts +81 -0
- package/src/detect/detectors/secrets/index.ts +8 -0
- package/src/detect/detectors/secrets/jwt.ts +101 -0
- package/src/detect/detectors/secrets/pemPrivateKey.ts +59 -0
- package/src/detect/detectors/vat/euVat.ts +280 -0
- package/src/detect/detectors/vat/index.ts +4 -0
- package/src/detect/entropy.ts +60 -0
- package/src/detect/isoCountries.ts +30 -0
- package/src/detect/registry.ts +134 -0
- package/src/detect/runner.ts +187 -0
- package/src/detect/types.ts +296 -0
- package/src/encoding/base58.ts +85 -0
- package/src/encoding/base58monero.ts +90 -0
- package/src/encoding/bech32.ts +125 -0
- package/src/encoding/bytes.ts +48 -0
- package/src/entityFamily.ts +70 -0
- package/src/entityLabel.ts +56 -0
- package/src/entityTypes.ts +107 -0
- package/src/exposure/index.ts +189 -0
- package/src/fuse/calibrate.ts +224 -0
- package/src/fuse/defaultCalibration.ts +71 -0
- package/src/fuse/explain.ts +114 -0
- package/src/fuse/profiles.ts +187 -0
- package/src/fuse/resolve.ts +237 -0
- package/src/gazetteer/index.ts +139 -0
- package/src/generate/bankcodes.ts +82 -0
- package/src/generate/contact.ts +147 -0
- package/src/generate/crypto.ts +91 -0
- package/src/generate/documents.ts +142 -0
- package/src/generate/financial.ts +149 -0
- package/src/generate/index.ts +22 -0
- package/src/generate/location.ts +80 -0
- package/src/generate/natidAmOc.ts +198 -0
- package/src/generate/natidAsia.ts +162 -0
- package/src/generate/natidCee.ts +196 -0
- package/src/generate/natidMeCis.ts +131 -0
- package/src/generate/natidWest.ts +208 -0
- package/src/generate/prng.ts +17 -0
- package/src/generate/secrets.ts +141 -0
- package/src/generate/vat.ts +239 -0
- package/src/index.ts +186 -0
- package/src/mask/egressGuard.ts +88 -0
- package/src/mask/masker.ts +276 -0
- package/src/mask/restorer.ts +284 -0
- package/src/mask/surrogatePools.ts +96 -0
- package/src/mask/surrogates.ts +248 -0
- package/src/mask/vault.ts +153 -0
- package/src/ner/align.ts +86 -0
- package/src/ner/chunk.ts +65 -0
- package/src/ner/chunkCache.ts +110 -0
- package/src/ner/engine.ts +141 -0
- package/src/ner/merge.ts +123 -0
- package/src/ner/runStage2.ts +51 -0
- package/src/ner/stage2b.ts +73 -0
- package/src/ner/transformersClassifier.ts +79 -0
- package/src/ner/types.ts +99 -0
- package/src/normalization.ts +119 -0
- package/src/offsetMap.ts +271 -0
- package/src/pipeline.ts +96 -0
- package/src/protect.ts +284 -0
- package/src/scripts.ts +164 -0
- package/src/transforms/foldDigits.ts +138 -0
- package/src/transforms/graphemes.ts +5 -0
- package/src/transforms/homoglyphFold.ts +221 -0
- package/src/transforms/nfkc.ts +48 -0
- package/src/transforms/stripInvisibles.ts +158 -0
- package/src/transforms/whitespacePunct.ts +100 -0
- package/src/types.ts +339 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 4 — EXPLANATIONS.
|
|
3
|
+
*
|
|
4
|
+
* SPEC.md: "Every emitted entity carries an EXPLANATION: which stages fired,
|
|
5
|
+
* which triggers were found, which validator passed. This drives the review UI
|
|
6
|
+
* and makes failures diagnosable."
|
|
7
|
+
*
|
|
8
|
+
* The last clause is the one that shapes this module. An explanation is not
|
|
9
|
+
* decoration for the UI — it is how a wrong detection gets diagnosed without
|
|
10
|
+
* re-running the pipeline under a debugger. So it records what actually
|
|
11
|
+
* happened rather than a summary of it: which stages contributed, which named
|
|
12
|
+
* Stage 3 signals fired and with what sign, and what the profile decided.
|
|
13
|
+
*
|
|
14
|
+
* NO PLAINTEXT IN EXPLANATIONS, which is why triggers are lexicon terms and
|
|
15
|
+
* signal names rather than document text. Explanations flow into eval reports,
|
|
16
|
+
* the review panel, and the popup; a value that reached any of those would
|
|
17
|
+
* breach SPEC's third non-negotiable. The one exception is the entity's own
|
|
18
|
+
* text, which the caller already holds and which `DetectedEntity` carries in
|
|
19
|
+
* its own field.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Build the explanation for one entity.
|
|
23
|
+
*
|
|
24
|
+
* `triggers` carries the Stage 3 signal names rather than only lexicon
|
|
25
|
+
* matches, because "why was this reported" is answered as much by
|
|
26
|
+
* `structure:key-names-API_KEY` as by a trigger word — and a reviewer chasing
|
|
27
|
+
* a false positive needs the negative signals too, which is why suppression
|
|
28
|
+
* and penalty signals appear with their sign rather than being filtered out.
|
|
29
|
+
*/
|
|
30
|
+
export function explain(input) {
|
|
31
|
+
const { scored } = input;
|
|
32
|
+
const stages = [scored.candidate.stage];
|
|
33
|
+
// Stage 3 fired if it contributed anything at all.
|
|
34
|
+
if (scored.contributions.length > 0)
|
|
35
|
+
stages.push('stage3-context');
|
|
36
|
+
stages.push('stage4-fusion');
|
|
37
|
+
const triggers = scored.contributions.map((c) => {
|
|
38
|
+
const sign = c.delta >= 0 ? '+' : '';
|
|
39
|
+
const detail = c.detail === undefined ? '' : ` (${c.detail})`;
|
|
40
|
+
return `${c.signal}${detail} ${sign}${c.delta.toFixed(2)}`;
|
|
41
|
+
});
|
|
42
|
+
if (input.absorbedOverlap === true) {
|
|
43
|
+
triggers.push('stage4:absorbed-overlapping-span +0.00');
|
|
44
|
+
}
|
|
45
|
+
for (const type of input.wonAgainst ?? []) {
|
|
46
|
+
triggers.push(`stage4:more-specific-than-${type} +0.00`);
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
stages,
|
|
50
|
+
triggers,
|
|
51
|
+
...(scored.candidate.validatorPassed !== undefined
|
|
52
|
+
? { validatorPassed: scored.candidate.validatorPassed }
|
|
53
|
+
: {}),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** Assemble the entity a consumer actually receives. */
|
|
57
|
+
export function toDetectedEntity(input) {
|
|
58
|
+
const { candidate } = input.scored;
|
|
59
|
+
return {
|
|
60
|
+
text: candidate.text,
|
|
61
|
+
type: candidate.type,
|
|
62
|
+
start: candidate.start,
|
|
63
|
+
end: candidate.end,
|
|
64
|
+
calibratedConfidence: input.calibratedConfidence,
|
|
65
|
+
explanation: explain(input),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* A one-line reason a candidate was NOT reported.
|
|
70
|
+
*
|
|
71
|
+
* SPEC's explanation requirement covers emitted entities, but the review UI
|
|
72
|
+
* has to answer "why did you miss this?" too, and a suppression with no
|
|
73
|
+
* recorded reason is exactly the failure D18 was written about. Kept in the
|
|
74
|
+
* same module so the two stay consistent.
|
|
75
|
+
*/
|
|
76
|
+
export function explainOmission(scored, decision) {
|
|
77
|
+
if (scored.suppressed) {
|
|
78
|
+
return `suppressed by ${scored.suppressionReason ?? 'an unnamed rule'}`;
|
|
79
|
+
}
|
|
80
|
+
switch (decision?.reason) {
|
|
81
|
+
case 'allowlist':
|
|
82
|
+
return 'on the user allowlist';
|
|
83
|
+
case 'type-out-of-profile':
|
|
84
|
+
return 'entity type is outside the active sensitivity profile';
|
|
85
|
+
case 'below-threshold':
|
|
86
|
+
return 'calibrated confidence below the profile threshold';
|
|
87
|
+
default:
|
|
88
|
+
return 'not reported';
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=explain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explain.js","sourceRoot":"","sources":["../../../src/fuse/explain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAiBH;;;;;;;;GAQG;AACH,MAAM,UAAU,OAAO,CAAC,KAAkB;IACxC,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACzB,MAAM,MAAM,GAAqB,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAE1D,mDAAmD;IACnD,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACnE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAE7B,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9C,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;QAC9D,OAAO,GAAG,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;QACnC,QAAQ,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAC1D,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC,6BAA6B,IAAI,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO;QACL,MAAM;QACN,QAAQ;QACR,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,KAAK,SAAS;YAChD,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE;YACvD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,gBAAgB,CAAC,KAAkB;IACjD,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;IACnC,OAAO;QACL,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,GAAG,EAAE,SAAS,CAAC,GAAG;QAClB,oBAAoB,EAAE,KAAK,CAAC,oBAAoB;QAChD,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC7B,MAA8B,EAC9B,QAA0B;IAE1B,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,iBAAiB,MAAM,CAAC,iBAAiB,IAAI,iBAAiB,EAAE,CAAC;IAC1E,CAAC;IACD,QAAQ,QAAQ,EAAE,MAAM,EAAE,CAAC;QACzB,KAAK,WAAW;YACd,OAAO,uBAAuB,CAAC;QACjC,KAAK,qBAAqB;YACxB,OAAO,uDAAuD,CAAC;QACjE,KAAK,iBAAiB;YACpB,OAAO,mDAAmD,CAAC;QAC7D;YACE,OAAO,cAAc,CAAC;IAC1B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 4 — SENSITIVITY PROFILES, allowlist and denylist.
|
|
3
|
+
*
|
|
4
|
+
* SPEC.md:
|
|
5
|
+
* "Apply the active SENSITIVITY PROFILE, which sets thresholds:
|
|
6
|
+
* Minimal — secrets and financial identifiers only.
|
|
7
|
+
* Balanced — default. Secrets, financial, national IDs, contact details,
|
|
8
|
+
* person names.
|
|
9
|
+
* Strict — adds health data, addresses, dates of birth, organizations,
|
|
10
|
+
* low-confidence candidates.
|
|
11
|
+
* Custom — per-entity-type threshold control."
|
|
12
|
+
* "Apply user allowlist (never mask …) and denylist (always mask …).
|
|
13
|
+
* Denylist beats everything."
|
|
14
|
+
*
|
|
15
|
+
* A profile does two things at once and it is worth separating them: it says
|
|
16
|
+
* WHICH TYPES are in scope, and it says HOW SURE the pipeline must be before
|
|
17
|
+
* reporting one. The second only became meaningful with calibration — before
|
|
18
|
+
* a confidence meant something comparable across types, a threshold was an
|
|
19
|
+
* arbitrary cut. That is why profiles land in the same milestone as the
|
|
20
|
+
* calibration curve rather than earlier.
|
|
21
|
+
*
|
|
22
|
+
* Thresholds are stated as CALIBRATED probabilities, so "0.5" reads as "report
|
|
23
|
+
* this when it is more likely right than wrong" rather than as a detector-local
|
|
24
|
+
* number whose meaning varies by type.
|
|
25
|
+
*/
|
|
26
|
+
import type { EntityType } from '../types.js';
|
|
27
|
+
export type ProfileName = 'minimal' | 'balanced' | 'strict' | 'custom';
|
|
28
|
+
export interface SensitivityProfile {
|
|
29
|
+
readonly name: ProfileName;
|
|
30
|
+
/** Types the profile reports at all. */
|
|
31
|
+
readonly types: ReadonlySet<EntityType>;
|
|
32
|
+
/**
|
|
33
|
+
* Minimum CALIBRATED confidence to report, per type, with a default.
|
|
34
|
+
* Meaningful only because Stage 4 calibrated the scale (D23).
|
|
35
|
+
*/
|
|
36
|
+
readonly threshold: (type: EntityType) => number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The three named profiles.
|
|
40
|
+
*
|
|
41
|
+
* Thresholds differ by INTENT, not by tuning. Minimal exists for a developer
|
|
42
|
+
* who wants surgical protection and would rather miss a weak signal than see
|
|
43
|
+
* a spurious one, so it demands high confidence. Strict exists for someone who
|
|
44
|
+
* would rather over-mask, so it deliberately admits low-confidence candidates
|
|
45
|
+
* — SPEC names "low-confidence candidates" as part of what Strict adds.
|
|
46
|
+
*/
|
|
47
|
+
export declare const PROFILES: Readonly<Record<Exclude<ProfileName, 'custom'>, SensitivityProfile>>;
|
|
48
|
+
/** A user's own additions to whatever profile is active. */
|
|
49
|
+
export interface UserLists {
|
|
50
|
+
/**
|
|
51
|
+
* Never mask these. Matched case- and whitespace-insensitively on the
|
|
52
|
+
* entity's text — a user's own employer name, say.
|
|
53
|
+
*/
|
|
54
|
+
readonly allow?: readonly string[];
|
|
55
|
+
/** Always mask these, whatever the profile or confidence says. */
|
|
56
|
+
readonly deny?: readonly string[];
|
|
57
|
+
}
|
|
58
|
+
export interface ProfileDecision {
|
|
59
|
+
readonly report: boolean;
|
|
60
|
+
/** Why, in one stable token, for the explanation and for tests. */
|
|
61
|
+
readonly reason: 'denylist' | 'allowlist' | 'type-out-of-profile' | 'below-threshold' | 'in-profile';
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Decide whether one entity is reported under a profile.
|
|
65
|
+
*
|
|
66
|
+
* ORDER IS THE WHOLE CONTRACT, and it follows SPEC exactly: "Denylist beats
|
|
67
|
+
* everything." A denylisted value is reported even when its type is out of
|
|
68
|
+
* profile and even when confidence is far below threshold — it is the one
|
|
69
|
+
* override a user can state absolutely. The allowlist is checked next, before
|
|
70
|
+
* type and threshold, so that suppressing a value the user has vouched for
|
|
71
|
+
* does not depend on which profile happens to be active.
|
|
72
|
+
*/
|
|
73
|
+
export declare function decide(entity: {
|
|
74
|
+
readonly type: EntityType;
|
|
75
|
+
readonly text: string;
|
|
76
|
+
readonly calibratedConfidence: number;
|
|
77
|
+
}, profileIn: SensitivityProfile, lists?: UserLists): ProfileDecision;
|
|
78
|
+
/** Build a custom profile from explicit per-type thresholds. */
|
|
79
|
+
export declare function customProfile(thresholds: Partial<Record<EntityType, number>>, defaultThreshold?: number): SensitivityProfile;
|
|
80
|
+
//# sourceMappingURL=profiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../../src/fuse/profiles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AA6CvE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,MAAM,CAAC;CAClD;AAeD;;;;;;;;GAQG;AACH,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,kBAAkB,CAAC,CAezF,CAAC;AAEF,4DAA4D;AAC5D,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,kEAAkE;IAClE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAMD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,mEAAmE;IACnE,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,qBAAqB,GAAG,iBAAiB,GAAG,YAAY,CAAC;CACtG;AAED;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CACpB,MAAM,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAA;CAAE,EACnG,SAAS,EAAE,kBAAkB,EAC7B,KAAK,GAAE,SAAc,GACpB,eAAe,CAgBjB;AAED,gEAAgE;AAChE,wBAAgB,aAAa,CAC3B,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,EAC/C,gBAAgB,SAAM,GACrB,kBAAkB,CAMpB"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 4 — SENSITIVITY PROFILES, allowlist and denylist.
|
|
3
|
+
*
|
|
4
|
+
* SPEC.md:
|
|
5
|
+
* "Apply the active SENSITIVITY PROFILE, which sets thresholds:
|
|
6
|
+
* Minimal — secrets and financial identifiers only.
|
|
7
|
+
* Balanced — default. Secrets, financial, national IDs, contact details,
|
|
8
|
+
* person names.
|
|
9
|
+
* Strict — adds health data, addresses, dates of birth, organizations,
|
|
10
|
+
* low-confidence candidates.
|
|
11
|
+
* Custom — per-entity-type threshold control."
|
|
12
|
+
* "Apply user allowlist (never mask …) and denylist (always mask …).
|
|
13
|
+
* Denylist beats everything."
|
|
14
|
+
*
|
|
15
|
+
* A profile does two things at once and it is worth separating them: it says
|
|
16
|
+
* WHICH TYPES are in scope, and it says HOW SURE the pipeline must be before
|
|
17
|
+
* reporting one. The second only became meaningful with calibration — before
|
|
18
|
+
* a confidence meant something comparable across types, a threshold was an
|
|
19
|
+
* arbitrary cut. That is why profiles land in the same milestone as the
|
|
20
|
+
* calibration curve rather than earlier.
|
|
21
|
+
*
|
|
22
|
+
* Thresholds are stated as CALIBRATED probabilities, so "0.5" reads as "report
|
|
23
|
+
* this when it is more likely right than wrong" rather than as a detector-local
|
|
24
|
+
* number whose meaning varies by type.
|
|
25
|
+
*/
|
|
26
|
+
/** Broad families, used to state the profiles in SPEC's own vocabulary. */
|
|
27
|
+
const SECRETS = [
|
|
28
|
+
'API_KEY',
|
|
29
|
+
'PRIVATE_KEY',
|
|
30
|
+
'JWT',
|
|
31
|
+
'GENERIC_SECRET',
|
|
32
|
+
'CONNECTION_STRING',
|
|
33
|
+
'URL_WITH_CREDENTIALS',
|
|
34
|
+
];
|
|
35
|
+
const FINANCIAL = [
|
|
36
|
+
'CREDIT_CARD',
|
|
37
|
+
'IBAN',
|
|
38
|
+
'SWIFT_BIC',
|
|
39
|
+
'US_ROUTING_NUMBER',
|
|
40
|
+
'UK_SORT_CODE',
|
|
41
|
+
'CA_TRANSIT_NUMBER',
|
|
42
|
+
'AU_BSB',
|
|
43
|
+
'IN_IFSC',
|
|
44
|
+
'BR_AGENCIA',
|
|
45
|
+
'CRYPTO_WALLET',
|
|
46
|
+
'VAT_NUMBER',
|
|
47
|
+
];
|
|
48
|
+
const GOVERNMENT_ID = [
|
|
49
|
+
'NATIONAL_ID',
|
|
50
|
+
'TAX_ID',
|
|
51
|
+
'PASSPORT_MRZ',
|
|
52
|
+
'DRIVERS_LICENSE',
|
|
53
|
+
'VIN',
|
|
54
|
+
'US_NPI',
|
|
55
|
+
];
|
|
56
|
+
const CONTACT = ['EMAIL', 'PHONE', 'IP_ADDRESS', 'MAC_ADDRESS'];
|
|
57
|
+
const LOCATION_TYPES = ['STREET_ADDRESS', 'POSTAL_CODE', 'COORDINATES', 'LOCATION'];
|
|
58
|
+
const HEALTH = ['HEALTH_DATA'];
|
|
59
|
+
const PEOPLE = ['PERSON'];
|
|
60
|
+
const ORGS = ['ORG'];
|
|
61
|
+
const DATES = ['DATE_OF_BIRTH'];
|
|
62
|
+
function profile(name, types, defaultThreshold, overrides = {}) {
|
|
63
|
+
return {
|
|
64
|
+
name,
|
|
65
|
+
types: new Set(types.flat()),
|
|
66
|
+
threshold: (type) => overrides[type] ?? defaultThreshold,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The three named profiles.
|
|
71
|
+
*
|
|
72
|
+
* Thresholds differ by INTENT, not by tuning. Minimal exists for a developer
|
|
73
|
+
* who wants surgical protection and would rather miss a weak signal than see
|
|
74
|
+
* a spurious one, so it demands high confidence. Strict exists for someone who
|
|
75
|
+
* would rather over-mask, so it deliberately admits low-confidence candidates
|
|
76
|
+
* — SPEC names "low-confidence candidates" as part of what Strict adds.
|
|
77
|
+
*/
|
|
78
|
+
export const PROFILES = {
|
|
79
|
+
minimal: profile('minimal', [SECRETS, FINANCIAL], 0.7),
|
|
80
|
+
balanced: profile('balanced', [SECRETS, FINANCIAL, GOVERNMENT_ID, CONTACT, PEOPLE], 0.5, {
|
|
81
|
+
// A leaked credential is unrecoverable, so it is reported on weaker
|
|
82
|
+
// evidence than a name, which the user can dismiss at no cost.
|
|
83
|
+
API_KEY: 0.35,
|
|
84
|
+
PRIVATE_KEY: 0.35,
|
|
85
|
+
CONNECTION_STRING: 0.35,
|
|
86
|
+
}),
|
|
87
|
+
strict: profile('strict', [SECRETS, FINANCIAL, GOVERNMENT_ID, CONTACT, PEOPLE, HEALTH, LOCATION_TYPES, ORGS, DATES], 0.25, { API_KEY: 0.2, PRIVATE_KEY: 0.2, CONNECTION_STRING: 0.2 }),
|
|
88
|
+
};
|
|
89
|
+
function fold(value) {
|
|
90
|
+
return value.trim().toLowerCase().replace(/\s+/g, ' ');
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Decide whether one entity is reported under a profile.
|
|
94
|
+
*
|
|
95
|
+
* ORDER IS THE WHOLE CONTRACT, and it follows SPEC exactly: "Denylist beats
|
|
96
|
+
* everything." A denylisted value is reported even when its type is out of
|
|
97
|
+
* profile and even when confidence is far below threshold — it is the one
|
|
98
|
+
* override a user can state absolutely. The allowlist is checked next, before
|
|
99
|
+
* type and threshold, so that suppressing a value the user has vouched for
|
|
100
|
+
* does not depend on which profile happens to be active.
|
|
101
|
+
*/
|
|
102
|
+
export function decide(entity, profileIn, lists = {}) {
|
|
103
|
+
const text = fold(entity.text);
|
|
104
|
+
if ((lists.deny ?? []).some((d) => fold(d) === text)) {
|
|
105
|
+
return { report: true, reason: 'denylist' };
|
|
106
|
+
}
|
|
107
|
+
if ((lists.allow ?? []).some((a) => fold(a) === text)) {
|
|
108
|
+
return { report: false, reason: 'allowlist' };
|
|
109
|
+
}
|
|
110
|
+
if (!profileIn.types.has(entity.type)) {
|
|
111
|
+
return { report: false, reason: 'type-out-of-profile' };
|
|
112
|
+
}
|
|
113
|
+
if (entity.calibratedConfidence < profileIn.threshold(entity.type)) {
|
|
114
|
+
return { report: false, reason: 'below-threshold' };
|
|
115
|
+
}
|
|
116
|
+
return { report: true, reason: 'in-profile' };
|
|
117
|
+
}
|
|
118
|
+
/** Build a custom profile from explicit per-type thresholds. */
|
|
119
|
+
export function customProfile(thresholds, defaultThreshold = 0.5) {
|
|
120
|
+
return {
|
|
121
|
+
name: 'custom',
|
|
122
|
+
types: new Set(Object.keys(thresholds)),
|
|
123
|
+
threshold: (type) => thresholds[type] ?? defaultThreshold,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../../src/fuse/profiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 4 — OVERLAP RESOLUTION.
|
|
3
|
+
*
|
|
4
|
+
* SPEC.md: "Resolve overlapping candidates: prefer the more specific type,
|
|
5
|
+
* then higher calibrated confidence, then longer span. Never emit overlapping
|
|
6
|
+
* entities."
|
|
7
|
+
*
|
|
8
|
+
* THE SAFETY PROPERTY THAT GOVERNS THIS FILE. Resolution DROPS candidates, so
|
|
9
|
+
* D18 applies to it exactly as it applies to a suppression rule — but it has a
|
|
10
|
+
* failure mode a suppression rule does not. Dropping a WIDE candidate in
|
|
11
|
+
* favour of a narrow one it contains does not merely relabel a span: the
|
|
12
|
+
* characters outside the narrow span stop being masked. A rule that naively
|
|
13
|
+
* "prefers the more specific type" would take CONNECTION_STRING over the
|
|
14
|
+
* credentialled URL containing it and leave the scheme, host and port of a
|
|
15
|
+
* live database URI in the outgoing text.
|
|
16
|
+
*
|
|
17
|
+
* So the ordering here is deliberately NOT SPEC's literal order. It is:
|
|
18
|
+
*
|
|
19
|
+
* 1. WIDEST SPAN first — never reduce masked coverage.
|
|
20
|
+
* 2. then the more specific TYPE, for spans of equal extent.
|
|
21
|
+
* 3. then higher confidence.
|
|
22
|
+
*
|
|
23
|
+
* Coverage is promoted above specificity because coverage is the property
|
|
24
|
+
* that cannot be recovered downstream: a mislabelled span is a cosmetic
|
|
25
|
+
* defect in the review UI, an unmasked one is a leak. Where spans are equal
|
|
26
|
+
* the two orderings agree, which is the case SPEC's wording is really about.
|
|
27
|
+
* `resolveOverlaps` asserts the coverage property on its own output.
|
|
28
|
+
*
|
|
29
|
+
* THE SPECIFICITY ORDER IS MEASURED, NOT ASSUMED. A census over the 2,600
|
|
30
|
+
* document corpus found 66.8% of Stage 1 candidates in at least one cross-type
|
|
31
|
+
* overlap, and for each pair recorded which type ground truth actually agreed
|
|
32
|
+
* with. Every rank below cites that measurement.
|
|
33
|
+
*/
|
|
34
|
+
import type { EntityType } from '../types.js';
|
|
35
|
+
import type { PipelineCandidate } from '../context/types.js';
|
|
36
|
+
/** A candidate with the confidence Stage 3 gave it. */
|
|
37
|
+
export interface ScoredForResolution {
|
|
38
|
+
readonly candidate: PipelineCandidate;
|
|
39
|
+
readonly confidence: number;
|
|
40
|
+
}
|
|
41
|
+
export interface ResolutionResult {
|
|
42
|
+
/** Non-overlapping survivors, in document order. */
|
|
43
|
+
readonly emitted: readonly ScoredForResolution[];
|
|
44
|
+
/** Candidates yielded to a winner, retained so the choice is explainable. */
|
|
45
|
+
readonly dropped: readonly {
|
|
46
|
+
readonly item: ScoredForResolution;
|
|
47
|
+
readonly toType: EntityType;
|
|
48
|
+
}[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Resolve a candidate set into a non-overlapping one.
|
|
52
|
+
*
|
|
53
|
+
* Greedy by the ordering above. Because the widest span is always taken
|
|
54
|
+
* first, any candidate it contains is dropped only after its characters are
|
|
55
|
+
* already covered — which is what makes the coverage property hold rather
|
|
56
|
+
* than merely being hoped for.
|
|
57
|
+
*
|
|
58
|
+
* Non-sensitive candidates (known test values) never displace a sensitive
|
|
59
|
+
* one: they are detected so the eval can assert they were seen, and letting
|
|
60
|
+
* one win an overlap would unmask the value it covers.
|
|
61
|
+
*/
|
|
62
|
+
export declare function resolveOverlaps(items: readonly ScoredForResolution[]): ResolutionResult;
|
|
63
|
+
/**
|
|
64
|
+
* Every character a sensitive candidate covered is still covered.
|
|
65
|
+
*
|
|
66
|
+
* The invariant resolution exists to preserve, exposed so callers and tests
|
|
67
|
+
* can assert it directly rather than trusting the ordering to imply it.
|
|
68
|
+
*/
|
|
69
|
+
export declare function coverageHoles(before: readonly ScoredForResolution[], after: readonly ScoredForResolution[]): {
|
|
70
|
+
readonly start: number;
|
|
71
|
+
readonly end: number;
|
|
72
|
+
}[];
|
|
73
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/fuse/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AA6E7D,uDAAuD;AACvD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,oDAAoD;IACpD,QAAQ,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACjD,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;KAAE,EAAE,CAAC;CAClG;AAUD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,mBAAmB,EAAE,GAAG,gBAAgB,CA6DvF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,mBAAmB,EAAE,EACtC,KAAK,EAAE,SAAS,mBAAmB,EAAE,GACpC;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAmBpD"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 4 — OVERLAP RESOLUTION.
|
|
3
|
+
*
|
|
4
|
+
* SPEC.md: "Resolve overlapping candidates: prefer the more specific type,
|
|
5
|
+
* then higher calibrated confidence, then longer span. Never emit overlapping
|
|
6
|
+
* entities."
|
|
7
|
+
*
|
|
8
|
+
* THE SAFETY PROPERTY THAT GOVERNS THIS FILE. Resolution DROPS candidates, so
|
|
9
|
+
* D18 applies to it exactly as it applies to a suppression rule — but it has a
|
|
10
|
+
* failure mode a suppression rule does not. Dropping a WIDE candidate in
|
|
11
|
+
* favour of a narrow one it contains does not merely relabel a span: the
|
|
12
|
+
* characters outside the narrow span stop being masked. A rule that naively
|
|
13
|
+
* "prefers the more specific type" would take CONNECTION_STRING over the
|
|
14
|
+
* credentialled URL containing it and leave the scheme, host and port of a
|
|
15
|
+
* live database URI in the outgoing text.
|
|
16
|
+
*
|
|
17
|
+
* So the ordering here is deliberately NOT SPEC's literal order. It is:
|
|
18
|
+
*
|
|
19
|
+
* 1. WIDEST SPAN first — never reduce masked coverage.
|
|
20
|
+
* 2. then the more specific TYPE, for spans of equal extent.
|
|
21
|
+
* 3. then higher confidence.
|
|
22
|
+
*
|
|
23
|
+
* Coverage is promoted above specificity because coverage is the property
|
|
24
|
+
* that cannot be recovered downstream: a mislabelled span is a cosmetic
|
|
25
|
+
* defect in the review UI, an unmasked one is a leak. Where spans are equal
|
|
26
|
+
* the two orderings agree, which is the case SPEC's wording is really about.
|
|
27
|
+
* `resolveOverlaps` asserts the coverage property on its own output.
|
|
28
|
+
*
|
|
29
|
+
* THE SPECIFICITY ORDER IS MEASURED, NOT ASSUMED. A census over the 2,600
|
|
30
|
+
* document corpus found 66.8% of Stage 1 candidates in at least one cross-type
|
|
31
|
+
* overlap, and for each pair recorded which type ground truth actually agreed
|
|
32
|
+
* with. Every rank below cites that measurement.
|
|
33
|
+
*/
|
|
34
|
+
/**
|
|
35
|
+
* Type specificity: LOWER wins a tie between spans of equal extent.
|
|
36
|
+
*
|
|
37
|
+
* Derived from the overlap census — the "which type did ground truth agree
|
|
38
|
+
* with" column — not from intuition about which type sounds more precise.
|
|
39
|
+
*/
|
|
40
|
+
const SPECIFICITY = {
|
|
41
|
+
// Self-verifying structure. A valid MRZ or PEM block is what it says it is.
|
|
42
|
+
PASSPORT_MRZ: 0,
|
|
43
|
+
PRIVATE_KEY: 0,
|
|
44
|
+
JWT: 0,
|
|
45
|
+
// A connection string and a credentialled URL claim IDENTICAL spans 140
|
|
46
|
+
// times in the corpus, and ground truth agreed with CONNECTION_STRING in
|
|
47
|
+
// 140 of 140. The DB/queue scheme is the more specific reading of the same
|
|
48
|
+
// characters, exactly as the M7 taxonomy predicted.
|
|
49
|
+
CONNECTION_STRING: 1,
|
|
50
|
+
URL_WITH_CREDENTIALS: 2,
|
|
51
|
+
// Checksum-validated identifiers.
|
|
52
|
+
IBAN: 3,
|
|
53
|
+
CREDIT_CARD: 3,
|
|
54
|
+
CRYPTO_WALLET: 3,
|
|
55
|
+
API_KEY: 3,
|
|
56
|
+
VAT_NUMBER: 3,
|
|
57
|
+
US_NPI: 3,
|
|
58
|
+
VIN: 3,
|
|
59
|
+
SWIFT_BIC: 3,
|
|
60
|
+
US_ROUTING_NUMBER: 3,
|
|
61
|
+
UK_SORT_CODE: 3,
|
|
62
|
+
CA_TRANSIT_NUMBER: 3,
|
|
63
|
+
AU_BSB: 3,
|
|
64
|
+
IN_IFSC: 3,
|
|
65
|
+
BR_AGENCIA: 3,
|
|
66
|
+
// Structured but not self-verifying.
|
|
67
|
+
EMAIL: 4,
|
|
68
|
+
PHONE: 4,
|
|
69
|
+
IP_ADDRESS: 4,
|
|
70
|
+
MAC_ADDRESS: 4,
|
|
71
|
+
COORDINATES: 4,
|
|
72
|
+
STREET_ADDRESS: 4,
|
|
73
|
+
HEALTH_DATA: 5,
|
|
74
|
+
// National and tax identifiers. Deliberately EQUAL: the census found
|
|
75
|
+
// TAX_ID-over-NATIONAL_ID and NATIONAL_ID-over-TAX_ID both occurring on
|
|
76
|
+
// equal spans with ground truth split roughly evenly between them (28/10/10
|
|
77
|
+
// and 19/11/11). No static ordering is honest about that — it is a genuine
|
|
78
|
+
// cross-scheme ambiguity that calibrated confidence has to settle, so they
|
|
79
|
+
// tie here and fall through to the confidence comparison.
|
|
80
|
+
NATIONAL_ID: 6,
|
|
81
|
+
TAX_ID: 6,
|
|
82
|
+
// Named entities: statistical proposals, not validated claims.
|
|
83
|
+
PERSON: 7,
|
|
84
|
+
ORG: 7,
|
|
85
|
+
LOCATION: 7,
|
|
86
|
+
// Shape-only, no validator behind it.
|
|
87
|
+
POSTAL_CODE: 8,
|
|
88
|
+
DRIVERS_LICENSE: 8,
|
|
89
|
+
DATE_OF_BIRTH: 8,
|
|
90
|
+
// Entropy alone. The census is unambiguous: a specific type covering the
|
|
91
|
+
// same characters was right in 2,047 of 2,053 measured overlaps.
|
|
92
|
+
GENERIC_SECRET: 9,
|
|
93
|
+
};
|
|
94
|
+
/** Types absent from the table sort between shape-only and generic. */
|
|
95
|
+
const DEFAULT_SPECIFICITY = 8;
|
|
96
|
+
function specificityOf(type) {
|
|
97
|
+
return SPECIFICITY[type] ?? DEFAULT_SPECIFICITY;
|
|
98
|
+
}
|
|
99
|
+
function overlaps(a, b) {
|
|
100
|
+
return a.start < b.end && b.start < a.end;
|
|
101
|
+
}
|
|
102
|
+
function width(item) {
|
|
103
|
+
return item.candidate.end - item.candidate.start;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Resolve a candidate set into a non-overlapping one.
|
|
107
|
+
*
|
|
108
|
+
* Greedy by the ordering above. Because the widest span is always taken
|
|
109
|
+
* first, any candidate it contains is dropped only after its characters are
|
|
110
|
+
* already covered — which is what makes the coverage property hold rather
|
|
111
|
+
* than merely being hoped for.
|
|
112
|
+
*
|
|
113
|
+
* Non-sensitive candidates (known test values) never displace a sensitive
|
|
114
|
+
* one: they are detected so the eval can assert they were seen, and letting
|
|
115
|
+
* one win an overlap would unmask the value it covers.
|
|
116
|
+
*/
|
|
117
|
+
export function resolveOverlaps(items) {
|
|
118
|
+
const ordered = [...items].sort((a, b) => {
|
|
119
|
+
// Sensitive first: a non-sensitive candidate must never displace one that
|
|
120
|
+
// would otherwise be masked.
|
|
121
|
+
if (a.candidate.sensitive !== b.candidate.sensitive)
|
|
122
|
+
return a.candidate.sensitive ? -1 : 1;
|
|
123
|
+
const byWidth = width(b) - width(a);
|
|
124
|
+
if (byWidth !== 0)
|
|
125
|
+
return byWidth;
|
|
126
|
+
const bySpecificity = specificityOf(a.candidate.type) - specificityOf(b.candidate.type);
|
|
127
|
+
if (bySpecificity !== 0)
|
|
128
|
+
return bySpecificity;
|
|
129
|
+
const byConfidence = b.confidence - a.confidence;
|
|
130
|
+
if (byConfidence !== 0)
|
|
131
|
+
return byConfidence;
|
|
132
|
+
// Total order, so the result cannot depend on input order.
|
|
133
|
+
return a.candidate.start - b.candidate.start || a.candidate.detectorId.localeCompare(b.candidate.detectorId);
|
|
134
|
+
});
|
|
135
|
+
const emitted = [];
|
|
136
|
+
const dropped = [];
|
|
137
|
+
for (const item of ordered) {
|
|
138
|
+
const at = emitted.findIndex((kept) => overlaps(kept.candidate, item.candidate));
|
|
139
|
+
if (at === -1) {
|
|
140
|
+
emitted.push(item);
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const winner = emitted[at];
|
|
144
|
+
const contained = winner.candidate.start <= item.candidate.start && item.candidate.end <= winner.candidate.end;
|
|
145
|
+
// CONTAINED: the winner already covers every character, so dropping the
|
|
146
|
+
// loser costs nothing but a label.
|
|
147
|
+
if (contained || !item.candidate.sensitive) {
|
|
148
|
+
dropped.push({ item, toType: winner.candidate.type });
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
// PARTIAL: the loser extends beyond the winner, so dropping it would
|
|
152
|
+
// leave the overhang unmasked. Measured on the corpus, this is rare (8
|
|
153
|
+
// spans in 2,600 documents, every one a Korean street address abutting
|
|
154
|
+
// another entity) but it is a leak, not a mislabelling. The winner
|
|
155
|
+
// absorbs the union instead.
|
|
156
|
+
//
|
|
157
|
+
// Widening in BOTH coordinate spaces is sound without re-consulting the
|
|
158
|
+
// offset map: the map is monotonic, so the union of two mapped spans
|
|
159
|
+
// contains the mapping of the union, and erring wider only ever masks
|
|
160
|
+
// more.
|
|
161
|
+
emitted[at] = {
|
|
162
|
+
...winner,
|
|
163
|
+
candidate: {
|
|
164
|
+
...winner.candidate,
|
|
165
|
+
start: Math.min(winner.candidate.start, item.candidate.start),
|
|
166
|
+
end: Math.max(winner.candidate.end, item.candidate.end),
|
|
167
|
+
originalStart: Math.min(winner.candidate.originalStart, item.candidate.originalStart),
|
|
168
|
+
originalEnd: Math.max(winner.candidate.originalEnd, item.candidate.originalEnd),
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
dropped.push({ item, toType: winner.candidate.type });
|
|
172
|
+
}
|
|
173
|
+
emitted.sort((a, b) => a.candidate.start - b.candidate.start);
|
|
174
|
+
return { emitted, dropped };
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Every character a sensitive candidate covered is still covered.
|
|
178
|
+
*
|
|
179
|
+
* The invariant resolution exists to preserve, exposed so callers and tests
|
|
180
|
+
* can assert it directly rather than trusting the ordering to imply it.
|
|
181
|
+
*/
|
|
182
|
+
export function coverageHoles(before, after) {
|
|
183
|
+
const covered = after
|
|
184
|
+
.filter((i) => i.candidate.sensitive)
|
|
185
|
+
.map((i) => ({ start: i.candidate.start, end: i.candidate.end }))
|
|
186
|
+
.sort((a, b) => a.start - b.start);
|
|
187
|
+
const holes = [];
|
|
188
|
+
for (const item of before) {
|
|
189
|
+
if (!item.candidate.sensitive)
|
|
190
|
+
continue;
|
|
191
|
+
let cursor = item.candidate.start;
|
|
192
|
+
for (const span of covered) {
|
|
193
|
+
if (span.end <= cursor)
|
|
194
|
+
continue;
|
|
195
|
+
if (span.start > cursor)
|
|
196
|
+
break;
|
|
197
|
+
cursor = Math.max(cursor, span.end);
|
|
198
|
+
if (cursor >= item.candidate.end)
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
if (cursor < item.candidate.end)
|
|
202
|
+
holes.push({ start: cursor, end: item.candidate.end });
|
|
203
|
+
}
|
|
204
|
+
return holes;
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/fuse/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 2b — GAZETTEER lookup.
|
|
3
|
+
*
|
|
4
|
+
* SPEC.md: "Bundled compressed lookup sets, checked in parallel with the
|
|
5
|
+
* model … Gazetteer hit alone is medium confidence; gazetteer plus model
|
|
6
|
+
* agreement is high."
|
|
7
|
+
*
|
|
8
|
+
* The bundled sets are Bloom filters (see `@discretion/data`'s
|
|
9
|
+
* gazetteers.ts for why). Two consequences shape this module:
|
|
10
|
+
*
|
|
11
|
+
* • A filter can report a false POSITIVE and never a false negative. So a
|
|
12
|
+
* hit is corroboration, never proof — which is exactly the weight SPEC.md
|
|
13
|
+
* assigns it — while a miss is conclusive.
|
|
14
|
+
* • The hash here must match the builder's byte for byte, so it is written
|
|
15
|
+
* out explicitly rather than pulled from a library that might change.
|
|
16
|
+
*/
|
|
17
|
+
import type { EntityType } from '../types.js';
|
|
18
|
+
/** Entity types a gazetteer can speak to. */
|
|
19
|
+
export type GazetteerType = 'PERSON' | 'ORG' | 'LOCATION';
|
|
20
|
+
export declare function isGazetteerType(type: EntityType): type is GazetteerType;
|
|
21
|
+
/** How a value matched the gazetteer. */
|
|
22
|
+
export interface GazetteerHit {
|
|
23
|
+
readonly type: GazetteerType;
|
|
24
|
+
/** True when the whole value matched, rather than one of its words. */
|
|
25
|
+
readonly whole: boolean;
|
|
26
|
+
/** Number of the value's words that matched, for multi-word names. */
|
|
27
|
+
readonly matchedWords: number;
|
|
28
|
+
readonly totalWords: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Look a value up as `type`.
|
|
32
|
+
*
|
|
33
|
+
* A person's full name is rarely a single gazetteer entry — the sets hold
|
|
34
|
+
* given names and family names separately — so a multi-word value is checked
|
|
35
|
+
* whole first, then word by word. `matchedWords` lets the caller weigh
|
|
36
|
+
* "every word is a known name" differently from "one word out of four is".
|
|
37
|
+
*/
|
|
38
|
+
export declare function lookupGazetteer(value: string, type: GazetteerType): GazetteerHit | undefined;
|
|
39
|
+
/** Entry counts per set, for reporting and for BENCHMARKS.md. */
|
|
40
|
+
export declare function gazetteerSizes(): Readonly<Record<GazetteerType, number>>;
|
|
41
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/gazetteer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,6CAA6C;AAC7C,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,KAAK,GAAG,UAAU,CAAC;AAI1D,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,IAAI,aAAa,CAEvE;AAkED,yCAAyC;AACzC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAKD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,YAAY,GAAG,SAAS,CAe5F;AAED,iEAAiE;AACjE,wBAAgB,cAAc,IAAI,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAMxE"}
|