clawsec 0.0.1

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 (361) hide show
  1. package/README.md +560 -0
  2. package/dist/bin/clawsec.d.ts +7 -0
  3. package/dist/bin/clawsec.d.ts.map +1 -0
  4. package/dist/bin/clawsec.js +12 -0
  5. package/dist/bin/clawsec.js.map +1 -0
  6. package/dist/src/actions/block.d.ts +22 -0
  7. package/dist/src/actions/block.d.ts.map +1 -0
  8. package/dist/src/actions/block.js +83 -0
  9. package/dist/src/actions/block.js.map +1 -0
  10. package/dist/src/actions/confirm.d.ts +35 -0
  11. package/dist/src/actions/confirm.d.ts.map +1 -0
  12. package/dist/src/actions/confirm.js +156 -0
  13. package/dist/src/actions/confirm.js.map +1 -0
  14. package/dist/src/actions/executor.d.ts +64 -0
  15. package/dist/src/actions/executor.d.ts.map +1 -0
  16. package/dist/src/actions/executor.js +114 -0
  17. package/dist/src/actions/executor.js.map +1 -0
  18. package/dist/src/actions/index.d.ts +13 -0
  19. package/dist/src/actions/index.d.ts.map +1 -0
  20. package/dist/src/actions/index.js +15 -0
  21. package/dist/src/actions/index.js.map +1 -0
  22. package/dist/src/actions/log.d.ts +19 -0
  23. package/dist/src/actions/log.d.ts.map +1 -0
  24. package/dist/src/actions/log.js +63 -0
  25. package/dist/src/actions/log.js.map +1 -0
  26. package/dist/src/actions/types.d.ts +85 -0
  27. package/dist/src/actions/types.d.ts.map +1 -0
  28. package/dist/src/actions/types.js +78 -0
  29. package/dist/src/actions/types.js.map +1 -0
  30. package/dist/src/actions/warn.d.ts +22 -0
  31. package/dist/src/actions/warn.d.ts.map +1 -0
  32. package/dist/src/actions/warn.js +84 -0
  33. package/dist/src/actions/warn.js.map +1 -0
  34. package/dist/src/approval/agent-confirm.d.ts +104 -0
  35. package/dist/src/approval/agent-confirm.d.ts.map +1 -0
  36. package/dist/src/approval/agent-confirm.js +173 -0
  37. package/dist/src/approval/agent-confirm.js.map +1 -0
  38. package/dist/src/approval/index.d.ts +14 -0
  39. package/dist/src/approval/index.d.ts.map +1 -0
  40. package/dist/src/approval/index.js +9 -0
  41. package/dist/src/approval/index.js.map +1 -0
  42. package/dist/src/approval/native.d.ts +56 -0
  43. package/dist/src/approval/native.d.ts.map +1 -0
  44. package/dist/src/approval/native.js +196 -0
  45. package/dist/src/approval/native.js.map +1 -0
  46. package/dist/src/approval/store.d.ts +88 -0
  47. package/dist/src/approval/store.d.ts.map +1 -0
  48. package/dist/src/approval/store.js +192 -0
  49. package/dist/src/approval/store.js.map +1 -0
  50. package/dist/src/approval/types.d.ts +119 -0
  51. package/dist/src/approval/types.d.ts.map +1 -0
  52. package/dist/src/approval/types.js +6 -0
  53. package/dist/src/approval/types.js.map +1 -0
  54. package/dist/src/approval/webhook.d.ts +170 -0
  55. package/dist/src/approval/webhook.d.ts.map +1 -0
  56. package/dist/src/approval/webhook.js +362 -0
  57. package/dist/src/approval/webhook.js.map +1 -0
  58. package/dist/src/cli/commands/audit.d.ts +43 -0
  59. package/dist/src/cli/commands/audit.d.ts.map +1 -0
  60. package/dist/src/cli/commands/audit.js +115 -0
  61. package/dist/src/cli/commands/audit.js.map +1 -0
  62. package/dist/src/cli/commands/feedback.d.ts +27 -0
  63. package/dist/src/cli/commands/feedback.d.ts.map +1 -0
  64. package/dist/src/cli/commands/feedback.js +228 -0
  65. package/dist/src/cli/commands/feedback.js.map +1 -0
  66. package/dist/src/cli/commands/index.d.ts +11 -0
  67. package/dist/src/cli/commands/index.d.ts.map +1 -0
  68. package/dist/src/cli/commands/index.js +13 -0
  69. package/dist/src/cli/commands/index.js.map +1 -0
  70. package/dist/src/cli/commands/status.d.ts +20 -0
  71. package/dist/src/cli/commands/status.d.ts.map +1 -0
  72. package/dist/src/cli/commands/status.js +122 -0
  73. package/dist/src/cli/commands/status.js.map +1 -0
  74. package/dist/src/cli/commands/test.d.ts +23 -0
  75. package/dist/src/cli/commands/test.d.ts.map +1 -0
  76. package/dist/src/cli/commands/test.js +134 -0
  77. package/dist/src/cli/commands/test.js.map +1 -0
  78. package/dist/src/cli/commands/types.d.ts +81 -0
  79. package/dist/src/cli/commands/types.d.ts.map +1 -0
  80. package/dist/src/cli/commands/types.js +6 -0
  81. package/dist/src/cli/commands/types.js.map +1 -0
  82. package/dist/src/cli/index.d.ts +17 -0
  83. package/dist/src/cli/index.d.ts.map +1 -0
  84. package/dist/src/cli/index.js +267 -0
  85. package/dist/src/cli/index.js.map +1 -0
  86. package/dist/src/config/defaults.d.ts +20 -0
  87. package/dist/src/config/defaults.d.ts.map +1 -0
  88. package/dist/src/config/defaults.js +123 -0
  89. package/dist/src/config/defaults.js.map +1 -0
  90. package/dist/src/config/index.d.ts +8 -0
  91. package/dist/src/config/index.d.ts.map +1 -0
  92. package/dist/src/config/index.js +41 -0
  93. package/dist/src/config/index.js.map +1 -0
  94. package/dist/src/config/loader.d.ts +99 -0
  95. package/dist/src/config/loader.d.ts.map +1 -0
  96. package/dist/src/config/loader.js +242 -0
  97. package/dist/src/config/loader.js.map +1 -0
  98. package/dist/src/config/schema.d.ts +627 -0
  99. package/dist/src/config/schema.d.ts.map +1 -0
  100. package/dist/src/config/schema.js +585 -0
  101. package/dist/src/config/schema.js.map +1 -0
  102. package/dist/src/detectors/destructive/cloud-detector.d.ts +51 -0
  103. package/dist/src/detectors/destructive/cloud-detector.d.ts.map +1 -0
  104. package/dist/src/detectors/destructive/cloud-detector.js +556 -0
  105. package/dist/src/detectors/destructive/cloud-detector.js.map +1 -0
  106. package/dist/src/detectors/destructive/code-detector.d.ts +59 -0
  107. package/dist/src/detectors/destructive/code-detector.d.ts.map +1 -0
  108. package/dist/src/detectors/destructive/code-detector.js +558 -0
  109. package/dist/src/detectors/destructive/code-detector.js.map +1 -0
  110. package/dist/src/detectors/destructive/index.d.ts +54 -0
  111. package/dist/src/detectors/destructive/index.d.ts.map +1 -0
  112. package/dist/src/detectors/destructive/index.js +168 -0
  113. package/dist/src/detectors/destructive/index.js.map +1 -0
  114. package/dist/src/detectors/destructive/shell-detector.d.ts +43 -0
  115. package/dist/src/detectors/destructive/shell-detector.d.ts.map +1 -0
  116. package/dist/src/detectors/destructive/shell-detector.js +302 -0
  117. package/dist/src/detectors/destructive/shell-detector.js.map +1 -0
  118. package/dist/src/detectors/destructive/types.d.ts +143 -0
  119. package/dist/src/detectors/destructive/types.d.ts.map +1 -0
  120. package/dist/src/detectors/destructive/types.js +6 -0
  121. package/dist/src/detectors/destructive/types.js.map +1 -0
  122. package/dist/src/detectors/exfiltration/cloud-detector.d.ts +51 -0
  123. package/dist/src/detectors/exfiltration/cloud-detector.d.ts.map +1 -0
  124. package/dist/src/detectors/exfiltration/cloud-detector.js +427 -0
  125. package/dist/src/detectors/exfiltration/cloud-detector.js.map +1 -0
  126. package/dist/src/detectors/exfiltration/http-detector.d.ts +47 -0
  127. package/dist/src/detectors/exfiltration/http-detector.d.ts.map +1 -0
  128. package/dist/src/detectors/exfiltration/http-detector.js +429 -0
  129. package/dist/src/detectors/exfiltration/http-detector.js.map +1 -0
  130. package/dist/src/detectors/exfiltration/index.d.ts +44 -0
  131. package/dist/src/detectors/exfiltration/index.d.ts.map +1 -0
  132. package/dist/src/detectors/exfiltration/index.js +118 -0
  133. package/dist/src/detectors/exfiltration/index.js.map +1 -0
  134. package/dist/src/detectors/exfiltration/network-detector.d.ts +55 -0
  135. package/dist/src/detectors/exfiltration/network-detector.d.ts.map +1 -0
  136. package/dist/src/detectors/exfiltration/network-detector.js +504 -0
  137. package/dist/src/detectors/exfiltration/network-detector.js.map +1 -0
  138. package/dist/src/detectors/exfiltration/types.d.ts +139 -0
  139. package/dist/src/detectors/exfiltration/types.d.ts.map +1 -0
  140. package/dist/src/detectors/exfiltration/types.js +6 -0
  141. package/dist/src/detectors/exfiltration/types.js.map +1 -0
  142. package/dist/src/detectors/purchase/domain-detector.d.ts +44 -0
  143. package/dist/src/detectors/purchase/domain-detector.d.ts.map +1 -0
  144. package/dist/src/detectors/purchase/domain-detector.js +296 -0
  145. package/dist/src/detectors/purchase/domain-detector.js.map +1 -0
  146. package/dist/src/detectors/purchase/form-detector.d.ts +27 -0
  147. package/dist/src/detectors/purchase/form-detector.d.ts.map +1 -0
  148. package/dist/src/detectors/purchase/form-detector.js +344 -0
  149. package/dist/src/detectors/purchase/form-detector.js.map +1 -0
  150. package/dist/src/detectors/purchase/index.d.ts +65 -0
  151. package/dist/src/detectors/purchase/index.d.ts.map +1 -0
  152. package/dist/src/detectors/purchase/index.js +216 -0
  153. package/dist/src/detectors/purchase/index.js.map +1 -0
  154. package/dist/src/detectors/purchase/spend-tracker.d.ts +132 -0
  155. package/dist/src/detectors/purchase/spend-tracker.d.ts.map +1 -0
  156. package/dist/src/detectors/purchase/spend-tracker.js +313 -0
  157. package/dist/src/detectors/purchase/spend-tracker.js.map +1 -0
  158. package/dist/src/detectors/purchase/types.d.ts +139 -0
  159. package/dist/src/detectors/purchase/types.d.ts.map +1 -0
  160. package/dist/src/detectors/purchase/types.js +6 -0
  161. package/dist/src/detectors/purchase/types.js.map +1 -0
  162. package/dist/src/detectors/purchase/url-detector.d.ts +31 -0
  163. package/dist/src/detectors/purchase/url-detector.d.ts.map +1 -0
  164. package/dist/src/detectors/purchase/url-detector.js +292 -0
  165. package/dist/src/detectors/purchase/url-detector.js.map +1 -0
  166. package/dist/src/detectors/secrets/api-key-detector.d.ts +30 -0
  167. package/dist/src/detectors/secrets/api-key-detector.d.ts.map +1 -0
  168. package/dist/src/detectors/secrets/api-key-detector.js +297 -0
  169. package/dist/src/detectors/secrets/api-key-detector.js.map +1 -0
  170. package/dist/src/detectors/secrets/index.d.ts +43 -0
  171. package/dist/src/detectors/secrets/index.d.ts.map +1 -0
  172. package/dist/src/detectors/secrets/index.js +261 -0
  173. package/dist/src/detectors/secrets/index.js.map +1 -0
  174. package/dist/src/detectors/secrets/pii-detector.d.ts +54 -0
  175. package/dist/src/detectors/secrets/pii-detector.d.ts.map +1 -0
  176. package/dist/src/detectors/secrets/pii-detector.js +286 -0
  177. package/dist/src/detectors/secrets/pii-detector.js.map +1 -0
  178. package/dist/src/detectors/secrets/token-detector.d.ts +51 -0
  179. package/dist/src/detectors/secrets/token-detector.d.ts.map +1 -0
  180. package/dist/src/detectors/secrets/token-detector.js +233 -0
  181. package/dist/src/detectors/secrets/token-detector.js.map +1 -0
  182. package/dist/src/detectors/secrets/types.d.ts +157 -0
  183. package/dist/src/detectors/secrets/types.d.ts.map +1 -0
  184. package/dist/src/detectors/secrets/types.js +6 -0
  185. package/dist/src/detectors/secrets/types.js.map +1 -0
  186. package/dist/src/detectors/website/category-detector.d.ts +22 -0
  187. package/dist/src/detectors/website/category-detector.d.ts.map +1 -0
  188. package/dist/src/detectors/website/category-detector.js +162 -0
  189. package/dist/src/detectors/website/category-detector.js.map +1 -0
  190. package/dist/src/detectors/website/index.d.ts +53 -0
  191. package/dist/src/detectors/website/index.d.ts.map +1 -0
  192. package/dist/src/detectors/website/index.js +232 -0
  193. package/dist/src/detectors/website/index.js.map +1 -0
  194. package/dist/src/detectors/website/pattern-matcher.d.ts +33 -0
  195. package/dist/src/detectors/website/pattern-matcher.d.ts.map +1 -0
  196. package/dist/src/detectors/website/pattern-matcher.js +121 -0
  197. package/dist/src/detectors/website/pattern-matcher.js.map +1 -0
  198. package/dist/src/detectors/website/types.d.ts +105 -0
  199. package/dist/src/detectors/website/types.d.ts.map +1 -0
  200. package/dist/src/detectors/website/types.js +6 -0
  201. package/dist/src/detectors/website/types.js.map +1 -0
  202. package/dist/src/engine/analyzer.d.ts +87 -0
  203. package/dist/src/engine/analyzer.d.ts.map +1 -0
  204. package/dist/src/engine/analyzer.js +427 -0
  205. package/dist/src/engine/analyzer.js.map +1 -0
  206. package/dist/src/engine/cache.d.ts +80 -0
  207. package/dist/src/engine/cache.d.ts.map +1 -0
  208. package/dist/src/engine/cache.js +167 -0
  209. package/dist/src/engine/cache.js.map +1 -0
  210. package/dist/src/engine/index.d.ts +11 -0
  211. package/dist/src/engine/index.d.ts.map +1 -0
  212. package/dist/src/engine/index.js +11 -0
  213. package/dist/src/engine/index.js.map +1 -0
  214. package/dist/src/engine/llm-client.d.ts +210 -0
  215. package/dist/src/engine/llm-client.d.ts.map +1 -0
  216. package/dist/src/engine/llm-client.js +506 -0
  217. package/dist/src/engine/llm-client.js.map +1 -0
  218. package/dist/src/engine/types.d.ts +163 -0
  219. package/dist/src/engine/types.d.ts.map +1 -0
  220. package/dist/src/engine/types.js +21 -0
  221. package/dist/src/engine/types.js.map +1 -0
  222. package/dist/src/feedback/index.d.ts +9 -0
  223. package/dist/src/feedback/index.d.ts.map +1 -0
  224. package/dist/src/feedback/index.js +8 -0
  225. package/dist/src/feedback/index.js.map +1 -0
  226. package/dist/src/feedback/learner.d.ts +222 -0
  227. package/dist/src/feedback/learner.d.ts.map +1 -0
  228. package/dist/src/feedback/learner.js +401 -0
  229. package/dist/src/feedback/learner.js.map +1 -0
  230. package/dist/src/feedback/store.d.ts +113 -0
  231. package/dist/src/feedback/store.d.ts.map +1 -0
  232. package/dist/src/feedback/store.js +228 -0
  233. package/dist/src/feedback/store.js.map +1 -0
  234. package/dist/src/feedback/types.d.ts +126 -0
  235. package/dist/src/feedback/types.d.ts.map +1 -0
  236. package/dist/src/feedback/types.js +6 -0
  237. package/dist/src/feedback/types.js.map +1 -0
  238. package/dist/src/hooks/before-agent-start/handler.d.ts +37 -0
  239. package/dist/src/hooks/before-agent-start/handler.d.ts.map +1 -0
  240. package/dist/src/hooks/before-agent-start/handler.js +109 -0
  241. package/dist/src/hooks/before-agent-start/handler.js.map +1 -0
  242. package/dist/src/hooks/before-agent-start/index.d.ts +8 -0
  243. package/dist/src/hooks/before-agent-start/index.d.ts.map +1 -0
  244. package/dist/src/hooks/before-agent-start/index.js +7 -0
  245. package/dist/src/hooks/before-agent-start/index.js.map +1 -0
  246. package/dist/src/hooks/before-agent-start/prompts.d.ts +48 -0
  247. package/dist/src/hooks/before-agent-start/prompts.d.ts.map +1 -0
  248. package/dist/src/hooks/before-agent-start/prompts.js +103 -0
  249. package/dist/src/hooks/before-agent-start/prompts.js.map +1 -0
  250. package/dist/src/hooks/before-tool-call/handler.d.ts +42 -0
  251. package/dist/src/hooks/before-tool-call/handler.d.ts.map +1 -0
  252. package/dist/src/hooks/before-tool-call/handler.js +226 -0
  253. package/dist/src/hooks/before-tool-call/handler.js.map +1 -0
  254. package/dist/src/hooks/before-tool-call/index.d.ts +7 -0
  255. package/dist/src/hooks/before-tool-call/index.d.ts.map +1 -0
  256. package/dist/src/hooks/before-tool-call/index.js +6 -0
  257. package/dist/src/hooks/before-tool-call/index.js.map +1 -0
  258. package/dist/src/hooks/tool-result-persist/filter.d.ts +72 -0
  259. package/dist/src/hooks/tool-result-persist/filter.d.ts.map +1 -0
  260. package/dist/src/hooks/tool-result-persist/filter.js +305 -0
  261. package/dist/src/hooks/tool-result-persist/filter.js.map +1 -0
  262. package/dist/src/hooks/tool-result-persist/handler.d.ts +49 -0
  263. package/dist/src/hooks/tool-result-persist/handler.d.ts.map +1 -0
  264. package/dist/src/hooks/tool-result-persist/handler.js +217 -0
  265. package/dist/src/hooks/tool-result-persist/handler.js.map +1 -0
  266. package/dist/src/hooks/tool-result-persist/index.d.ts +11 -0
  267. package/dist/src/hooks/tool-result-persist/index.d.ts.map +1 -0
  268. package/dist/src/hooks/tool-result-persist/index.js +11 -0
  269. package/dist/src/hooks/tool-result-persist/index.js.map +1 -0
  270. package/dist/src/index.d.ts +256 -0
  271. package/dist/src/index.d.ts.map +1 -0
  272. package/dist/src/index.js +222 -0
  273. package/dist/src/index.js.map +1 -0
  274. package/dist/src/notifications/discord.d.ts +10 -0
  275. package/dist/src/notifications/discord.d.ts.map +1 -0
  276. package/dist/src/notifications/discord.js +218 -0
  277. package/dist/src/notifications/discord.js.map +1 -0
  278. package/dist/src/notifications/index.d.ts +37 -0
  279. package/dist/src/notifications/index.d.ts.map +1 -0
  280. package/dist/src/notifications/index.js +68 -0
  281. package/dist/src/notifications/index.js.map +1 -0
  282. package/dist/src/notifications/slack.d.ts +10 -0
  283. package/dist/src/notifications/slack.d.ts.map +1 -0
  284. package/dist/src/notifications/slack.js +218 -0
  285. package/dist/src/notifications/slack.js.map +1 -0
  286. package/dist/src/notifications/telegram.d.ts +10 -0
  287. package/dist/src/notifications/telegram.d.ts.map +1 -0
  288. package/dist/src/notifications/telegram.js +242 -0
  289. package/dist/src/notifications/telegram.js.map +1 -0
  290. package/dist/src/notifications/types.d.ts +119 -0
  291. package/dist/src/notifications/types.d.ts.map +1 -0
  292. package/dist/src/notifications/types.js +6 -0
  293. package/dist/src/notifications/types.js.map +1 -0
  294. package/dist/src/proxy/index.d.ts +8 -0
  295. package/dist/src/proxy/index.d.ts.map +1 -0
  296. package/dist/src/proxy/index.js +9 -0
  297. package/dist/src/proxy/index.js.map +1 -0
  298. package/dist/src/proxy/middleware.d.ts +55 -0
  299. package/dist/src/proxy/middleware.d.ts.map +1 -0
  300. package/dist/src/proxy/middleware.js +215 -0
  301. package/dist/src/proxy/middleware.js.map +1 -0
  302. package/dist/src/proxy/server.d.ts +57 -0
  303. package/dist/src/proxy/server.d.ts.map +1 -0
  304. package/dist/src/proxy/server.js +298 -0
  305. package/dist/src/proxy/server.js.map +1 -0
  306. package/dist/src/proxy/types.d.ts +136 -0
  307. package/dist/src/proxy/types.d.ts.map +1 -0
  308. package/dist/src/proxy/types.js +6 -0
  309. package/dist/src/proxy/types.js.map +1 -0
  310. package/dist/src/sanitization/index.d.ts +10 -0
  311. package/dist/src/sanitization/index.d.ts.map +1 -0
  312. package/dist/src/sanitization/index.js +9 -0
  313. package/dist/src/sanitization/index.js.map +1 -0
  314. package/dist/src/sanitization/patterns.d.ts +51 -0
  315. package/dist/src/sanitization/patterns.d.ts.map +1 -0
  316. package/dist/src/sanitization/patterns.js +266 -0
  317. package/dist/src/sanitization/patterns.js.map +1 -0
  318. package/dist/src/sanitization/scanner.d.ts +29 -0
  319. package/dist/src/sanitization/scanner.d.ts.map +1 -0
  320. package/dist/src/sanitization/scanner.js +328 -0
  321. package/dist/src/sanitization/scanner.js.map +1 -0
  322. package/dist/src/sanitization/types.d.ts +57 -0
  323. package/dist/src/sanitization/types.d.ts.map +1 -0
  324. package/dist/src/sanitization/types.js +5 -0
  325. package/dist/src/sanitization/types.js.map +1 -0
  326. package/openclaw.plugin.json +114 -0
  327. package/package.json +63 -0
  328. package/rules/builtin/README.md +139 -0
  329. package/rules/builtin/ai-services.yaml +70 -0
  330. package/rules/builtin/api-keys.yaml +64 -0
  331. package/rules/builtin/authentication.yaml +56 -0
  332. package/rules/builtin/aws-security.yaml +57 -0
  333. package/rules/builtin/azure-security.yaml +58 -0
  334. package/rules/builtin/cicd-security.yaml +64 -0
  335. package/rules/builtin/cloud-storage.yaml +64 -0
  336. package/rules/builtin/container-registry.yaml +55 -0
  337. package/rules/builtin/crypto-wallets.yaml +71 -0
  338. package/rules/builtin/database-nosql.yaml +58 -0
  339. package/rules/builtin/database-sql.yaml +62 -0
  340. package/rules/builtin/development-env.yaml +67 -0
  341. package/rules/builtin/docker.yaml +57 -0
  342. package/rules/builtin/filesystem.yaml +71 -0
  343. package/rules/builtin/financial-pci.yaml +61 -0
  344. package/rules/builtin/gcp-security.yaml +57 -0
  345. package/rules/builtin/git-operations.yaml +68 -0
  346. package/rules/builtin/healthcare-hipaa.yaml +64 -0
  347. package/rules/builtin/kubernetes.yaml +60 -0
  348. package/rules/builtin/messaging-services.yaml +53 -0
  349. package/rules/builtin/minimal.yaml +47 -0
  350. package/rules/builtin/mobile-development.yaml +61 -0
  351. package/rules/builtin/monitoring.yaml +63 -0
  352. package/rules/builtin/network-security.yaml +57 -0
  353. package/rules/builtin/package-managers.yaml +74 -0
  354. package/rules/builtin/payment-processing.yaml +66 -0
  355. package/rules/builtin/pii-protection.yaml +48 -0
  356. package/rules/builtin/production-strict.yaml +55 -0
  357. package/rules/builtin/secrets-management.yaml +63 -0
  358. package/rules/builtin/serverless.yaml +74 -0
  359. package/rules/builtin/ssh-security.yaml +66 -0
  360. package/rules/builtin/terraform.yaml +51 -0
  361. package/rules/builtin/web-security.yaml +62 -0
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Token Detector
3
+ * Detects tokens including JWTs, Bearer tokens, and session tokens
4
+ */
5
+ import type { SecretsDetectionResult, SecretSubDetector, TokenMatch } from './types.js';
6
+ import type { Severity } from '../../config/index.js';
7
+ /**
8
+ * Validate JWT structure
9
+ * Returns true if the token appears to be a valid JWT
10
+ */
11
+ export declare function isValidJwtStructure(token: string): boolean;
12
+ /**
13
+ * Match JWTs in text
14
+ */
15
+ export declare function matchJwt(text: string): TokenMatch[];
16
+ /**
17
+ * Match Bearer tokens in text
18
+ */
19
+ export declare function matchBearerToken(text: string): TokenMatch[];
20
+ /**
21
+ * Match session tokens in text
22
+ */
23
+ export declare function matchSessionToken(text: string): TokenMatch[];
24
+ /**
25
+ * Match refresh tokens in text
26
+ */
27
+ export declare function matchRefreshToken(text: string): TokenMatch[];
28
+ /**
29
+ * Match generic access tokens in text
30
+ */
31
+ export declare function matchAccessToken(text: string): TokenMatch[];
32
+ /**
33
+ * Match all token types in text
34
+ */
35
+ export declare function matchTokens(text: string): TokenMatch[];
36
+ /**
37
+ * Token Detector class
38
+ */
39
+ export declare class TokenDetector implements SecretSubDetector {
40
+ private severity;
41
+ constructor(severity: Severity);
42
+ /**
43
+ * Scan text for tokens
44
+ */
45
+ scan(text: string, location: string): SecretsDetectionResult[];
46
+ }
47
+ /**
48
+ * Create a token detector
49
+ */
50
+ export declare function createTokenDetector(severity: Severity): TokenDetector;
51
+ //# sourceMappingURL=token-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-detector.d.ts","sourceRoot":"","sources":["../../../../src/detectors/secrets/token-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,sBAAsB,EACtB,iBAAiB,EACjB,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAuCtD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAwB1D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAmBnD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAqB3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAuB5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAuB5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CA0B3D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAUtD;AAED;;GAEG;AACH,qBAAa,aAAc,YAAW,iBAAiB;IACrD,OAAO,CAAC,QAAQ,CAAW;gBAEf,QAAQ,EAAE,QAAQ;IAI9B;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,EAAE;CAiB/D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,aAAa,CAErE"}
@@ -0,0 +1,233 @@
1
+ /**
2
+ * Token Detector
3
+ * Detects tokens including JWTs, Bearer tokens, and session tokens
4
+ */
5
+ import { redactValue } from './api-key-detector.js';
6
+ /**
7
+ * JWT pattern - three base64url-encoded parts separated by dots
8
+ * Header starts with eyJ (base64 for '{"')
9
+ */
10
+ const JWT_PATTERN = /\beyJ[A-Za-z0-9_-]*\.eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]+\b/g;
11
+ /**
12
+ * Bearer token pattern in Authorization header
13
+ */
14
+ const BEARER_PATTERN = /\b(?:Bearer|bearer|BEARER)\s+([A-Za-z0-9_.-]+)\b/g;
15
+ /**
16
+ * Session token patterns
17
+ */
18
+ const SESSION_PATTERNS = [
19
+ /\bsession_[A-Za-z0-9_-]{20,}\b/g,
20
+ /\bsess_[A-Za-z0-9_-]{20,}\b/g,
21
+ /\bsid[_-][A-Za-z0-9_-]{20,}\b/gi,
22
+ ];
23
+ /**
24
+ * Refresh token patterns
25
+ */
26
+ const REFRESH_PATTERNS = [
27
+ /\brefresh_[A-Za-z0-9_-]{20,}\b/g,
28
+ /\brt_[A-Za-z0-9_-]{20,}\b/g,
29
+ ];
30
+ /**
31
+ * Access token patterns (generic)
32
+ */
33
+ const ACCESS_TOKEN_PATTERNS = [
34
+ /\baccess_token[_=:]["']?([A-Za-z0-9_.-]{20,})["']?/gi,
35
+ /\btoken[_=:]["']?([A-Za-z0-9_.-]{32,})["']?/gi,
36
+ ];
37
+ /**
38
+ * Validate JWT structure
39
+ * Returns true if the token appears to be a valid JWT
40
+ */
41
+ export function isValidJwtStructure(token) {
42
+ const parts = token.split('.');
43
+ if (parts.length !== 3)
44
+ return false;
45
+ // Each part should be base64url encoded
46
+ const base64UrlRegex = /^[A-Za-z0-9_-]+$/;
47
+ if (!parts.every(part => base64UrlRegex.test(part)))
48
+ return false;
49
+ // Try to decode and parse the header
50
+ try {
51
+ const header = JSON.parse(atob(parts[0].replace(/-/g, '+').replace(/_/g, '/')));
52
+ // JWT headers typically have 'alg' and optionally 'typ'
53
+ if (!header.alg)
54
+ return false;
55
+ // Try to decode the payload (should be valid JSON)
56
+ const payload = JSON.parse(atob(parts[1].replace(/-/g, '+').replace(/_/g, '/')));
57
+ // Payload should be an object
58
+ if (typeof payload !== 'object' || payload === null)
59
+ return false;
60
+ return true;
61
+ }
62
+ catch {
63
+ // If we can't parse it, it's likely not a valid JWT
64
+ return false;
65
+ }
66
+ }
67
+ /**
68
+ * Match JWTs in text
69
+ */
70
+ export function matchJwt(text) {
71
+ const matches = [];
72
+ const regex = new RegExp(JWT_PATTERN.source, JWT_PATTERN.flags);
73
+ let match;
74
+ while ((match = regex.exec(text)) !== null) {
75
+ const value = match[0];
76
+ const isValid = isValidJwtStructure(value);
77
+ matches.push({
78
+ matched: true,
79
+ tokenType: 'jwt',
80
+ value,
81
+ redactedValue: redactValue(value, 10, 6),
82
+ confidence: isValid ? 0.95 : 0.70,
83
+ });
84
+ }
85
+ return matches;
86
+ }
87
+ /**
88
+ * Match Bearer tokens in text
89
+ */
90
+ export function matchBearerToken(text) {
91
+ const matches = [];
92
+ const regex = new RegExp(BEARER_PATTERN.source, BEARER_PATTERN.flags);
93
+ let match;
94
+ while ((match = regex.exec(text)) !== null) {
95
+ const value = match[1] || match[0];
96
+ // Skip if it looks like a JWT (will be caught by JWT detector)
97
+ if (value.startsWith('eyJ'))
98
+ continue;
99
+ matches.push({
100
+ matched: true,
101
+ tokenType: 'bearer',
102
+ value,
103
+ redactedValue: redactValue(value),
104
+ confidence: 0.85,
105
+ });
106
+ }
107
+ return matches;
108
+ }
109
+ /**
110
+ * Match session tokens in text
111
+ */
112
+ export function matchSessionToken(text) {
113
+ const matches = [];
114
+ const seen = new Set();
115
+ for (const pattern of SESSION_PATTERNS) {
116
+ const regex = new RegExp(pattern.source, pattern.flags);
117
+ let match;
118
+ while ((match = regex.exec(text)) !== null) {
119
+ const value = match[0];
120
+ if (seen.has(value))
121
+ continue;
122
+ seen.add(value);
123
+ matches.push({
124
+ matched: true,
125
+ tokenType: 'session',
126
+ value,
127
+ redactedValue: redactValue(value),
128
+ confidence: 0.85,
129
+ });
130
+ }
131
+ }
132
+ return matches;
133
+ }
134
+ /**
135
+ * Match refresh tokens in text
136
+ */
137
+ export function matchRefreshToken(text) {
138
+ const matches = [];
139
+ const seen = new Set();
140
+ for (const pattern of REFRESH_PATTERNS) {
141
+ const regex = new RegExp(pattern.source, pattern.flags);
142
+ let match;
143
+ while ((match = regex.exec(text)) !== null) {
144
+ const value = match[0];
145
+ if (seen.has(value))
146
+ continue;
147
+ seen.add(value);
148
+ matches.push({
149
+ matched: true,
150
+ tokenType: 'refresh',
151
+ value,
152
+ redactedValue: redactValue(value),
153
+ confidence: 0.85,
154
+ });
155
+ }
156
+ }
157
+ return matches;
158
+ }
159
+ /**
160
+ * Match generic access tokens in text
161
+ */
162
+ export function matchAccessToken(text) {
163
+ const matches = [];
164
+ const seen = new Set();
165
+ for (const pattern of ACCESS_TOKEN_PATTERNS) {
166
+ const regex = new RegExp(pattern.source, pattern.flags);
167
+ let match;
168
+ while ((match = regex.exec(text)) !== null) {
169
+ const value = match[1] || match[0];
170
+ if (seen.has(value))
171
+ continue;
172
+ seen.add(value);
173
+ // Skip if it looks like a JWT
174
+ if (value.startsWith('eyJ'))
175
+ continue;
176
+ matches.push({
177
+ matched: true,
178
+ tokenType: 'bearer', // Treat generic access tokens as bearer-like
179
+ value,
180
+ redactedValue: redactValue(value),
181
+ confidence: 0.70,
182
+ });
183
+ }
184
+ }
185
+ return matches;
186
+ }
187
+ /**
188
+ * Match all token types in text
189
+ */
190
+ export function matchTokens(text) {
191
+ const allMatches = [];
192
+ allMatches.push(...matchJwt(text));
193
+ allMatches.push(...matchBearerToken(text));
194
+ allMatches.push(...matchSessionToken(text));
195
+ allMatches.push(...matchRefreshToken(text));
196
+ allMatches.push(...matchAccessToken(text));
197
+ return allMatches;
198
+ }
199
+ /**
200
+ * Token Detector class
201
+ */
202
+ export class TokenDetector {
203
+ severity;
204
+ constructor(severity) {
205
+ this.severity = severity;
206
+ }
207
+ /**
208
+ * Scan text for tokens
209
+ */
210
+ scan(text, location) {
211
+ const matches = matchTokens(text);
212
+ return matches.map((match) => ({
213
+ detected: true,
214
+ category: 'secrets',
215
+ severity: this.severity,
216
+ confidence: match.confidence,
217
+ reason: `Detected ${match.tokenType.toUpperCase()} token`,
218
+ metadata: {
219
+ type: 'token',
220
+ subtype: match.tokenType,
221
+ redactedValue: match.redactedValue,
222
+ location,
223
+ },
224
+ }));
225
+ }
226
+ }
227
+ /**
228
+ * Create a token detector
229
+ */
230
+ export function createTokenDetector(severity) {
231
+ return new TokenDetector(severity);
232
+ }
233
+ //# sourceMappingURL=token-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-detector.js","sourceRoot":"","sources":["../../../../src/detectors/secrets/token-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Secrets Detector Types
3
+ * Type definitions for detecting secrets, tokens, and PII
4
+ */
5
+ import type { Severity, Action } from '../../config/index.js';
6
+ /**
7
+ * Detection context passed to detectors
8
+ */
9
+ export interface SecretsDetectionContext {
10
+ /** Name of the tool being invoked */
11
+ toolName: string;
12
+ /** Input parameters to the tool */
13
+ toolInput: Record<string, unknown>;
14
+ /** Output from the tool (if scanning output) */
15
+ toolOutput?: string;
16
+ }
17
+ /**
18
+ * Type of secret detected
19
+ */
20
+ export type SecretType = 'api-key' | 'token' | 'credential' | 'pii';
21
+ /**
22
+ * Provider of the detected API key
23
+ */
24
+ export type ApiKeyProvider = 'openai' | 'aws' | 'github' | 'stripe' | 'slack' | 'google' | 'anthropic' | 'generic';
25
+ /**
26
+ * Type of token detected
27
+ */
28
+ export type TokenType = 'jwt' | 'bearer' | 'session' | 'refresh';
29
+ /**
30
+ * Type of PII detected
31
+ */
32
+ export type PiiType = 'ssn' | 'credit-card' | 'email';
33
+ /**
34
+ * Result of a secrets detection
35
+ */
36
+ export interface SecretsDetectionResult {
37
+ /** Whether a secret was detected */
38
+ detected: boolean;
39
+ /** Category of the detection */
40
+ category: 'secrets';
41
+ /** Severity level of the detection */
42
+ severity: Severity;
43
+ /** Confidence score from 0 to 1 */
44
+ confidence: number;
45
+ /** Human-readable reason for the detection */
46
+ reason: string;
47
+ /** Additional metadata about the detection */
48
+ metadata?: {
49
+ /** Type of secret detected */
50
+ type: SecretType;
51
+ /** Provider for API keys */
52
+ provider?: string;
53
+ /** Redacted value showing first/last few chars with *** */
54
+ redactedValue?: string;
55
+ /** Where the secret was found (input/output, field name) */
56
+ location?: string;
57
+ /** Specific subtype (jwt, ssn, etc.) */
58
+ subtype?: string;
59
+ };
60
+ }
61
+ /**
62
+ * Configuration for the secrets detector
63
+ */
64
+ export interface SecretsDetectorConfig {
65
+ /** Whether the detector is enabled */
66
+ enabled: boolean;
67
+ /** Severity level to assign to detections */
68
+ severity: Severity;
69
+ /** Action to take when secret is detected */
70
+ action: Action;
71
+ }
72
+ /**
73
+ * Interface for the main secrets detector
74
+ */
75
+ export interface SecretsDetector {
76
+ /**
77
+ * Detect secrets in the given context
78
+ * @param context Detection context with tool information
79
+ * @returns Detection result (may contain multiple matches)
80
+ */
81
+ detect(context: SecretsDetectionContext): Promise<SecretsDetectionResult>;
82
+ }
83
+ /**
84
+ * Interface for sub-detectors (api-key, token, pii)
85
+ */
86
+ export interface SecretSubDetector {
87
+ /**
88
+ * Scan text for secrets
89
+ * @param text Text to scan
90
+ * @param location Description of where the text came from
91
+ * @returns Array of detection results
92
+ */
93
+ scan(text: string, location: string): SecretsDetectionResult[];
94
+ }
95
+ /**
96
+ * API key match result
97
+ */
98
+ export interface ApiKeyMatch {
99
+ /** Whether a match was found */
100
+ matched: boolean;
101
+ /** The provider of the API key */
102
+ provider: ApiKeyProvider;
103
+ /** The original matched value */
104
+ value: string;
105
+ /** Redacted value for safe display */
106
+ redactedValue: string;
107
+ /** Confidence score */
108
+ confidence: number;
109
+ }
110
+ /**
111
+ * Token match result
112
+ */
113
+ export interface TokenMatch {
114
+ /** Whether a match was found */
115
+ matched: boolean;
116
+ /** Type of token */
117
+ tokenType: TokenType;
118
+ /** The original matched value */
119
+ value: string;
120
+ /** Redacted value for safe display */
121
+ redactedValue: string;
122
+ /** Confidence score */
123
+ confidence: number;
124
+ }
125
+ /**
126
+ * PII match result
127
+ */
128
+ export interface PiiMatch {
129
+ /** Whether a match was found */
130
+ matched: boolean;
131
+ /** Type of PII */
132
+ piiType: PiiType;
133
+ /** The original matched value */
134
+ value: string;
135
+ /** Redacted value for safe display */
136
+ redactedValue: string;
137
+ /** Confidence score */
138
+ confidence: number;
139
+ /** Whether Luhn validation passed (for credit cards) */
140
+ luhnValid?: boolean;
141
+ }
142
+ /**
143
+ * Credential match result
144
+ */
145
+ export interface CredentialMatch {
146
+ /** Whether a match was found */
147
+ matched: boolean;
148
+ /** Type of credential pattern */
149
+ credentialType: string;
150
+ /** The matched value (usually key=value) */
151
+ value: string;
152
+ /** Redacted value */
153
+ redactedValue: string;
154
+ /** Confidence score */
155
+ confidence: number;
156
+ }
157
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/detectors/secrets/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Secrets Detector Types
3
+ * Type definitions for detecting secrets, tokens, and PII
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/detectors/secrets/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Category Detector
3
+ * Detects website categories like malware, phishing, gambling, adult content
4
+ */
5
+ import type { CategoryDetectionResult, WebsiteCategory } from './types.js';
6
+ /**
7
+ * Detect website category based on domain patterns
8
+ */
9
+ export declare function detectCategory(domain: string): CategoryDetectionResult;
10
+ /**
11
+ * Check if a category is considered dangerous (malware, phishing)
12
+ */
13
+ export declare function isDangerousCategory(category: WebsiteCategory): boolean;
14
+ /**
15
+ * Check if a category is considered optional/warning-only (gambling, adult)
16
+ */
17
+ export declare function isWarningCategory(category: WebsiteCategory): boolean;
18
+ /**
19
+ * Get severity description for a category
20
+ */
21
+ export declare function getCategorySeverityDescription(category: WebsiteCategory): string;
22
+ //# sourceMappingURL=category-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"category-detector.d.ts","sourceRoot":"","sources":["../../../../src/detectors/website/category-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA0H3E;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,uBAAuB,CAoBtE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAEtE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAEpE;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAahF"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Category Detector
3
+ * Detects website categories like malware, phishing, gambling, adult content
4
+ */
5
+ import { matchesGlobPattern } from './pattern-matcher.js';
6
+ /**
7
+ * Known malware domain patterns
8
+ * These patterns match domains commonly associated with malware distribution
9
+ */
10
+ const MALWARE_PATTERNS = [
11
+ // Common malware domain patterns
12
+ '*.malware.*',
13
+ '*.virus.*',
14
+ '*.trojan.*',
15
+ '*.exploit.*',
16
+ 'malware-*.*',
17
+ '*-malware.*',
18
+ '*.malicious.*',
19
+ // Suspicious TLDs often used for malware
20
+ '*.xyz',
21
+ '*.tk',
22
+ '*.ml',
23
+ '*.ga',
24
+ '*.cf',
25
+ '*.gq',
26
+ // Download/crack sites (common malware vectors)
27
+ '*crack*.*',
28
+ '*keygen*.*',
29
+ '*warez*.*',
30
+ '*pirat*.*',
31
+ ];
32
+ /**
33
+ * Known phishing domain patterns
34
+ * These patterns match domains commonly used for phishing attacks
35
+ */
36
+ const PHISHING_PATTERNS = [
37
+ // Phishing keyword patterns
38
+ 'phishing-*.*',
39
+ '*-phishing.*',
40
+ '*.phishing.*',
41
+ // Common phishing techniques
42
+ '*login-secure*.*',
43
+ '*secure-login*.*',
44
+ '*account-verify*.*',
45
+ '*verify-account*.*',
46
+ '*update-payment*.*',
47
+ '*payment-update*.*',
48
+ '*confirm-identity*.*',
49
+ '*identity-confirm*.*',
50
+ // Lookalike domain patterns (suspicious)
51
+ '*-signin.*',
52
+ '*signin-*.*',
53
+ '*-login.*',
54
+ '*login-*.*',
55
+ '*paypa1*.*', // Paypal with 1 instead of l
56
+ '*g00gle*.*', // Google with 0 instead of o
57
+ '*amaz0n*.*', // Amazon with 0 instead of o
58
+ '*faceb00k*.*', // Facebook with 0 instead of o
59
+ '*micros0ft*.*', // Microsoft with 0 instead of o
60
+ '*app1e*.*', // Apple with 1 instead of l
61
+ // Urgent action domains
62
+ '*urgent-*.*',
63
+ '*-urgent.*',
64
+ '*suspended-*.*',
65
+ '*-suspended.*',
66
+ ];
67
+ /**
68
+ * Gambling domain patterns
69
+ */
70
+ const GAMBLING_PATTERNS = [
71
+ '*.casino.*',
72
+ '*.bet.*',
73
+ '*.poker.*',
74
+ '*.slots.*',
75
+ '*.gambling.*',
76
+ '*casino*.*',
77
+ '*betting*.*',
78
+ '*poker*.*',
79
+ '*blackjack*.*',
80
+ '*roulette*.*',
81
+ '*lottery*.*',
82
+ '*jackpot*.*',
83
+ '*.888casino.*',
84
+ '*.bet365.*',
85
+ '*.pokerstars.*',
86
+ '*.draftkings.*',
87
+ '*.fanduel.*',
88
+ ];
89
+ /**
90
+ * Adult content domain patterns
91
+ */
92
+ const ADULT_PATTERNS = [
93
+ '*.adult.*',
94
+ '*.xxx.*',
95
+ '*.porn*.*',
96
+ '*porn*.*',
97
+ '*.sex.*',
98
+ '*adult*.*',
99
+ '*.nsfw.*',
100
+ '*nsfw*.*',
101
+ ];
102
+ /**
103
+ * Category patterns with their severity
104
+ */
105
+ const CATEGORY_PATTERNS = [
106
+ { category: 'malware', patterns: MALWARE_PATTERNS, defaultConfidence: 0.85 },
107
+ { category: 'phishing', patterns: PHISHING_PATTERNS, defaultConfidence: 0.80 },
108
+ { category: 'gambling', patterns: GAMBLING_PATTERNS, defaultConfidence: 0.90 },
109
+ { category: 'adult', patterns: ADULT_PATTERNS, defaultConfidence: 0.90 },
110
+ ];
111
+ /**
112
+ * Detect website category based on domain patterns
113
+ */
114
+ export function detectCategory(domain) {
115
+ const domainLower = domain.toLowerCase();
116
+ for (const { category, patterns, defaultConfidence } of CATEGORY_PATTERNS) {
117
+ for (const pattern of patterns) {
118
+ if (matchesGlobPattern(domainLower, pattern)) {
119
+ return {
120
+ detected: true,
121
+ category,
122
+ matchedPattern: pattern,
123
+ confidence: defaultConfidence,
124
+ };
125
+ }
126
+ }
127
+ }
128
+ return {
129
+ detected: false,
130
+ confidence: 0,
131
+ };
132
+ }
133
+ /**
134
+ * Check if a category is considered dangerous (malware, phishing)
135
+ */
136
+ export function isDangerousCategory(category) {
137
+ return category === 'malware' || category === 'phishing';
138
+ }
139
+ /**
140
+ * Check if a category is considered optional/warning-only (gambling, adult)
141
+ */
142
+ export function isWarningCategory(category) {
143
+ return category === 'gambling' || category === 'adult';
144
+ }
145
+ /**
146
+ * Get severity description for a category
147
+ */
148
+ export function getCategorySeverityDescription(category) {
149
+ switch (category) {
150
+ case 'malware':
151
+ return 'potential malware distribution site';
152
+ case 'phishing':
153
+ return 'potential phishing site';
154
+ case 'gambling':
155
+ return 'gambling website';
156
+ case 'adult':
157
+ return 'adult content website';
158
+ default:
159
+ return 'unknown category';
160
+ }
161
+ }
162
+ //# sourceMappingURL=category-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"category-detector.js","sourceRoot":"","sources":["../../../../src/detectors/website/category-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;GAGG;AACH,MAAM,gBAAgB,GAAG;IACvB,iCAAiC;IACjC,aAAa;IACb,WAAW;IACX,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,eAAe;IAEf,yCAAyC;IACzC,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IAEN,gDAAgD;IAChD,WAAW;IACX,YAAY;IACZ,WAAW;IACX,WAAW;CACZ,CAAC;AAEF;;;GAGG;AACH,MAAM,iBAAiB,GAAG;IACxB,4BAA4B;IAC5B,cAAc;IACd,cAAc;IACd,cAAc;IAEd,6BAA6B;IAC7B,kBAAkB;IAClB,kBAAkB;IAClB,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IACpB,sBAAsB;IACtB,sBAAsB;IAEtB,yCAAyC;IACzC,YAAY;IACZ,aAAa;IACb,WAAW;IACX,YAAY;IACZ,YAAY,EAAO,6BAA6B;IAChD,YAAY,EAAO,6BAA6B;IAChD,YAAY,EAAO,6BAA6B;IAChD,cAAc,EAAK,+BAA+B;IAClD,eAAe,EAAI,gCAAgC;IACnD,WAAW,EAAQ,4BAA4B;IAE/C,wBAAwB;IACxB,aAAa;IACb,YAAY;IACZ,gBAAgB;IAChB,eAAe;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,iBAAiB,GAAG;IACxB,YAAY;IACZ,SAAS;IACT,WAAW;IACX,WAAW;IACX,cAAc;IACd,YAAY;IACZ,aAAa;IACb,WAAW;IACX,eAAe;IACf,cAAc;IACd,aAAa;IACb,aAAa;IACb,eAAe;IACf,YAAY;IACZ,gBAAgB;IAChB,gBAAgB;IAChB,aAAa;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,cAAc,GAAG;IACrB,WAAW;IACX,SAAS;IACT,WAAW;IACX,UAAU;IACV,SAAS;IACT,WAAW;IACX,UAAU;IACV,UAAU;CACX,CAAC;AAEF;;GAEG;AACH,MAAM,iBAAiB,GAIlB;IACH,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,IAAI,EAAE;IAC5E,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,EAAE;IAC9E,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,EAAE;IAC9E,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,iBAAiB,EAAE,IAAI,EAAE;CACzE,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAEzC,KAAK,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,iBAAiB,EAAE,CAAC;QAC1E,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC7C,OAAO;oBACL,QAAQ,EAAE,IAAI;oBACd,QAAQ;oBACR,cAAc,EAAE,OAAO;oBACvB,UAAU,EAAE,iBAAiB;iBAC9B,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,CAAC;KACd,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAyB;IAC3D,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,UAAU,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAyB;IACzD,OAAO,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,OAAO,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAAC,QAAyB;IACtE,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,qCAAqC,CAAC;QAC/C,KAAK,UAAU;YACb,OAAO,yBAAyB,CAAC;QACnC,KAAK,UAAU;YACb,OAAO,kBAAkB,CAAC;QAC5B,KAAK,OAAO;YACV,OAAO,uBAAuB,CAAC;QACjC;YACE,OAAO,kBAAkB,CAAC;IAC9B,CAAC;AACH,CAAC"}