@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.
Files changed (885) hide show
  1. package/CHANGELOG.md +117 -0
  2. package/LICENSE +21 -0
  3. package/README.md +319 -0
  4. package/dist/src/checksums/aba.d.ts +25 -0
  5. package/dist/src/checksums/aba.d.ts.map +1 -0
  6. package/dist/src/checksums/aba.js +47 -0
  7. package/dist/src/checksums/aba.js.map +1 -0
  8. package/dist/src/checksums/digits.d.ts +55 -0
  9. package/dist/src/checksums/digits.d.ts.map +1 -0
  10. package/dist/src/checksums/digits.js +114 -0
  11. package/dist/src/checksums/digits.js.map +1 -0
  12. package/dist/src/checksums/icao9303.d.ts +29 -0
  13. package/dist/src/checksums/icao9303.d.ts.map +1 -0
  14. package/dist/src/checksums/icao9303.js +56 -0
  15. package/dist/src/checksums/icao9303.js.map +1 -0
  16. package/dist/src/checksums/index.d.ts +21 -0
  17. package/dist/src/checksums/index.d.ts.map +1 -0
  18. package/dist/src/checksums/index.js +21 -0
  19. package/dist/src/checksums/index.js.map +1 -0
  20. package/dist/src/checksums/iso7064.d.ts +67 -0
  21. package/dist/src/checksums/iso7064.d.ts.map +1 -0
  22. package/dist/src/checksums/iso7064.js +159 -0
  23. package/dist/src/checksums/iso7064.js.map +1 -0
  24. package/dist/src/checksums/luhn.d.ts +32 -0
  25. package/dist/src/checksums/luhn.d.ts.map +1 -0
  26. package/dist/src/checksums/luhn.js +66 -0
  27. package/dist/src/checksums/luhn.js.map +1 -0
  28. package/dist/src/checksums/mod97.d.ts +55 -0
  29. package/dist/src/checksums/mod97.d.ts.map +1 -0
  30. package/dist/src/checksums/mod97.js +94 -0
  31. package/dist/src/checksums/mod97.js.map +1 -0
  32. package/dist/src/checksums/verhoeff.d.ts +28 -0
  33. package/dist/src/checksums/verhoeff.d.ts.map +1 -0
  34. package/dist/src/checksums/verhoeff.js +80 -0
  35. package/dist/src/checksums/verhoeff.js.map +1 -0
  36. package/dist/src/checksums/weighted.d.ts +64 -0
  37. package/dist/src/checksums/weighted.d.ts.map +1 -0
  38. package/dist/src/checksums/weighted.js +97 -0
  39. package/dist/src/checksums/weighted.js.map +1 -0
  40. package/dist/src/context/documentProfile.d.ts +34 -0
  41. package/dist/src/context/documentProfile.d.ts.map +1 -0
  42. package/dist/src/context/documentProfile.js +253 -0
  43. package/dist/src/context/documentProfile.js.map +1 -0
  44. package/dist/src/context/negativeRules.d.ts +60 -0
  45. package/dist/src/context/negativeRules.d.ts.map +1 -0
  46. package/dist/src/context/negativeRules.js +696 -0
  47. package/dist/src/context/negativeRules.js.map +1 -0
  48. package/dist/src/context/score.d.ts +52 -0
  49. package/dist/src/context/score.d.ts.map +1 -0
  50. package/dist/src/context/score.js +346 -0
  51. package/dist/src/context/score.js.map +1 -0
  52. package/dist/src/context/structure.d.ts +46 -0
  53. package/dist/src/context/structure.d.ts.map +1 -0
  54. package/dist/src/context/structure.js +528 -0
  55. package/dist/src/context/structure.js.map +1 -0
  56. package/dist/src/context/triggers.d.ts +73 -0
  57. package/dist/src/context/triggers.d.ts.map +1 -0
  58. package/dist/src/context/triggers.js +172 -0
  59. package/dist/src/context/triggers.js.map +1 -0
  60. package/dist/src/context/types.d.ts +137 -0
  61. package/dist/src/context/types.d.ts.map +1 -0
  62. package/dist/src/context/types.js +25 -0
  63. package/dist/src/context/types.js.map +1 -0
  64. package/dist/src/crypto/keccak256.d.ts +15 -0
  65. package/dist/src/crypto/keccak256.d.ts.map +1 -0
  66. package/dist/src/crypto/keccak256.js +89 -0
  67. package/dist/src/crypto/keccak256.js.map +1 -0
  68. package/dist/src/crypto/sha256.d.ts +16 -0
  69. package/dist/src/crypto/sha256.d.ts.map +1 -0
  70. package/dist/src/crypto/sha256.js +81 -0
  71. package/dist/src/crypto/sha256.js.map +1 -0
  72. package/dist/src/detect/detectors/bankcodes/auBsb.d.ts +11 -0
  73. package/dist/src/detect/detectors/bankcodes/auBsb.d.ts.map +1 -0
  74. package/dist/src/detect/detectors/bankcodes/auBsb.js +34 -0
  75. package/dist/src/detect/detectors/bankcodes/auBsb.js.map +1 -0
  76. package/dist/src/detect/detectors/bankcodes/brAgencia.d.ts +15 -0
  77. package/dist/src/detect/detectors/bankcodes/brAgencia.d.ts.map +1 -0
  78. package/dist/src/detect/detectors/bankcodes/brAgencia.js +43 -0
  79. package/dist/src/detect/detectors/bankcodes/brAgencia.js.map +1 -0
  80. package/dist/src/detect/detectors/bankcodes/caTransit.d.ts +13 -0
  81. package/dist/src/detect/detectors/bankcodes/caTransit.d.ts.map +1 -0
  82. package/dist/src/detect/detectors/bankcodes/caTransit.js +86 -0
  83. package/dist/src/detect/detectors/bankcodes/caTransit.js.map +1 -0
  84. package/dist/src/detect/detectors/bankcodes/inIfsc.d.ts +13 -0
  85. package/dist/src/detect/detectors/bankcodes/inIfsc.d.ts.map +1 -0
  86. package/dist/src/detect/detectors/bankcodes/inIfsc.js +37 -0
  87. package/dist/src/detect/detectors/bankcodes/inIfsc.js.map +1 -0
  88. package/dist/src/detect/detectors/bankcodes/index.d.ts +10 -0
  89. package/dist/src/detect/detectors/bankcodes/index.d.ts.map +1 -0
  90. package/dist/src/detect/detectors/bankcodes/index.js +10 -0
  91. package/dist/src/detect/detectors/bankcodes/index.js.map +1 -0
  92. package/dist/src/detect/detectors/bankcodes/ukSortCode.d.ts +13 -0
  93. package/dist/src/detect/detectors/bankcodes/ukSortCode.d.ts.map +1 -0
  94. package/dist/src/detect/detectors/bankcodes/ukSortCode.js +36 -0
  95. package/dist/src/detect/detectors/bankcodes/ukSortCode.js.map +1 -0
  96. package/dist/src/detect/detectors/bankcodes/usRouting.d.ts +12 -0
  97. package/dist/src/detect/detectors/bankcodes/usRouting.d.ts.map +1 -0
  98. package/dist/src/detect/detectors/bankcodes/usRouting.js +45 -0
  99. package/dist/src/detect/detectors/bankcodes/usRouting.js.map +1 -0
  100. package/dist/src/detect/detectors/contact/email.d.ts +16 -0
  101. package/dist/src/detect/detectors/contact/email.d.ts.map +1 -0
  102. package/dist/src/detect/detectors/contact/email.js +111 -0
  103. package/dist/src/detect/detectors/contact/email.js.map +1 -0
  104. package/dist/src/detect/detectors/contact/index.d.ts +11 -0
  105. package/dist/src/detect/detectors/contact/index.d.ts.map +1 -0
  106. package/dist/src/detect/detectors/contact/index.js +11 -0
  107. package/dist/src/detect/detectors/contact/index.js.map +1 -0
  108. package/dist/src/detect/detectors/contact/ipv4.d.ts +12 -0
  109. package/dist/src/detect/detectors/contact/ipv4.d.ts.map +1 -0
  110. package/dist/src/detect/detectors/contact/ipv4.js +109 -0
  111. package/dist/src/detect/detectors/contact/ipv4.js.map +1 -0
  112. package/dist/src/detect/detectors/contact/ipv6.d.ts +16 -0
  113. package/dist/src/detect/detectors/contact/ipv6.d.ts.map +1 -0
  114. package/dist/src/detect/detectors/contact/ipv6.js +187 -0
  115. package/dist/src/detect/detectors/contact/ipv6.js.map +1 -0
  116. package/dist/src/detect/detectors/contact/mac.d.ts +14 -0
  117. package/dist/src/detect/detectors/contact/mac.d.ts.map +1 -0
  118. package/dist/src/detect/detectors/contact/mac.js +64 -0
  119. package/dist/src/detect/detectors/contact/mac.js.map +1 -0
  120. package/dist/src/detect/detectors/contact/phone.d.ts +21 -0
  121. package/dist/src/detect/detectors/contact/phone.d.ts.map +1 -0
  122. package/dist/src/detect/detectors/contact/phone.js +76 -0
  123. package/dist/src/detect/detectors/contact/phone.js.map +1 -0
  124. package/dist/src/detect/detectors/contact/urlCredentials.d.ts +23 -0
  125. package/dist/src/detect/detectors/contact/urlCredentials.d.ts.map +1 -0
  126. package/dist/src/detect/detectors/contact/urlCredentials.js +123 -0
  127. package/dist/src/detect/detectors/contact/urlCredentials.js.map +1 -0
  128. package/dist/src/detect/detectors/crypto/ada.d.ts +13 -0
  129. package/dist/src/detect/detectors/crypto/ada.d.ts.map +1 -0
  130. package/dist/src/detect/detectors/crypto/ada.js +51 -0
  131. package/dist/src/detect/detectors/crypto/ada.js.map +1 -0
  132. package/dist/src/detect/detectors/crypto/btc.d.ts +15 -0
  133. package/dist/src/detect/detectors/crypto/btc.d.ts.map +1 -0
  134. package/dist/src/detect/detectors/crypto/btc.js +78 -0
  135. package/dist/src/detect/detectors/crypto/btc.js.map +1 -0
  136. package/dist/src/detect/detectors/crypto/dot.d.ts +13 -0
  137. package/dist/src/detect/detectors/crypto/dot.d.ts.map +1 -0
  138. package/dist/src/detect/detectors/crypto/dot.js +41 -0
  139. package/dist/src/detect/detectors/crypto/dot.js.map +1 -0
  140. package/dist/src/detect/detectors/crypto/eth.d.ts +15 -0
  141. package/dist/src/detect/detectors/crypto/eth.d.ts.map +1 -0
  142. package/dist/src/detect/detectors/crypto/eth.js +63 -0
  143. package/dist/src/detect/detectors/crypto/eth.js.map +1 -0
  144. package/dist/src/detect/detectors/crypto/index.d.ts +12 -0
  145. package/dist/src/detect/detectors/crypto/index.d.ts.map +1 -0
  146. package/dist/src/detect/detectors/crypto/index.js +12 -0
  147. package/dist/src/detect/detectors/crypto/index.js.map +1 -0
  148. package/dist/src/detect/detectors/crypto/ltc.d.ts +12 -0
  149. package/dist/src/detect/detectors/crypto/ltc.d.ts.map +1 -0
  150. package/dist/src/detect/detectors/crypto/ltc.js +71 -0
  151. package/dist/src/detect/detectors/crypto/ltc.js.map +1 -0
  152. package/dist/src/detect/detectors/crypto/sol.d.ts +13 -0
  153. package/dist/src/detect/detectors/crypto/sol.d.ts.map +1 -0
  154. package/dist/src/detect/detectors/crypto/sol.js +39 -0
  155. package/dist/src/detect/detectors/crypto/sol.js.map +1 -0
  156. package/dist/src/detect/detectors/crypto/trx.d.ts +8 -0
  157. package/dist/src/detect/detectors/crypto/trx.d.ts.map +1 -0
  158. package/dist/src/detect/detectors/crypto/trx.js +34 -0
  159. package/dist/src/detect/detectors/crypto/trx.js.map +1 -0
  160. package/dist/src/detect/detectors/crypto/xmr.d.ts +10 -0
  161. package/dist/src/detect/detectors/crypto/xmr.d.ts.map +1 -0
  162. package/dist/src/detect/detectors/crypto/xmr.js +51 -0
  163. package/dist/src/detect/detectors/crypto/xmr.js.map +1 -0
  164. package/dist/src/detect/detectors/documents/driversLicense.d.ts +24 -0
  165. package/dist/src/detect/detectors/documents/driversLicense.d.ts.map +1 -0
  166. package/dist/src/detect/detectors/documents/driversLicense.js +79 -0
  167. package/dist/src/detect/detectors/documents/driversLicense.js.map +1 -0
  168. package/dist/src/detect/detectors/documents/healthData.d.ts +23 -0
  169. package/dist/src/detect/detectors/documents/healthData.d.ts.map +1 -0
  170. package/dist/src/detect/detectors/documents/healthData.js +78 -0
  171. package/dist/src/detect/detectors/documents/healthData.js.map +1 -0
  172. package/dist/src/detect/detectors/documents/index.d.ts +9 -0
  173. package/dist/src/detect/detectors/documents/index.d.ts.map +1 -0
  174. package/dist/src/detect/detectors/documents/index.js +9 -0
  175. package/dist/src/detect/detectors/documents/index.js.map +1 -0
  176. package/dist/src/detect/detectors/documents/passportMrz.d.ts +20 -0
  177. package/dist/src/detect/detectors/documents/passportMrz.d.ts.map +1 -0
  178. package/dist/src/detect/detectors/documents/passportMrz.js +194 -0
  179. package/dist/src/detect/detectors/documents/passportMrz.js.map +1 -0
  180. package/dist/src/detect/detectors/documents/usNpi.d.ts +16 -0
  181. package/dist/src/detect/detectors/documents/usNpi.d.ts.map +1 -0
  182. package/dist/src/detect/detectors/documents/usNpi.js +48 -0
  183. package/dist/src/detect/detectors/documents/usNpi.js.map +1 -0
  184. package/dist/src/detect/detectors/documents/vin.d.ts +15 -0
  185. package/dist/src/detect/detectors/documents/vin.d.ts.map +1 -0
  186. package/dist/src/detect/detectors/documents/vin.js +64 -0
  187. package/dist/src/detect/detectors/documents/vin.js.map +1 -0
  188. package/dist/src/detect/detectors/financial/creditCard.d.ts +23 -0
  189. package/dist/src/detect/detectors/financial/creditCard.d.ts.map +1 -0
  190. package/dist/src/detect/detectors/financial/creditCard.js +157 -0
  191. package/dist/src/detect/detectors/financial/creditCard.js.map +1 -0
  192. package/dist/src/detect/detectors/financial/iban.d.ts +18 -0
  193. package/dist/src/detect/detectors/financial/iban.d.ts.map +1 -0
  194. package/dist/src/detect/detectors/financial/iban.js +80 -0
  195. package/dist/src/detect/detectors/financial/iban.js.map +1 -0
  196. package/dist/src/detect/detectors/financial/ibanRegistry.d.ts +35 -0
  197. package/dist/src/detect/detectors/financial/ibanRegistry.d.ts.map +1 -0
  198. package/dist/src/detect/detectors/financial/ibanRegistry.js +92 -0
  199. package/dist/src/detect/detectors/financial/ibanRegistry.js.map +1 -0
  200. package/dist/src/detect/detectors/financial/index.d.ts +7 -0
  201. package/dist/src/detect/detectors/financial/index.d.ts.map +1 -0
  202. package/dist/src/detect/detectors/financial/index.js +7 -0
  203. package/dist/src/detect/detectors/financial/index.js.map +1 -0
  204. package/dist/src/detect/detectors/financial/swiftBic.d.ts +17 -0
  205. package/dist/src/detect/detectors/financial/swiftBic.d.ts.map +1 -0
  206. package/dist/src/detect/detectors/financial/swiftBic.js +55 -0
  207. package/dist/src/detect/detectors/financial/swiftBic.js.map +1 -0
  208. package/dist/src/detect/detectors/index.d.ts +15 -0
  209. package/dist/src/detect/detectors/index.d.ts.map +1 -0
  210. package/dist/src/detect/detectors/index.js +15 -0
  211. package/dist/src/detect/detectors/index.js.map +1 -0
  212. package/dist/src/detect/detectors/location/coordinates.d.ts +14 -0
  213. package/dist/src/detect/detectors/location/coordinates.d.ts.map +1 -0
  214. package/dist/src/detect/detectors/location/coordinates.js +79 -0
  215. package/dist/src/detect/detectors/location/coordinates.js.map +1 -0
  216. package/dist/src/detect/detectors/location/index.d.ts +7 -0
  217. package/dist/src/detect/detectors/location/index.d.ts.map +1 -0
  218. package/dist/src/detect/detectors/location/index.js +7 -0
  219. package/dist/src/detect/detectors/location/index.js.map +1 -0
  220. package/dist/src/detect/detectors/location/postalCode.d.ts +13 -0
  221. package/dist/src/detect/detectors/location/postalCode.d.ts.map +1 -0
  222. package/dist/src/detect/detectors/location/postalCode.js +53 -0
  223. package/dist/src/detect/detectors/location/postalCode.js.map +1 -0
  224. package/dist/src/detect/detectors/location/postalRegistry.d.ts +19 -0
  225. package/dist/src/detect/detectors/location/postalRegistry.d.ts.map +1 -0
  226. package/dist/src/detect/detectors/location/postalRegistry.js +73 -0
  227. package/dist/src/detect/detectors/location/postalRegistry.js.map +1 -0
  228. package/dist/src/detect/detectors/location/streetAddress.d.ts +21 -0
  229. package/dist/src/detect/detectors/location/streetAddress.d.ts.map +1 -0
  230. package/dist/src/detect/detectors/location/streetAddress.js +70 -0
  231. package/dist/src/detect/detectors/location/streetAddress.js.map +1 -0
  232. package/dist/src/detect/detectors/natid/africa.d.ts +17 -0
  233. package/dist/src/detect/detectors/natid/africa.d.ts.map +1 -0
  234. package/dist/src/detect/detectors/natid/africa.js +106 -0
  235. package/dist/src/detect/detectors/natid/africa.js.map +1 -0
  236. package/dist/src/detect/detectors/natid/ar.d.ts +14 -0
  237. package/dist/src/detect/detectors/natid/ar.d.ts.map +1 -0
  238. package/dist/src/detect/detectors/natid/ar.js +62 -0
  239. package/dist/src/detect/detectors/natid/ar.js.map +1 -0
  240. package/dist/src/detect/detectors/natid/au.d.ts +13 -0
  241. package/dist/src/detect/detectors/natid/au.d.ts.map +1 -0
  242. package/dist/src/detect/detectors/natid/au.js +100 -0
  243. package/dist/src/detect/detectors/natid/au.js.map +1 -0
  244. package/dist/src/detect/detectors/natid/be.d.ts +8 -0
  245. package/dist/src/detect/detectors/natid/be.d.ts.map +1 -0
  246. package/dist/src/detect/detectors/natid/be.js +44 -0
  247. package/dist/src/detect/detectors/natid/be.js.map +1 -0
  248. package/dist/src/detect/detectors/natid/bg.d.ts +7 -0
  249. package/dist/src/detect/detectors/natid/bg.d.ts.map +1 -0
  250. package/dist/src/detect/detectors/natid/bg.js +44 -0
  251. package/dist/src/detect/detectors/natid/bg.js.map +1 -0
  252. package/dist/src/detect/detectors/natid/br.d.ts +8 -0
  253. package/dist/src/detect/detectors/natid/br.d.ts.map +1 -0
  254. package/dist/src/detect/detectors/natid/br.js +85 -0
  255. package/dist/src/detect/detectors/natid/br.js.map +1 -0
  256. package/dist/src/detect/detectors/natid/ca.d.ts +8 -0
  257. package/dist/src/detect/detectors/natid/ca.d.ts.map +1 -0
  258. package/dist/src/detect/detectors/natid/ca.js +41 -0
  259. package/dist/src/detect/detectors/natid/ca.js.map +1 -0
  260. package/dist/src/detect/detectors/natid/cl.d.ts +9 -0
  261. package/dist/src/detect/detectors/natid/cl.d.ts.map +1 -0
  262. package/dist/src/detect/detectors/natid/cl.js +47 -0
  263. package/dist/src/detect/detectors/natid/cl.js.map +1 -0
  264. package/dist/src/detect/detectors/natid/cn.d.ts +9 -0
  265. package/dist/src/detect/detectors/natid/cn.d.ts.map +1 -0
  266. package/dist/src/detect/detectors/natid/cn.js +49 -0
  267. package/dist/src/detect/detectors/natid/cn.js.map +1 -0
  268. package/dist/src/detect/detectors/natid/co.d.ts +10 -0
  269. package/dist/src/detect/detectors/natid/co.d.ts.map +1 -0
  270. package/dist/src/detect/detectors/natid/co.js +43 -0
  271. package/dist/src/detect/detectors/natid/co.js.map +1 -0
  272. package/dist/src/detect/detectors/natid/cz.d.ts +11 -0
  273. package/dist/src/detect/detectors/natid/cz.d.ts.map +1 -0
  274. package/dist/src/detect/detectors/natid/cz.js +44 -0
  275. package/dist/src/detect/detectors/natid/cz.js.map +1 -0
  276. package/dist/src/detect/detectors/natid/de.d.ts +16 -0
  277. package/dist/src/detect/detectors/natid/de.d.ts.map +1 -0
  278. package/dist/src/detect/detectors/natid/de.js +77 -0
  279. package/dist/src/detect/detectors/natid/de.js.map +1 -0
  280. package/dist/src/detect/detectors/natid/dk.d.ts +9 -0
  281. package/dist/src/detect/detectors/natid/dk.d.ts.map +1 -0
  282. package/dist/src/detect/detectors/natid/dk.js +31 -0
  283. package/dist/src/detect/detectors/natid/dk.js.map +1 -0
  284. package/dist/src/detect/detectors/natid/es.d.ts +12 -0
  285. package/dist/src/detect/detectors/natid/es.d.ts.map +1 -0
  286. package/dist/src/detect/detectors/natid/es.js +96 -0
  287. package/dist/src/detect/detectors/natid/es.js.map +1 -0
  288. package/dist/src/detect/detectors/natid/fi.d.ts +10 -0
  289. package/dist/src/detect/detectors/natid/fi.d.ts.map +1 -0
  290. package/dist/src/detect/detectors/natid/fi.js +40 -0
  291. package/dist/src/detect/detectors/natid/fi.js.map +1 -0
  292. package/dist/src/detect/detectors/natid/fr.d.ts +12 -0
  293. package/dist/src/detect/detectors/natid/fr.d.ts.map +1 -0
  294. package/dist/src/detect/detectors/natid/fr.js +61 -0
  295. package/dist/src/detect/detectors/natid/fr.js.map +1 -0
  296. package/dist/src/detect/detectors/natid/gb.d.ts +10 -0
  297. package/dist/src/detect/detectors/natid/gb.d.ts.map +1 -0
  298. package/dist/src/detect/detectors/natid/gb.js +72 -0
  299. package/dist/src/detect/detectors/natid/gb.js.map +1 -0
  300. package/dist/src/detect/detectors/natid/gr.d.ts +7 -0
  301. package/dist/src/detect/detectors/natid/gr.d.ts.map +1 -0
  302. package/dist/src/detect/detectors/natid/gr.js +36 -0
  303. package/dist/src/detect/detectors/natid/gr.js.map +1 -0
  304. package/dist/src/detect/detectors/natid/gulf.d.ts +16 -0
  305. package/dist/src/detect/detectors/natid/gulf.d.ts.map +1 -0
  306. package/dist/src/detect/detectors/natid/gulf.js +121 -0
  307. package/dist/src/detect/detectors/natid/gulf.js.map +1 -0
  308. package/dist/src/detect/detectors/natid/hk.d.ts +9 -0
  309. package/dist/src/detect/detectors/natid/hk.d.ts.map +1 -0
  310. package/dist/src/detect/detectors/natid/hk.js +41 -0
  311. package/dist/src/detect/detectors/natid/hk.js.map +1 -0
  312. package/dist/src/detect/detectors/natid/hr.d.ts +6 -0
  313. package/dist/src/detect/detectors/natid/hr.d.ts.map +1 -0
  314. package/dist/src/detect/detectors/natid/hr.js +32 -0
  315. package/dist/src/detect/detectors/natid/hr.js.map +1 -0
  316. package/dist/src/detect/detectors/natid/hu.d.ts +7 -0
  317. package/dist/src/detect/detectors/natid/hu.d.ts.map +1 -0
  318. package/dist/src/detect/detectors/natid/hu.js +37 -0
  319. package/dist/src/detect/detectors/natid/hu.js.map +1 -0
  320. package/dist/src/detect/detectors/natid/ie.d.ts +9 -0
  321. package/dist/src/detect/detectors/natid/ie.d.ts.map +1 -0
  322. package/dist/src/detect/detectors/natid/ie.js +36 -0
  323. package/dist/src/detect/detectors/natid/ie.js.map +1 -0
  324. package/dist/src/detect/detectors/natid/il.d.ts +10 -0
  325. package/dist/src/detect/detectors/natid/il.d.ts.map +1 -0
  326. package/dist/src/detect/detectors/natid/il.js +38 -0
  327. package/dist/src/detect/detectors/natid/il.js.map +1 -0
  328. package/dist/src/detect/detectors/natid/in.d.ts +17 -0
  329. package/dist/src/detect/detectors/natid/in.d.ts.map +1 -0
  330. package/dist/src/detect/detectors/natid/in.js +67 -0
  331. package/dist/src/detect/detectors/natid/in.js.map +1 -0
  332. package/dist/src/detect/detectors/natid/index.d.ts +55 -0
  333. package/dist/src/detect/detectors/natid/index.d.ts.map +1 -0
  334. package/dist/src/detect/detectors/natid/index.js +55 -0
  335. package/dist/src/detect/detectors/natid/index.js.map +1 -0
  336. package/dist/src/detect/detectors/natid/is.d.ts +8 -0
  337. package/dist/src/detect/detectors/natid/is.d.ts.map +1 -0
  338. package/dist/src/detect/detectors/natid/is.js +42 -0
  339. package/dist/src/detect/detectors/natid/is.js.map +1 -0
  340. package/dist/src/detect/detectors/natid/it.d.ts +12 -0
  341. package/dist/src/detect/detectors/natid/it.d.ts.map +1 -0
  342. package/dist/src/detect/detectors/natid/it.js +62 -0
  343. package/dist/src/detect/detectors/natid/it.js.map +1 -0
  344. package/dist/src/detect/detectors/natid/jp.d.ts +9 -0
  345. package/dist/src/detect/detectors/natid/jp.d.ts.map +1 -0
  346. package/dist/src/detect/detectors/natid/jp.js +46 -0
  347. package/dist/src/detect/detectors/natid/jp.js.map +1 -0
  348. package/dist/src/detect/detectors/natid/kr.d.ts +11 -0
  349. package/dist/src/detect/detectors/natid/kr.d.ts.map +1 -0
  350. package/dist/src/detect/detectors/natid/kr.js +40 -0
  351. package/dist/src/detect/detectors/natid/kr.js.map +1 -0
  352. package/dist/src/detect/detectors/natid/kz.d.ts +8 -0
  353. package/dist/src/detect/detectors/natid/kz.d.ts.map +1 -0
  354. package/dist/src/detect/detectors/natid/kz.js +46 -0
  355. package/dist/src/detect/detectors/natid/kz.js.map +1 -0
  356. package/dist/src/detect/detectors/natid/mx.d.ts +16 -0
  357. package/dist/src/detect/detectors/natid/mx.d.ts.map +1 -0
  358. package/dist/src/detect/detectors/natid/mx.js +82 -0
  359. package/dist/src/detect/detectors/natid/mx.js.map +1 -0
  360. package/dist/src/detect/detectors/natid/nl.d.ts +8 -0
  361. package/dist/src/detect/detectors/natid/nl.d.ts.map +1 -0
  362. package/dist/src/detect/detectors/natid/nl.js +40 -0
  363. package/dist/src/detect/detectors/natid/nl.js.map +1 -0
  364. package/dist/src/detect/detectors/natid/no.d.ts +9 -0
  365. package/dist/src/detect/detectors/natid/no.d.ts.map +1 -0
  366. package/dist/src/detect/detectors/natid/no.js +52 -0
  367. package/dist/src/detect/detectors/natid/no.js.map +1 -0
  368. package/dist/src/detect/detectors/natid/nz.d.ts +9 -0
  369. package/dist/src/detect/detectors/natid/nz.d.ts.map +1 -0
  370. package/dist/src/detect/detectors/natid/nz.js +52 -0
  371. package/dist/src/detect/detectors/natid/nz.js.map +1 -0
  372. package/dist/src/detect/detectors/natid/pe.d.ts +7 -0
  373. package/dist/src/detect/detectors/natid/pe.d.ts.map +1 -0
  374. package/dist/src/detect/detectors/natid/pe.js +26 -0
  375. package/dist/src/detect/detectors/natid/pe.js.map +1 -0
  376. package/dist/src/detect/detectors/natid/pl.d.ts +11 -0
  377. package/dist/src/detect/detectors/natid/pl.d.ts.map +1 -0
  378. package/dist/src/detect/detectors/natid/pl.js +105 -0
  379. package/dist/src/detect/detectors/natid/pl.js.map +1 -0
  380. package/dist/src/detect/detectors/natid/pt.d.ts +6 -0
  381. package/dist/src/detect/detectors/natid/pt.d.ts.map +1 -0
  382. package/dist/src/detect/detectors/natid/pt.js +35 -0
  383. package/dist/src/detect/detectors/natid/pt.js.map +1 -0
  384. package/dist/src/detect/detectors/natid/ro.d.ts +8 -0
  385. package/dist/src/detect/detectors/natid/ro.d.ts.map +1 -0
  386. package/dist/src/detect/detectors/natid/ro.js +48 -0
  387. package/dist/src/detect/detectors/natid/ro.js.map +1 -0
  388. package/dist/src/detect/detectors/natid/ru.d.ts +11 -0
  389. package/dist/src/detect/detectors/natid/ru.d.ts.map +1 -0
  390. package/dist/src/detect/detectors/natid/ru.js +86 -0
  391. package/dist/src/detect/detectors/natid/ru.js.map +1 -0
  392. package/dist/src/detect/detectors/natid/se.d.ts +9 -0
  393. package/dist/src/detect/detectors/natid/se.d.ts.map +1 -0
  394. package/dist/src/detect/detectors/natid/se.js +43 -0
  395. package/dist/src/detect/detectors/natid/se.js.map +1 -0
  396. package/dist/src/detect/detectors/natid/seasia.d.ts +19 -0
  397. package/dist/src/detect/detectors/natid/seasia.d.ts.map +1 -0
  398. package/dist/src/detect/detectors/natid/seasia.js +182 -0
  399. package/dist/src/detect/detectors/natid/seasia.js.map +1 -0
  400. package/dist/src/detect/detectors/natid/sg.d.ts +8 -0
  401. package/dist/src/detect/detectors/natid/sg.d.ts.map +1 -0
  402. package/dist/src/detect/detectors/natid/sg.js +39 -0
  403. package/dist/src/detect/detectors/natid/sg.js.map +1 -0
  404. package/dist/src/detect/detectors/natid/si.d.ts +8 -0
  405. package/dist/src/detect/detectors/natid/si.d.ts.map +1 -0
  406. package/dist/src/detect/detectors/natid/si.js +44 -0
  407. package/dist/src/detect/detectors/natid/si.js.map +1 -0
  408. package/dist/src/detect/detectors/natid/tr.d.ts +14 -0
  409. package/dist/src/detect/detectors/natid/tr.d.ts.map +1 -0
  410. package/dist/src/detect/detectors/natid/tr.js +79 -0
  411. package/dist/src/detect/detectors/natid/tr.js.map +1 -0
  412. package/dist/src/detect/detectors/natid/tw.d.ts +9 -0
  413. package/dist/src/detect/detectors/natid/tw.d.ts.map +1 -0
  414. package/dist/src/detect/detectors/natid/tw.js +40 -0
  415. package/dist/src/detect/detectors/natid/tw.js.map +1 -0
  416. package/dist/src/detect/detectors/natid/ua.d.ts +7 -0
  417. package/dist/src/detect/detectors/natid/ua.d.ts.map +1 -0
  418. package/dist/src/detect/detectors/natid/ua.js +38 -0
  419. package/dist/src/detect/detectors/natid/ua.js.map +1 -0
  420. package/dist/src/detect/detectors/natid/us.d.ts +15 -0
  421. package/dist/src/detect/detectors/natid/us.d.ts.map +1 -0
  422. package/dist/src/detect/detectors/natid/us.js +119 -0
  423. package/dist/src/detect/detectors/natid/us.js.map +1 -0
  424. package/dist/src/detect/detectors/natid/za.d.ts +9 -0
  425. package/dist/src/detect/detectors/natid/za.d.ts.map +1 -0
  426. package/dist/src/detect/detectors/natid/za.js +44 -0
  427. package/dist/src/detect/detectors/natid/za.js.map +1 -0
  428. package/dist/src/detect/detectors/secrets/apiKey.d.ts +14 -0
  429. package/dist/src/detect/detectors/secrets/apiKey.d.ts.map +1 -0
  430. package/dist/src/detect/detectors/secrets/apiKey.js +103 -0
  431. package/dist/src/detect/detectors/secrets/apiKey.js.map +1 -0
  432. package/dist/src/detect/detectors/secrets/connectionString.d.ts +12 -0
  433. package/dist/src/detect/detectors/secrets/connectionString.d.ts.map +1 -0
  434. package/dist/src/detect/detectors/secrets/connectionString.js +70 -0
  435. package/dist/src/detect/detectors/secrets/connectionString.js.map +1 -0
  436. package/dist/src/detect/detectors/secrets/genericSecret.d.ts +22 -0
  437. package/dist/src/detect/detectors/secrets/genericSecret.d.ts.map +1 -0
  438. package/dist/src/detect/detectors/secrets/genericSecret.js +77 -0
  439. package/dist/src/detect/detectors/secrets/genericSecret.js.map +1 -0
  440. package/dist/src/detect/detectors/secrets/index.d.ts +9 -0
  441. package/dist/src/detect/detectors/secrets/index.d.ts.map +1 -0
  442. package/dist/src/detect/detectors/secrets/index.js +9 -0
  443. package/dist/src/detect/detectors/secrets/index.js.map +1 -0
  444. package/dist/src/detect/detectors/secrets/jwt.d.ts +11 -0
  445. package/dist/src/detect/detectors/secrets/jwt.d.ts.map +1 -0
  446. package/dist/src/detect/detectors/secrets/jwt.js +111 -0
  447. package/dist/src/detect/detectors/secrets/jwt.js.map +1 -0
  448. package/dist/src/detect/detectors/secrets/pemPrivateKey.d.ts +16 -0
  449. package/dist/src/detect/detectors/secrets/pemPrivateKey.d.ts.map +1 -0
  450. package/dist/src/detect/detectors/secrets/pemPrivateKey.js +56 -0
  451. package/dist/src/detect/detectors/secrets/pemPrivateKey.js.map +1 -0
  452. package/dist/src/detect/detectors/vat/euVat.d.ts +17 -0
  453. package/dist/src/detect/detectors/vat/euVat.d.ts.map +1 -0
  454. package/dist/src/detect/detectors/vat/euVat.js +293 -0
  455. package/dist/src/detect/detectors/vat/euVat.js.map +1 -0
  456. package/dist/src/detect/detectors/vat/index.d.ts +5 -0
  457. package/dist/src/detect/detectors/vat/index.d.ts.map +1 -0
  458. package/dist/src/detect/detectors/vat/index.js +5 -0
  459. package/dist/src/detect/detectors/vat/index.js.map +1 -0
  460. package/dist/src/detect/entropy.d.ts +28 -0
  461. package/dist/src/detect/entropy.d.ts.map +1 -0
  462. package/dist/src/detect/entropy.js +64 -0
  463. package/dist/src/detect/entropy.js.map +1 -0
  464. package/dist/src/detect/isoCountries.d.ts +10 -0
  465. package/dist/src/detect/isoCountries.d.ts.map +1 -0
  466. package/dist/src/detect/isoCountries.js +25 -0
  467. package/dist/src/detect/isoCountries.js.map +1 -0
  468. package/dist/src/detect/registry.d.ts +50 -0
  469. package/dist/src/detect/registry.d.ts.map +1 -0
  470. package/dist/src/detect/registry.js +110 -0
  471. package/dist/src/detect/registry.js.map +1 -0
  472. package/dist/src/detect/runner.d.ts +64 -0
  473. package/dist/src/detect/runner.d.ts.map +1 -0
  474. package/dist/src/detect/runner.js +142 -0
  475. package/dist/src/detect/runner.js.map +1 -0
  476. package/dist/src/detect/types.d.ts +251 -0
  477. package/dist/src/detect/types.d.ts.map +1 -0
  478. package/dist/src/detect/types.js +59 -0
  479. package/dist/src/detect/types.js.map +1 -0
  480. package/dist/src/encoding/base58.d.ts +26 -0
  481. package/dist/src/encoding/base58.d.ts.map +1 -0
  482. package/dist/src/encoding/base58.js +77 -0
  483. package/dist/src/encoding/base58.js.map +1 -0
  484. package/dist/src/encoding/base58monero.d.ts +15 -0
  485. package/dist/src/encoding/base58monero.d.ts.map +1 -0
  486. package/dist/src/encoding/base58monero.js +87 -0
  487. package/dist/src/encoding/base58monero.js.map +1 -0
  488. package/dist/src/encoding/bech32.d.ts +28 -0
  489. package/dist/src/encoding/bech32.d.ts.map +1 -0
  490. package/dist/src/encoding/bech32.js +108 -0
  491. package/dist/src/encoding/bech32.js.map +1 -0
  492. package/dist/src/encoding/bytes.d.ts +15 -0
  493. package/dist/src/encoding/bytes.d.ts.map +1 -0
  494. package/dist/src/encoding/bytes.js +46 -0
  495. package/dist/src/encoding/bytes.js.map +1 -0
  496. package/dist/src/entityFamily.d.ts +18 -0
  497. package/dist/src/entityFamily.d.ts.map +1 -0
  498. package/dist/src/entityFamily.js +54 -0
  499. package/dist/src/entityFamily.js.map +1 -0
  500. package/dist/src/entityLabel.d.ts +18 -0
  501. package/dist/src/entityLabel.d.ts.map +1 -0
  502. package/dist/src/entityLabel.js +53 -0
  503. package/dist/src/entityLabel.js.map +1 -0
  504. package/dist/src/entityTypes.d.ts +64 -0
  505. package/dist/src/entityTypes.d.ts.map +1 -0
  506. package/dist/src/entityTypes.js +94 -0
  507. package/dist/src/entityTypes.js.map +1 -0
  508. package/dist/src/exposure/index.d.ts +86 -0
  509. package/dist/src/exposure/index.d.ts.map +1 -0
  510. package/dist/src/exposure/index.js +134 -0
  511. package/dist/src/exposure/index.js.map +1 -0
  512. package/dist/src/fuse/calibrate.d.ts +95 -0
  513. package/dist/src/fuse/calibrate.d.ts.map +1 -0
  514. package/dist/src/fuse/calibrate.js +165 -0
  515. package/dist/src/fuse/calibrate.js.map +1 -0
  516. package/dist/src/fuse/defaultCalibration.d.ts +52 -0
  517. package/dist/src/fuse/defaultCalibration.d.ts.map +1 -0
  518. package/dist/src/fuse/defaultCalibration.js +41 -0
  519. package/dist/src/fuse/defaultCalibration.js.map +1 -0
  520. package/dist/src/fuse/explain.d.ts +55 -0
  521. package/dist/src/fuse/explain.d.ts.map +1 -0
  522. package/dist/src/fuse/explain.js +91 -0
  523. package/dist/src/fuse/explain.js.map +1 -0
  524. package/dist/src/fuse/profiles.d.ts +80 -0
  525. package/dist/src/fuse/profiles.d.ts.map +1 -0
  526. package/dist/src/fuse/profiles.js +126 -0
  527. package/dist/src/fuse/profiles.js.map +1 -0
  528. package/dist/src/fuse/resolve.d.ts +73 -0
  529. package/dist/src/fuse/resolve.d.ts.map +1 -0
  530. package/dist/src/fuse/resolve.js +206 -0
  531. package/dist/src/fuse/resolve.js.map +1 -0
  532. package/dist/src/gazetteer/index.d.ts +41 -0
  533. package/dist/src/gazetteer/index.d.ts.map +1 -0
  534. package/dist/src/gazetteer/index.js +117 -0
  535. package/dist/src/gazetteer/index.js.map +1 -0
  536. package/dist/src/generate/bankcodes.d.ts +20 -0
  537. package/dist/src/generate/bankcodes.d.ts.map +1 -0
  538. package/dist/src/generate/bankcodes.js +71 -0
  539. package/dist/src/generate/bankcodes.js.map +1 -0
  540. package/dist/src/generate/contact.d.ts +31 -0
  541. package/dist/src/generate/contact.d.ts.map +1 -0
  542. package/dist/src/generate/contact.js +139 -0
  543. package/dist/src/generate/contact.js.map +1 -0
  544. package/dist/src/generate/crypto.d.ts +27 -0
  545. package/dist/src/generate/crypto.d.ts.map +1 -0
  546. package/dist/src/generate/crypto.js +88 -0
  547. package/dist/src/generate/crypto.js.map +1 -0
  548. package/dist/src/generate/documents.d.ts +24 -0
  549. package/dist/src/generate/documents.d.ts.map +1 -0
  550. package/dist/src/generate/documents.js +124 -0
  551. package/dist/src/generate/documents.js.map +1 -0
  552. package/dist/src/generate/financial.d.ts +26 -0
  553. package/dist/src/generate/financial.d.ts.map +1 -0
  554. package/dist/src/generate/financial.js +136 -0
  555. package/dist/src/generate/financial.js.map +1 -0
  556. package/dist/src/generate/index.d.ts +23 -0
  557. package/dist/src/generate/index.d.ts.map +1 -0
  558. package/dist/src/generate/index.js +23 -0
  559. package/dist/src/generate/index.js.map +1 -0
  560. package/dist/src/generate/location.d.ts +12 -0
  561. package/dist/src/generate/location.d.ts.map +1 -0
  562. package/dist/src/generate/location.js +75 -0
  563. package/dist/src/generate/location.js.map +1 -0
  564. package/dist/src/generate/natidAmOc.d.ts +22 -0
  565. package/dist/src/generate/natidAmOc.d.ts.map +1 -0
  566. package/dist/src/generate/natidAmOc.js +181 -0
  567. package/dist/src/generate/natidAmOc.js.map +1 -0
  568. package/dist/src/generate/natidAsia.d.ts +20 -0
  569. package/dist/src/generate/natidAsia.d.ts.map +1 -0
  570. package/dist/src/generate/natidAsia.js +147 -0
  571. package/dist/src/generate/natidAsia.js.map +1 -0
  572. package/dist/src/generate/natidCee.d.ts +21 -0
  573. package/dist/src/generate/natidCee.d.ts.map +1 -0
  574. package/dist/src/generate/natidCee.js +181 -0
  575. package/dist/src/generate/natidCee.js.map +1 -0
  576. package/dist/src/generate/natidMeCis.d.ts +17 -0
  577. package/dist/src/generate/natidMeCis.d.ts.map +1 -0
  578. package/dist/src/generate/natidMeCis.js +121 -0
  579. package/dist/src/generate/natidMeCis.js.map +1 -0
  580. package/dist/src/generate/natidWest.d.ts +32 -0
  581. package/dist/src/generate/natidWest.d.ts.map +1 -0
  582. package/dist/src/generate/natidWest.js +187 -0
  583. package/dist/src/generate/natidWest.js.map +1 -0
  584. package/dist/src/generate/prng.d.ts +10 -0
  585. package/dist/src/generate/prng.d.ts.map +1 -0
  586. package/dist/src/generate/prng.js +18 -0
  587. package/dist/src/generate/prng.js.map +1 -0
  588. package/dist/src/generate/secrets.d.ts +23 -0
  589. package/dist/src/generate/secrets.d.ts.map +1 -0
  590. package/dist/src/generate/secrets.js +126 -0
  591. package/dist/src/generate/secrets.js.map +1 -0
  592. package/dist/src/generate/vat.d.ts +11 -0
  593. package/dist/src/generate/vat.d.ts.map +1 -0
  594. package/dist/src/generate/vat.js +233 -0
  595. package/dist/src/generate/vat.js.map +1 -0
  596. package/dist/src/index.d.ts +81 -0
  597. package/dist/src/index.d.ts.map +1 -0
  598. package/dist/src/index.js +76 -0
  599. package/dist/src/index.js.map +1 -0
  600. package/dist/src/mask/egressGuard.d.ts +54 -0
  601. package/dist/src/mask/egressGuard.d.ts.map +1 -0
  602. package/dist/src/mask/egressGuard.js +67 -0
  603. package/dist/src/mask/egressGuard.js.map +1 -0
  604. package/dist/src/mask/masker.d.ts +76 -0
  605. package/dist/src/mask/masker.d.ts.map +1 -0
  606. package/dist/src/mask/masker.js +201 -0
  607. package/dist/src/mask/masker.js.map +1 -0
  608. package/dist/src/mask/restorer.d.ts +96 -0
  609. package/dist/src/mask/restorer.d.ts.map +1 -0
  610. package/dist/src/mask/restorer.js +263 -0
  611. package/dist/src/mask/restorer.js.map +1 -0
  612. package/dist/src/mask/surrogatePools.d.ts +33 -0
  613. package/dist/src/mask/surrogatePools.d.ts.map +1 -0
  614. package/dist/src/mask/surrogatePools.js +81 -0
  615. package/dist/src/mask/surrogatePools.js.map +1 -0
  616. package/dist/src/mask/surrogates.d.ts +45 -0
  617. package/dist/src/mask/surrogates.d.ts.map +1 -0
  618. package/dist/src/mask/surrogates.js +241 -0
  619. package/dist/src/mask/surrogates.js.map +1 -0
  620. package/dist/src/mask/vault.d.ts +76 -0
  621. package/dist/src/mask/vault.d.ts.map +1 -0
  622. package/dist/src/mask/vault.js +141 -0
  623. package/dist/src/mask/vault.js.map +1 -0
  624. package/dist/src/ner/align.d.ts +36 -0
  625. package/dist/src/ner/align.d.ts.map +1 -0
  626. package/dist/src/ner/align.js +73 -0
  627. package/dist/src/ner/align.js.map +1 -0
  628. package/dist/src/ner/chunk.d.ts +27 -0
  629. package/dist/src/ner/chunk.d.ts.map +1 -0
  630. package/dist/src/ner/chunk.js +55 -0
  631. package/dist/src/ner/chunk.js.map +1 -0
  632. package/dist/src/ner/chunkCache.d.ts +63 -0
  633. package/dist/src/ner/chunkCache.d.ts.map +1 -0
  634. package/dist/src/ner/chunkCache.js +99 -0
  635. package/dist/src/ner/chunkCache.js.map +1 -0
  636. package/dist/src/ner/engine.d.ts +53 -0
  637. package/dist/src/ner/engine.d.ts.map +1 -0
  638. package/dist/src/ner/engine.js +113 -0
  639. package/dist/src/ner/engine.js.map +1 -0
  640. package/dist/src/ner/merge.d.ts +26 -0
  641. package/dist/src/ner/merge.d.ts.map +1 -0
  642. package/dist/src/ner/merge.js +108 -0
  643. package/dist/src/ner/merge.js.map +1 -0
  644. package/dist/src/ner/runStage2.d.ts +17 -0
  645. package/dist/src/ner/runStage2.d.ts.map +1 -0
  646. package/dist/src/ner/runStage2.js +43 -0
  647. package/dist/src/ner/runStage2.js.map +1 -0
  648. package/dist/src/ner/stage2b.d.ts +59 -0
  649. package/dist/src/ner/stage2b.d.ts.map +1 -0
  650. package/dist/src/ner/stage2b.js +51 -0
  651. package/dist/src/ner/stage2b.js.map +1 -0
  652. package/dist/src/ner/transformersClassifier.d.ts +45 -0
  653. package/dist/src/ner/transformersClassifier.d.ts.map +1 -0
  654. package/dist/src/ner/transformersClassifier.js +40 -0
  655. package/dist/src/ner/transformersClassifier.js.map +1 -0
  656. package/dist/src/ner/types.d.ts +93 -0
  657. package/dist/src/ner/types.d.ts.map +1 -0
  658. package/dist/src/ner/types.js +12 -0
  659. package/dist/src/ner/types.js.map +1 -0
  660. package/dist/src/normalization.d.ts +24 -0
  661. package/dist/src/normalization.d.ts.map +1 -0
  662. package/dist/src/normalization.js +92 -0
  663. package/dist/src/normalization.js.map +1 -0
  664. package/dist/src/offsetMap.d.ts +165 -0
  665. package/dist/src/offsetMap.d.ts.map +1 -0
  666. package/dist/src/offsetMap.js +225 -0
  667. package/dist/src/offsetMap.js.map +1 -0
  668. package/dist/src/pipeline.d.ts +58 -0
  669. package/dist/src/pipeline.d.ts.map +1 -0
  670. package/dist/src/pipeline.js +57 -0
  671. package/dist/src/pipeline.js.map +1 -0
  672. package/dist/src/protect.d.ts +146 -0
  673. package/dist/src/protect.d.ts.map +1 -0
  674. package/dist/src/protect.js +161 -0
  675. package/dist/src/protect.js.map +1 -0
  676. package/dist/src/scripts.d.ts +37 -0
  677. package/dist/src/scripts.d.ts.map +1 -0
  678. package/dist/src/scripts.js +145 -0
  679. package/dist/src/scripts.js.map +1 -0
  680. package/dist/src/transforms/foldDigits.d.ts +49 -0
  681. package/dist/src/transforms/foldDigits.d.ts.map +1 -0
  682. package/dist/src/transforms/foldDigits.js +135 -0
  683. package/dist/src/transforms/foldDigits.js.map +1 -0
  684. package/dist/src/transforms/graphemes.d.ts +6 -0
  685. package/dist/src/transforms/graphemes.d.ts.map +1 -0
  686. package/dist/src/transforms/graphemes.js +6 -0
  687. package/dist/src/transforms/graphemes.js.map +1 -0
  688. package/dist/src/transforms/homoglyphFold.d.ts +5 -0
  689. package/dist/src/transforms/homoglyphFold.d.ts.map +1 -0
  690. package/dist/src/transforms/homoglyphFold.js +214 -0
  691. package/dist/src/transforms/homoglyphFold.js.map +1 -0
  692. package/dist/src/transforms/nfkc.d.ts +20 -0
  693. package/dist/src/transforms/nfkc.d.ts.map +1 -0
  694. package/dist/src/transforms/nfkc.js +48 -0
  695. package/dist/src/transforms/nfkc.js.map +1 -0
  696. package/dist/src/transforms/stripInvisibles.d.ts +37 -0
  697. package/dist/src/transforms/stripInvisibles.d.ts.map +1 -0
  698. package/dist/src/transforms/stripInvisibles.js +151 -0
  699. package/dist/src/transforms/stripInvisibles.js.map +1 -0
  700. package/dist/src/transforms/whitespacePunct.d.ts +21 -0
  701. package/dist/src/transforms/whitespacePunct.d.ts.map +1 -0
  702. package/dist/src/transforms/whitespacePunct.js +100 -0
  703. package/dist/src/transforms/whitespacePunct.js.map +1 -0
  704. package/dist/src/types.d.ts +212 -0
  705. package/dist/src/types.d.ts.map +1 -0
  706. package/dist/src/types.js +14 -0
  707. package/dist/src/types.js.map +1 -0
  708. package/package.json +67 -0
  709. package/src/checksums/aba.ts +45 -0
  710. package/src/checksums/digits.ts +108 -0
  711. package/src/checksums/icao9303.ts +53 -0
  712. package/src/checksums/index.ts +36 -0
  713. package/src/checksums/iso7064.ts +168 -0
  714. package/src/checksums/luhn.ts +66 -0
  715. package/src/checksums/mod97.ts +91 -0
  716. package/src/checksums/verhoeff.ts +84 -0
  717. package/src/checksums/weighted.ts +108 -0
  718. package/src/context/documentProfile.ts +293 -0
  719. package/src/context/negativeRules.ts +765 -0
  720. package/src/context/score.ts +430 -0
  721. package/src/context/structure.ts +611 -0
  722. package/src/context/triggers.ts +266 -0
  723. package/src/context/types.ts +150 -0
  724. package/src/crypto/keccak256.ts +98 -0
  725. package/src/crypto/sha256.ts +76 -0
  726. package/src/detect/AUTHORING.md +50 -0
  727. package/src/detect/detectors/bankcodes/auBsb.ts +36 -0
  728. package/src/detect/detectors/bankcodes/brAgencia.ts +46 -0
  729. package/src/detect/detectors/bankcodes/caTransit.ts +89 -0
  730. package/src/detect/detectors/bankcodes/inIfsc.ts +40 -0
  731. package/src/detect/detectors/bankcodes/index.ts +9 -0
  732. package/src/detect/detectors/bankcodes/ukSortCode.ts +38 -0
  733. package/src/detect/detectors/bankcodes/usRouting.ts +47 -0
  734. package/src/detect/detectors/contact/email.ts +113 -0
  735. package/src/detect/detectors/contact/index.ts +10 -0
  736. package/src/detect/detectors/contact/ipv4.ts +112 -0
  737. package/src/detect/detectors/contact/ipv6.ts +188 -0
  738. package/src/detect/detectors/contact/mac.ts +68 -0
  739. package/src/detect/detectors/contact/phone.ts +81 -0
  740. package/src/detect/detectors/contact/urlCredentials.ts +124 -0
  741. package/src/detect/detectors/crypto/ada.ts +52 -0
  742. package/src/detect/detectors/crypto/btc.ts +77 -0
  743. package/src/detect/detectors/crypto/dot.ts +42 -0
  744. package/src/detect/detectors/crypto/eth.ts +70 -0
  745. package/src/detect/detectors/crypto/index.ts +11 -0
  746. package/src/detect/detectors/crypto/ltc.ts +69 -0
  747. package/src/detect/detectors/crypto/sol.ts +41 -0
  748. package/src/detect/detectors/crypto/trx.ts +35 -0
  749. package/src/detect/detectors/crypto/xmr.ts +54 -0
  750. package/src/detect/detectors/documents/driversLicense.ts +83 -0
  751. package/src/detect/detectors/documents/healthData.ts +88 -0
  752. package/src/detect/detectors/documents/index.ts +8 -0
  753. package/src/detect/detectors/documents/passportMrz.ts +203 -0
  754. package/src/detect/detectors/documents/usNpi.ts +50 -0
  755. package/src/detect/detectors/documents/vin.ts +67 -0
  756. package/src/detect/detectors/financial/creditCard.ts +167 -0
  757. package/src/detect/detectors/financial/iban.ts +82 -0
  758. package/src/detect/detectors/financial/ibanRegistry.ts +112 -0
  759. package/src/detect/detectors/financial/index.ts +6 -0
  760. package/src/detect/detectors/financial/swiftBic.ts +61 -0
  761. package/src/detect/detectors/index.ts +14 -0
  762. package/src/detect/detectors/location/coordinates.ts +84 -0
  763. package/src/detect/detectors/location/index.ts +6 -0
  764. package/src/detect/detectors/location/postalCode.ts +56 -0
  765. package/src/detect/detectors/location/postalRegistry.ts +74 -0
  766. package/src/detect/detectors/location/streetAddress.ts +84 -0
  767. package/src/detect/detectors/natid/africa.ts +108 -0
  768. package/src/detect/detectors/natid/ar.ts +62 -0
  769. package/src/detect/detectors/natid/au.ts +99 -0
  770. package/src/detect/detectors/natid/be.ts +45 -0
  771. package/src/detect/detectors/natid/bg.ts +44 -0
  772. package/src/detect/detectors/natid/br.ts +81 -0
  773. package/src/detect/detectors/natid/ca.ts +40 -0
  774. package/src/detect/detectors/natid/cl.ts +47 -0
  775. package/src/detect/detectors/natid/cn.ts +48 -0
  776. package/src/detect/detectors/natid/co.ts +46 -0
  777. package/src/detect/detectors/natid/cz.ts +44 -0
  778. package/src/detect/detectors/natid/de.ts +75 -0
  779. package/src/detect/detectors/natid/dk.ts +31 -0
  780. package/src/detect/detectors/natid/es.ts +95 -0
  781. package/src/detect/detectors/natid/fi.ts +41 -0
  782. package/src/detect/detectors/natid/fr.ts +63 -0
  783. package/src/detect/detectors/natid/gb.ts +70 -0
  784. package/src/detect/detectors/natid/gr.ts +35 -0
  785. package/src/detect/detectors/natid/gulf.ts +116 -0
  786. package/src/detect/detectors/natid/hk.ts +42 -0
  787. package/src/detect/detectors/natid/hr.ts +32 -0
  788. package/src/detect/detectors/natid/hu.ts +36 -0
  789. package/src/detect/detectors/natid/ie.ts +37 -0
  790. package/src/detect/detectors/natid/il.ts +37 -0
  791. package/src/detect/detectors/natid/in.ts +67 -0
  792. package/src/detect/detectors/natid/index.ts +54 -0
  793. package/src/detect/detectors/natid/is.ts +42 -0
  794. package/src/detect/detectors/natid/it.ts +65 -0
  795. package/src/detect/detectors/natid/jp.ts +48 -0
  796. package/src/detect/detectors/natid/kr.ts +41 -0
  797. package/src/detect/detectors/natid/kz.ts +44 -0
  798. package/src/detect/detectors/natid/mx.ts +83 -0
  799. package/src/detect/detectors/natid/nl.ts +38 -0
  800. package/src/detect/detectors/natid/no.ts +50 -0
  801. package/src/detect/detectors/natid/nz.ts +53 -0
  802. package/src/detect/detectors/natid/pe.ts +28 -0
  803. package/src/detect/detectors/natid/pl.ts +100 -0
  804. package/src/detect/detectors/natid/pt.ts +36 -0
  805. package/src/detect/detectors/natid/ro.ts +47 -0
  806. package/src/detect/detectors/natid/ru.ts +82 -0
  807. package/src/detect/detectors/natid/se.ts +42 -0
  808. package/src/detect/detectors/natid/seasia.ts +174 -0
  809. package/src/detect/detectors/natid/sg.ts +39 -0
  810. package/src/detect/detectors/natid/si.ts +42 -0
  811. package/src/detect/detectors/natid/tr.ts +76 -0
  812. package/src/detect/detectors/natid/tw.ts +41 -0
  813. package/src/detect/detectors/natid/ua.ts +38 -0
  814. package/src/detect/detectors/natid/us.ts +118 -0
  815. package/src/detect/detectors/natid/za.ts +42 -0
  816. package/src/detect/detectors/secrets/apiKey.ts +115 -0
  817. package/src/detect/detectors/secrets/connectionString.ts +71 -0
  818. package/src/detect/detectors/secrets/genericSecret.ts +81 -0
  819. package/src/detect/detectors/secrets/index.ts +8 -0
  820. package/src/detect/detectors/secrets/jwt.ts +101 -0
  821. package/src/detect/detectors/secrets/pemPrivateKey.ts +59 -0
  822. package/src/detect/detectors/vat/euVat.ts +280 -0
  823. package/src/detect/detectors/vat/index.ts +4 -0
  824. package/src/detect/entropy.ts +60 -0
  825. package/src/detect/isoCountries.ts +30 -0
  826. package/src/detect/registry.ts +134 -0
  827. package/src/detect/runner.ts +187 -0
  828. package/src/detect/types.ts +296 -0
  829. package/src/encoding/base58.ts +85 -0
  830. package/src/encoding/base58monero.ts +90 -0
  831. package/src/encoding/bech32.ts +125 -0
  832. package/src/encoding/bytes.ts +48 -0
  833. package/src/entityFamily.ts +70 -0
  834. package/src/entityLabel.ts +56 -0
  835. package/src/entityTypes.ts +107 -0
  836. package/src/exposure/index.ts +189 -0
  837. package/src/fuse/calibrate.ts +224 -0
  838. package/src/fuse/defaultCalibration.ts +71 -0
  839. package/src/fuse/explain.ts +114 -0
  840. package/src/fuse/profiles.ts +187 -0
  841. package/src/fuse/resolve.ts +237 -0
  842. package/src/gazetteer/index.ts +139 -0
  843. package/src/generate/bankcodes.ts +82 -0
  844. package/src/generate/contact.ts +147 -0
  845. package/src/generate/crypto.ts +91 -0
  846. package/src/generate/documents.ts +142 -0
  847. package/src/generate/financial.ts +149 -0
  848. package/src/generate/index.ts +22 -0
  849. package/src/generate/location.ts +80 -0
  850. package/src/generate/natidAmOc.ts +198 -0
  851. package/src/generate/natidAsia.ts +162 -0
  852. package/src/generate/natidCee.ts +196 -0
  853. package/src/generate/natidMeCis.ts +131 -0
  854. package/src/generate/natidWest.ts +208 -0
  855. package/src/generate/prng.ts +17 -0
  856. package/src/generate/secrets.ts +141 -0
  857. package/src/generate/vat.ts +239 -0
  858. package/src/index.ts +186 -0
  859. package/src/mask/egressGuard.ts +88 -0
  860. package/src/mask/masker.ts +276 -0
  861. package/src/mask/restorer.ts +284 -0
  862. package/src/mask/surrogatePools.ts +96 -0
  863. package/src/mask/surrogates.ts +248 -0
  864. package/src/mask/vault.ts +153 -0
  865. package/src/ner/align.ts +86 -0
  866. package/src/ner/chunk.ts +65 -0
  867. package/src/ner/chunkCache.ts +110 -0
  868. package/src/ner/engine.ts +141 -0
  869. package/src/ner/merge.ts +123 -0
  870. package/src/ner/runStage2.ts +51 -0
  871. package/src/ner/stage2b.ts +73 -0
  872. package/src/ner/transformersClassifier.ts +79 -0
  873. package/src/ner/types.ts +99 -0
  874. package/src/normalization.ts +119 -0
  875. package/src/offsetMap.ts +271 -0
  876. package/src/pipeline.ts +96 -0
  877. package/src/protect.ts +284 -0
  878. package/src/scripts.ts +164 -0
  879. package/src/transforms/foldDigits.ts +138 -0
  880. package/src/transforms/graphemes.ts +5 -0
  881. package/src/transforms/homoglyphFold.ts +221 -0
  882. package/src/transforms/nfkc.ts +48 -0
  883. package/src/transforms/stripInvisibles.ts +158 -0
  884. package/src/transforms/whitespacePunct.ts +100 -0
  885. package/src/types.ts +339 -0
@@ -0,0 +1,276 @@
1
+ /**
2
+ * masker.ts — replace detected sensitive spans with surrogates (or tokens),
3
+ * building the vault as it goes.
4
+ *
5
+ * Operates on Stage 1 candidates in ORIGINAL-text coordinates (the offsets
6
+ * the runner resolved through the Stage 0 map), so the edited text is the
7
+ * user's real text with exactly the sensitive spans replaced.
8
+ *
9
+ * FOUR GUARANTEES, each enforced here:
10
+ * • CONSISTENT — the same original (by exact, canonical, or normalized key)
11
+ * always maps to the same surrogate within a session; a repeat reuses the
12
+ * vault entry rather than minting a new one.
13
+ * • COLLISION-SAFE — before committing a surrogate, verify it appears
14
+ * nowhere in the source text and nowhere in the vault; on collision, retry
15
+ * with a fresh seed up to a bound. Exhausting the bound falls back to a
16
+ * bracket token.
17
+ * • REVERSIBLE — every substitution is a vault entry, so the restorer can
18
+ * invert it.
19
+ * • NON-OVERLAPPING — overlapping candidates would corrupt the edit. Stage 4
20
+ * (M8) does calibrated overlap resolution; here a documented pre-fusion
21
+ * stopgap picks a non-overlapping subset (higher confidence, then longer
22
+ * span, then more-specific type) purely so masking is well-defined.
23
+ *
24
+ * Non-sensitive candidates (known test values) are NOT masked — they are
25
+ * detected precisely so they can be left alone.
26
+ */
27
+
28
+ import { normalize } from '../normalization.js';
29
+ import { runStage1 } from '../detect/runner.js';
30
+ import type { Stage1Options } from '../detect/runner.js';
31
+ import type { SubstitutionMode, VaultEntry } from '../types.js';
32
+ import type { Stage1Candidate } from '../detect/types.js';
33
+ import type { PipelineCandidate } from '../context/types.js';
34
+ import type { Vault } from './vault.js';
35
+ import { chooseSurrogate } from './surrogates.js';
36
+ import { comparisonForm, separatorFree } from './egressGuard.js';
37
+
38
+ const MAX_SURROGATE_ATTEMPTS = 24;
39
+
40
+ export interface MaskOptions {
41
+ /** 'surrogate' (default) or 'token' — SPEC.md's user-selectable modes. */
42
+ readonly mode?: SubstitutionMode;
43
+ /** Base seed; a session should vary this so two sessions differ. */
44
+ readonly seed?: number;
45
+ }
46
+
47
+ export interface MaskedEntity {
48
+ readonly type: Stage1Candidate['type'];
49
+ readonly originalStart: number;
50
+ readonly originalEnd: number;
51
+ readonly original: string;
52
+ readonly replacement: string;
53
+ readonly vaultId: string;
54
+ readonly fallback: boolean;
55
+ }
56
+
57
+ export interface MaskResult {
58
+ readonly maskedText: string;
59
+ readonly entities: readonly MaskedEntity[];
60
+ readonly vaultEntries: readonly VaultEntry[];
61
+ }
62
+
63
+ /** A stable bracket token, used in token mode and as the surrogate fallback. */
64
+ function bracketToken(type: string, ordinal: number): string {
65
+ return `[${type}_${ordinal}]`;
66
+ }
67
+
68
+ /**
69
+ * Pre-fusion overlap resolution: greedily keep non-overlapping candidates,
70
+ * preferring higher confidence, then longer span, then a stable detector id
71
+ * for determinism. A documented stopgap until Stage 4 fusion (M8) resolves
72
+ * overlaps against calibrated scores.
73
+ */
74
+ export function resolveForMasking<C extends PipelineCandidate>(
75
+ candidates: readonly C[],
76
+ ): C[] {
77
+ const sensitive = candidates.filter((c) => c.sensitive);
78
+ const ranked = [...sensitive].sort((a, b) => {
79
+ if (b.rawConfidence !== a.rawConfidence) return b.rawConfidence - a.rawConfidence;
80
+ const lenA = a.originalEnd - a.originalStart;
81
+ const lenB = b.originalEnd - b.originalStart;
82
+ if (lenB !== lenA) return lenB - lenA;
83
+ return a.detectorId < b.detectorId ? -1 : 1;
84
+ });
85
+ const kept: C[] = [];
86
+ for (const c of ranked) {
87
+ if (!kept.some((k) => c.originalStart < k.originalEnd && k.originalStart < c.originalEnd)) {
88
+ kept.push(c);
89
+ }
90
+ }
91
+ return kept.sort((a, b) => a.originalStart - b.originalStart);
92
+ }
93
+
94
+ /**
95
+ * Mask the given ORIGINAL text using the candidates found in it.
96
+ * The candidates' `originalStart`/`originalEnd` must index into `original`.
97
+ *
98
+ * Takes `PipelineCandidate` rather than `Stage1Candidate` because Stage 2's
99
+ * PERSON/ORG/LOCATION entities must be masked too, and nothing in this file
100
+ * reads the `stage` discriminant — the two candidate shapes are otherwise
101
+ * identical. Typing it to Stage 1 alone was the narrower claim, not the safer
102
+ * one: it silently excluded the entities SPEC most wants surrogates for.
103
+ */
104
+ export function maskOriginal(
105
+ original: string,
106
+ candidates: readonly PipelineCandidate[],
107
+ vault: Vault,
108
+ options: MaskOptions = {},
109
+ ): MaskResult {
110
+ const mode = options.mode ?? 'surrogate';
111
+ const baseSeed = options.seed ?? 0x5eed;
112
+ const resolved = resolveForMasking(candidates);
113
+
114
+ // The collision check must run in the EGRESS GUARD'S comparison space:
115
+ // the guard scans in normalized+case-folded form plus a separator-free
116
+ // canonical pass, so a surrogate is acceptable only if none of this
117
+ // document's sensitive values would be found inside it under those same
118
+ // comparisons. The bug this prevents was found by the integration
119
+ // property: a phone surrogate drawn from the same small pool was the SAME
120
+ // number as the original in different formatting — the literal string
121
+ // check passed, and the masked text then failed its own guard.
122
+ const forbiddenNeedles = resolved.map((c) => {
123
+ const value = original.slice(c.originalStart, c.originalEnd);
124
+ const form = comparisonForm(value);
125
+ const strip = separatorFree(separatorFreeCanonical(c, value));
126
+ return { form, strip };
127
+ });
128
+
129
+ const entities: MaskedEntity[] = [];
130
+ const vaultEntries: VaultEntry[] = [];
131
+ const tokenOrdinals = new Map<string, number>();
132
+
133
+ const out: string[] = [];
134
+ let cursor = 0;
135
+
136
+ for (const c of resolved) {
137
+ const value = original.slice(c.originalStart, c.originalEnd);
138
+ out.push(original.slice(cursor, c.originalStart));
139
+ cursor = c.originalEnd;
140
+
141
+ // Consistency: a value already masked this session reuses its surrogate.
142
+ const existing = vault.getByOriginal(value, c.canonical);
143
+ if (existing !== undefined) {
144
+ out.push(existing.replacement);
145
+ entities.push({
146
+ type: c.type, originalStart: c.originalStart, originalEnd: c.originalEnd,
147
+ original: value, replacement: existing.replacement, vaultId: existing.id,
148
+ fallback: existing.fallback ?? false,
149
+ });
150
+ continue;
151
+ }
152
+
153
+ const { replacement, fallback } = selectReplacement(
154
+ c, value, original, vault, mode, baseSeed, tokenOrdinals, forbiddenNeedles,
155
+ );
156
+ const entry = vault.register({
157
+ type: c.type,
158
+ original: value,
159
+ replacement,
160
+ ...(c.canonical !== undefined ? { canonical: c.canonical } : {}),
161
+ ...(fallback ? { fallback: true } : {}),
162
+ });
163
+ vaultEntries.push(entry);
164
+ out.push(replacement);
165
+ entities.push({
166
+ type: c.type, originalStart: c.originalStart, originalEnd: c.originalEnd,
167
+ original: value, replacement, vaultId: entry.id, fallback,
168
+ });
169
+ }
170
+ out.push(original.slice(cursor));
171
+
172
+ return { maskedText: out.join(''), entities, vaultEntries };
173
+ }
174
+
175
+ /**
176
+ * End-to-end: normalize, run Stage 1, and mask the original text. The
177
+ * convenience entry point for the playground (M5) and the tests; the
178
+ * extension (M9) wires the same pieces with its own detection options.
179
+ */
180
+ export function mask(text: string, vault: Vault, options: MaskOptions & Stage1Options = {}): MaskResult {
181
+ const normalization = normalize(text);
182
+ const { mode, seed, ...stage1 } = options;
183
+ const candidates = runStage1(normalization, stage1);
184
+ return maskOriginal(
185
+ text,
186
+ candidates,
187
+ vault,
188
+ { ...(mode !== undefined ? { mode } : {}), ...(seed !== undefined ? { seed } : {}) },
189
+ );
190
+ }
191
+
192
+ interface ForbiddenNeedle {
193
+ readonly form: string;
194
+ readonly strip: string;
195
+ }
196
+
197
+ /** The candidate's canonical in comparison form (falls back to the value). */
198
+ function separatorFreeCanonical(c: PipelineCandidate, value: string): string {
199
+ return comparisonForm(c.canonical ?? value);
200
+ }
201
+
202
+ /** Pick a collision-free, consistent replacement for one value. */
203
+ function selectReplacement(
204
+ c: PipelineCandidate,
205
+ value: string,
206
+ sourceDoc: string,
207
+ vault: Vault,
208
+ mode: SubstitutionMode,
209
+ baseSeed: number,
210
+ tokenOrdinals: Map<string, number>,
211
+ forbiddenNeedles: readonly ForbiddenNeedle[],
212
+ ): { replacement: string; fallback: boolean } {
213
+ if (mode === 'token') {
214
+ return { replacement: nextToken(c.type, vault, sourceDoc, tokenOrdinals), fallback: false };
215
+ }
216
+
217
+ const seedBase = baseSeed ^ hashString(c.canonical ?? value);
218
+ for (let attempt = 0; attempt < MAX_SURROGATE_ATTEMPTS; attempt++) {
219
+ const surrogate = chooseSurrogate(
220
+ { type: c.type, text: value, ...(c.metadata !== undefined ? { metadata: c.metadata } : {}) },
221
+ (seedBase + attempt * 0x9e37) & 0x7fffffff,
222
+ );
223
+ if (surrogate === null) break; // no surrogate for this type → token
224
+ if (!collides(surrogate, sourceDoc, vault, forbiddenNeedles)) {
225
+ return { replacement: surrogate, fallback: false };
226
+ }
227
+ }
228
+ // Pool exhausted or no surrogate: fall back to a bracket token, recorded.
229
+ return { replacement: nextToken(c.type, vault, sourceDoc, tokenOrdinals), fallback: true };
230
+ }
231
+
232
+ /**
233
+ * A surrogate collides if it appears in the source text or the vault — or
234
+ * if any of this document's sensitive values would be FOUND WITHIN IT under
235
+ * the egress guard's comparisons (normalized case-folded substring, or the
236
+ * ≥6-char separator-free canonical pass). Masker and guard sharing one
237
+ * comparison space is what guarantees masked text passes its own guard.
238
+ */
239
+ function collides(
240
+ surrogate: string,
241
+ sourceDoc: string,
242
+ vault: Vault,
243
+ forbiddenNeedles: readonly ForbiddenNeedle[],
244
+ ): boolean {
245
+ if (vault.wouldCollide(surrogate)) return true;
246
+ // Case-insensitive appearance in the source, so the restorer's fuzzy pass
247
+ // cannot later confuse the surrogate with pre-existing text.
248
+ if (sourceDoc.toLowerCase().includes(surrogate.toLowerCase())) return true;
249
+
250
+ const surrogateForm = comparisonForm(surrogate);
251
+ const surrogateStrip = separatorFree(surrogateForm);
252
+ for (const needle of forbiddenNeedles) {
253
+ if (needle.form.length > 0 && surrogateForm.includes(needle.form)) return true;
254
+ if (needle.strip.length >= 6 && surrogateStrip.includes(needle.strip)) return true;
255
+ }
256
+ return false;
257
+ }
258
+
259
+ /** The next unused bracket token for a type (unique in source and vault). */
260
+ function nextToken(type: string, vault: Vault, sourceDoc: string, tokenOrdinals: Map<string, number>): string {
261
+ let ordinal = tokenOrdinals.get(type) ?? 1;
262
+ let token = bracketToken(type, ordinal);
263
+ while (vault.wouldCollide(token) || sourceDoc.includes(token)) {
264
+ ordinal += 1;
265
+ token = bracketToken(type, ordinal);
266
+ }
267
+ tokenOrdinals.set(type, ordinal + 1);
268
+ return token;
269
+ }
270
+
271
+ /** Deterministic 31-bit string hash so a value's seed is stable per session. */
272
+ function hashString(s: string): number {
273
+ let h = 0;
274
+ for (let i = 0; i < s.length; i++) h = (Math.imul(h, 31) + s.charCodeAt(i)) | 0;
275
+ return h & 0x7fffffff;
276
+ }
@@ -0,0 +1,284 @@
1
+ /**
2
+ * restorer.ts — the unmasker, correct against fragmented streaming text.
3
+ *
4
+ * The model's response arrives in chunks, and a surrogate may be split across
5
+ * a chunk boundary. The restorer therefore operates on ACCUMULATED text and
6
+ * emits only what is safe to finalize:
7
+ *
8
+ * • HOLD ON PARTIAL MATCH. If a suffix of the accumulated buffer is a proper
9
+ * prefix of any known surrogate, that suffix is held unrendered until more
10
+ * text resolves it. This is the guarantee behind the key test: no partial
11
+ * surrogate is ever wrongly replaced, however the stream is chunked.
12
+ *
13
+ * • EXACT REPLACEMENT is longest-match, left to right — a surrogate that is a
14
+ * prefix of a longer surrogate never steals the longer one's match.
15
+ *
16
+ * • FUZZY FALLBACK is a controlled, per-token pass for a surrogate the model
17
+ * transformed: case change, possessive ('s), or plural (s/es). It fires
18
+ * ONLY when exactly one surrogate matches a settled token under those
19
+ * relaxations; ANY ambiguity (two surrogates match, or none) leaves the
20
+ * token untouched — SPEC.md's hard rule. Cross-script "translation" of a
21
+ * surrogate is deliberately NOT attempted; such a surrogate stays visible
22
+ * rather than being guessed at (ARCHITECTURE.md D13).
23
+ *
24
+ * • IDEMPOTENT. Only newly-buffered text is ever processed; rendered text is
25
+ * never revisited. Re-restoring already-restored text is a no-op because
26
+ * originals are collision-guaranteed distinct from every surrogate, so
27
+ * nothing in the output matches a surrogate to replace again.
28
+ */
29
+
30
+ import type { RestoreResult } from '../types.js';
31
+ import type { Vault } from './vault.js';
32
+
33
+ /** ASCII/Unicode word character, for exact-match boundary checks. */
34
+ const WORD_CHAR = /[\p{L}\p{N}_]/u;
35
+
36
+ interface FuzzyEntry {
37
+ readonly surrogate: string;
38
+ readonly lower: string;
39
+ readonly original: string;
40
+ }
41
+
42
+ export interface RestorerOptions {
43
+ /** Enable the transformed-surrogate fuzzy fallback. Default true. */
44
+ readonly fuzzy?: boolean;
45
+ }
46
+
47
+ export class Restorer {
48
+ private buffer = '';
49
+ private out = '';
50
+ private restored = 0;
51
+ private done = false;
52
+
53
+ private readonly surrogatesByLength: readonly string[];
54
+ private readonly maxLen: number;
55
+ private readonly fuzzyByLower: ReadonlyMap<string, readonly FuzzyEntry[]>;
56
+ private readonly fuzzy: boolean;
57
+ private readonly vault: Vault;
58
+
59
+ constructor(vault: Vault, options: RestorerOptions = {}) {
60
+ this.vault = vault;
61
+ this.fuzzy = options.fuzzy ?? true;
62
+ const surrogates = vault.replacements();
63
+ this.surrogatesByLength = [...surrogates].sort((a, b) => b.length - a.length);
64
+ this.maxLen = surrogates.reduce((m, s) => Math.max(m, s.length), 0);
65
+
66
+ const fuzzyMap = new Map<string, FuzzyEntry[]>();
67
+ for (const surrogate of surrogates) {
68
+ const entry = vault.getBySurrogate(surrogate);
69
+ if (entry === undefined) continue;
70
+ const lower = surrogate.toLowerCase();
71
+ const list = fuzzyMap.get(lower) ?? [];
72
+ list.push({ surrogate, lower, original: entry.original });
73
+ fuzzyMap.set(lower, list);
74
+ }
75
+ this.fuzzyByLower = fuzzyMap;
76
+ }
77
+
78
+ /** Push the next stream chunk; returns the text newly rendered this call. */
79
+ push(chunk: string): string {
80
+ if (this.done) throw new Error('restorer: push after finish');
81
+ this.buffer += chunk;
82
+ return this.drain(false);
83
+ }
84
+
85
+ /** Flush the remainder; no more holding. Returns the final rendered text. */
86
+ finish(): string {
87
+ if (this.done) return '';
88
+ const tail = this.drain(true);
89
+ this.done = true;
90
+ return tail;
91
+ }
92
+
93
+ /** Everything rendered so far. */
94
+ get rendered(): string {
95
+ return this.out;
96
+ }
97
+
98
+ /** How many surrogate occurrences have been restored. */
99
+ get restoredCount(): number {
100
+ return this.restored;
101
+ }
102
+
103
+ /** Emit every settled portion of the buffer, holding what is still risky. */
104
+ private drain(final: boolean): string {
105
+ if (this.surrogatesByLength.length === 0) {
106
+ // Nothing to restore: pure passthrough, no holding.
107
+ const emit = this.buffer;
108
+ this.buffer = '';
109
+ this.out += emit;
110
+ return emit;
111
+ }
112
+
113
+ const holdFrom = final ? this.buffer.length : this.holdPoint();
114
+ const settled = this.buffer.slice(0, holdFrom);
115
+ this.buffer = this.buffer.slice(holdFrom);
116
+ const emitted = this.replaceSettled(settled);
117
+ this.out += emitted;
118
+ return emitted;
119
+ }
120
+
121
+ /**
122
+ * The earliest position from which the buffer must be held back:
123
+ * • the start of any suffix that is a proper prefix of a surrogate, and
124
+ * • (fuzzy on) the start of a trailing non-whitespace run, so the fuzzy
125
+ * pass always sees whole tokens rather than a word still being typed.
126
+ */
127
+ private holdPoint(): number {
128
+ const n = this.buffer.length;
129
+ let hold = n;
130
+
131
+ // A prefix-to-end can only begin within maxLen characters of the end.
132
+ const scanStart = Math.max(0, n - this.maxLen);
133
+ for (let p = scanStart; p < n; p++) {
134
+ const tail = this.buffer.slice(p);
135
+ if (this.isProperPrefixOfSurrogate(tail)) {
136
+ hold = Math.min(hold, p);
137
+ break; // earliest such p found
138
+ }
139
+ }
140
+
141
+ if (this.fuzzy) {
142
+ // Trailing run of non-whitespace = a token that may still be growing.
143
+ let w = n;
144
+ while (w > 0 && !/\s/.test(this.buffer[w - 1]!)) w--;
145
+ if (w < n) hold = Math.min(hold, w);
146
+ }
147
+
148
+ return hold;
149
+ }
150
+
151
+ private isProperPrefixOfSurrogate(tail: string): boolean {
152
+ if (tail.length === 0) return false;
153
+ for (const s of this.surrogatesByLength) {
154
+ if (s.length > tail.length && s.startsWith(tail)) return true;
155
+ }
156
+ return false;
157
+ }
158
+
159
+ /** Exact longest-match replacement, then the controlled fuzzy pass. */
160
+ private replaceSettled(text: string): string {
161
+ if (text.length === 0) return '';
162
+
163
+ // Exact pass.
164
+ let exact = '';
165
+ let i = 0;
166
+ while (i < text.length) {
167
+ const match = this.longestSurrogateAt(text, i);
168
+ if (match !== null) {
169
+ exact += this.vault.getBySurrogate(match)!.original;
170
+ this.restored += 1;
171
+ i += match.length;
172
+ } else {
173
+ exact += text[i];
174
+ i += 1;
175
+ }
176
+ }
177
+
178
+ return this.fuzzy ? this.fuzzyPass(exact) : exact;
179
+ }
180
+
181
+ /**
182
+ * Longest surrogate matching at `pos` WITH word-boundary semantics: a
183
+ * surrogate whose first/last character is a word character must not be
184
+ * glued to another word character in the text. Without this, a short
185
+ * surrogate ('Cat') corrupts an ordinary word ('Catalog' -> 'Org Onealog').
186
+ * Structured surrogates (emails, IBANs, PEM blocks) are unaffected because
187
+ * their neighbours in real text are punctuation or whitespace, and a
188
+ * surrogate ending in punctuation imposes no trailing constraint at all.
189
+ * Model-added affixes ('Northwinds') are handled by the fuzzy pass, which
190
+ * re-attaches what it strips.
191
+ */
192
+ private longestSurrogateAt(text: string, pos: number): string | null {
193
+ for (const s of this.surrogatesByLength) {
194
+ if (pos + s.length > text.length || !text.startsWith(s, pos)) continue;
195
+ const end = pos + s.length;
196
+ const startsWord = WORD_CHAR.test(s[0]!);
197
+ const endsWord = WORD_CHAR.test(s[s.length - 1]!);
198
+ if (startsWord && pos > 0 && WORD_CHAR.test(text[pos - 1]!)) continue;
199
+ if (endsWord && end < text.length && WORD_CHAR.test(text[end]!)) continue;
200
+ return s;
201
+ }
202
+ return null;
203
+ }
204
+
205
+ /**
206
+ * Per-token fuzzy restoration of transformed surrogates. Splits on
207
+ * whitespace, keeps the separators, and rewrites only tokens that resolve
208
+ * to exactly one surrogate under case / possessive / plural relaxation.
209
+ */
210
+ private fuzzyPass(text: string): string {
211
+ const pieces = text.split(/(\s+)/); // keep whitespace as odd-indexed pieces
212
+ for (let k = 0; k < pieces.length; k += 2) {
213
+ const token = pieces[k];
214
+ if (token === undefined || token.length === 0) continue;
215
+ const rewritten = this.fuzzyToken(token);
216
+ if (rewritten !== null) {
217
+ pieces[k] = rewritten;
218
+ this.restored += 1;
219
+ }
220
+ }
221
+ return pieces.join('');
222
+ }
223
+
224
+ /** Try to restore one whitespace-free token; null = leave it alone. */
225
+ private fuzzyToken(token: string): string | null {
226
+ // Peel surrounding punctuation so "Nils," and "(Nils)" still resolve;
227
+ // the peeled affixes are re-attached around the restored original.
228
+ const m = /^(\p{P}*)(.*?)(\p{P}*)$/u.exec(token);
229
+ if (m === null) return null;
230
+ const [, lead, coreRaw, trail] = m as unknown as [string, string, string, string];
231
+ if (coreRaw.length === 0) return null;
232
+
233
+ const resolved = this.resolveFuzzyCore(coreRaw);
234
+ if (resolved === null) return null; // zero or ambiguous → leave alone
235
+ // The stripped affix is re-attached to the ORIGINAL, so a model plural
236
+ // survives restoration ('Northwinds' -> 'Acme Corps') — except when the
237
+ // original already ends with the same letters, where re-attaching would
238
+ // only stutter ('Acme Holdings' + 's'). Either way the restored VALUE is
239
+ // right; perfect cross-language morphology is out of scope here.
240
+ const suffix =
241
+ resolved.suffix.length > 0 && resolved.original.toLowerCase().endsWith(resolved.suffix.toLowerCase())
242
+ ? ''
243
+ : resolved.suffix;
244
+ return `${lead}${resolved.original}${suffix}${trail}`;
245
+ }
246
+
247
+ /**
248
+ * Resolve a core token to exactly one original, under case-fold plus
249
+ * possessive/plural stripping, carrying the affix that was stripped.
250
+ * Returns null when zero or MORE THAN ONE distinct original is reachable —
251
+ * SPEC.md's hard rule that ambiguous matches are left alone.
252
+ */
253
+ private resolveFuzzyCore(core: string): { original: string; suffix: string } | null {
254
+ const lower = core.toLowerCase();
255
+ const forms: readonly (readonly [string, string])[] = [
256
+ [lower, ''],
257
+ [lower.replace(/['’]s$|['’]$/u, ''), core.slice(lower.replace(/['’]s$|['’]$/u, '').length)],
258
+ ...(/es$/i.test(core) ? ([[lower.replace(/es$/i, ''), core.slice(core.length - 2)]] as const) : []),
259
+ ...(/s$/i.test(core) ? ([[lower.replace(/s$/i, ''), core.slice(core.length - 1)]] as const) : []),
260
+ ];
261
+
262
+ const byOriginal = new Map<string, string>();
263
+ for (const [form, suffix] of forms) {
264
+ if (form === '' || form === lower && suffix !== '') continue;
265
+ const entries = this.fuzzyByLower.get(form);
266
+ if (entries === undefined) continue;
267
+ for (const e of entries) {
268
+ if (!byOriginal.has(e.original)) byOriginal.set(e.original, suffix);
269
+ }
270
+ }
271
+
272
+ if (byOriginal.size !== 1) return null;
273
+ const [original, suffix] = [...byOriginal.entries()][0]!;
274
+ return { original, suffix };
275
+ }
276
+ }
277
+
278
+ /** One-shot restoration of a complete (non-streamed) response. */
279
+ export function restore(text: string, vault: Vault, options: RestorerOptions = {}): RestoreResult {
280
+ const r = new Restorer(vault, options);
281
+ r.push(text);
282
+ r.finish();
283
+ return { restoredText: r.rendered, restoredCount: r.restoredCount, unmatchedReplacements: [] };
284
+ }
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Starter surrogate pools for the NER entity types (PERSON, ORG, LOCATION)
3
+ * and dates.
4
+ *
5
+ * These types are produced by Stage 2 (M6), which does not exist yet, so
6
+ * nothing in the M4 pipeline reaches them — but SPEC.md's substitution table
7
+ * requires them, and building the pools now lets the surrogate registry be
8
+ * complete and lets M6 plug in without touching this file's consumers.
9
+ *
10
+ * PERSON pools are grouped by SCRIPT and broad naming convention so that
11
+ * "Yuki Tanaka" is replaced by another East-Asian-convention name rather than
12
+ * "Bob Smith" (SPEC.md's explicit example). These are deliberately small,
13
+ * hand-picked, unmistakably-fictional pools; M7's gazetteers replace them
14
+ * with broad real-name coverage. Recorded in ARCHITECTURE.md D12.
15
+ */
16
+
17
+ import type { ScriptName } from '../types.js';
18
+
19
+ export interface PersonPool {
20
+ readonly script: ScriptName;
21
+ readonly given: readonly string[];
22
+ readonly surnames: readonly string[];
23
+ /** Order: given-first (Western) or family-first (East Asian). */
24
+ readonly order: 'given-first' | 'family-first';
25
+ /** Separator between the two parts. */
26
+ readonly sep: string;
27
+ }
28
+
29
+ export const PERSON_POOLS: readonly PersonPool[] = [
30
+ {
31
+ script: 'latin', order: 'given-first', sep: ' ',
32
+ given: ['Alex', 'Maria', 'Sofia', 'Lucas', 'Elena', 'Marco', 'Nadia', 'Oscar', 'Petra', 'Ravi'],
33
+ surnames: ['Fontaine', 'Delacroix', 'Marchetti', 'Ellison', 'Vandel', 'Rourke', 'Sandoval', 'Keller'],
34
+ },
35
+ {
36
+ script: 'cyrillic', order: 'given-first', sep: ' ',
37
+ given: ['Ирина', 'Дмитрий', 'Ольга', 'Сергей', 'Наталья', 'Павел'],
38
+ surnames: ['Соколова', 'Морозов', 'Волкова', 'Лебедев', 'Козлова', 'Новиков'],
39
+ },
40
+ {
41
+ script: 'greek', order: 'given-first', sep: ' ',
42
+ given: ['Γιώργος', 'Ελένη', 'Νίκος', 'Μαρία', 'Κώστας'],
43
+ surnames: ['Παπαδόπουλος', 'Νικολάου', 'Γεωργίου', 'Δημητρίου'],
44
+ },
45
+ {
46
+ script: 'arabic', order: 'given-first', sep: ' ',
47
+ given: ['ليلى', 'أحمد', 'فاطمة', 'يوسف', 'زينب'],
48
+ surnames: ['الحسن', 'المنصور', 'الصالح', 'الرشيد'],
49
+ },
50
+ {
51
+ script: 'hebrew', order: 'given-first', sep: ' ',
52
+ given: ['נועה', 'איתי', 'תמר', 'יונתן'],
53
+ surnames: ['לוי', 'כהן', 'פרץ', 'ביטון'],
54
+ },
55
+ {
56
+ script: 'devanagari', order: 'given-first', sep: ' ',
57
+ given: ['आरव', 'दिया', 'विवान', 'सान्या'],
58
+ surnames: ['शर्मा', 'वर्मा', 'गुप्ता', 'सिंह'],
59
+ },
60
+ {
61
+ script: 'han', order: 'family-first', sep: '',
62
+ given: ['伟', '芳', '娜', '强', '敏', '静'],
63
+ surnames: ['王', '李', '张', '刘', '陈'],
64
+ },
65
+ {
66
+ script: 'kana', order: 'family-first', sep: '',
67
+ given: ['ゆき', 'はると', 'さくら', 'れん'],
68
+ surnames: ['田中', '佐藤', '鈴木', '高橋'],
69
+ },
70
+ {
71
+ script: 'hangul', order: 'family-first', sep: '',
72
+ given: ['민준', '서연', '지호', '하은'],
73
+ surnames: ['김', '이', '박', '최'],
74
+ },
75
+ {
76
+ script: 'thai', order: 'given-first', sep: ' ',
77
+ given: ['สมชาย', 'สุดา', 'ประเสริฐ'],
78
+ surnames: ['แซ่ตั้ง', 'ศรีสุข', 'บุญมี'],
79
+ },
80
+ ];
81
+
82
+ /** Fallback pool when a detected script has no dedicated one. */
83
+ export const DEFAULT_PERSON_POOL = PERSON_POOLS[0]!;
84
+
85
+ /** Plausible fictional organization names. */
86
+ export const ORG_POOL: readonly string[] = [
87
+ 'Northwind Systems', 'Brightpath Analytics', 'Cedar Grove Holdings', 'Meridian Labs',
88
+ 'Quillfeather & Co.', 'Ashford Logistics', 'Blue Harbor Partners', 'Vireo Technologies',
89
+ 'Sunspire Media', 'Gravel & Stone LLC',
90
+ ];
91
+
92
+ /** Plausible fictional place names (cities). */
93
+ export const LOCATION_POOL: readonly string[] = [
94
+ 'Fairmont', 'Elderbrook', 'Port Haven', 'Westmere', 'Ashville Bay',
95
+ 'Cranleigh', 'Thornbury', 'Riverton', 'Oakmoor', 'Silverdale',
96
+ ];