shield360 1.0.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (424) hide show
  1. package/README.md +392 -37
  2. package/dist/__tests__/build-info.test.d.ts +1 -0
  3. package/dist/__tests__/build-info.test.js +196 -0
  4. package/dist/__tests__/build-info.test.js.map +1 -0
  5. package/dist/__tests__/code-location.test.d.ts +1 -0
  6. package/dist/__tests__/code-location.test.js +180 -0
  7. package/dist/__tests__/code-location.test.js.map +1 -0
  8. package/dist/__tests__/masking.test.d.ts +1 -0
  9. package/dist/__tests__/masking.test.js +66 -0
  10. package/dist/__tests__/masking.test.js.map +1 -0
  11. package/dist/__tests__/pricing-claude-5.test.js +3 -0
  12. package/dist/__tests__/pricing-claude-5.test.js.map +1 -1
  13. package/dist/__tests__/register.e2e.test.d.ts +1 -0
  14. package/dist/__tests__/register.e2e.test.js +264 -0
  15. package/dist/__tests__/register.e2e.test.js.map +1 -0
  16. package/dist/__tests__/register.test.js +60 -0
  17. package/dist/__tests__/register.test.js.map +1 -1
  18. package/dist/agents/__tests__/agents.test.d.ts +1 -0
  19. package/dist/agents/__tests__/agents.test.js +529 -0
  20. package/dist/agents/__tests__/agents.test.js.map +1 -0
  21. package/dist/agents/index.d.ts +15 -0
  22. package/dist/agents/index.js +25 -0
  23. package/dist/agents/index.js.map +1 -0
  24. package/dist/agents/passport.d.ts +92 -0
  25. package/dist/agents/passport.js +301 -0
  26. package/dist/agents/passport.js.map +1 -0
  27. package/dist/agents/policy.d.ts +24 -0
  28. package/dist/agents/policy.js +93 -0
  29. package/dist/agents/policy.js.map +1 -0
  30. package/dist/agents/replay.d.ts +20 -0
  31. package/dist/agents/replay.js +47 -0
  32. package/dist/agents/replay.js.map +1 -0
  33. package/dist/agents/report.d.ts +30 -0
  34. package/dist/agents/report.js +93 -0
  35. package/dist/agents/report.js.map +1 -0
  36. package/dist/agents/types.d.ts +148 -0
  37. package/dist/agents/types.js +37 -0
  38. package/dist/agents/types.js.map +1 -0
  39. package/dist/agents/verifier.d.ts +33 -0
  40. package/dist/agents/verifier.js +276 -0
  41. package/dist/agents/verifier.js.map +1 -0
  42. package/dist/ai-security/__tests__/bench.test.d.ts +1 -0
  43. package/dist/ai-security/__tests__/bench.test.js +50 -0
  44. package/dist/ai-security/__tests__/bench.test.js.map +1 -0
  45. package/dist/ai-security/__tests__/checks.test.d.ts +1 -0
  46. package/dist/ai-security/__tests__/checks.test.js +248 -0
  47. package/dist/ai-security/__tests__/checks.test.js.map +1 -0
  48. package/dist/ai-security/__tests__/config.test.d.ts +1 -0
  49. package/dist/ai-security/__tests__/config.test.js +164 -0
  50. package/dist/ai-security/__tests__/config.test.js.map +1 -0
  51. package/dist/ai-security/__tests__/detection.test.d.ts +1 -0
  52. package/dist/ai-security/__tests__/detection.test.js +114 -0
  53. package/dist/ai-security/__tests__/detection.test.js.map +1 -0
  54. package/dist/ai-security/__tests__/fixtures.d.ts +8 -0
  55. package/dist/ai-security/__tests__/fixtures.js +30 -0
  56. package/dist/ai-security/__tests__/fixtures.js.map +1 -0
  57. package/dist/ai-security/__tests__/hooks.test.d.ts +1 -0
  58. package/dist/ai-security/__tests__/hooks.test.js +174 -0
  59. package/dist/ai-security/__tests__/hooks.test.js.map +1 -0
  60. package/dist/ai-security/__tests__/stream.test.d.ts +1 -0
  61. package/dist/ai-security/__tests__/stream.test.js +85 -0
  62. package/dist/ai-security/__tests__/stream.test.js.map +1 -0
  63. package/dist/ai-security/config.d.ts +94 -0
  64. package/dist/ai-security/config.js +241 -0
  65. package/dist/ai-security/config.js.map +1 -0
  66. package/dist/ai-security/context.d.ts +45 -0
  67. package/dist/ai-security/context.js +108 -0
  68. package/dist/ai-security/context.js.map +1 -0
  69. package/dist/ai-security/custom-kinds.d.ts +23 -0
  70. package/dist/ai-security/custom-kinds.js +97 -0
  71. package/dist/ai-security/custom-kinds.js.map +1 -0
  72. package/dist/ai-security/events.d.ts +77 -0
  73. package/dist/ai-security/events.js +153 -0
  74. package/dist/ai-security/events.js.map +1 -0
  75. package/dist/ai-security/hooks.d.ts +48 -0
  76. package/dist/ai-security/hooks.js +461 -0
  77. package/dist/ai-security/hooks.js.map +1 -0
  78. package/dist/ai-security/index.d.ts +209 -0
  79. package/dist/ai-security/index.js +587 -0
  80. package/dist/ai-security/index.js.map +1 -0
  81. package/dist/ai-security/injection-rules.json +1024 -0
  82. package/dist/ai-security/injection.d.ts +46 -0
  83. package/dist/ai-security/injection.js +635 -0
  84. package/dist/ai-security/injection.js.map +1 -0
  85. package/dist/ai-security/jailbreak.d.ts +38 -0
  86. package/dist/ai-security/jailbreak.js +73 -0
  87. package/dist/ai-security/jailbreak.js.map +1 -0
  88. package/dist/ai-security/limits.d.ts +84 -0
  89. package/dist/ai-security/limits.js +195 -0
  90. package/dist/ai-security/limits.js.map +1 -0
  91. package/dist/ai-security/mcp.d.ts +82 -0
  92. package/dist/ai-security/mcp.js +150 -0
  93. package/dist/ai-security/mcp.js.map +1 -0
  94. package/dist/ai-security/output.d.ts +107 -0
  95. package/dist/ai-security/output.js +390 -0
  96. package/dist/ai-security/output.js.map +1 -0
  97. package/dist/ai-security/policy.d.ts +125 -0
  98. package/dist/ai-security/policy.js +196 -0
  99. package/dist/ai-security/policy.js.map +1 -0
  100. package/dist/ai-security/rag.d.ts +70 -0
  101. package/dist/ai-security/rag.js +174 -0
  102. package/dist/ai-security/rag.js.map +1 -0
  103. package/dist/ai-security/tool-rules.json +203 -0
  104. package/dist/ai-security/tools.d.ts +46 -0
  105. package/dist/ai-security/tools.js +62 -0
  106. package/dist/ai-security/tools.js.map +1 -0
  107. package/dist/budgets/__tests__/budgets.test.d.ts +1 -0
  108. package/dist/budgets/__tests__/budgets.test.js +134 -0
  109. package/dist/budgets/__tests__/budgets.test.js.map +1 -0
  110. package/dist/budgets/auto.d.ts +25 -0
  111. package/dist/budgets/auto.js +63 -0
  112. package/dist/budgets/auto.js.map +1 -0
  113. package/dist/budgets/index.d.ts +110 -0
  114. package/dist/budgets/index.js +239 -0
  115. package/dist/budgets/index.js.map +1 -0
  116. package/dist/config.js +1 -1
  117. package/dist/config.js.map +1 -1
  118. package/dist/customer/__tests__/customer.test.d.ts +1 -0
  119. package/dist/customer/__tests__/customer.test.js +155 -0
  120. package/dist/customer/__tests__/customer.test.js.map +1 -0
  121. package/dist/customer/index.d.ts +48 -0
  122. package/dist/customer/index.js +132 -0
  123. package/dist/customer/index.js.map +1 -0
  124. package/dist/feedback/__tests__/feedback.test.d.ts +1 -0
  125. package/dist/feedback/__tests__/feedback.test.js +80 -0
  126. package/dist/feedback/__tests__/feedback.test.js.map +1 -0
  127. package/dist/feedback/index.d.ts +48 -0
  128. package/dist/feedback/index.js +97 -0
  129. package/dist/feedback/index.js.map +1 -0
  130. package/dist/flags/__tests__/flags.test.d.ts +1 -0
  131. package/dist/flags/__tests__/flags.test.js +301 -0
  132. package/dist/flags/__tests__/flags.test.js.map +1 -0
  133. package/dist/flags/client.d.ts +131 -0
  134. package/dist/flags/client.js +301 -0
  135. package/dist/flags/client.js.map +1 -0
  136. package/dist/flags/engine.d.ts +200 -0
  137. package/dist/flags/engine.js +677 -0
  138. package/dist/flags/engine.js.map +1 -0
  139. package/dist/flags/index.d.ts +4 -0
  140. package/dist/flags/index.js +16 -0
  141. package/dist/flags/index.js.map +1 -0
  142. package/dist/guard/__tests__/findings.test.js +28 -9
  143. package/dist/guard/__tests__/findings.test.js.map +1 -1
  144. package/dist/guard/__tests__/report.test.js +67 -0
  145. package/dist/guard/__tests__/report.test.js.map +1 -1
  146. package/dist/guard/base.d.ts +2 -0
  147. package/dist/guard/base.js +4 -0
  148. package/dist/guard/base.js.map +1 -1
  149. package/dist/guard/findings.d.ts +12 -2
  150. package/dist/guard/findings.js +19 -49
  151. package/dist/guard/findings.js.map +1 -1
  152. package/dist/guard/heartbeat.d.ts +34 -0
  153. package/dist/guard/heartbeat.js +83 -0
  154. package/dist/guard/heartbeat.js.map +1 -0
  155. package/dist/guard/integration.d.ts +33 -3
  156. package/dist/guard/integration.js +106 -32
  157. package/dist/guard/integration.js.map +1 -1
  158. package/dist/guard/pipeline.d.ts +10 -1
  159. package/dist/guard/pipeline.js +14 -0
  160. package/dist/guard/pipeline.js.map +1 -1
  161. package/dist/guard/report.d.ts +24 -1
  162. package/dist/guard/report.js +67 -18
  163. package/dist/guard/report.js.map +1 -1
  164. package/dist/index.d.ts +90 -0
  165. package/dist/index.js +225 -3
  166. package/dist/index.js.map +1 -1
  167. package/dist/instrumentation/__tests__/langchain-wrapper.test.js +1 -1
  168. package/dist/instrumentation/__tests__/langchain-wrapper.test.js.map +1 -1
  169. package/dist/instrumentation/anthropic/wrapper.js +4 -0
  170. package/dist/instrumentation/anthropic/wrapper.js.map +1 -1
  171. package/dist/instrumentation/mcp/wrapper.js +7 -1
  172. package/dist/instrumentation/mcp/wrapper.js.map +1 -1
  173. package/dist/instrumentation/openai/wrapper.js +6 -0
  174. package/dist/instrumentation/openai/wrapper.js.map +1 -1
  175. package/dist/masking.d.ts +42 -0
  176. package/dist/masking.js +197 -0
  177. package/dist/masking.js.map +1 -0
  178. package/dist/otel/__tests__/app-logs-safety.test.d.ts +1 -0
  179. package/dist/otel/__tests__/app-logs-safety.test.js +129 -0
  180. package/dist/otel/__tests__/app-logs-safety.test.js.map +1 -0
  181. package/dist/otel/__tests__/app-logs.test.d.ts +1 -0
  182. package/dist/otel/__tests__/app-logs.test.js +269 -0
  183. package/dist/otel/__tests__/app-logs.test.js.map +1 -0
  184. package/dist/otel/__tests__/log-auto.test.d.ts +1 -0
  185. package/dist/otel/__tests__/log-auto.test.js +125 -0
  186. package/dist/otel/__tests__/log-auto.test.js.map +1 -0
  187. package/dist/otel/__tests__/log-bridges.test.d.ts +1 -0
  188. package/dist/otel/__tests__/log-bridges.test.js +170 -0
  189. package/dist/otel/__tests__/log-bridges.test.js.map +1 -0
  190. package/dist/otel/__tests__/system-metrics.test.d.ts +1 -0
  191. package/dist/otel/__tests__/system-metrics.test.js +79 -0
  192. package/dist/otel/__tests__/system-metrics.test.js.map +1 -0
  193. package/dist/otel/app-logs.d.ts +80 -0
  194. package/dist/otel/app-logs.js +195 -0
  195. package/dist/otel/app-logs.js.map +1 -0
  196. package/dist/otel/build-info.d.ts +23 -0
  197. package/dist/otel/build-info.js +176 -0
  198. package/dist/otel/build-info.js.map +1 -0
  199. package/dist/otel/code-location.d.ts +49 -0
  200. package/dist/otel/code-location.js +233 -0
  201. package/dist/otel/code-location.js.map +1 -0
  202. package/dist/otel/events.d.ts +1 -0
  203. package/dist/otel/events.js +21 -12
  204. package/dist/otel/events.js.map +1 -1
  205. package/dist/otel/log-auto.d.ts +44 -0
  206. package/dist/otel/log-auto.js +200 -0
  207. package/dist/otel/log-auto.js.map +1 -0
  208. package/dist/otel/log-bridges.d.ts +54 -0
  209. package/dist/otel/log-bridges.js +307 -0
  210. package/dist/otel/log-bridges.js.map +1 -0
  211. package/dist/otel/system-metrics.d.ts +39 -0
  212. package/dist/otel/system-metrics.js +166 -0
  213. package/dist/otel/system-metrics.js.map +1 -0
  214. package/dist/otel/tracing.js +12 -1
  215. package/dist/otel/tracing.js.map +1 -1
  216. package/dist/pricing.json +100 -42
  217. package/dist/protect/__tests__/protect.test.d.ts +1 -0
  218. package/dist/protect/__tests__/protect.test.js +210 -0
  219. package/dist/protect/__tests__/protect.test.js.map +1 -0
  220. package/dist/protect/index.d.ts +103 -0
  221. package/dist/protect/index.js +196 -0
  222. package/dist/protect/index.js.map +1 -0
  223. package/dist/protect/mcp.d.ts +13 -0
  224. package/dist/protect/mcp.js +49 -0
  225. package/dist/protect/mcp.js.map +1 -0
  226. package/dist/protect/mode.d.ts +89 -0
  227. package/dist/protect/mode.js +134 -0
  228. package/dist/protect/mode.js.map +1 -0
  229. package/dist/rasp/__tests__/auto-http.test.d.ts +1 -0
  230. package/dist/rasp/__tests__/auto-http.test.js +136 -0
  231. package/dist/rasp/__tests__/auto-http.test.js.map +1 -0
  232. package/dist/rasp/__tests__/baseline.test.d.ts +1 -0
  233. package/dist/rasp/__tests__/baseline.test.js +86 -0
  234. package/dist/rasp/__tests__/baseline.test.js.map +1 -0
  235. package/dist/rasp/__tests__/benign-corpus.test.d.ts +1 -0
  236. package/dist/rasp/__tests__/benign-corpus.test.js +68 -0
  237. package/dist/rasp/__tests__/benign-corpus.test.js.map +1 -0
  238. package/dist/rasp/__tests__/capture-context.test.d.ts +1 -0
  239. package/dist/rasp/__tests__/capture-context.test.js +135 -0
  240. package/dist/rasp/__tests__/capture-context.test.js.map +1 -0
  241. package/dist/rasp/__tests__/code-hook.test.d.ts +1 -0
  242. package/dist/rasp/__tests__/code-hook.test.js +218 -0
  243. package/dist/rasp/__tests__/code-hook.test.js.map +1 -0
  244. package/dist/rasp/__tests__/config-client.test.d.ts +1 -0
  245. package/dist/rasp/__tests__/config-client.test.js +283 -0
  246. package/dist/rasp/__tests__/config-client.test.js.map +1 -0
  247. package/dist/rasp/__tests__/corpus.d.ts +13 -0
  248. package/dist/rasp/__tests__/corpus.js +111 -0
  249. package/dist/rasp/__tests__/corpus.js.map +1 -0
  250. package/dist/rasp/__tests__/custom-rules.test.d.ts +1 -0
  251. package/dist/rasp/__tests__/custom-rules.test.js +276 -0
  252. package/dist/rasp/__tests__/custom-rules.test.js.map +1 -0
  253. package/dist/rasp/__tests__/db-hook.test.d.ts +1 -0
  254. package/dist/rasp/__tests__/db-hook.test.js +438 -0
  255. package/dist/rasp/__tests__/db-hook.test.js.map +1 -0
  256. package/dist/rasp/__tests__/deception.test.d.ts +1 -0
  257. package/dist/rasp/__tests__/deception.test.js +567 -0
  258. package/dist/rasp/__tests__/deception.test.js.map +1 -0
  259. package/dist/rasp/__tests__/detect.test.d.ts +1 -0
  260. package/dist/rasp/__tests__/detect.test.js +276 -0
  261. package/dist/rasp/__tests__/detect.test.js.map +1 -0
  262. package/dist/rasp/__tests__/esm-exports.test.d.ts +1 -0
  263. package/dist/rasp/__tests__/esm-exports.test.js +20 -0
  264. package/dist/rasp/__tests__/esm-exports.test.js.map +1 -0
  265. package/dist/rasp/__tests__/fs-hook.test.d.ts +1 -0
  266. package/dist/rasp/__tests__/fs-hook.test.js +241 -0
  267. package/dist/rasp/__tests__/fs-hook.test.js.map +1 -0
  268. package/dist/rasp/__tests__/hook-contracts.test.d.ts +1 -0
  269. package/dist/rasp/__tests__/hook-contracts.test.js +201 -0
  270. package/dist/rasp/__tests__/hook-contracts.test.js.map +1 -0
  271. package/dist/rasp/__tests__/hook-kit.d.ts +42 -0
  272. package/dist/rasp/__tests__/hook-kit.js +139 -0
  273. package/dist/rasp/__tests__/hook-kit.js.map +1 -0
  274. package/dist/rasp/__tests__/http-hook.test.d.ts +1 -0
  275. package/dist/rasp/__tests__/http-hook.test.js +250 -0
  276. package/dist/rasp/__tests__/http-hook.test.js.map +1 -0
  277. package/dist/rasp/__tests__/iast.test.d.ts +1 -0
  278. package/dist/rasp/__tests__/iast.test.js +361 -0
  279. package/dist/rasp/__tests__/iast.test.js.map +1 -0
  280. package/dist/rasp/__tests__/include-hook.test.d.ts +1 -0
  281. package/dist/rasp/__tests__/include-hook.test.js +122 -0
  282. package/dist/rasp/__tests__/include-hook.test.js.map +1 -0
  283. package/dist/rasp/__tests__/middleware.test.d.ts +1 -0
  284. package/dist/rasp/__tests__/middleware.test.js +302 -0
  285. package/dist/rasp/__tests__/middleware.test.js.map +1 -0
  286. package/dist/rasp/__tests__/process-hook.test.d.ts +1 -0
  287. package/dist/rasp/__tests__/process-hook.test.js +238 -0
  288. package/dist/rasp/__tests__/process-hook.test.js.map +1 -0
  289. package/dist/rasp/__tests__/reporter.test.d.ts +1 -0
  290. package/dist/rasp/__tests__/reporter.test.js +114 -0
  291. package/dist/rasp/__tests__/reporter.test.js.map +1 -0
  292. package/dist/rasp/__tests__/route.test.d.ts +1 -0
  293. package/dist/rasp/__tests__/route.test.js +46 -0
  294. package/dist/rasp/__tests__/route.test.js.map +1 -0
  295. package/dist/rasp/__tests__/rule-expr.test.d.ts +1 -0
  296. package/dist/rasp/__tests__/rule-expr.test.js +151 -0
  297. package/dist/rasp/__tests__/rule-expr.test.js.map +1 -0
  298. package/dist/rasp/__tests__/rule-phases.test.d.ts +1 -0
  299. package/dist/rasp/__tests__/rule-phases.test.js +271 -0
  300. package/dist/rasp/__tests__/rule-phases.test.js.map +1 -0
  301. package/dist/rasp/__tests__/sinks-hook.test.d.ts +1 -0
  302. package/dist/rasp/__tests__/sinks-hook.test.js +177 -0
  303. package/dist/rasp/__tests__/sinks-hook.test.js.map +1 -0
  304. package/dist/rasp/__tests__/targets.test.d.ts +1 -0
  305. package/dist/rasp/__tests__/targets.test.js +82 -0
  306. package/dist/rasp/__tests__/targets.test.js.map +1 -0
  307. package/dist/rasp/__tests__/template-hook.test.d.ts +1 -0
  308. package/dist/rasp/__tests__/template-hook.test.js +254 -0
  309. package/dist/rasp/__tests__/template-hook.test.js.map +1 -0
  310. package/dist/rasp/__tests__/upload.test.d.ts +1 -0
  311. package/dist/rasp/__tests__/upload.test.js +81 -0
  312. package/dist/rasp/__tests__/upload.test.js.map +1 -0
  313. package/dist/rasp/__tests__/vpatch-engine.test.d.ts +1 -0
  314. package/dist/rasp/__tests__/vpatch-engine.test.js +177 -0
  315. package/dist/rasp/__tests__/vpatch-engine.test.js.map +1 -0
  316. package/dist/rasp/auto-http.d.ts +6 -0
  317. package/dist/rasp/auto-http.js +194 -0
  318. package/dist/rasp/auto-http.js.map +1 -0
  319. package/dist/rasp/baseline.d.ts +35 -0
  320. package/dist/rasp/baseline.js +91 -0
  321. package/dist/rasp/baseline.js.map +1 -0
  322. package/dist/rasp/capture.d.ts +76 -0
  323. package/dist/rasp/capture.js +304 -0
  324. package/dist/rasp/capture.js.map +1 -0
  325. package/dist/rasp/config-client.d.ts +122 -0
  326. package/dist/rasp/config-client.js +337 -0
  327. package/dist/rasp/config-client.js.map +1 -0
  328. package/dist/rasp/context.d.ts +65 -0
  329. package/dist/rasp/context.js +68 -0
  330. package/dist/rasp/context.js.map +1 -0
  331. package/dist/rasp/custom-rules.d.ts +68 -0
  332. package/dist/rasp/custom-rules.js +222 -0
  333. package/dist/rasp/custom-rules.js.map +1 -0
  334. package/dist/rasp/data/default-rules.json +199 -0
  335. package/dist/rasp/data/default-sinks.json +4 -0
  336. package/dist/rasp/data/dnslog-domains.json +11 -0
  337. package/dist/rasp/deception.d.ts +70 -0
  338. package/dist/rasp/deception.js +220 -0
  339. package/dist/rasp/deception.js.map +1 -0
  340. package/dist/rasp/detect.d.ts +68 -0
  341. package/dist/rasp/detect.js +671 -0
  342. package/dist/rasp/detect.js.map +1 -0
  343. package/dist/rasp/engine.d.ts +107 -0
  344. package/dist/rasp/engine.js +330 -0
  345. package/dist/rasp/engine.js.map +1 -0
  346. package/dist/rasp/hooks/code.d.ts +20 -0
  347. package/dist/rasp/hooks/code.js +334 -0
  348. package/dist/rasp/hooks/code.js.map +1 -0
  349. package/dist/rasp/hooks/db.d.ts +48 -0
  350. package/dist/rasp/hooks/db.js +322 -0
  351. package/dist/rasp/hooks/db.js.map +1 -0
  352. package/dist/rasp/hooks/esm.d.ts +7 -0
  353. package/dist/rasp/hooks/esm.js +18 -0
  354. package/dist/rasp/hooks/esm.js.map +1 -0
  355. package/dist/rasp/hooks/fs.d.ts +3 -0
  356. package/dist/rasp/hooks/fs.js +206 -0
  357. package/dist/rasp/hooks/fs.js.map +1 -0
  358. package/dist/rasp/hooks/http.d.ts +4 -0
  359. package/dist/rasp/hooks/http.js +213 -0
  360. package/dist/rasp/hooks/http.js.map +1 -0
  361. package/dist/rasp/hooks/include.d.ts +9 -0
  362. package/dist/rasp/hooks/include.js +79 -0
  363. package/dist/rasp/hooks/include.js.map +1 -0
  364. package/dist/rasp/hooks/marks.d.ts +2 -0
  365. package/dist/rasp/hooks/marks.js +16 -0
  366. package/dist/rasp/hooks/marks.js.map +1 -0
  367. package/dist/rasp/hooks/process.d.ts +22 -0
  368. package/dist/rasp/hooks/process.js +191 -0
  369. package/dist/rasp/hooks/process.js.map +1 -0
  370. package/dist/rasp/hooks/sinks.d.ts +54 -0
  371. package/dist/rasp/hooks/sinks.js +329 -0
  372. package/dist/rasp/hooks/sinks.js.map +1 -0
  373. package/dist/rasp/hooks/template.d.ts +21 -0
  374. package/dist/rasp/hooks/template.js +152 -0
  375. package/dist/rasp/hooks/template.js.map +1 -0
  376. package/dist/rasp/iast-rules.d.ts +82 -0
  377. package/dist/rasp/iast-rules.js +240 -0
  378. package/dist/rasp/iast-rules.js.map +1 -0
  379. package/dist/rasp/iast-scope.d.ts +29 -0
  380. package/dist/rasp/iast-scope.js +54 -0
  381. package/dist/rasp/iast-scope.js.map +1 -0
  382. package/dist/rasp/iast.d.ts +81 -0
  383. package/dist/rasp/iast.js +272 -0
  384. package/dist/rasp/iast.js.map +1 -0
  385. package/dist/rasp/index.d.ts +52 -0
  386. package/dist/rasp/index.js +280 -0
  387. package/dist/rasp/index.js.map +1 -0
  388. package/dist/rasp/lexers.d.ts +32 -0
  389. package/dist/rasp/lexers.js +444 -0
  390. package/dist/rasp/lexers.js.map +1 -0
  391. package/dist/rasp/middleware.d.ts +155 -0
  392. package/dist/rasp/middleware.js +568 -0
  393. package/dist/rasp/middleware.js.map +1 -0
  394. package/dist/rasp/model-output.d.ts +14 -0
  395. package/dist/rasp/model-output.js +107 -0
  396. package/dist/rasp/model-output.js.map +1 -0
  397. package/dist/rasp/normalize.d.ts +23 -0
  398. package/dist/rasp/normalize.js +140 -0
  399. package/dist/rasp/normalize.js.map +1 -0
  400. package/dist/rasp/reporter.d.ts +60 -0
  401. package/dist/rasp/reporter.js +230 -0
  402. package/dist/rasp/reporter.js.map +1 -0
  403. package/dist/rasp/rule-expr.d.ts +236 -0
  404. package/dist/rasp/rule-expr.js +1253 -0
  405. package/dist/rasp/rule-expr.js.map +1 -0
  406. package/dist/rasp/template.d.ts +53 -0
  407. package/dist/rasp/template.js +336 -0
  408. package/dist/rasp/template.js.map +1 -0
  409. package/dist/rasp/types.d.ts +110 -0
  410. package/dist/rasp/types.js +51 -0
  411. package/dist/rasp/types.js.map +1 -0
  412. package/dist/rasp/vpatch.d.ts +55 -0
  413. package/dist/rasp/vpatch.js +120 -0
  414. package/dist/rasp/vpatch.js.map +1 -0
  415. package/dist/register.js +52 -11
  416. package/dist/register.js.map +1 -1
  417. package/dist/semantic-convention.d.ts +2 -0
  418. package/dist/semantic-convention.js +5 -0
  419. package/dist/semantic-convention.js.map +1 -1
  420. package/dist/types.d.ts +96 -0
  421. package/dist/zero-code.d.ts +8 -0
  422. package/dist/zero-code.js +38 -0
  423. package/dist/zero-code.js.map +1 -0
  424. package/package.json +18 -2
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Shield Protect -- enforcement APIs, kept apart from the tracing APIs.
3
+ *
4
+ * protectTool(name, fn, options) wrap a function the agent may call: its
5
+ * arguments are checked before it runs,
6
+ * an optional authorize step is asked,
7
+ * and its result is checked before it is
8
+ * returned. In enforced mode every failure
9
+ * refuses the call.
10
+ * authorizeWithShield360(target) ask Shield360's decision service about a
11
+ * model or a destination, as the agent
12
+ * (SHIELD360_AGENT_TOKEN).
13
+ * protectReadiness() what this process can claim.
14
+ *
15
+ * `trace`, `startTrace` and the instrumentations record; these refuse.
16
+ *
17
+ * Must stay in sync with: sdk/python/src/shield360/protect/__init__.py
18
+ */
19
+ import { Pipeline } from '../guard/pipeline';
20
+ import { ProtectMode } from './mode';
21
+ export { ProtectDeniedError, ProtectError, ProtectReadinessError, protectReadiness, resolveProtectMode, resolveProtect, PROTECT_MODES, } from './mode';
22
+ export type { ProtectMode, ProtectConfig, ProtectReadiness } from './mode';
23
+ export type ProtectToolOptions<A extends unknown[]> = {
24
+ /** The pipeline to check with; defaults to the one init() installed. */
25
+ pipeline?: Pipeline;
26
+ /** The mode; defaults to the process's. With none set anywhere, deny findings refuse (as a guard's own action says). */
27
+ mode?: ProtectMode;
28
+ /** How the arguments are turned into text for the guards. Default: canonical JSON of every argument. */
29
+ describeArgs?: (...args: A) => string;
30
+ /** How the result is turned into text for postflight guards. Default: canonical JSON. */
31
+ describeResult?: (result: unknown) => string;
32
+ /**
33
+ * An authorization step asked after the guards and before the call: a
34
+ * grant lookup, a Shield360 decision (authorizeWithShield360), a budget.
35
+ * A refusal, a throw or a non-boolean answer refuses the call in enforced
36
+ * mode; the call never runs on an answer it did not get.
37
+ */
38
+ authorize?: (...args: A) => Promise<{
39
+ allow: boolean;
40
+ reason?: string;
41
+ }> | {
42
+ allow: boolean;
43
+ reason?: string;
44
+ };
45
+ };
46
+ export type ProtectDecision = {
47
+ tool: string;
48
+ phase: 'preflight' | 'authorize' | 'postflight';
49
+ outcome: 'allow' | 'deny' | 'observed';
50
+ reason: string;
51
+ };
52
+ /** Canonical JSON: keys sorted, undefined dropped, so the same call reads the same. */
53
+ export declare function canonicalJson(value: unknown, depth?: number): string;
54
+ /**
55
+ * Whether a pipeline result stops the call under a mode. With no mode
56
+ * (legacy), a DENY stops it as before. In observe and warn it is recorded,
57
+ * and in warn also logged, and the call goes on. In enforced it stops.
58
+ */
59
+ export declare function findingStops(mode: ProtectMode | undefined, denied: boolean): boolean;
60
+ /**
61
+ * Wraps a function as a protected tool. Returns a function with the same
62
+ * signature. Nothing about tracing: the call is recorded as a decision
63
+ * event on the active span, if any, and that is all.
64
+ */
65
+ export declare function protectTool<A extends unknown[], R>(name: string, fn: (...args: A) => Promise<R> | R, options?: ProtectToolOptions<A>): (...args: A) => Promise<R>;
66
+ export type AuthorizeTarget = {
67
+ kind: 'model';
68
+ model: string;
69
+ provider?: string;
70
+ inputTokens?: number;
71
+ maxOutputTokens?: number;
72
+ estimatedCostUsd?: number;
73
+ } | {
74
+ kind: 'destination';
75
+ host: string;
76
+ method?: string;
77
+ };
78
+ export type AuthorizeOptions = {
79
+ /** The agent's token; defaults to SHIELD360_AGENT_TOKEN. */
80
+ agentToken?: string;
81
+ /** Shield360's URL; defaults to init()'s shield360Url, then SHIELD360_URL. */
82
+ url?: string;
83
+ onBehalfOf?: string;
84
+ environment?: string;
85
+ timeoutMs?: number;
86
+ fetchImpl?: typeof fetch;
87
+ };
88
+ export type AuthorizeAnswer = {
89
+ allow: boolean;
90
+ reason: string;
91
+ outcome?: string;
92
+ message?: string;
93
+ policyVersion?: string;
94
+ decisionId?: string | null;
95
+ };
96
+ /**
97
+ * Asks Shield360 whether this agent may make a model call or reach a host
98
+ * (POST /api/agent-authorization/check). The agent's token decides the agent
99
+ * and its environment. An answer that did not arrive is `allow: false` with
100
+ * the reason: a caller in enforced mode treats it as a refusal, never a
101
+ * verdict in the agent's favour.
102
+ */
103
+ export declare function authorizeWithShield360(target: AuthorizeTarget, options?: AuthorizeOptions): Promise<AuthorizeAnswer>;
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ /**
3
+ * Shield Protect -- enforcement APIs, kept apart from the tracing APIs.
4
+ *
5
+ * protectTool(name, fn, options) wrap a function the agent may call: its
6
+ * arguments are checked before it runs,
7
+ * an optional authorize step is asked,
8
+ * and its result is checked before it is
9
+ * returned. In enforced mode every failure
10
+ * refuses the call.
11
+ * authorizeWithShield360(target) ask Shield360's decision service about a
12
+ * model or a destination, as the agent
13
+ * (SHIELD360_AGENT_TOKEN).
14
+ * protectReadiness() what this process can claim.
15
+ *
16
+ * `trace`, `startTrace` and the instrumentations record; these refuse.
17
+ *
18
+ * Must stay in sync with: sdk/python/src/shield360/protect/__init__.py
19
+ */
20
+ var __importDefault = (this && this.__importDefault) || function (mod) {
21
+ return (mod && mod.__esModule) ? mod : { "default": mod };
22
+ };
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.PROTECT_MODES = exports.resolveProtect = exports.resolveProtectMode = exports.protectReadiness = exports.ProtectReadinessError = exports.ProtectError = exports.ProtectDeniedError = void 0;
25
+ exports.canonicalJson = canonicalJson;
26
+ exports.findingStops = findingStops;
27
+ exports.protectTool = protectTool;
28
+ exports.authorizeWithShield360 = authorizeWithShield360;
29
+ const api_1 = require("@opentelemetry/api");
30
+ const config_1 = __importDefault(require("../config"));
31
+ const base_1 = require("../guard/base");
32
+ const mode_1 = require("./mode");
33
+ var mode_2 = require("./mode");
34
+ Object.defineProperty(exports, "ProtectDeniedError", { enumerable: true, get: function () { return mode_2.ProtectDeniedError; } });
35
+ Object.defineProperty(exports, "ProtectError", { enumerable: true, get: function () { return mode_2.ProtectError; } });
36
+ Object.defineProperty(exports, "ProtectReadinessError", { enumerable: true, get: function () { return mode_2.ProtectReadinessError; } });
37
+ Object.defineProperty(exports, "protectReadiness", { enumerable: true, get: function () { return mode_2.protectReadiness; } });
38
+ Object.defineProperty(exports, "resolveProtectMode", { enumerable: true, get: function () { return mode_2.resolveProtectMode; } });
39
+ Object.defineProperty(exports, "resolveProtect", { enumerable: true, get: function () { return mode_2.resolveProtect; } });
40
+ Object.defineProperty(exports, "PROTECT_MODES", { enumerable: true, get: function () { return mode_2.PROTECT_MODES; } });
41
+ const MAX_DESCRIBED = 1000000;
42
+ /** Canonical JSON: keys sorted, undefined dropped, so the same call reads the same. */
43
+ function canonicalJson(value, depth = 0) {
44
+ if (depth > 32)
45
+ return '"…"';
46
+ if (Array.isArray(value))
47
+ return `[${value.map((v) => canonicalJson(v === undefined ? null : v, depth + 1)).join(',')}]`;
48
+ if (value && typeof value === 'object') {
49
+ const entries = Object.entries(value)
50
+ .filter(([, v]) => v !== undefined && typeof v !== 'function')
51
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
52
+ return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${canonicalJson(v, depth + 1)}`).join(',')}}`;
53
+ }
54
+ if (typeof value === 'bigint')
55
+ return JSON.stringify(String(value));
56
+ if (typeof value === 'function' || typeof value === 'symbol')
57
+ return 'null';
58
+ return JSON.stringify(value ?? null);
59
+ }
60
+ function record(decision) {
61
+ try {
62
+ const span = api_1.trace.getActiveSpan();
63
+ span?.addEvent('shield360.protect.decision', {
64
+ 'shield360.protect.tool': decision.tool,
65
+ 'shield360.protect.phase': decision.phase,
66
+ 'shield360.protect.outcome': decision.outcome,
67
+ 'shield360.protect.reason': decision.reason.slice(0, 500),
68
+ });
69
+ }
70
+ catch {
71
+ // recording never changes a decision
72
+ }
73
+ }
74
+ /**
75
+ * Whether a pipeline result stops the call under a mode. With no mode
76
+ * (legacy), a DENY stops it as before. In observe and warn it is recorded,
77
+ * and in warn also logged, and the call goes on. In enforced it stops.
78
+ */
79
+ function findingStops(mode, denied) {
80
+ if (!denied)
81
+ return false;
82
+ if (mode === undefined)
83
+ return true;
84
+ return (0, mode_1.refuses)(mode);
85
+ }
86
+ function evaluateText(pipeline, text, phase, tool, mode) {
87
+ if (!text)
88
+ return;
89
+ const bound = pipeline.scanBound();
90
+ if ((0, mode_1.refuses)(mode) && bound > 0 && text.length > bound) {
91
+ record({ tool, phase, outcome: 'deny', reason: `input of ${text.length} characters is over the ${bound}-character scan bound` });
92
+ throw new mode_1.ProtectDeniedError('oversized', `Shield360 Protect refused ${tool}: ${text.length} characters is more than its guards scan (${bound}); send less.`);
93
+ }
94
+ let result;
95
+ try {
96
+ result = pipeline.evaluate(text, phase);
97
+ }
98
+ catch (e) {
99
+ if ((0, mode_1.refuses)(mode)) {
100
+ record({ tool, phase, outcome: 'deny', reason: `guard failed: ${e?.message ?? String(e)}` });
101
+ throw new mode_1.ProtectDeniedError('guard_failed', `Shield360 Protect refused ${tool}: a guard failed and enforced mode does not run unchecked calls.`);
102
+ }
103
+ throw e;
104
+ }
105
+ const denied = result.action === base_1.GuardAction.DENY;
106
+ if (!denied) {
107
+ record({ tool, phase, outcome: 'allow', reason: result.action });
108
+ return;
109
+ }
110
+ if (findingStops(mode, true)) {
111
+ record({ tool, phase, outcome: 'deny', reason: result.explanation });
112
+ throw new base_1.GuardDeniedError(result);
113
+ }
114
+ record({ tool, phase, outcome: 'observed', reason: result.explanation });
115
+ if (mode === 'warn')
116
+ console.warn(`[shield360] Protect (warn mode): ${tool} would have been refused at ${phase}: ${result.explanation}`);
117
+ }
118
+ /**
119
+ * Wraps a function as a protected tool. Returns a function with the same
120
+ * signature. Nothing about tracing: the call is recorded as a decision
121
+ * event on the active span, if any, and that is all.
122
+ */
123
+ function protectTool(name, fn, options = {}) {
124
+ const describeArgs = options.describeArgs ?? ((...args) => canonicalJson(args).slice(0, MAX_DESCRIBED));
125
+ const describeResult = options.describeResult ?? ((result) => canonicalJson(result).slice(0, MAX_DESCRIBED));
126
+ return async (...args) => {
127
+ const mode = options.mode ?? (0, mode_1.currentProtectMode)();
128
+ const pipeline = options.pipeline ?? config_1.default.guardPipeline;
129
+ if (!pipeline && (0, mode_1.refuses)(mode)) {
130
+ throw new mode_1.ProtectDeniedError('guard_failed', `Shield360 Protect refused ${name}: enforced mode has no guard pipeline; pass guards to init() or to protectTool().`);
131
+ }
132
+ if (pipeline)
133
+ evaluateText(pipeline, describeArgs(...args), base_1.GuardPhase.PREFLIGHT, name, mode);
134
+ if (options.authorize) {
135
+ let verdict;
136
+ let failed = false;
137
+ try {
138
+ verdict = await options.authorize(...args);
139
+ }
140
+ catch (e) {
141
+ failed = true;
142
+ record({ tool: name, phase: 'authorize', outcome: (0, mode_1.refuses)(mode) ? 'deny' : 'observed', reason: `authorize failed: ${e?.message ?? String(e)}` });
143
+ if ((0, mode_1.refuses)(mode))
144
+ throw new mode_1.ProtectDeniedError('authorize_failed', `Shield360 Protect refused ${name}: the authorization check failed and enforced mode does not run unchecked calls.`);
145
+ }
146
+ if (!failed) {
147
+ // Anything but an object saying allow: true -- undefined, null, a bare boolean -- is not an answer in the call's favour.
148
+ const answer = verdict && typeof verdict === 'object' ? verdict : null;
149
+ const allowed = answer?.allow === true;
150
+ const reason = typeof answer?.reason === 'string' ? answer.reason : answer ? '' : 'no authorization answer';
151
+ record({ tool: name, phase: 'authorize', outcome: allowed ? 'allow' : findingStops(mode, true) ? 'deny' : 'observed', reason });
152
+ if (!allowed && findingStops(mode, true))
153
+ throw new mode_1.ProtectDeniedError('not_authorized', `Shield360 Protect refused ${name}: ${reason || 'not authorized'}.`);
154
+ }
155
+ }
156
+ const result = await fn(...args);
157
+ if (pipeline)
158
+ evaluateText(pipeline, describeResult(result), base_1.GuardPhase.POSTFLIGHT, name, mode);
159
+ return result;
160
+ };
161
+ }
162
+ /**
163
+ * Asks Shield360 whether this agent may make a model call or reach a host
164
+ * (POST /api/agent-authorization/check). The agent's token decides the agent
165
+ * and its environment. An answer that did not arrive is `allow: false` with
166
+ * the reason: a caller in enforced mode treats it as a refusal, never a
167
+ * verdict in the agent's favour.
168
+ */
169
+ async function authorizeWithShield360(target, options = {}) {
170
+ const token = options.agentToken ?? process.env.SHIELD360_AGENT_TOKEN ?? '';
171
+ const base = (options.url ?? config_1.default.shield360Url ?? process.env.SHIELD360_URL ?? '').replace(/\/+$/, '');
172
+ if (!token || !base)
173
+ return { allow: false, reason: 'shield360_not_configured' };
174
+ const doFetch = options.fetchImpl ?? fetch;
175
+ const controller = new AbortController();
176
+ const timer = setTimeout(() => controller.abort(), options.timeoutMs ?? 5000);
177
+ try {
178
+ const headers = { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` };
179
+ if (options.onBehalfOf)
180
+ headers['X-Shield360-On-Behalf-Of'] = options.onBehalfOf;
181
+ if (options.environment)
182
+ headers['X-Shield360-Environment'] = options.environment;
183
+ const res = await doFetch(`${base}/api/agent-authorization/check`, { method: 'POST', headers, body: JSON.stringify(target), signal: controller.signal });
184
+ if (!res.ok)
185
+ return { allow: false, reason: `check_http_${res.status}` };
186
+ const body = (await res.json());
187
+ return { allow: body.outcome === 'allow', reason: body.reason ?? 'unknown', outcome: body.outcome, message: body.message, policyVersion: body.policyVersion, decisionId: body.decisionId ?? null };
188
+ }
189
+ catch (e) {
190
+ return { allow: false, reason: `check_unreachable: ${e?.message ?? String(e)}` };
191
+ }
192
+ finally {
193
+ clearTimeout(timer);
194
+ }
195
+ }
196
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/protect/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Shield Protect -- the pre-execution check on an MCP client's tools/call.
3
+ *
4
+ * The MCP instrumentation records every call; this is the one place it can
5
+ * refuse one. The tool's arguments, as canonical JSON, go through the
6
+ * preflight guards init() installed, under the process's Protect mode:
7
+ * observe records, warn records and logs, enforced refuses (and refuses when
8
+ * a guard fails, or when the arguments are past the scan bound). With no
9
+ * pipeline or no mode, nothing changes: the call is recorded as before.
10
+ *
11
+ * Must stay in sync with: sdk/python/src/shield360/protect/_mcp.py
12
+ */
13
+ export declare function checkMcpToolCall(toolName: string, toolArguments: unknown): void;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ /**
3
+ * Shield Protect -- the pre-execution check on an MCP client's tools/call.
4
+ *
5
+ * The MCP instrumentation records every call; this is the one place it can
6
+ * refuse one. The tool's arguments, as canonical JSON, go through the
7
+ * preflight guards init() installed, under the process's Protect mode:
8
+ * observe records, warn records and logs, enforced refuses (and refuses when
9
+ * a guard fails, or when the arguments are past the scan bound). With no
10
+ * pipeline or no mode, nothing changes: the call is recorded as before.
11
+ *
12
+ * Must stay in sync with: sdk/python/src/shield360/protect/_mcp.py
13
+ */
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.checkMcpToolCall = checkMcpToolCall;
19
+ const config_1 = __importDefault(require("../config"));
20
+ const base_1 = require("../guard/base");
21
+ const index_1 = require("./index");
22
+ const mode_1 = require("./mode");
23
+ function checkMcpToolCall(toolName, toolArguments) {
24
+ const mode = (0, mode_1.currentProtectMode)();
25
+ const pipeline = config_1.default.guardPipeline;
26
+ if (!pipeline || mode === undefined)
27
+ return;
28
+ const text = (0, index_1.canonicalJson)(toolArguments ?? {});
29
+ const bound = pipeline.scanBound();
30
+ if ((0, mode_1.refuses)(mode) && bound > 0 && text.length > bound) {
31
+ throw new mode_1.ProtectDeniedError('oversized', `Shield360 Protect refused MCP tool ${toolName}: ${text.length} characters of arguments is more than its guards scan (${bound}).`);
32
+ }
33
+ let result;
34
+ try {
35
+ result = pipeline.evaluate(text, base_1.GuardPhase.PREFLIGHT);
36
+ }
37
+ catch (e) {
38
+ if ((0, mode_1.refuses)(mode))
39
+ throw new mode_1.ProtectDeniedError('guard_failed', `Shield360 Protect refused MCP tool ${toolName}: a guard failed and enforced mode does not run unchecked calls.`);
40
+ throw e;
41
+ }
42
+ if (result.action !== base_1.GuardAction.DENY)
43
+ return;
44
+ if ((0, mode_1.refuses)(mode))
45
+ throw new base_1.GuardDeniedError(result);
46
+ if (mode === 'warn')
47
+ console.warn(`[shield360] Protect (warn mode): MCP tool ${toolName} would have been refused: ${result.explanation}`);
48
+ }
49
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/protect/mcp.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;;;AAOH,4CAmBC;AAxBD,uDAAwC;AACxC,wCAA0E;AAC1E,mCAAwC;AACxC,iCAAyE;AAEzE,SAAgB,gBAAgB,CAAC,QAAgB,EAAE,aAAsB;IACvE,MAAM,IAAI,GAAG,IAAA,yBAAkB,GAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,gBAAe,CAAC,aAAa,CAAC;IAC/C,IAAI,CAAC,QAAQ,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO;IAC5C,MAAM,IAAI,GAAG,IAAA,qBAAa,EAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;IACnC,IAAI,IAAA,cAAO,EAAC,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;QACtD,MAAM,IAAI,yBAAkB,CAAC,WAAW,EAAE,sCAAsC,QAAQ,KAAK,IAAI,CAAC,MAAM,0DAA0D,KAAK,IAAI,CAAC,CAAC;IAC/K,CAAC;IACD,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,iBAAU,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,IAAA,cAAO,EAAC,IAAI,CAAC;YAAE,MAAM,IAAI,yBAAkB,CAAC,cAAc,EAAE,sCAAsC,QAAQ,kEAAkE,CAAC,CAAC;QAClL,MAAM,CAAC,CAAC;IACV,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,kBAAW,CAAC,IAAI;QAAE,OAAO;IAC/C,IAAI,IAAA,cAAO,EAAC,IAAI,CAAC;QAAE,MAAM,IAAI,uBAAgB,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,6CAA6C,QAAQ,6BAA6B,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;AAC5I,CAAC"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Shield Protect -- the enforcement mode of this process.
3
+ *
4
+ * observe every check runs and its finding is recorded (span event,
5
+ * decision report); nothing is refused. For seeing what enforced
6
+ * mode would stop before turning it on.
7
+ * warn as observe, and the finding is logged as a warning.
8
+ * enforced a finding refuses the call; a guard that throws refuses the
9
+ * call (fail closed, whatever guardFailOpen says); a provider
10
+ * named in `required` that could not be wrapped stops startup;
11
+ * a streamed completion that postflight guards cannot inspect
12
+ * is refused; input past the scan bound is refused rather than
13
+ * scanned in part.
14
+ *
15
+ * The mode set in code is a floor: SHIELD360_PROTECT_MODE can raise it and
16
+ * never lower it, so an environment variable in a shell or a container
17
+ * cannot weaken what the application was deployed with. With no mode set
18
+ * anywhere, guards behave as they always have (each guard's own action,
19
+ * guardFailOpen as given): that is `legacy`, and nothing changes for an
20
+ * application that never asked for Protect.
21
+ *
22
+ * What this layer can and cannot claim: it runs inside the application's
23
+ * process. Code that can disable the SDK, import a provider the SDK does
24
+ * not wrap, or reach a network directly is not stopped by it. The
25
+ * mandatory boundary is the Shield360 gateway; this layer is monitored or
26
+ * partially protected, and its readiness report says so.
27
+ *
28
+ * Must stay in sync with: sdk/python/src/shield360/protect/_mode.py
29
+ */
30
+ export type ProtectMode = 'observe' | 'warn' | 'enforced';
31
+ export declare const PROTECT_MODES: readonly ProtectMode[];
32
+ export declare const PROTECT_MODE_ENV = "SHIELD360_PROTECT_MODE";
33
+ export declare const PROTECT_REQUIRED_ENV = "SHIELD360_PROTECT_REQUIRED";
34
+ export declare function isProtectMode(value: unknown): value is ProtectMode;
35
+ /** The stricter of two modes; undefined counts as nothing. */
36
+ export declare function strictestMode(a?: ProtectMode, b?: ProtectMode): ProtectMode | undefined;
37
+ /**
38
+ * The mode this process runs under: what the code set, raised by the
39
+ * environment when the environment asks for more. An environment value
40
+ * that is not a mode is ignored, never a downgrade.
41
+ */
42
+ export declare function resolveProtectMode(fromCode?: ProtectMode, env?: NodeJS.ProcessEnv): ProtectMode | undefined;
43
+ /** Providers that must be wrapped: the code's list plus the environment's. */
44
+ export declare function resolveRequired(fromCode?: string[], env?: NodeJS.ProcessEnv): string[];
45
+ export type ProtectConfig = {
46
+ mode?: ProtectMode;
47
+ /** npm package names whose provider methods must be wrapped, or startup fails in enforced mode: "openai", "@anthropic-ai/sdk". */
48
+ required?: string[];
49
+ };
50
+ export type ResolvedProtect = {
51
+ mode?: ProtectMode;
52
+ required: string[];
53
+ };
54
+ export declare function resolveProtect(config: ProtectConfig | undefined, env?: NodeJS.ProcessEnv): ResolvedProtect;
55
+ export declare const refuses: (mode: ProtectMode | undefined) => boolean;
56
+ export declare class ProtectError extends Error {
57
+ constructor(message?: string);
58
+ }
59
+ /** A call refused by Protect for a reason that is not a guard finding: oversized input, uninspectable streaming, a failed check. */
60
+ export declare class ProtectDeniedError extends ProtectError {
61
+ readonly code: 'oversized' | 'streaming' | 'guard_failed' | 'not_authorized' | 'authorize_failed';
62
+ constructor(code: ProtectDeniedError['code'], message: string);
63
+ }
64
+ /** Enforced mode could not be set up: a required provider is not wrapped, or guards are missing. Thrown from init. */
65
+ export declare class ProtectReadinessError extends ProtectError {
66
+ readonly missing: string[];
67
+ constructor(missing: string[], message: string);
68
+ }
69
+ export type ProtectReadiness = {
70
+ mode: ProtectMode | 'legacy';
71
+ /** Provider packages whose methods were wrapped. */
72
+ wrapped: string[];
73
+ /** Provider packages named as required that were not wrapped. */
74
+ missing: string[];
75
+ /** monitored: in-process checks that code in the same process can bypass. Never "enforced": that is the gateway's claim. */
76
+ level: 'monitored' | 'partially_protected';
77
+ note: string;
78
+ };
79
+ /** @internal */
80
+ export declare function setProtectState(next: {
81
+ mode?: ProtectMode;
82
+ wrapped: string[];
83
+ missing: string[];
84
+ }): void;
85
+ /** @internal */
86
+ export declare function currentProtectMode(): ProtectMode | undefined;
87
+ export declare function protectReadiness(): ProtectReadiness;
88
+ /** @internal for tests */
89
+ export declare function resetProtectState(): void;
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ /**
3
+ * Shield Protect -- the enforcement mode of this process.
4
+ *
5
+ * observe every check runs and its finding is recorded (span event,
6
+ * decision report); nothing is refused. For seeing what enforced
7
+ * mode would stop before turning it on.
8
+ * warn as observe, and the finding is logged as a warning.
9
+ * enforced a finding refuses the call; a guard that throws refuses the
10
+ * call (fail closed, whatever guardFailOpen says); a provider
11
+ * named in `required` that could not be wrapped stops startup;
12
+ * a streamed completion that postflight guards cannot inspect
13
+ * is refused; input past the scan bound is refused rather than
14
+ * scanned in part.
15
+ *
16
+ * The mode set in code is a floor: SHIELD360_PROTECT_MODE can raise it and
17
+ * never lower it, so an environment variable in a shell or a container
18
+ * cannot weaken what the application was deployed with. With no mode set
19
+ * anywhere, guards behave as they always have (each guard's own action,
20
+ * guardFailOpen as given): that is `legacy`, and nothing changes for an
21
+ * application that never asked for Protect.
22
+ *
23
+ * What this layer can and cannot claim: it runs inside the application's
24
+ * process. Code that can disable the SDK, import a provider the SDK does
25
+ * not wrap, or reach a network directly is not stopped by it. The
26
+ * mandatory boundary is the Shield360 gateway; this layer is monitored or
27
+ * partially protected, and its readiness report says so.
28
+ *
29
+ * Must stay in sync with: sdk/python/src/shield360/protect/_mode.py
30
+ */
31
+ Object.defineProperty(exports, "__esModule", { value: true });
32
+ exports.ProtectReadinessError = exports.ProtectDeniedError = exports.ProtectError = exports.refuses = exports.PROTECT_REQUIRED_ENV = exports.PROTECT_MODE_ENV = exports.PROTECT_MODES = void 0;
33
+ exports.isProtectMode = isProtectMode;
34
+ exports.strictestMode = strictestMode;
35
+ exports.resolveProtectMode = resolveProtectMode;
36
+ exports.resolveRequired = resolveRequired;
37
+ exports.resolveProtect = resolveProtect;
38
+ exports.setProtectState = setProtectState;
39
+ exports.currentProtectMode = currentProtectMode;
40
+ exports.protectReadiness = protectReadiness;
41
+ exports.resetProtectState = resetProtectState;
42
+ exports.PROTECT_MODES = ['observe', 'warn', 'enforced'];
43
+ const RANK = { observe: 0, warn: 1, enforced: 2 };
44
+ exports.PROTECT_MODE_ENV = 'SHIELD360_PROTECT_MODE';
45
+ exports.PROTECT_REQUIRED_ENV = 'SHIELD360_PROTECT_REQUIRED';
46
+ function isProtectMode(value) {
47
+ return typeof value === 'string' && exports.PROTECT_MODES.includes(value);
48
+ }
49
+ /** The stricter of two modes; undefined counts as nothing. */
50
+ function strictestMode(a, b) {
51
+ if (!a)
52
+ return b;
53
+ if (!b)
54
+ return a;
55
+ return RANK[a] >= RANK[b] ? a : b;
56
+ }
57
+ /**
58
+ * The mode this process runs under: what the code set, raised by the
59
+ * environment when the environment asks for more. An environment value
60
+ * that is not a mode is ignored, never a downgrade.
61
+ */
62
+ function resolveProtectMode(fromCode, env = process.env) {
63
+ const raw = (env[exports.PROTECT_MODE_ENV] || '').trim().toLowerCase();
64
+ const fromEnv = isProtectMode(raw) ? raw : undefined;
65
+ return strictestMode(fromCode, fromEnv);
66
+ }
67
+ /** Providers that must be wrapped: the code's list plus the environment's. */
68
+ function resolveRequired(fromCode = [], env = process.env) {
69
+ const fromEnv = (env[exports.PROTECT_REQUIRED_ENV] || '')
70
+ .split(',')
71
+ .map((s) => s.trim())
72
+ .filter(Boolean);
73
+ return Array.from(new Set([...fromCode, ...fromEnv]));
74
+ }
75
+ function resolveProtect(config, env = process.env) {
76
+ return { mode: resolveProtectMode(config?.mode, env), required: resolveRequired(config?.required, env) };
77
+ }
78
+ const refuses = (mode) => mode === 'enforced';
79
+ exports.refuses = refuses;
80
+ // ---------------------------------------------------------------------------
81
+ // Errors
82
+ // ---------------------------------------------------------------------------
83
+ class ProtectError extends Error {
84
+ constructor(message) {
85
+ super(message);
86
+ this.name = 'ProtectError';
87
+ }
88
+ }
89
+ exports.ProtectError = ProtectError;
90
+ /** A call refused by Protect for a reason that is not a guard finding: oversized input, uninspectable streaming, a failed check. */
91
+ class ProtectDeniedError extends ProtectError {
92
+ constructor(code, message) {
93
+ super(message);
94
+ this.name = 'ProtectDeniedError';
95
+ this.code = code;
96
+ }
97
+ }
98
+ exports.ProtectDeniedError = ProtectDeniedError;
99
+ /** Enforced mode could not be set up: a required provider is not wrapped, or guards are missing. Thrown from init. */
100
+ class ProtectReadinessError extends ProtectError {
101
+ constructor(missing, message) {
102
+ super(message);
103
+ this.name = 'ProtectReadinessError';
104
+ this.missing = missing;
105
+ }
106
+ }
107
+ exports.ProtectReadinessError = ProtectReadinessError;
108
+ let state = { wrapped: [], missing: [] };
109
+ /** @internal */
110
+ function setProtectState(next) {
111
+ state = { mode: next.mode, wrapped: [...next.wrapped], missing: [...next.missing] };
112
+ }
113
+ /** @internal */
114
+ function currentProtectMode() {
115
+ return state.mode;
116
+ }
117
+ function protectReadiness() {
118
+ const mode = state.mode ?? 'legacy';
119
+ const partial = mode === 'enforced' && state.missing.length === 0 && state.wrapped.length > 0;
120
+ return {
121
+ mode,
122
+ wrapped: [...state.wrapped],
123
+ missing: [...state.missing],
124
+ level: partial ? 'partially_protected' : 'monitored',
125
+ note: partial
126
+ ? 'Supported provider calls in this process are refused before they leave when a guard finds a violation, and fail closed. Code in this process that bypasses the SDK is not covered; the mandatory boundary is the Shield360 gateway.'
127
+ : 'Findings are recorded; calls are not refused by this layer. The mandatory boundary is the Shield360 gateway.',
128
+ };
129
+ }
130
+ /** @internal for tests */
131
+ function resetProtectState() {
132
+ state = { wrapped: [], missing: [] };
133
+ }
134
+ //# sourceMappingURL=mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode.js","sourceRoot":"","sources":["../../src/protect/mode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};