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,344 @@
1
+ /**
2
+ * Form Field Detector
3
+ * Detects payment-related form fields and inputs
4
+ */
5
+ /**
6
+ * Credit card field patterns (field names, IDs, or labels)
7
+ */
8
+ const CREDIT_CARD_PATTERNS = [
9
+ // Card number
10
+ 'card-number',
11
+ 'cardnumber',
12
+ 'card_number',
13
+ 'cardNumber',
14
+ 'credit-card',
15
+ 'creditcard',
16
+ 'credit_card',
17
+ 'creditCard',
18
+ 'cc-number',
19
+ 'ccnumber',
20
+ 'cc_number',
21
+ 'ccNumber',
22
+ 'pan', // Primary Account Number
23
+ 'account-number',
24
+ 'accountnumber',
25
+ // CVV/CVC
26
+ 'cvv',
27
+ 'cvc',
28
+ 'cvv2',
29
+ 'cvc2',
30
+ 'security-code',
31
+ 'securitycode',
32
+ 'security_code',
33
+ 'securityCode',
34
+ 'card-security',
35
+ 'card-code',
36
+ 'verification-code',
37
+ 'verificationcode',
38
+ 'csv', // Card Security Value
39
+ // Expiry
40
+ 'expiry',
41
+ 'expiration',
42
+ 'exp-date',
43
+ 'expdate',
44
+ 'exp_date',
45
+ 'expDate',
46
+ 'exp-month',
47
+ 'expmonth',
48
+ 'exp_month',
49
+ 'expMonth',
50
+ 'exp-year',
51
+ 'expyear',
52
+ 'exp_year',
53
+ 'expYear',
54
+ 'card-expiry',
55
+ 'cardexpiry',
56
+ 'mm-yy',
57
+ 'mmyy',
58
+ 'mm/yy',
59
+ // Card holder
60
+ 'cardholder',
61
+ 'card-holder',
62
+ 'card_holder',
63
+ 'cardHolder',
64
+ 'name-on-card',
65
+ 'nameoncard',
66
+ 'name_on_card',
67
+ 'nameOnCard',
68
+ ];
69
+ /**
70
+ * Billing address field patterns
71
+ */
72
+ const BILLING_PATTERNS = [
73
+ 'billing-address',
74
+ 'billingaddress',
75
+ 'billing_address',
76
+ 'billingAddress',
77
+ 'billing-street',
78
+ 'billing-city',
79
+ 'billing-state',
80
+ 'billing-zip',
81
+ 'billing-postal',
82
+ 'billing-country',
83
+ 'payment-address',
84
+ 'paymentaddress',
85
+ 'payment_address',
86
+ ];
87
+ /**
88
+ * Payment method field patterns
89
+ */
90
+ const PAYMENT_METHOD_PATTERNS = [
91
+ 'payment-method',
92
+ 'paymentmethod',
93
+ 'payment_method',
94
+ 'paymentMethod',
95
+ 'payment-type',
96
+ 'paymenttype',
97
+ 'payment_type',
98
+ 'paymentType',
99
+ 'pay-with',
100
+ 'paywith',
101
+ 'pay_with',
102
+ 'card-type',
103
+ 'cardtype',
104
+ 'card_type',
105
+ ];
106
+ /**
107
+ * Bank account patterns
108
+ */
109
+ const BANK_ACCOUNT_PATTERNS = [
110
+ 'routing-number',
111
+ 'routingnumber',
112
+ 'routing_number',
113
+ 'routingNumber',
114
+ 'bank-account',
115
+ 'bankaccount',
116
+ 'bank_account',
117
+ 'bankAccount',
118
+ 'account-number',
119
+ 'iban',
120
+ 'swift',
121
+ 'bic',
122
+ 'aba',
123
+ ];
124
+ /**
125
+ * Amount/Price patterns
126
+ */
127
+ const AMOUNT_PATTERNS = [
128
+ 'amount',
129
+ 'price',
130
+ 'total',
131
+ 'subtotal',
132
+ 'payment-amount',
133
+ 'paymentamount',
134
+ 'payment_amount',
135
+ 'charge-amount',
136
+ 'transaction-amount',
137
+ ];
138
+ /**
139
+ * All payment-related patterns combined
140
+ */
141
+ const ALL_PAYMENT_PATTERNS = [
142
+ ...CREDIT_CARD_PATTERNS,
143
+ ...BILLING_PATTERNS,
144
+ ...PAYMENT_METHOD_PATTERNS,
145
+ ...BANK_ACCOUNT_PATTERNS,
146
+ ...AMOUNT_PATTERNS,
147
+ ];
148
+ /**
149
+ * High-confidence patterns (definitely payment related)
150
+ */
151
+ const HIGH_CONFIDENCE_PATTERNS = [
152
+ ...CREDIT_CARD_PATTERNS,
153
+ ...BANK_ACCOUNT_PATTERNS,
154
+ ];
155
+ /**
156
+ * Check if a field name/id matches payment patterns
157
+ */
158
+ function matchesPattern(field, patterns) {
159
+ const fieldLower = field.toLowerCase().replace(/[-_\s]/g, '');
160
+ for (const pattern of patterns) {
161
+ const patternLower = pattern.toLowerCase().replace(/[-_\s]/g, '');
162
+ if (fieldLower.includes(patternLower) || patternLower.includes(fieldLower)) {
163
+ return pattern;
164
+ }
165
+ }
166
+ return null;
167
+ }
168
+ /**
169
+ * Extract field names from tool input
170
+ */
171
+ function extractFieldNames(input) {
172
+ const fields = [];
173
+ // Direct field names in input
174
+ for (const key of Object.keys(input)) {
175
+ fields.push(key);
176
+ }
177
+ // Check for fields array (common in form-filling tools)
178
+ if (Array.isArray(input.fields)) {
179
+ for (const field of input.fields) {
180
+ if (typeof field === 'string') {
181
+ fields.push(field);
182
+ }
183
+ else if (typeof field === 'object' && field !== null) {
184
+ const fieldObj = field;
185
+ if (typeof fieldObj.name === 'string') {
186
+ fields.push(fieldObj.name);
187
+ }
188
+ if (typeof fieldObj.id === 'string') {
189
+ fields.push(fieldObj.id);
190
+ }
191
+ if (typeof fieldObj.label === 'string') {
192
+ fields.push(fieldObj.label);
193
+ }
194
+ if (typeof fieldObj.ref === 'string') {
195
+ fields.push(fieldObj.ref);
196
+ }
197
+ }
198
+ }
199
+ }
200
+ // Check for selector patterns (Playwright/Puppeteer style)
201
+ if (typeof input.selector === 'string') {
202
+ fields.push(input.selector);
203
+ }
204
+ if (typeof input.ref === 'string') {
205
+ fields.push(input.ref);
206
+ }
207
+ if (typeof input.element === 'string') {
208
+ fields.push(input.element);
209
+ }
210
+ // Check nested objects
211
+ for (const value of Object.values(input)) {
212
+ if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
213
+ const nested = value;
214
+ for (const key of Object.keys(nested)) {
215
+ fields.push(key);
216
+ }
217
+ }
218
+ }
219
+ return fields;
220
+ }
221
+ /**
222
+ * Match form fields against payment patterns
223
+ */
224
+ export function matchFormFields(fields) {
225
+ const matchedFields = [];
226
+ const matchedPatterns = [];
227
+ let highConfidenceMatch = false;
228
+ for (const field of fields) {
229
+ // Check high-confidence patterns first
230
+ const highMatch = matchesPattern(field, HIGH_CONFIDENCE_PATTERNS);
231
+ if (highMatch) {
232
+ matchedFields.push(field);
233
+ matchedPatterns.push(highMatch);
234
+ highConfidenceMatch = true;
235
+ continue;
236
+ }
237
+ // Check all patterns
238
+ const match = matchesPattern(field, ALL_PAYMENT_PATTERNS);
239
+ if (match) {
240
+ matchedFields.push(field);
241
+ matchedPatterns.push(match);
242
+ }
243
+ }
244
+ if (matchedFields.length === 0) {
245
+ return { matched: false, confidence: 0 };
246
+ }
247
+ // Calculate confidence based on matches
248
+ let confidence;
249
+ if (highConfidenceMatch) {
250
+ // High confidence for credit card/bank fields
251
+ confidence = 0.9;
252
+ }
253
+ else if (matchedFields.length >= 3) {
254
+ // Multiple billing/payment fields
255
+ confidence = 0.85;
256
+ }
257
+ else if (matchedFields.length >= 2) {
258
+ confidence = 0.75;
259
+ }
260
+ else {
261
+ // Single match, lower confidence
262
+ confidence = 0.6;
263
+ }
264
+ return {
265
+ matched: true,
266
+ fields: matchedFields,
267
+ patterns: matchedPatterns,
268
+ confidence,
269
+ };
270
+ }
271
+ /**
272
+ * Check if text content contains payment-related values
273
+ */
274
+ export function containsPaymentValues(text) {
275
+ // Credit card number pattern (13-19 digits, possibly with spaces/dashes)
276
+ const cardNumberRegex = /\b(?:\d{4}[-\s]?){3,4}\d{1,4}\b/;
277
+ if (cardNumberRegex.test(text)) {
278
+ return true;
279
+ }
280
+ // CVV pattern (3-4 digits)
281
+ const cvvRegex = /\bcvv[:\s]*\d{3,4}\b/i;
282
+ if (cvvRegex.test(text)) {
283
+ return true;
284
+ }
285
+ // Expiry date pattern (MM/YY or MM/YYYY)
286
+ const expiryRegex = /\b(?:0[1-9]|1[0-2])[-/]\d{2,4}\b/;
287
+ if (expiryRegex.test(text)) {
288
+ return true;
289
+ }
290
+ return false;
291
+ }
292
+ /**
293
+ * Form field detector class
294
+ */
295
+ export class FormDetector {
296
+ severity;
297
+ constructor(severity = 'critical') {
298
+ this.severity = severity;
299
+ }
300
+ detect(context) {
301
+ const fields = extractFieldNames(context.toolInput);
302
+ if (fields.length === 0) {
303
+ return null;
304
+ }
305
+ const result = matchFormFields(fields);
306
+ if (!result.matched) {
307
+ // Also check for payment values in string inputs
308
+ for (const value of Object.values(context.toolInput)) {
309
+ if (typeof value === 'string' && containsPaymentValues(value)) {
310
+ return {
311
+ detected: true,
312
+ category: 'purchase',
313
+ severity: this.severity,
314
+ confidence: 0.8,
315
+ reason: 'Detected payment-related data (credit card number, CVV, or expiry)',
316
+ metadata: {
317
+ formFields: ['[embedded payment data]'],
318
+ },
319
+ };
320
+ }
321
+ }
322
+ return null;
323
+ }
324
+ const fieldList = result.fields?.join(', ') || '';
325
+ return {
326
+ detected: true,
327
+ category: 'purchase',
328
+ severity: this.severity,
329
+ confidence: result.confidence,
330
+ reason: `Detected payment form fields: ${fieldList}`,
331
+ metadata: {
332
+ formFields: result.fields,
333
+ matchedPattern: result.patterns?.join(', '),
334
+ },
335
+ };
336
+ }
337
+ }
338
+ /**
339
+ * Create a form detector with the given configuration
340
+ */
341
+ export function createFormDetector(severity = 'critical') {
342
+ return new FormDetector(severity);
343
+ }
344
+ //# sourceMappingURL=form-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-detector.js","sourceRoot":"","sources":["../../../../src/detectors/purchase/form-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Purchase Detector
3
+ * Main detector that combines domain, URL, and form field detection
4
+ */
5
+ import type { DetectionContext, DetectionResult, PurchaseDetector as IPurchaseDetector, PurchaseDetectorConfig } from './types.js';
6
+ import { SpendTracker } from './spend-tracker.js';
7
+ import type { PurchaseRule, SpendLimits } from '../../config/index.js';
8
+ export * from './types.js';
9
+ export { DomainDetector, createDomainDetector } from './domain-detector.js';
10
+ export { UrlDetector, createUrlDetector } from './url-detector.js';
11
+ export { FormDetector, createFormDetector } from './form-detector.js';
12
+ export { extractDomain, matchDomain, globToRegex, matchesGlobPattern, hasPaymentKeyword, } from './domain-detector.js';
13
+ export { extractPath, matchUrlPath } from './url-detector.js';
14
+ export { matchFormFields, containsPaymentValues } from './form-detector.js';
15
+ export { SpendTracker, createSpendTracker, getGlobalSpendTracker, resetGlobalSpendTracker, extractAmountFromInput, extractAmount, type SpendRecord, type SpendLimitResult, type ISpendTracker, } from './spend-tracker.js';
16
+ /**
17
+ * Main purchase detector implementation
18
+ */
19
+ export declare class PurchaseDetectorImpl implements IPurchaseDetector {
20
+ private config;
21
+ private domainDetector;
22
+ private urlDetector;
23
+ private formDetector;
24
+ private spendTracker;
25
+ constructor(config: PurchaseDetectorConfig, spendTracker?: SpendTracker);
26
+ detect(context: DetectionContext): Promise<DetectionResult>;
27
+ /**
28
+ * Check spend limits and enhance detection result
29
+ */
30
+ private checkSpendLimits;
31
+ /**
32
+ * Record a transaction after it has been approved
33
+ * Call this when a purchase is allowed to proceed
34
+ */
35
+ recordTransaction(amount: number, metadata?: {
36
+ transactionId?: string;
37
+ domain?: string;
38
+ }): void;
39
+ /**
40
+ * Get the spend tracker instance
41
+ */
42
+ getSpendTracker(): SpendTracker;
43
+ /**
44
+ * Get the configured action for detected purchases
45
+ */
46
+ getAction(): "block" | "confirm" | "agent-confirm" | "warn" | "log";
47
+ /**
48
+ * Check if the detector is enabled
49
+ */
50
+ isEnabled(): boolean;
51
+ /**
52
+ * Get the configured spend limits
53
+ */
54
+ getSpendLimits(): SpendLimits | undefined;
55
+ }
56
+ /**
57
+ * Create a purchase detector from PurchaseRule configuration
58
+ */
59
+ export declare function createPurchaseDetector(rule: PurchaseRule, spendTracker?: SpendTracker): PurchaseDetectorImpl;
60
+ /**
61
+ * Create a purchase detector with default configuration
62
+ */
63
+ export declare function createDefaultPurchaseDetector(): PurchaseDetectorImpl;
64
+ export default PurchaseDetectorImpl;
65
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/detectors/purchase/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,gBAAgB,IAAI,iBAAiB,EACrC,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,YAAY,EAGb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,YAAY,EAAY,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGjF,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EACL,aAAa,EACb,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAG5E,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,aAAa,GACnB,MAAM,oBAAoB,CAAC;AAuE5B;;GAEG;AACH,qBAAa,oBAAqB,YAAW,iBAAiB;IAC5D,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,YAAY,CAAe;gBAEvB,MAAM,EAAE,sBAAsB,EAAE,YAAY,CAAC,EAAE,YAAY;IAajE,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAsBjE;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA4CxB;;;OAGG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAI/F;;OAEG;IACH,eAAe,IAAI,YAAY;IAI/B;;OAEG;IACH,SAAS;IAIT;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,cAAc,IAAI,WAAW,GAAG,SAAS;CAG1C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC,EAAE,YAAY,GAAG,oBAAoB,CAgB5G;AAED;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,oBAAoB,CAMpE;AAGD,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Purchase Detector
3
+ * Main detector that combines domain, URL, and form field detection
4
+ */
5
+ import { createDomainDetector } from './domain-detector.js';
6
+ import { createUrlDetector } from './url-detector.js';
7
+ import { createFormDetector } from './form-detector.js';
8
+ import { getGlobalSpendTracker, extractAmountFromInput, } from './spend-tracker.js';
9
+ // Re-export types
10
+ export * from './types.js';
11
+ // Re-export sub-detectors
12
+ export { DomainDetector, createDomainDetector } from './domain-detector.js';
13
+ export { UrlDetector, createUrlDetector } from './url-detector.js';
14
+ export { FormDetector, createFormDetector } from './form-detector.js';
15
+ export { extractDomain, matchDomain, globToRegex, matchesGlobPattern, hasPaymentKeyword, } from './domain-detector.js';
16
+ export { extractPath, matchUrlPath } from './url-detector.js';
17
+ export { matchFormFields, containsPaymentValues } from './form-detector.js';
18
+ // Re-export spend tracker
19
+ export { SpendTracker, createSpendTracker, getGlobalSpendTracker, resetGlobalSpendTracker, extractAmountFromInput, extractAmount, } from './spend-tracker.js';
20
+ /**
21
+ * No detection result (used when disabled or no match)
22
+ */
23
+ function noDetection(severity) {
24
+ return {
25
+ detected: false,
26
+ category: 'purchase',
27
+ severity,
28
+ confidence: 0,
29
+ reason: 'No purchase activity detected',
30
+ };
31
+ }
32
+ /**
33
+ * Combine multiple detection results, taking the highest confidence
34
+ */
35
+ function combineResults(results, severity) {
36
+ const validResults = results.filter((r) => r !== null && r.detected);
37
+ if (validResults.length === 0) {
38
+ return noDetection(severity);
39
+ }
40
+ // Sort by confidence (highest first)
41
+ validResults.sort((a, b) => b.confidence - a.confidence);
42
+ // Take the highest confidence result as primary
43
+ const primary = validResults[0];
44
+ // Merge metadata from all results
45
+ const mergedMetadata = {
46
+ ...primary.metadata,
47
+ };
48
+ // Collect all form fields
49
+ const allFormFields = [];
50
+ for (const result of validResults) {
51
+ if (result.metadata?.formFields) {
52
+ allFormFields.push(...result.metadata.formFields);
53
+ }
54
+ }
55
+ if (allFormFields.length > 0) {
56
+ mergedMetadata.formFields = [...new Set(allFormFields)];
57
+ }
58
+ // Build combined reason
59
+ let reason = primary.reason;
60
+ if (validResults.length > 1) {
61
+ const additionalReasons = validResults.slice(1).map(r => r.reason);
62
+ reason = `${primary.reason}. Additional signals: ${additionalReasons.join('; ')}`;
63
+ }
64
+ // Boost confidence if multiple detectors triggered
65
+ let confidence = primary.confidence;
66
+ if (validResults.length >= 2) {
67
+ // Boost confidence but cap at 0.99
68
+ confidence = Math.min(0.99, confidence + 0.05 * (validResults.length - 1));
69
+ }
70
+ return {
71
+ detected: true,
72
+ category: 'purchase',
73
+ severity,
74
+ confidence,
75
+ reason,
76
+ metadata: mergedMetadata,
77
+ };
78
+ }
79
+ /**
80
+ * Main purchase detector implementation
81
+ */
82
+ export class PurchaseDetectorImpl {
83
+ config;
84
+ domainDetector;
85
+ urlDetector;
86
+ formDetector;
87
+ spendTracker;
88
+ constructor(config, spendTracker) {
89
+ this.config = config;
90
+ const customBlocklist = config.domains?.mode === 'blocklist'
91
+ ? (config.domains.blocklist || [])
92
+ : [];
93
+ this.domainDetector = createDomainDetector(config.severity, customBlocklist);
94
+ this.urlDetector = createUrlDetector(config.severity);
95
+ this.formDetector = createFormDetector(config.severity);
96
+ this.spendTracker = spendTracker || getGlobalSpendTracker();
97
+ }
98
+ async detect(context) {
99
+ // Check if detector is enabled
100
+ if (!this.config.enabled) {
101
+ return noDetection(this.config.severity);
102
+ }
103
+ // Run all sub-detectors
104
+ const domainResult = this.domainDetector.detect(context);
105
+ const urlResult = this.urlDetector.detect(context);
106
+ const formResult = this.formDetector.detect(context);
107
+ // Combine results
108
+ let result = combineResults([domainResult, urlResult, formResult], this.config.severity);
109
+ // If purchase detected and spend limits configured, check limits
110
+ if (result.detected && this.config.spendLimits) {
111
+ result = this.checkSpendLimits(result, context);
112
+ }
113
+ return result;
114
+ }
115
+ /**
116
+ * Check spend limits and enhance detection result
117
+ */
118
+ checkSpendLimits(result, context) {
119
+ const limits = this.config.spendLimits;
120
+ if (!limits) {
121
+ return result;
122
+ }
123
+ // Try to extract amount from the tool input
124
+ const amount = extractAmountFromInput(context.toolInput);
125
+ // If no amount found, use per-transaction limit as the assumed amount
126
+ // This is a security-first approach - assume worst case if unknown
127
+ const effectiveAmount = amount ?? limits.perTransaction;
128
+ // Check limits
129
+ const limitResult = this.spendTracker.checkLimits(effectiveAmount, limits);
130
+ // Enhance metadata with amount info
131
+ const enhancedMetadata = {
132
+ ...result.metadata,
133
+ amount: amount ?? undefined,
134
+ currentDailyTotal: limitResult.currentDailyTotal,
135
+ };
136
+ // If limits exceeded, add to reason
137
+ if (!limitResult.allowed) {
138
+ enhancedMetadata.exceededLimit = limitResult.exceededLimit;
139
+ const limitReason = limitResult.message ||
140
+ `Spend limit exceeded: ${limitResult.exceededLimit}`;
141
+ return {
142
+ ...result,
143
+ reason: `${result.reason}. ${limitReason}`,
144
+ metadata: enhancedMetadata,
145
+ };
146
+ }
147
+ // Limits not exceeded but amount detected - add to metadata
148
+ return {
149
+ ...result,
150
+ metadata: enhancedMetadata,
151
+ };
152
+ }
153
+ /**
154
+ * Record a transaction after it has been approved
155
+ * Call this when a purchase is allowed to proceed
156
+ */
157
+ recordTransaction(amount, metadata) {
158
+ this.spendTracker.record(amount, metadata);
159
+ }
160
+ /**
161
+ * Get the spend tracker instance
162
+ */
163
+ getSpendTracker() {
164
+ return this.spendTracker;
165
+ }
166
+ /**
167
+ * Get the configured action for detected purchases
168
+ */
169
+ getAction() {
170
+ return this.config.action;
171
+ }
172
+ /**
173
+ * Check if the detector is enabled
174
+ */
175
+ isEnabled() {
176
+ return this.config.enabled;
177
+ }
178
+ /**
179
+ * Get the configured spend limits
180
+ */
181
+ getSpendLimits() {
182
+ return this.config.spendLimits;
183
+ }
184
+ }
185
+ /**
186
+ * Create a purchase detector from PurchaseRule configuration
187
+ */
188
+ export function createPurchaseDetector(rule, spendTracker) {
189
+ const config = {
190
+ enabled: rule.enabled,
191
+ severity: rule.severity,
192
+ action: rule.action,
193
+ domains: rule.domains ? {
194
+ mode: rule.domains.mode,
195
+ blocklist: rule.domains.blocklist,
196
+ } : undefined,
197
+ spendLimits: rule.spendLimits ? {
198
+ perTransaction: rule.spendLimits.perTransaction,
199
+ daily: rule.spendLimits.daily,
200
+ } : undefined,
201
+ };
202
+ return new PurchaseDetectorImpl(config, spendTracker);
203
+ }
204
+ /**
205
+ * Create a purchase detector with default configuration
206
+ */
207
+ export function createDefaultPurchaseDetector() {
208
+ return new PurchaseDetectorImpl({
209
+ enabled: true,
210
+ severity: 'critical',
211
+ action: 'block',
212
+ });
213
+ }
214
+ // Default export
215
+ export default PurchaseDetectorImpl;
216
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/detectors/purchase/index.ts"],"names":[],"mappings":"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"}