shield360 1.1.0 → 1.2.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 (400) hide show
  1. package/README.md +330 -3
  2. package/dist/__tests__/build-info.test.js +8 -1
  3. package/dist/__tests__/build-info.test.js.map +1 -1
  4. package/dist/__tests__/code-location.test.js +1 -1
  5. package/dist/__tests__/destination.test.js +15 -0
  6. package/dist/__tests__/destination.test.js.map +1 -1
  7. package/dist/__tests__/masking.test.d.ts +1 -0
  8. package/dist/__tests__/masking.test.js +66 -0
  9. package/dist/__tests__/masking.test.js.map +1 -0
  10. package/dist/__tests__/register.e2e.test.d.ts +1 -0
  11. package/dist/__tests__/register.e2e.test.js +279 -0
  12. package/dist/__tests__/register.e2e.test.js.map +1 -0
  13. package/dist/__tests__/register.test.js +60 -0
  14. package/dist/__tests__/register.test.js.map +1 -1
  15. package/dist/agents/__tests__/agents.test.d.ts +1 -0
  16. package/dist/agents/__tests__/agents.test.js +529 -0
  17. package/dist/agents/__tests__/agents.test.js.map +1 -0
  18. package/dist/agents/index.d.ts +15 -0
  19. package/dist/agents/index.js +25 -0
  20. package/dist/agents/index.js.map +1 -0
  21. package/dist/agents/passport.d.ts +92 -0
  22. package/dist/agents/passport.js +301 -0
  23. package/dist/agents/passport.js.map +1 -0
  24. package/dist/agents/policy.d.ts +24 -0
  25. package/dist/agents/policy.js +93 -0
  26. package/dist/agents/policy.js.map +1 -0
  27. package/dist/agents/replay.d.ts +20 -0
  28. package/dist/agents/replay.js +47 -0
  29. package/dist/agents/replay.js.map +1 -0
  30. package/dist/agents/report.d.ts +30 -0
  31. package/dist/agents/report.js +93 -0
  32. package/dist/agents/report.js.map +1 -0
  33. package/dist/agents/types.d.ts +148 -0
  34. package/dist/agents/types.js +37 -0
  35. package/dist/agents/types.js.map +1 -0
  36. package/dist/agents/verifier.d.ts +33 -0
  37. package/dist/agents/verifier.js +276 -0
  38. package/dist/agents/verifier.js.map +1 -0
  39. package/dist/ai-security/__tests__/bench.test.d.ts +1 -0
  40. package/dist/ai-security/__tests__/bench.test.js +50 -0
  41. package/dist/ai-security/__tests__/bench.test.js.map +1 -0
  42. package/dist/ai-security/__tests__/checks.test.d.ts +1 -0
  43. package/dist/ai-security/__tests__/checks.test.js +248 -0
  44. package/dist/ai-security/__tests__/checks.test.js.map +1 -0
  45. package/dist/ai-security/__tests__/config.test.d.ts +1 -0
  46. package/dist/ai-security/__tests__/config.test.js +164 -0
  47. package/dist/ai-security/__tests__/config.test.js.map +1 -0
  48. package/dist/ai-security/__tests__/detection.test.d.ts +1 -0
  49. package/dist/ai-security/__tests__/detection.test.js +114 -0
  50. package/dist/ai-security/__tests__/detection.test.js.map +1 -0
  51. package/dist/ai-security/__tests__/fixtures.d.ts +8 -0
  52. package/dist/ai-security/__tests__/fixtures.js +30 -0
  53. package/dist/ai-security/__tests__/fixtures.js.map +1 -0
  54. package/dist/ai-security/__tests__/hooks.test.d.ts +1 -0
  55. package/dist/ai-security/__tests__/hooks.test.js +174 -0
  56. package/dist/ai-security/__tests__/hooks.test.js.map +1 -0
  57. package/dist/ai-security/__tests__/stream.test.d.ts +1 -0
  58. package/dist/ai-security/__tests__/stream.test.js +85 -0
  59. package/dist/ai-security/__tests__/stream.test.js.map +1 -0
  60. package/dist/ai-security/config.d.ts +94 -0
  61. package/dist/ai-security/config.js +241 -0
  62. package/dist/ai-security/config.js.map +1 -0
  63. package/dist/ai-security/context.d.ts +45 -0
  64. package/dist/ai-security/context.js +108 -0
  65. package/dist/ai-security/context.js.map +1 -0
  66. package/dist/ai-security/custom-kinds.d.ts +23 -0
  67. package/dist/ai-security/custom-kinds.js +97 -0
  68. package/dist/ai-security/custom-kinds.js.map +1 -0
  69. package/dist/ai-security/events.d.ts +77 -0
  70. package/dist/ai-security/events.js +153 -0
  71. package/dist/ai-security/events.js.map +1 -0
  72. package/dist/ai-security/hooks.d.ts +48 -0
  73. package/dist/ai-security/hooks.js +461 -0
  74. package/dist/ai-security/hooks.js.map +1 -0
  75. package/dist/ai-security/index.d.ts +209 -0
  76. package/dist/ai-security/index.js +587 -0
  77. package/dist/ai-security/index.js.map +1 -0
  78. package/dist/ai-security/injection-rules.json +1024 -0
  79. package/dist/ai-security/injection.d.ts +46 -0
  80. package/dist/ai-security/injection.js +635 -0
  81. package/dist/ai-security/injection.js.map +1 -0
  82. package/dist/ai-security/jailbreak.d.ts +38 -0
  83. package/dist/ai-security/jailbreak.js +73 -0
  84. package/dist/ai-security/jailbreak.js.map +1 -0
  85. package/dist/ai-security/limits.d.ts +84 -0
  86. package/dist/ai-security/limits.js +195 -0
  87. package/dist/ai-security/limits.js.map +1 -0
  88. package/dist/ai-security/mcp.d.ts +82 -0
  89. package/dist/ai-security/mcp.js +150 -0
  90. package/dist/ai-security/mcp.js.map +1 -0
  91. package/dist/ai-security/output.d.ts +107 -0
  92. package/dist/ai-security/output.js +390 -0
  93. package/dist/ai-security/output.js.map +1 -0
  94. package/dist/ai-security/policy.d.ts +125 -0
  95. package/dist/ai-security/policy.js +196 -0
  96. package/dist/ai-security/policy.js.map +1 -0
  97. package/dist/ai-security/rag.d.ts +70 -0
  98. package/dist/ai-security/rag.js +174 -0
  99. package/dist/ai-security/rag.js.map +1 -0
  100. package/dist/ai-security/tool-rules.json +203 -0
  101. package/dist/ai-security/tools.d.ts +46 -0
  102. package/dist/ai-security/tools.js +62 -0
  103. package/dist/ai-security/tools.js.map +1 -0
  104. package/dist/budgets/__tests__/budgets.test.d.ts +1 -0
  105. package/dist/budgets/__tests__/budgets.test.js +134 -0
  106. package/dist/budgets/__tests__/budgets.test.js.map +1 -0
  107. package/dist/budgets/auto.d.ts +25 -0
  108. package/dist/budgets/auto.js +63 -0
  109. package/dist/budgets/auto.js.map +1 -0
  110. package/dist/budgets/index.d.ts +110 -0
  111. package/dist/budgets/index.js +239 -0
  112. package/dist/budgets/index.js.map +1 -0
  113. package/dist/customer/__tests__/customer.test.d.ts +1 -0
  114. package/dist/customer/__tests__/customer.test.js +155 -0
  115. package/dist/customer/__tests__/customer.test.js.map +1 -0
  116. package/dist/customer/index.d.ts +48 -0
  117. package/dist/customer/index.js +132 -0
  118. package/dist/customer/index.js.map +1 -0
  119. package/dist/destination.d.ts +14 -0
  120. package/dist/destination.js +16 -0
  121. package/dist/destination.js.map +1 -1
  122. package/dist/feedback/__tests__/feedback.test.d.ts +1 -0
  123. package/dist/feedback/__tests__/feedback.test.js +80 -0
  124. package/dist/feedback/__tests__/feedback.test.js.map +1 -0
  125. package/dist/feedback/index.d.ts +48 -0
  126. package/dist/feedback/index.js +97 -0
  127. package/dist/feedback/index.js.map +1 -0
  128. package/dist/flags/__tests__/flags.test.d.ts +1 -0
  129. package/dist/flags/__tests__/flags.test.js +301 -0
  130. package/dist/flags/__tests__/flags.test.js.map +1 -0
  131. package/dist/flags/client.d.ts +131 -0
  132. package/dist/flags/client.js +301 -0
  133. package/dist/flags/client.js.map +1 -0
  134. package/dist/flags/engine.d.ts +200 -0
  135. package/dist/flags/engine.js +677 -0
  136. package/dist/flags/engine.js.map +1 -0
  137. package/dist/flags/index.d.ts +4 -0
  138. package/dist/flags/index.js +16 -0
  139. package/dist/flags/index.js.map +1 -0
  140. package/dist/guard/__tests__/findings.test.js +1 -1
  141. package/dist/guard/__tests__/report.test.js +67 -0
  142. package/dist/guard/__tests__/report.test.js.map +1 -1
  143. package/dist/guard/heartbeat.d.ts +34 -0
  144. package/dist/guard/heartbeat.js +83 -0
  145. package/dist/guard/heartbeat.js.map +1 -0
  146. package/dist/guard/integration.d.ts +9 -0
  147. package/dist/guard/integration.js +4 -2
  148. package/dist/guard/integration.js.map +1 -1
  149. package/dist/guard/report.d.ts +24 -1
  150. package/dist/guard/report.js +67 -18
  151. package/dist/guard/report.js.map +1 -1
  152. package/dist/index.d.ts +88 -0
  153. package/dist/index.js +203 -2
  154. package/dist/index.js.map +1 -1
  155. package/dist/instrumentation/__tests__/langchain-wrapper.test.js +1 -1
  156. package/dist/instrumentation/__tests__/langchain-wrapper.test.js.map +1 -1
  157. package/dist/instrumentation/anthropic/wrapper.js +4 -0
  158. package/dist/instrumentation/anthropic/wrapper.js.map +1 -1
  159. package/dist/instrumentation/openai/wrapper.js +6 -0
  160. package/dist/instrumentation/openai/wrapper.js.map +1 -1
  161. package/dist/masking.d.ts +42 -0
  162. package/dist/masking.js +197 -0
  163. package/dist/masking.js.map +1 -0
  164. package/dist/otel/__tests__/app-logs-safety.test.d.ts +1 -0
  165. package/dist/otel/__tests__/app-logs-safety.test.js +129 -0
  166. package/dist/otel/__tests__/app-logs-safety.test.js.map +1 -0
  167. package/dist/otel/__tests__/app-logs.test.d.ts +1 -0
  168. package/dist/otel/__tests__/app-logs.test.js +269 -0
  169. package/dist/otel/__tests__/app-logs.test.js.map +1 -0
  170. package/dist/otel/__tests__/log-auto.test.d.ts +1 -0
  171. package/dist/otel/__tests__/log-auto.test.js +125 -0
  172. package/dist/otel/__tests__/log-auto.test.js.map +1 -0
  173. package/dist/otel/__tests__/log-bridges.test.d.ts +1 -0
  174. package/dist/otel/__tests__/log-bridges.test.js +170 -0
  175. package/dist/otel/__tests__/log-bridges.test.js.map +1 -0
  176. package/dist/otel/__tests__/system-metrics.test.d.ts +1 -0
  177. package/dist/otel/__tests__/system-metrics.test.js +79 -0
  178. package/dist/otel/__tests__/system-metrics.test.js.map +1 -0
  179. package/dist/otel/app-logs.d.ts +80 -0
  180. package/dist/otel/app-logs.js +195 -0
  181. package/dist/otel/app-logs.js.map +1 -0
  182. package/dist/otel/build-info.d.ts +2 -1
  183. package/dist/otel/build-info.js +3 -2
  184. package/dist/otel/build-info.js.map +1 -1
  185. package/dist/otel/events.d.ts +1 -0
  186. package/dist/otel/events.js +22 -13
  187. package/dist/otel/events.js.map +1 -1
  188. package/dist/otel/log-auto.d.ts +44 -0
  189. package/dist/otel/log-auto.js +200 -0
  190. package/dist/otel/log-auto.js.map +1 -0
  191. package/dist/otel/log-bridges.d.ts +54 -0
  192. package/dist/otel/log-bridges.js +307 -0
  193. package/dist/otel/log-bridges.js.map +1 -0
  194. package/dist/otel/metrics.js +1 -1
  195. package/dist/otel/metrics.js.map +1 -1
  196. package/dist/otel/system-metrics.d.ts +39 -0
  197. package/dist/otel/system-metrics.js +166 -0
  198. package/dist/otel/system-metrics.js.map +1 -0
  199. package/dist/otel/tracing.js +6 -2
  200. package/dist/otel/tracing.js.map +1 -1
  201. package/dist/protect/__tests__/protect.test.js +4 -0
  202. package/dist/protect/__tests__/protect.test.js.map +1 -1
  203. package/dist/protect/index.js +9 -4
  204. package/dist/protect/index.js.map +1 -1
  205. package/dist/rasp/__tests__/auto-http.test.d.ts +1 -0
  206. package/dist/rasp/__tests__/auto-http.test.js +136 -0
  207. package/dist/rasp/__tests__/auto-http.test.js.map +1 -0
  208. package/dist/rasp/__tests__/baseline.test.d.ts +1 -0
  209. package/dist/rasp/__tests__/baseline.test.js +86 -0
  210. package/dist/rasp/__tests__/baseline.test.js.map +1 -0
  211. package/dist/rasp/__tests__/benign-corpus.test.d.ts +1 -0
  212. package/dist/rasp/__tests__/benign-corpus.test.js +68 -0
  213. package/dist/rasp/__tests__/benign-corpus.test.js.map +1 -0
  214. package/dist/rasp/__tests__/capture-context.test.d.ts +1 -0
  215. package/dist/rasp/__tests__/capture-context.test.js +135 -0
  216. package/dist/rasp/__tests__/capture-context.test.js.map +1 -0
  217. package/dist/rasp/__tests__/code-hook.test.d.ts +1 -0
  218. package/dist/rasp/__tests__/code-hook.test.js +218 -0
  219. package/dist/rasp/__tests__/code-hook.test.js.map +1 -0
  220. package/dist/rasp/__tests__/config-client.test.d.ts +1 -0
  221. package/dist/rasp/__tests__/config-client.test.js +283 -0
  222. package/dist/rasp/__tests__/config-client.test.js.map +1 -0
  223. package/dist/rasp/__tests__/corpus.d.ts +13 -0
  224. package/dist/rasp/__tests__/corpus.js +111 -0
  225. package/dist/rasp/__tests__/corpus.js.map +1 -0
  226. package/dist/rasp/__tests__/custom-rules.test.d.ts +1 -0
  227. package/dist/rasp/__tests__/custom-rules.test.js +276 -0
  228. package/dist/rasp/__tests__/custom-rules.test.js.map +1 -0
  229. package/dist/rasp/__tests__/db-hook.test.d.ts +1 -0
  230. package/dist/rasp/__tests__/db-hook.test.js +438 -0
  231. package/dist/rasp/__tests__/db-hook.test.js.map +1 -0
  232. package/dist/rasp/__tests__/deception.test.d.ts +1 -0
  233. package/dist/rasp/__tests__/deception.test.js +567 -0
  234. package/dist/rasp/__tests__/deception.test.js.map +1 -0
  235. package/dist/rasp/__tests__/detect.test.d.ts +1 -0
  236. package/dist/rasp/__tests__/detect.test.js +276 -0
  237. package/dist/rasp/__tests__/detect.test.js.map +1 -0
  238. package/dist/rasp/__tests__/esm-exports.test.d.ts +1 -0
  239. package/dist/rasp/__tests__/esm-exports.test.js +20 -0
  240. package/dist/rasp/__tests__/esm-exports.test.js.map +1 -0
  241. package/dist/rasp/__tests__/fs-hook.test.d.ts +1 -0
  242. package/dist/rasp/__tests__/fs-hook.test.js +241 -0
  243. package/dist/rasp/__tests__/fs-hook.test.js.map +1 -0
  244. package/dist/rasp/__tests__/hook-contracts.test.d.ts +1 -0
  245. package/dist/rasp/__tests__/hook-contracts.test.js +201 -0
  246. package/dist/rasp/__tests__/hook-contracts.test.js.map +1 -0
  247. package/dist/rasp/__tests__/hook-kit.d.ts +42 -0
  248. package/dist/rasp/__tests__/hook-kit.js +139 -0
  249. package/dist/rasp/__tests__/hook-kit.js.map +1 -0
  250. package/dist/rasp/__tests__/http-hook.test.d.ts +1 -0
  251. package/dist/rasp/__tests__/http-hook.test.js +250 -0
  252. package/dist/rasp/__tests__/http-hook.test.js.map +1 -0
  253. package/dist/rasp/__tests__/iast.test.d.ts +1 -0
  254. package/dist/rasp/__tests__/iast.test.js +361 -0
  255. package/dist/rasp/__tests__/iast.test.js.map +1 -0
  256. package/dist/rasp/__tests__/include-hook.test.d.ts +1 -0
  257. package/dist/rasp/__tests__/include-hook.test.js +122 -0
  258. package/dist/rasp/__tests__/include-hook.test.js.map +1 -0
  259. package/dist/rasp/__tests__/middleware.test.d.ts +1 -0
  260. package/dist/rasp/__tests__/middleware.test.js +302 -0
  261. package/dist/rasp/__tests__/middleware.test.js.map +1 -0
  262. package/dist/rasp/__tests__/process-hook.test.d.ts +1 -0
  263. package/dist/rasp/__tests__/process-hook.test.js +238 -0
  264. package/dist/rasp/__tests__/process-hook.test.js.map +1 -0
  265. package/dist/rasp/__tests__/reporter.test.d.ts +1 -0
  266. package/dist/rasp/__tests__/reporter.test.js +114 -0
  267. package/dist/rasp/__tests__/reporter.test.js.map +1 -0
  268. package/dist/rasp/__tests__/route.test.d.ts +1 -0
  269. package/dist/rasp/__tests__/route.test.js +46 -0
  270. package/dist/rasp/__tests__/route.test.js.map +1 -0
  271. package/dist/rasp/__tests__/rule-expr.test.d.ts +1 -0
  272. package/dist/rasp/__tests__/rule-expr.test.js +151 -0
  273. package/dist/rasp/__tests__/rule-expr.test.js.map +1 -0
  274. package/dist/rasp/__tests__/rule-phases.test.d.ts +1 -0
  275. package/dist/rasp/__tests__/rule-phases.test.js +271 -0
  276. package/dist/rasp/__tests__/rule-phases.test.js.map +1 -0
  277. package/dist/rasp/__tests__/sinks-hook.test.d.ts +1 -0
  278. package/dist/rasp/__tests__/sinks-hook.test.js +177 -0
  279. package/dist/rasp/__tests__/sinks-hook.test.js.map +1 -0
  280. package/dist/rasp/__tests__/targets.test.d.ts +1 -0
  281. package/dist/rasp/__tests__/targets.test.js +82 -0
  282. package/dist/rasp/__tests__/targets.test.js.map +1 -0
  283. package/dist/rasp/__tests__/template-hook.test.d.ts +1 -0
  284. package/dist/rasp/__tests__/template-hook.test.js +254 -0
  285. package/dist/rasp/__tests__/template-hook.test.js.map +1 -0
  286. package/dist/rasp/__tests__/upload.test.d.ts +1 -0
  287. package/dist/rasp/__tests__/upload.test.js +81 -0
  288. package/dist/rasp/__tests__/upload.test.js.map +1 -0
  289. package/dist/rasp/__tests__/vpatch-engine.test.d.ts +1 -0
  290. package/dist/rasp/__tests__/vpatch-engine.test.js +177 -0
  291. package/dist/rasp/__tests__/vpatch-engine.test.js.map +1 -0
  292. package/dist/rasp/auto-http.d.ts +6 -0
  293. package/dist/rasp/auto-http.js +194 -0
  294. package/dist/rasp/auto-http.js.map +1 -0
  295. package/dist/rasp/baseline.d.ts +35 -0
  296. package/dist/rasp/baseline.js +91 -0
  297. package/dist/rasp/baseline.js.map +1 -0
  298. package/dist/rasp/capture.d.ts +76 -0
  299. package/dist/rasp/capture.js +304 -0
  300. package/dist/rasp/capture.js.map +1 -0
  301. package/dist/rasp/config-client.d.ts +122 -0
  302. package/dist/rasp/config-client.js +337 -0
  303. package/dist/rasp/config-client.js.map +1 -0
  304. package/dist/rasp/context.d.ts +65 -0
  305. package/dist/rasp/context.js +68 -0
  306. package/dist/rasp/context.js.map +1 -0
  307. package/dist/rasp/custom-rules.d.ts +68 -0
  308. package/dist/rasp/custom-rules.js +222 -0
  309. package/dist/rasp/custom-rules.js.map +1 -0
  310. package/dist/rasp/data/default-rules.json +199 -0
  311. package/dist/rasp/data/default-sinks.json +4 -0
  312. package/dist/rasp/data/dnslog-domains.json +11 -0
  313. package/dist/rasp/deception.d.ts +70 -0
  314. package/dist/rasp/deception.js +220 -0
  315. package/dist/rasp/deception.js.map +1 -0
  316. package/dist/rasp/detect.d.ts +68 -0
  317. package/dist/rasp/detect.js +671 -0
  318. package/dist/rasp/detect.js.map +1 -0
  319. package/dist/rasp/engine.d.ts +107 -0
  320. package/dist/rasp/engine.js +330 -0
  321. package/dist/rasp/engine.js.map +1 -0
  322. package/dist/rasp/hooks/code.d.ts +20 -0
  323. package/dist/rasp/hooks/code.js +334 -0
  324. package/dist/rasp/hooks/code.js.map +1 -0
  325. package/dist/rasp/hooks/db.d.ts +48 -0
  326. package/dist/rasp/hooks/db.js +322 -0
  327. package/dist/rasp/hooks/db.js.map +1 -0
  328. package/dist/rasp/hooks/esm.d.ts +7 -0
  329. package/dist/rasp/hooks/esm.js +18 -0
  330. package/dist/rasp/hooks/esm.js.map +1 -0
  331. package/dist/rasp/hooks/fs.d.ts +3 -0
  332. package/dist/rasp/hooks/fs.js +206 -0
  333. package/dist/rasp/hooks/fs.js.map +1 -0
  334. package/dist/rasp/hooks/http.d.ts +4 -0
  335. package/dist/rasp/hooks/http.js +213 -0
  336. package/dist/rasp/hooks/http.js.map +1 -0
  337. package/dist/rasp/hooks/include.d.ts +9 -0
  338. package/dist/rasp/hooks/include.js +79 -0
  339. package/dist/rasp/hooks/include.js.map +1 -0
  340. package/dist/rasp/hooks/marks.d.ts +2 -0
  341. package/dist/rasp/hooks/marks.js +16 -0
  342. package/dist/rasp/hooks/marks.js.map +1 -0
  343. package/dist/rasp/hooks/process.d.ts +22 -0
  344. package/dist/rasp/hooks/process.js +191 -0
  345. package/dist/rasp/hooks/process.js.map +1 -0
  346. package/dist/rasp/hooks/sinks.d.ts +54 -0
  347. package/dist/rasp/hooks/sinks.js +329 -0
  348. package/dist/rasp/hooks/sinks.js.map +1 -0
  349. package/dist/rasp/hooks/template.d.ts +21 -0
  350. package/dist/rasp/hooks/template.js +152 -0
  351. package/dist/rasp/hooks/template.js.map +1 -0
  352. package/dist/rasp/iast-rules.d.ts +82 -0
  353. package/dist/rasp/iast-rules.js +240 -0
  354. package/dist/rasp/iast-rules.js.map +1 -0
  355. package/dist/rasp/iast-scope.d.ts +29 -0
  356. package/dist/rasp/iast-scope.js +54 -0
  357. package/dist/rasp/iast-scope.js.map +1 -0
  358. package/dist/rasp/iast.d.ts +81 -0
  359. package/dist/rasp/iast.js +272 -0
  360. package/dist/rasp/iast.js.map +1 -0
  361. package/dist/rasp/index.d.ts +52 -0
  362. package/dist/rasp/index.js +280 -0
  363. package/dist/rasp/index.js.map +1 -0
  364. package/dist/rasp/lexers.d.ts +32 -0
  365. package/dist/rasp/lexers.js +444 -0
  366. package/dist/rasp/lexers.js.map +1 -0
  367. package/dist/rasp/middleware.d.ts +155 -0
  368. package/dist/rasp/middleware.js +568 -0
  369. package/dist/rasp/middleware.js.map +1 -0
  370. package/dist/rasp/model-output.d.ts +14 -0
  371. package/dist/rasp/model-output.js +107 -0
  372. package/dist/rasp/model-output.js.map +1 -0
  373. package/dist/rasp/normalize.d.ts +23 -0
  374. package/dist/rasp/normalize.js +140 -0
  375. package/dist/rasp/normalize.js.map +1 -0
  376. package/dist/rasp/reporter.d.ts +60 -0
  377. package/dist/rasp/reporter.js +230 -0
  378. package/dist/rasp/reporter.js.map +1 -0
  379. package/dist/rasp/rule-expr.d.ts +236 -0
  380. package/dist/rasp/rule-expr.js +1253 -0
  381. package/dist/rasp/rule-expr.js.map +1 -0
  382. package/dist/rasp/template.d.ts +53 -0
  383. package/dist/rasp/template.js +336 -0
  384. package/dist/rasp/template.js.map +1 -0
  385. package/dist/rasp/types.d.ts +110 -0
  386. package/dist/rasp/types.js +51 -0
  387. package/dist/rasp/types.js.map +1 -0
  388. package/dist/rasp/vpatch.d.ts +55 -0
  389. package/dist/rasp/vpatch.js +120 -0
  390. package/dist/rasp/vpatch.js.map +1 -0
  391. package/dist/register.js +52 -11
  392. package/dist/register.js.map +1 -1
  393. package/dist/semantic-convention.d.ts +2 -0
  394. package/dist/semantic-convention.js +5 -0
  395. package/dist/semantic-convention.js.map +1 -1
  396. package/dist/types.d.ts +77 -1
  397. package/dist/zero-code.d.ts +8 -0
  398. package/dist/zero-code.js +38 -0
  399. package/dist/zero-code.js.map +1 -0
  400. package/package.json +18 -2
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+ /**
3
+ * The app's AI security policy from the platform, signed.
4
+ *
5
+ * GET /api/ai-security/config?app=<service name> answers, for the API key's
6
+ * environment, a compact JWS (EdDSA, Ed25519, typ
7
+ * "shield360-ai-security+jws") whose claims are { app, policy, ver, iat,
8
+ * exp }, signed with the environment's attestation key, plus that key's
9
+ * public JWK. The SDK verifies the signature and refuses a policy for
10
+ * another app or one already expired.
11
+ *
12
+ * Pinning is required. The token must verify under a key the developer
13
+ * pinned: `configPublicKey` (a JWK, a PEM, or a JWKS { keys: [...] } so a
14
+ * rotation can list the old and the new key) or the env
15
+ * SHIELD360_CONFIG_PUBLIC_KEY (the same, as text). The key published beside
16
+ * the token is never trusted on its own. Without a pin the SDK does not
17
+ * apply the platform's policy: it keeps the policy from code (monitoring by
18
+ * default) and reports it once. Trust on first use (pin the first key seen)
19
+ * exists only behind `allowUnpinnedConfig: true`, for development.
20
+ *
21
+ * A verified answer can be cached to a file (`cacheFile`) and is re-verified
22
+ * under the pinned keys when read back, so a restart while the platform is
23
+ * unreachable still starts with the last policy. A cached answer never pins
24
+ * a key.
25
+ *
26
+ * Fetched in the background every refreshSeconds (60 s), never on the
27
+ * request path. When nothing valid can be read the policy from code
28
+ * applies: fail open to monitoring.
29
+ *
30
+ * Must stay in sync with: sdk/python/src/shield360/ai_security/_config.py
31
+ */
32
+ Object.defineProperty(exports, "__esModule", { value: true });
33
+ exports.ConfigClient = exports.CONFIG_JWS_TYPE = void 0;
34
+ exports.publicKeyFrom = publicKeyFrom;
35
+ exports.pinnedKeysFrom = pinnedKeysFrom;
36
+ exports.verifyPolicy = verifyPolicy;
37
+ const crypto_1 = require("crypto");
38
+ const fs_1 = require("fs");
39
+ exports.CONFIG_JWS_TYPE = 'shield360-ai-security+jws';
40
+ const MAX_JWS = 256 * 1024;
41
+ function parse(token) {
42
+ if (typeof token !== 'string' || token.length > MAX_JWS)
43
+ return null;
44
+ const parts = token.split('.');
45
+ if (parts.length !== 3 || !parts.every((p) => /^[A-Za-z0-9_-]+$/.test(p)))
46
+ return null;
47
+ try {
48
+ const header = JSON.parse(Buffer.from(parts[0], 'base64url').toString('utf8'));
49
+ if (!header || header.alg !== 'EdDSA' || header.typ !== exports.CONFIG_JWS_TYPE || typeof header.kid !== 'string')
50
+ return null;
51
+ const claims = JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf8'));
52
+ if (!claims || typeof claims !== 'object' || Array.isArray(claims))
53
+ return null;
54
+ return { kid: header.kid, claims, input: `${parts[0]}.${parts[1]}`, signature: Buffer.from(parts[2], 'base64url') };
55
+ }
56
+ catch {
57
+ return null;
58
+ }
59
+ }
60
+ /** A public Ed25519 key from a JWK object or a PEM string; null when it is not one. */
61
+ function publicKeyFrom(value) {
62
+ try {
63
+ if (typeof value === 'string' && value.includes('BEGIN PUBLIC KEY'))
64
+ return (0, crypto_1.createPublicKey)(value);
65
+ if (value && typeof value === 'object') {
66
+ const jwk = value;
67
+ if (jwk.kty !== 'OKP' || jwk.crv !== 'Ed25519' || typeof jwk.x !== 'string')
68
+ return null;
69
+ return (0, crypto_1.createPublicKey)({ key: { kty: 'OKP', crv: 'Ed25519', x: jwk.x }, format: 'jwk' });
70
+ }
71
+ }
72
+ catch {
73
+ // not a key
74
+ }
75
+ return null;
76
+ }
77
+ /**
78
+ * The keys a value pins: one JWK or PEM, a JWKS ({ keys: [...] }), or the
79
+ * JSON text of either. Keys that are not Ed25519 are skipped.
80
+ */
81
+ function pinnedKeysFrom(value) {
82
+ let v = value;
83
+ if (typeof v === 'string') {
84
+ const t = v.trim();
85
+ if (!t)
86
+ return [];
87
+ if (t.startsWith('{') || t.startsWith('[')) {
88
+ try {
89
+ v = JSON.parse(t);
90
+ }
91
+ catch {
92
+ return [];
93
+ }
94
+ }
95
+ }
96
+ const list = Array.isArray(v) ? v : v && typeof v === 'object' && Array.isArray(v.keys) ? v.keys : [v];
97
+ const out = [];
98
+ for (const item of list.slice(0, 20)) {
99
+ const key = publicKeyFrom(item);
100
+ if (!key)
101
+ continue;
102
+ const kid = item && typeof item === 'object' && typeof item.kid === 'string' ? item.kid : null;
103
+ out.push({ kid, key });
104
+ }
105
+ return out;
106
+ }
107
+ /** The kid in a token's header, unverified (to pick the pinned key to try first). */
108
+ function kidOf(token) {
109
+ return parse(token)?.kid ?? null;
110
+ }
111
+ /** The claims of a policy token signed by this key, for this app, not expired; otherwise null. */
112
+ function verifyPolicy(token, key, app, nowMs) {
113
+ const parsed = parse(token);
114
+ if (!parsed)
115
+ return null;
116
+ try {
117
+ if (!(0, crypto_1.verify)(null, Buffer.from(parsed.input), key, parsed.signature))
118
+ return null;
119
+ }
120
+ catch {
121
+ return null;
122
+ }
123
+ const c = parsed.claims;
124
+ if (c.app !== app || typeof c.exp !== 'number' || typeof c.iat !== 'number' || typeof c.ver !== 'number')
125
+ return null;
126
+ if (c.exp * 1000 < nowMs)
127
+ return null;
128
+ return { app, policy: c.policy, ver: c.ver, iat: c.iat, exp: c.exp, kid: parsed.kid };
129
+ }
130
+ class ConfigClient {
131
+ constructor(o) {
132
+ this.o = o;
133
+ this.timer = null;
134
+ this.lastVer = -1;
135
+ const env = typeof process !== 'undefined' ? process.env?.SHIELD360_CONFIG_PUBLIC_KEY : undefined;
136
+ this.keys = pinnedKeysFrom(o.publicKey ?? env ?? '');
137
+ this.tofu = this.keys.length === 0 && o.allowUnpinned === true;
138
+ this.fetchImpl = o.fetch || fetch;
139
+ this.now = o.now || Date.now;
140
+ }
141
+ /** Reads the cache (if any), fetches once, then refreshes in the background. */
142
+ async start() {
143
+ if (!this.usable)
144
+ return;
145
+ await this.readCache();
146
+ await this.refresh();
147
+ const every = Math.max(10, this.o.refreshSeconds ?? 60) * 1000;
148
+ this.timer = setInterval(() => void this.refresh(), every);
149
+ this.timer.unref?.();
150
+ }
151
+ stop() {
152
+ if (this.timer)
153
+ clearInterval(this.timer);
154
+ this.timer = null;
155
+ }
156
+ /** Whether the client can verify anything: a pinned key, or trust on first use allowed. */
157
+ get usable() {
158
+ return this.keys.length > 0 || this.tofu;
159
+ }
160
+ accept(answer, pin = true) {
161
+ let candidates = this.keys;
162
+ if (!candidates.length) {
163
+ if (!this.tofu)
164
+ return false;
165
+ candidates = pinnedKeysFrom(answer.publicKey).slice(0, 1);
166
+ if (!candidates.length)
167
+ return false;
168
+ }
169
+ const kid = kidOf(answer.jws);
170
+ const ordered = [...candidates.filter((k) => k.kid && k.kid === kid), ...candidates.filter((k) => !k.kid || k.kid !== kid)];
171
+ let signed = null;
172
+ let used = null;
173
+ for (const k of ordered) {
174
+ signed = verifyPolicy(answer.jws, k.key, this.o.app, this.now());
175
+ if (signed) {
176
+ used = k;
177
+ break;
178
+ }
179
+ }
180
+ if (!signed || !used)
181
+ return false;
182
+ // Trust on first use (development only): pinned from now on. A cached answer never pins.
183
+ if (pin && !this.keys.length)
184
+ this.keys = [used];
185
+ if (signed.ver !== this.lastVer) {
186
+ this.lastVer = signed.ver;
187
+ this.o.onPolicy(signed);
188
+ }
189
+ return true;
190
+ }
191
+ async refresh() {
192
+ if (!this.usable)
193
+ return false;
194
+ const base = this.o.url.replace(/\/+$/, '');
195
+ const ctl = new AbortController();
196
+ const t = setTimeout(() => ctl.abort(), this.o.timeoutMs ?? 3000);
197
+ t.unref?.();
198
+ try {
199
+ const res = await this.fetchImpl(`${base}/api/ai-security/config?app=${encodeURIComponent(this.o.app)}`, {
200
+ headers: { Authorization: `Bearer ${this.o.apiKey}` },
201
+ signal: ctl.signal,
202
+ });
203
+ if (!res.ok)
204
+ return false;
205
+ const answer = (await res.json());
206
+ if (!this.accept(answer))
207
+ return false;
208
+ await this.writeCache(answer);
209
+ return true;
210
+ }
211
+ catch {
212
+ return false;
213
+ }
214
+ finally {
215
+ clearTimeout(t);
216
+ }
217
+ }
218
+ async readCache() {
219
+ if (!this.o.cacheFile)
220
+ return;
221
+ try {
222
+ const raw = await fs_1.promises.readFile(this.o.cacheFile, 'utf8');
223
+ this.accept(JSON.parse(raw), false);
224
+ }
225
+ catch {
226
+ // no cache yet
227
+ }
228
+ }
229
+ async writeCache(answer) {
230
+ if (!this.o.cacheFile)
231
+ return;
232
+ try {
233
+ await fs_1.promises.writeFile(this.o.cacheFile, JSON.stringify({ jws: answer.jws, publicKey: answer.publicKey }), { mode: 0o600 });
234
+ }
235
+ catch {
236
+ // caching is best effort
237
+ }
238
+ }
239
+ }
240
+ exports.ConfigClient = ConfigClient;
241
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/ai-security/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * What the AI security checks know about the request in progress: the
3
+ * signed-in end user's roles and attributes (for tool permissions), and the
4
+ * identifiers of other tenants that reached the model's context (for the
5
+ * cross-tenant output check).
6
+ *
7
+ * The end customer itself (tenant and user ids) is the one set with
8
+ * Shield360.withCustomer() / setCustomer(); this adds what tool rules need.
9
+ * Scoped with AsyncLocalStorage, so concurrent requests never see each
10
+ * other's state. Bounded: at most MAX_IDENTIFIERS identifiers per request.
11
+ *
12
+ * Must stay in sync with: sdk/python/src/shield360/ai_security/_context.py
13
+ */
14
+ import { type CustomerInput } from '../customer';
15
+ export type EndUser = {
16
+ roles: string[];
17
+ attributes: Record<string, string>;
18
+ };
19
+ export type RequestState = {
20
+ user: EndUser | null;
21
+ /** Lower-cased identifier -> the tenant it belongs to. */
22
+ foreign: Map<string, string>;
23
+ };
24
+ export type EndUserInput = CustomerInput & {
25
+ roles?: string[];
26
+ attributes?: Record<string, unknown>;
27
+ };
28
+ /**
29
+ * Runs fn as one request for this end user: the customer (tenant, user) for
30
+ * attribution, and roles and attributes for tool permissions. Identifiers
31
+ * of other tenants seen during fn are forgotten when it returns.
32
+ */
33
+ export declare function withEndUser<T>(user: EndUserInput | null, fn: () => T): T;
34
+ /** Sets the process-wide end user (scripts, single-user workers). Prefer withEndUser in servers. */
35
+ export declare function setEndUser(user: EndUserInput | null): void;
36
+ export declare function getEndUser(): EndUser | null;
37
+ /** The tenant of the request in progress, from the end customer. */
38
+ export declare function currentTenant(): string | null;
39
+ /** Remembers identifiers that belong to another tenant and reached this request's context. */
40
+ export declare function rememberForeignIdentifiers(tenantId: string, identifiers: Iterable<string>): void;
41
+ export declare function foreignIdentifiers(): ReadonlyMap<string, string>;
42
+ /** Clears the process-wide state; for tests. */
43
+ export declare function resetRequestState(): void;
44
+ /** Distinctive identifiers in a text: e-mail addresses, UUIDs, record ids and long numbers. Bounded. */
45
+ export declare function identifiersIn(text: string, limit?: number): string[];
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ /**
3
+ * What the AI security checks know about the request in progress: the
4
+ * signed-in end user's roles and attributes (for tool permissions), and the
5
+ * identifiers of other tenants that reached the model's context (for the
6
+ * cross-tenant output check).
7
+ *
8
+ * The end customer itself (tenant and user ids) is the one set with
9
+ * Shield360.withCustomer() / setCustomer(); this adds what tool rules need.
10
+ * Scoped with AsyncLocalStorage, so concurrent requests never see each
11
+ * other's state. Bounded: at most MAX_IDENTIFIERS identifiers per request.
12
+ *
13
+ * Must stay in sync with: sdk/python/src/shield360/ai_security/_context.py
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.withEndUser = withEndUser;
17
+ exports.setEndUser = setEndUser;
18
+ exports.getEndUser = getEndUser;
19
+ exports.currentTenant = currentTenant;
20
+ exports.rememberForeignIdentifiers = rememberForeignIdentifiers;
21
+ exports.foreignIdentifiers = foreignIdentifiers;
22
+ exports.resetRequestState = resetRequestState;
23
+ exports.identifiersIn = identifiersIn;
24
+ const node_async_hooks_1 = require("node:async_hooks");
25
+ const customer_1 = require("../customer");
26
+ const MAX_IDENTIFIERS = 2000;
27
+ const MIN_IDENTIFIER = 4;
28
+ const MAX_IDENTIFIER = 200;
29
+ const store = new node_async_hooks_1.AsyncLocalStorage();
30
+ let fallback = { user: null, foreign: new Map() };
31
+ function state() {
32
+ return store.getStore() || fallback;
33
+ }
34
+ function cleanUser(input) {
35
+ if (!input)
36
+ return null;
37
+ const roles = Array.isArray(input.roles)
38
+ ? input.roles.filter((r) => typeof r === 'string' && r.length > 0 && r.length <= 128).slice(0, 100)
39
+ : [];
40
+ const attributes = {};
41
+ if (input.attributes && typeof input.attributes === 'object') {
42
+ for (const [k, v] of Object.entries(input.attributes).slice(0, 100)) {
43
+ if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean')
44
+ attributes[k] = String(v).slice(0, 256);
45
+ }
46
+ }
47
+ return { roles, attributes };
48
+ }
49
+ /**
50
+ * Runs fn as one request for this end user: the customer (tenant, user) for
51
+ * attribution, and roles and attributes for tool permissions. Identifiers
52
+ * of other tenants seen during fn are forgotten when it returns.
53
+ */
54
+ function withEndUser(user, fn) {
55
+ const next = { user: cleanUser(user), foreign: new Map() };
56
+ const run = () => store.run(next, fn);
57
+ return user && user.tenantId !== undefined ? (0, customer_1.withCustomer)({ tenantId: user.tenantId, userId: user.userId }, run) : run();
58
+ }
59
+ /** Sets the process-wide end user (scripts, single-user workers). Prefer withEndUser in servers. */
60
+ function setEndUser(user) {
61
+ fallback = { user: cleanUser(user), foreign: new Map() };
62
+ }
63
+ function getEndUser() {
64
+ return state().user;
65
+ }
66
+ /** The tenant of the request in progress, from the end customer. */
67
+ function currentTenant() {
68
+ return (0, customer_1.getCustomer)()?.tenantId ?? null;
69
+ }
70
+ /** Remembers identifiers that belong to another tenant and reached this request's context. */
71
+ function rememberForeignIdentifiers(tenantId, identifiers) {
72
+ const s = state();
73
+ for (const raw of identifiers) {
74
+ if (s.foreign.size >= MAX_IDENTIFIERS)
75
+ return;
76
+ const id = String(raw).trim().toLowerCase();
77
+ if (id.length >= MIN_IDENTIFIER && id.length <= MAX_IDENTIFIER)
78
+ s.foreign.set(id, tenantId);
79
+ }
80
+ }
81
+ function foreignIdentifiers() {
82
+ return state().foreign;
83
+ }
84
+ /** Clears the process-wide state; for tests. */
85
+ function resetRequestState() {
86
+ fallback = { user: null, foreign: new Map() };
87
+ }
88
+ const ID_PATTERNS = [
89
+ /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g, // e-mail
90
+ /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi, // UUID
91
+ /\b[A-Z]{2,6}-?[0-9]{4,}\b/g, // ACCT-00421, INV2024001
92
+ /(?<![0-9])[0-9]{6,}(?![0-9])/g, // long numbers: account, order, phone
93
+ ];
94
+ /** Distinctive identifiers in a text: e-mail addresses, UUIDs, record ids and long numbers. Bounded. */
95
+ function identifiersIn(text, limit = 200) {
96
+ const out = new Set();
97
+ if (!text)
98
+ return [];
99
+ const sample = text.length > 100000 ? text.slice(0, 100000) : text;
100
+ for (const re of ID_PATTERNS) {
101
+ re.lastIndex = 0;
102
+ let m;
103
+ while ((m = re.exec(sample)) && out.size < limit)
104
+ out.add(m[0]);
105
+ }
106
+ return Array.from(out);
107
+ }
108
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/ai-security/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * The organisation's own kinds of sensitive data (keywords and format masks,
3
+ * never free-form regular expressions), matched in model output.
4
+ *
5
+ * A copy of the matching half of the reference,
6
+ * src/client/src/lib/platform/collector/custom-data-kinds.ts; the other
7
+ * copies are cli/internal/coding/guard/custom.go and
8
+ * extension/src/shared/custom-kinds.ts. Same definition, same matches: masks
9
+ * are `#` digit, `@` letter, `*` letter or digit, `\x` the character x, and
10
+ * anything else that character without regard to case. A match may not start
11
+ * or end inside a longer word. Linear in the text: no quantifier over a group.
12
+ *
13
+ * Must stay in sync with: sdk/python/src/shield360/ai_security/_custom_kinds.py
14
+ */
15
+ import type { CustomDataKindDef } from './policy';
16
+ export type CustomKindFinding = {
17
+ id: string;
18
+ name: string;
19
+ start: number;
20
+ end: number;
21
+ };
22
+ /** Every custom kind found in text, by span (UTF-16 offsets). */
23
+ export declare function findCustomKinds(text: string, kinds: readonly CustomDataKindDef[]): CustomKindFinding[];
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ /**
3
+ * The organisation's own kinds of sensitive data (keywords and format masks,
4
+ * never free-form regular expressions), matched in model output.
5
+ *
6
+ * A copy of the matching half of the reference,
7
+ * src/client/src/lib/platform/collector/custom-data-kinds.ts; the other
8
+ * copies are cli/internal/coding/guard/custom.go and
9
+ * extension/src/shared/custom-kinds.ts. Same definition, same matches: masks
10
+ * are `#` digit, `@` letter, `*` letter or digit, `\x` the character x, and
11
+ * anything else that character without regard to case. A match may not start
12
+ * or end inside a longer word. Linear in the text: no quantifier over a group.
13
+ *
14
+ * Must stay in sync with: sdk/python/src/shield360/ai_security/_custom_kinds.py
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.findCustomKinds = findCustomKinds;
18
+ function parseMask(mask) {
19
+ const chars = Array.from(mask);
20
+ const tokens = [];
21
+ for (let i = 0; i < chars.length; i++) {
22
+ const c = chars[i];
23
+ if (c === '\\') {
24
+ const next = chars[++i];
25
+ if (next === undefined)
26
+ return null;
27
+ tokens.push({ kind: 'literal', char: next });
28
+ }
29
+ else if (c === '#')
30
+ tokens.push({ kind: 'digit' });
31
+ else if (c === '@')
32
+ tokens.push({ kind: 'letter' });
33
+ else if (c === '*')
34
+ tokens.push({ kind: 'alnum' });
35
+ else
36
+ tokens.push({ kind: 'literal', char: c });
37
+ }
38
+ const placeholders = tokens.filter((t) => t.kind !== 'literal').length;
39
+ if (tokens.length < 3 || tokens.length > 64 || placeholders < 3)
40
+ return null;
41
+ if (placeholders === tokens.length && placeholders < 6)
42
+ return null;
43
+ return tokens;
44
+ }
45
+ const WORD = /[\p{L}\p{N}_]/u;
46
+ const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\/]/g, '\\$&');
47
+ function maskSource(tokens) {
48
+ return tokens
49
+ .map((t) => (t.kind === 'literal' ? escapeRegExp(t.char) : t.kind === 'digit' ? '[0-9]' : t.kind === 'letter' ? '[A-Za-z]' : '[A-Za-z0-9]'))
50
+ .join('');
51
+ }
52
+ const charBefore = (text, index) => index > 0 ? String.fromCodePoint(text.codePointAt(index - 1 - (/[\udc00-\udfff]/.test(text[index - 1]) && index > 1 ? 1 : 0))) : '';
53
+ const charAt = (text, index) => (index < text.length ? String.fromCodePoint(text.codePointAt(index)) : '');
54
+ function onBoundaries(text, start, end) {
55
+ if (WORD.test(charAt(text, start)) && WORD.test(charBefore(text, start)))
56
+ return false;
57
+ if (WORD.test(charBefore(text, end)) && WORD.test(charAt(text, end)))
58
+ return false;
59
+ return true;
60
+ }
61
+ const patterns = new WeakMap();
62
+ function patternOf(kind) {
63
+ let re = patterns.get(kind);
64
+ if (re)
65
+ return re;
66
+ const parts = kind.match.type === 'keywords'
67
+ ? [...kind.match.keywords].sort((a, b) => b.length - a.length).map((k) => escapeRegExp(k.trim().replace(/\s+/g, ' ')).replace(/ /g, '\\s+'))
68
+ : kind.match.masks.map((m) => parseMask(m)).filter((t) => !!t).map(maskSource);
69
+ re = new RegExp(parts.length ? parts.join('|') : '(?!)', 'giu');
70
+ patterns.set(kind, re);
71
+ return re;
72
+ }
73
+ /** Every custom kind found in text, by span (UTF-16 offsets). */
74
+ function findCustomKinds(text, kinds) {
75
+ const out = [];
76
+ if (!text)
77
+ return out;
78
+ for (const kind of kinds) {
79
+ const re = patternOf(kind);
80
+ re.lastIndex = 0;
81
+ let m;
82
+ while ((m = re.exec(text))) {
83
+ if (m[0].length === 0) {
84
+ re.lastIndex++;
85
+ continue;
86
+ }
87
+ const start = m.index;
88
+ const end = start + m[0].length;
89
+ if (onBoundaries(text, start, end))
90
+ out.push({ id: kind.id, name: kind.name, start, end });
91
+ else
92
+ re.lastIndex = start + 1;
93
+ }
94
+ }
95
+ return out.sort((a, b) => a.start - b.start || b.end - a.end);
96
+ }
97
+ //# sourceMappingURL=custom-kinds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-kinds.js","sourceRoot":"","sources":["../../src/ai-security/custom-kinds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * AI security events: what a check found and what it did, sent to Shield360
3
+ * (POST /api/ai-security/events) in batches off the call path.
4
+ *
5
+ * An event carries the check, the kind of finding, the mode and the action
6
+ * taken, the app, the end customer (tenant and user ids as given: the
7
+ * platform keeps user ids only as a keyed hash) and per finding a kind, a
8
+ * masked token and a keyed fingerprint. Never the text that was checked.
9
+ *
10
+ * A batch that cannot be delivered is retried a few times and dropped; the
11
+ * decision was already taken. Repeated identical events (same check, kind,
12
+ * tool and customer) inside a few seconds are counted into one.
13
+ *
14
+ * Must stay in sync with: sdk/python/src/shield360/ai_security/_events.py
15
+ */
16
+ export declare const AI_SECURITY_EVENT = "shield360.ai_security.event";
17
+ export type AiSecurityCheck = 'indirect_injection' | 'jailbreak' | 'output' | 'tool_permission' | 'limits' | 'mcp' | 'rag'
18
+ /** The SDK's own state, e.g. no pinned config key. */
19
+ | 'config';
20
+ export type AiSecurityAction = 'reported' | 'stripped' | 'redacted' | 'dropped' | 'blocked' | 'denied' | 'allowed';
21
+ /** Output findings: kind, token, fingerprint. Injection findings: rule, category, masked snippet, fingerprint. */
22
+ export type EventFinding = {
23
+ kind?: string;
24
+ masked?: string;
25
+ fingerprint?: string;
26
+ rule?: string;
27
+ category?: string;
28
+ snippet?: string;
29
+ };
30
+ export type AiSecurityEvent = {
31
+ check: AiSecurityCheck;
32
+ /** What was found: injection, jailbreak, pii, secret, custom_kind, cross_tenant, exfil_link, system_prompt_leak, canary_leak, tool_denied, rate_limited, mcp_unknown_server, mcp_unknown_tool, mcp_tool_changed, mcp_tool_poisoned, rag_cross_tenant, rag_hub. */
33
+ kind: string;
34
+ mode: 'monitor' | 'enforce';
35
+ action: AiSecurityAction;
36
+ /** Where the text came from: prompt, tool_result, document, context, file, output, tool_description. */
37
+ source?: string;
38
+ score?: number;
39
+ rules?: string[];
40
+ categories?: string[];
41
+ rulesVersion?: string;
42
+ tool?: string;
43
+ server?: string;
44
+ /** A short, already-masked description (rule snippets, hashes); never content. */
45
+ detail?: string;
46
+ findings?: EventFinding[];
47
+ count?: number;
48
+ };
49
+ export interface EventSink {
50
+ add(event: AiSecurityEvent): void;
51
+ flush(): Promise<void>;
52
+ close(): Promise<void>;
53
+ }
54
+ export declare class EventReporter implements EventSink {
55
+ private readonly endpoint;
56
+ private readonly apiKey;
57
+ private readonly app;
58
+ private readonly environment;
59
+ private readonly fetchImpl;
60
+ private readonly now;
61
+ private queue;
62
+ private readonly recent;
63
+ private readonly timer;
64
+ private sending;
65
+ constructor(endpoint: string, apiKey: string, app: string, environment: string, fetchImpl?: typeof fetch, now?: () => number);
66
+ add(event: AiSecurityEvent): void;
67
+ flush(): Promise<void>;
68
+ private post;
69
+ close(): Promise<void>;
70
+ }
71
+ /** Collects events in memory: for tests, and when no Shield360 URL is configured. */
72
+ export declare class MemorySink implements EventSink {
73
+ readonly events: AiSecurityEvent[];
74
+ add(event: AiSecurityEvent): void;
75
+ flush(): Promise<void>;
76
+ close(): Promise<void>;
77
+ }