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,233 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodeLocationSpanProcessor = exports.PathNormaliser = exports.ATTR_CODE_LINE_NUMBER = exports.ATTR_CODE_FILE_PATH = exports.ATTR_CODE_FUNCTION_NAME = void 0;
4
+ exports.resolveCaptureCodeLocation = resolveCaptureCodeLocation;
5
+ exports.anonymiseAbsolutePath = anonymiseAbsolutePath;
6
+ /**
7
+ * Code location on GenAI spans: code.function.name, code.file.path and
8
+ * code.line.number of the application call site that started the span.
9
+ *
10
+ * A SpanProcessor's onStart runs synchronously inside tracer.startSpan, so
11
+ * the caller's stack is still live there and one processor covers every
12
+ * instrumentation. Only names, repo-relative paths and line numbers are
13
+ * captured: never argument values, locals or source text.
14
+ */
15
+ const fs_1 = require("fs");
16
+ const os_1 = require("os");
17
+ const path_1 = require("path");
18
+ const url_1 = require("url");
19
+ const constant_1 = require("../constant");
20
+ exports.ATTR_CODE_FUNCTION_NAME = 'code.function.name';
21
+ exports.ATTR_CODE_FILE_PATH = 'code.file.path';
22
+ exports.ATTR_CODE_LINE_NUMBER = 'code.line.number';
23
+ const GEN_AI_OPERATION = 'gen_ai.operation.name';
24
+ // These instrumentations set gen_ai.operation.name after span creation, so
25
+ // their spans are recognised by instrumentation scope instead.
26
+ const LATE_OPERATION_SCOPES = new Set(['langchain', 'mcp', 'browser-use'].map((n) => `${constant_1.INSTRUMENTATION_PREFIX}/instrumentation-${n}`));
27
+ const MAX_CACHE_ENTRIES = 4096;
28
+ const STACK_LIMIT = 64;
29
+ const FALSY = new Set(['false', '0', 'no', 'off']);
30
+ // The SDK's own compiled or source directory (dist/ or src/). Its tests are
31
+ // application code for this purpose.
32
+ const SDK_DIR = toPosix((0, path_1.resolve)(__dirname, '..'));
33
+ /** captureCodeLocation option wins; otherwise SHIELD360_CAPTURE_CODE_LOCATION; default on. */
34
+ function resolveCaptureCodeLocation(option) {
35
+ if (option !== undefined)
36
+ return option;
37
+ const env = process.env.SHIELD360_CAPTURE_CODE_LOCATION;
38
+ return !(env && FALSY.has(env.trim().toLowerCase()));
39
+ }
40
+ function toPosix(p) {
41
+ return p.replace(/\\/g, '/');
42
+ }
43
+ function stripPrefix(path, root) {
44
+ if (!root)
45
+ return undefined;
46
+ const r = toPosix(root).replace(/\/+$/, '');
47
+ if (r && path.startsWith(r + '/'))
48
+ return path.slice(r.length + 1);
49
+ return undefined;
50
+ }
51
+ /** CI workspace and home directory prefixes, CI first (a runner's workspace sits under its home). */
52
+ const BUILD_HOST_PREFIXES = [
53
+ /^\/home\/runner\/work\/[^/]+\/[^/]+\//, // GitHub Actions
54
+ /^\/github\/workspace\//, // GitHub container actions
55
+ /^\/home\/vsts\/work\/[^/]+\/s\//, // Azure Pipelines
56
+ /^\/builds\/[^/]+\/[^/]+\//, // GitLab CI
57
+ /^\/var\/lib\/buildkite-agent\/builds\/[^/]+\/[^/]+\/[^/]+\//, // Buildkite
58
+ /^\/(?:var\/lib\/jenkins|var\/jenkins_home)\/workspace\/[^/]+\//, // Jenkins
59
+ /^\/opt\/atlassian\/pipelines\/agent\/build\//, // Bitbucket Pipelines
60
+ /^\/codebuild\/output\/src[^/]*\/src\//, // AWS CodeBuild
61
+ /^\/home\/[^/]+\//,
62
+ /^\/Users\/[^/]+\//,
63
+ /^[A-Za-z]:\/Users\/[^/]+\//,
64
+ /^\/root\//,
65
+ ];
66
+ /**
67
+ * Drops the first home directory or CI workspace prefix of an absolute path:
68
+ * the last resort for a path under no code root, repository, working directory
69
+ * or the current user's home. Other absolute paths (/srv/app/...) are kept.
70
+ */
71
+ function anonymiseAbsolutePath(path) {
72
+ for (const re of BUILD_HOST_PREFIXES) {
73
+ const m = re.exec(path);
74
+ if (m)
75
+ return path.slice(m[0].length);
76
+ }
77
+ return path;
78
+ }
79
+ class PathNormaliser {
80
+ constructor(options = {}) {
81
+ this.gitDirs = new Map();
82
+ const codeRoot = options.codeRoot ?? process.env.SHIELD360_CODE_ROOT;
83
+ this.codeRoot = codeRoot ? toPosix((0, path_1.resolve)(codeRoot)) : undefined;
84
+ this.cwd = toPosix(options.cwd ?? process.cwd());
85
+ this.home = toPosix(options.home ?? (0, os_1.homedir)());
86
+ }
87
+ /** Repo-relative path for a stack-frame file (path or file:// URL). */
88
+ normalise(file) {
89
+ let path = file;
90
+ if (path.startsWith('file://')) {
91
+ path = (0, url_1.fileURLToPath)(path.replace(/[?#].*$/, ''));
92
+ }
93
+ path = toPosix(path);
94
+ const relative = stripPrefix(path, this.codeRoot) ??
95
+ stripPrefix(path, this.gitRoot(path)) ??
96
+ stripPrefix(path, this.cwd) ??
97
+ stripPrefix(path, this.home) ??
98
+ anonymiseAbsolutePath(path);
99
+ return relative.replace(/^\.\//, '');
100
+ }
101
+ /** Nearest ancestor containing .git; each directory is probed at most once. */
102
+ gitRoot(path) {
103
+ let dir = (0, path_1.dirname)(path);
104
+ for (;;) {
105
+ let hasGit = this.gitDirs.get(dir);
106
+ if (hasGit === undefined) {
107
+ hasGit = (0, fs_1.existsSync)((0, path_1.join)(dir, '.git'));
108
+ if (this.gitDirs.size < MAX_CACHE_ENTRIES)
109
+ this.gitDirs.set(dir, hasGit);
110
+ }
111
+ if (hasGit)
112
+ return toPosix(dir);
113
+ const parent = (0, path_1.dirname)(dir);
114
+ if (parent === dir)
115
+ return undefined;
116
+ dir = parent;
117
+ }
118
+ }
119
+ }
120
+ exports.PathNormaliser = PathNormaliser;
121
+ const FRAME_RE = /^\s*at (?:(.+?) \()?(.+?):(\d+):(\d+)\)?$/;
122
+ function isApplicationFile(file) {
123
+ if (file.startsWith('node:') || file.startsWith('internal/') || file.startsWith('<'))
124
+ return false;
125
+ if (!(file.startsWith('/') || file.startsWith('file://') || /^[A-Za-z]:[\\/]/.test(file))) {
126
+ return false;
127
+ }
128
+ const posix = toPosix(file);
129
+ if (posix.includes('/node_modules/'))
130
+ return false;
131
+ if (posix.startsWith(SDK_DIR + '/') && !posix.includes('/__tests__/'))
132
+ return false;
133
+ return true;
134
+ }
135
+ function cleanFunctionName(raw) {
136
+ if (!raw)
137
+ return undefined;
138
+ const name = raw
139
+ .replace(/^async /, '')
140
+ .replace(/^new /, '')
141
+ .replace(/ \[as [^\]]+\]$/, '')
142
+ .trim();
143
+ if (!name || name.includes('<anonymous>'))
144
+ return undefined;
145
+ return name;
146
+ }
147
+ class CodeLocationSpanProcessor {
148
+ constructor(options = {}) {
149
+ // Raw frame line -> parsed application frame, or null when not one.
150
+ this.cache = new Map();
151
+ this.normaliser = new PathNormaliser(options);
152
+ }
153
+ onStart(span, _parentContext) {
154
+ try {
155
+ if (!isGenAISpan(span))
156
+ return;
157
+ const attrs = span.attributes;
158
+ if (attrs[exports.ATTR_CODE_FUNCTION_NAME] !== undefined ||
159
+ attrs[exports.ATTR_CODE_FILE_PATH] !== undefined ||
160
+ attrs[exports.ATTR_CODE_LINE_NUMBER] !== undefined) {
161
+ return;
162
+ }
163
+ const frame = this.findApplicationFrame(captureStack());
164
+ if (!frame)
165
+ return;
166
+ if (frame.functionName)
167
+ span.setAttribute(exports.ATTR_CODE_FUNCTION_NAME, frame.functionName);
168
+ span.setAttribute(exports.ATTR_CODE_FILE_PATH, frame.filePath);
169
+ span.setAttribute(exports.ATTR_CODE_LINE_NUMBER, frame.lineNumber);
170
+ }
171
+ catch {
172
+ // Never break span creation.
173
+ }
174
+ }
175
+ /** Visible for tests: number of cached frame lines. */
176
+ get cacheSize() {
177
+ return this.cache.size;
178
+ }
179
+ /** First application frame in a V8 stack string. */
180
+ findApplicationFrame(stack) {
181
+ if (!stack)
182
+ return undefined;
183
+ const lines = stack.split('\n');
184
+ for (let i = 1; i < lines.length; i++) {
185
+ const frame = this.parseLine(lines[i]);
186
+ if (frame)
187
+ return frame;
188
+ }
189
+ return undefined;
190
+ }
191
+ parseLine(line) {
192
+ const cached = this.cache.get(line);
193
+ if (cached !== undefined)
194
+ return cached;
195
+ let frame = null;
196
+ const m = FRAME_RE.exec(line);
197
+ if (m && !m[2].includes('(') && isApplicationFile(m[2])) {
198
+ frame = {
199
+ functionName: cleanFunctionName(m[1]),
200
+ filePath: this.normaliser.normalise(m[2]),
201
+ lineNumber: Number(m[3]),
202
+ };
203
+ }
204
+ if (this.cache.size < MAX_CACHE_ENTRIES)
205
+ this.cache.set(line, frame);
206
+ return frame;
207
+ }
208
+ onEnd(_span) { }
209
+ forceFlush() {
210
+ return Promise.resolve();
211
+ }
212
+ shutdown() {
213
+ return Promise.resolve();
214
+ }
215
+ }
216
+ exports.CodeLocationSpanProcessor = CodeLocationSpanProcessor;
217
+ function isGenAISpan(span) {
218
+ if (span.attributes[GEN_AI_OPERATION] !== undefined)
219
+ return true;
220
+ const scope = span.instrumentationScope?.name;
221
+ return scope !== undefined && LATE_OPERATION_SCOPES.has(scope);
222
+ }
223
+ function captureStack() {
224
+ const previous = Error.stackTraceLimit;
225
+ try {
226
+ Error.stackTraceLimit = STACK_LIMIT;
227
+ return new Error().stack;
228
+ }
229
+ finally {
230
+ Error.stackTraceLimit = previous;
231
+ }
232
+ }
233
+ //# sourceMappingURL=code-location.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-location.js","sourceRoot":"","sources":["../../src/otel/code-location.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export default class Events {
5
5
  static loggerProvider: LoggerProvider;
6
6
  static logger: ReturnType<typeof logs.getLogger>;
7
7
  static setup(options: SetupEventsOptions): import("@opentelemetry/api-logs").Logger | null;
8
+ static ensureProvider(options: SetupEventsOptions): LoggerProvider;
8
9
  private static buildLoggerProvider;
9
10
  private static createOTLPProcessor;
10
11
  static resetForTesting(): void;
@@ -9,18 +9,7 @@ class Events {
9
9
  static setup(options) {
10
10
  try {
11
11
  if (!EVENTS_SET) {
12
- const existingProvider = api_logs_1.logs.getLoggerProvider();
13
- const isSDKProvider = existingProvider &&
14
- typeof existingProvider.forceFlush === 'function' &&
15
- existingProvider.constructor.name !== 'NoopLoggerProvider';
16
- if (isSDKProvider) {
17
- this.loggerProvider = existingProvider;
18
- }
19
- else {
20
- this.loggerProvider = Events.buildLoggerProvider(options);
21
- api_logs_1.logs.setGlobalLoggerProvider(this.loggerProvider);
22
- }
23
- this.logger = this.loggerProvider.getLogger('shield360');
12
+ this.logger = this.ensureProvider(options).getLogger('shield360');
24
13
  EVENTS_SET = true;
25
14
  }
26
15
  return this.logger;
@@ -30,6 +19,24 @@ class Events {
30
19
  return null;
31
20
  }
32
21
  }
22
+ // SHIELD: the provider on its own, so application logs (app-logs.ts) can
23
+ // share it — same exporter, same destination — even with GenAI events off.
24
+ static ensureProvider(options) {
25
+ if (!this.loggerProvider) {
26
+ const existingProvider = api_logs_1.logs.getLoggerProvider();
27
+ const isSDKProvider = existingProvider &&
28
+ typeof existingProvider.forceFlush === 'function' &&
29
+ existingProvider.constructor.name !== 'NoopLoggerProvider';
30
+ if (isSDKProvider) {
31
+ this.loggerProvider = existingProvider;
32
+ }
33
+ else {
34
+ this.loggerProvider = Events.buildLoggerProvider(options);
35
+ api_logs_1.logs.setGlobalLoggerProvider(this.loggerProvider);
36
+ }
37
+ }
38
+ return this.loggerProvider;
39
+ }
33
40
  static buildLoggerProvider(options) {
34
41
  const exporterList = (0, utils_1.parseExporters)('OTEL_LOGS_EXPORTER');
35
42
  const processors = [];
@@ -68,6 +75,8 @@ class Events {
68
75
  }
69
76
  static resetForTesting() {
70
77
  EVENTS_SET = false;
78
+ this.loggerProvider = undefined;
79
+ this.logger = undefined;
71
80
  }
72
81
  }
73
82
  exports.default = Events;
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/otel/events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/otel/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * winston and pino, bridged without code changes when application logs are on.
3
+ *
4
+ * With `captureLogs: true` (or SHIELD360_CAPTURE_LOGS=true), init() hooks the
5
+ * loggers an app already uses, through OpenTelemetry's module hooks
6
+ * (@opentelemetry/instrumentation), the way OpenTelemetry's own winston and
7
+ * pino instrumentations do:
8
+ *
9
+ * winston every winston.createLogger() also gets the Shield360 transport
10
+ * (log-bridges.ts), built on the app's own winston.Transport. A
11
+ * winston already loaded before init() is patched in place.
12
+ * pino every pino() logger writes to its destination and to the
13
+ * Shield360 stream (pino.multistream), so output is unchanged.
14
+ * Loggers created before init() are not changed: create them after
15
+ * init(), or add Shield360.pinoStream() yourself.
16
+ *
17
+ * The hooks are inert while application logs are off, so turning them off
18
+ * later stops new loggers being bridged. Nothing here throws into the app: if
19
+ * a logger cannot be bridged it is created exactly as it would have been.
20
+ */
21
+ import { InstrumentationBase, InstrumentationNodeModuleDefinition } from '@opentelemetry/instrumentation';
22
+ declare const ORIGINAL: unique symbol;
23
+ type AnyFunction = ((...args: any[]) => any) & {
24
+ [ORIGINAL]?: AnyFunction;
25
+ [key: string | symbol]: any;
26
+ };
27
+ /** Makes winston.createLogger() add the Shield360 transport. Returns the module. */
28
+ export declare function patchWinston(winston: any): any;
29
+ export declare function unpatchWinston(winston: any): void;
30
+ /**
31
+ * pino's arguments with the Shield360 stream added, or null to call pino
32
+ * unchanged: pino(), pino(opts), pino(stream), pino(opts, stream),
33
+ * pino(opts, 'path'), and opts.transport.
34
+ */
35
+ export declare function bridgePinoArgs(pino: AnyFunction, args: unknown[]): unknown[] | null;
36
+ /** A pino function whose loggers also write to Shield360. Returns the module to use. */
37
+ export declare function patchPino(pino: any): any;
38
+ export declare class Shield360LogBridgeInstrumentation extends InstrumentationBase {
39
+ constructor();
40
+ protected init(): InstrumentationNodeModuleDefinition[];
41
+ }
42
+ /** Hooks winston and pino (once). Called by init() when application logs are on. */
43
+ export declare function enableLogBridges(): void;
44
+ export {};
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Shield360LogBridgeInstrumentation = void 0;
4
+ exports.patchWinston = patchWinston;
5
+ exports.unpatchWinston = unpatchWinston;
6
+ exports.bridgePinoArgs = bridgePinoArgs;
7
+ exports.patchPino = patchPino;
8
+ exports.enableLogBridges = enableLogBridges;
9
+ /**
10
+ * winston and pino, bridged without code changes when application logs are on.
11
+ *
12
+ * With `captureLogs: true` (or SHIELD360_CAPTURE_LOGS=true), init() hooks the
13
+ * loggers an app already uses, through OpenTelemetry's module hooks
14
+ * (@opentelemetry/instrumentation), the way OpenTelemetry's own winston and
15
+ * pino instrumentations do:
16
+ *
17
+ * winston every winston.createLogger() also gets the Shield360 transport
18
+ * (log-bridges.ts), built on the app's own winston.Transport. A
19
+ * winston already loaded before init() is patched in place.
20
+ * pino every pino() logger writes to its destination and to the
21
+ * Shield360 stream (pino.multistream), so output is unchanged.
22
+ * Loggers created before init() are not changed: create them after
23
+ * init(), or add Shield360.pinoStream() yourself.
24
+ *
25
+ * The hooks are inert while application logs are off, so turning them off
26
+ * later stops new loggers being bridged. Nothing here throws into the app: if
27
+ * a logger cannot be bridged it is created exactly as it would have been.
28
+ */
29
+ const instrumentation_1 = require("@opentelemetry/instrumentation");
30
+ const constant_1 = require("../constant");
31
+ const app_logs_1 = require("./app-logs");
32
+ const log_bridges_1 = require("./log-bridges");
33
+ const ORIGINAL = Symbol.for('shield360.logBridge.original');
34
+ const BRIDGED = Symbol.for('shield360.logBridge.transport');
35
+ // ---------------------------------------------------------------- winston
36
+ /** Makes winston.createLogger() add the Shield360 transport. Returns the module. */
37
+ function patchWinston(winston) {
38
+ try {
39
+ if (!winston || typeof winston.createLogger !== 'function' || winston.createLogger[ORIGINAL])
40
+ return winston;
41
+ if (typeof winston.Transport !== 'function')
42
+ return winston;
43
+ const Shield360Transport = (0, log_bridges_1.winstonTransport)(winston.Transport);
44
+ const original = winston.createLogger;
45
+ const patched = function (...args) {
46
+ const logger = original.apply(this, args);
47
+ if (!(0, app_logs_1.appLogsEnabled)())
48
+ return logger;
49
+ try {
50
+ const transports = Array.isArray(logger?.transports) ? logger.transports : [];
51
+ if (!transports.some((t) => t?.[BRIDGED])) {
52
+ const transport = new Shield360Transport();
53
+ transport[BRIDGED] = true;
54
+ logger.add(transport);
55
+ }
56
+ }
57
+ catch {
58
+ // The logger works as created.
59
+ }
60
+ return logger;
61
+ };
62
+ patched[ORIGINAL] = original;
63
+ winston.createLogger = patched;
64
+ }
65
+ catch {
66
+ // Left unpatched.
67
+ }
68
+ return winston;
69
+ }
70
+ function unpatchWinston(winston) {
71
+ try {
72
+ const original = winston?.createLogger?.[ORIGINAL];
73
+ if (original)
74
+ winston.createLogger = original;
75
+ }
76
+ catch {
77
+ // Nothing to undo.
78
+ }
79
+ }
80
+ // ------------------------------------------------------------------- pino
81
+ function isStream(value) {
82
+ return !!value && typeof value.write === 'function';
83
+ }
84
+ /**
85
+ * pino's arguments with the Shield360 stream added, or null to call pino
86
+ * unchanged: pino(), pino(opts), pino(stream), pino(opts, stream),
87
+ * pino(opts, 'path'), and opts.transport.
88
+ */
89
+ function bridgePinoArgs(pino, args) {
90
+ let [opts, stream] = args;
91
+ if (args.length > 2)
92
+ return null;
93
+ if (stream === undefined && (isStream(opts) || typeof opts === 'string')) {
94
+ stream = opts;
95
+ opts = {};
96
+ }
97
+ if (opts === undefined || opts === null)
98
+ opts = {};
99
+ if (typeof opts !== 'object' || Array.isArray(opts))
100
+ return null;
101
+ let options = opts;
102
+ if (typeof pino.multistream !== 'function' || typeof pino.destination !== 'function')
103
+ return null;
104
+ if (options.transport) {
105
+ if (stream !== undefined)
106
+ return null; // pino refuses both; let it say so
107
+ if (typeof pino.transport !== 'function')
108
+ return null;
109
+ stream = pino.transport(options.transport);
110
+ options = { ...options };
111
+ delete options.transport;
112
+ }
113
+ if (stream === undefined)
114
+ stream = pino.destination((process.stdout && process.stdout.fd) || 1);
115
+ else if (typeof stream === 'string' || typeof stream === 'number')
116
+ stream = pino.destination(stream);
117
+ if (!isStream(stream))
118
+ return null;
119
+ // levelVal 0: both streams see every record the logger itself lets through.
120
+ const streams = pino.multistream([
121
+ { levelVal: 0, stream },
122
+ { levelVal: 0, stream: (0, log_bridges_1.pinoStream)() },
123
+ ]);
124
+ return [options, streams];
125
+ }
126
+ /** A pino function whose loggers also write to Shield360. Returns the module to use. */
127
+ function patchPino(pino) {
128
+ try {
129
+ if (typeof pino !== 'function' || pino[ORIGINAL])
130
+ return pino;
131
+ const original = pino;
132
+ const patched = function (...args) {
133
+ if ((0, app_logs_1.appLogsEnabled)()) {
134
+ let bridged = null;
135
+ try {
136
+ bridged = bridgePinoArgs(original, args);
137
+ }
138
+ catch {
139
+ bridged = null;
140
+ }
141
+ if (bridged)
142
+ return original.apply(this, bridged);
143
+ }
144
+ return original.apply(this, args);
145
+ };
146
+ Object.assign(patched, original);
147
+ patched[ORIGINAL] = original;
148
+ patched.default = patched;
149
+ patched.pino = patched;
150
+ return patched;
151
+ }
152
+ catch {
153
+ return pino;
154
+ }
155
+ }
156
+ // -------------------------------------------------------------- the hooks
157
+ class Shield360LogBridgeInstrumentation extends instrumentation_1.InstrumentationBase {
158
+ constructor() {
159
+ super(`${constant_1.INSTRUMENTATION_PREFIX}/instrumentation-log-bridges`, '1.0.0', {});
160
+ }
161
+ init() {
162
+ return [
163
+ new instrumentation_1.InstrumentationNodeModuleDefinition('winston', ['>=3 <4'], (moduleExports) => patchWinston(moduleExports), (moduleExports) => unpatchWinston(moduleExports)),
164
+ new instrumentation_1.InstrumentationNodeModuleDefinition('pino', ['>=7 <11'], (moduleExports) => patchPino(moduleExports),
165
+ // The patched function is inert while application logs are off.
166
+ (moduleExports) => moduleExports),
167
+ ];
168
+ }
169
+ }
170
+ exports.Shield360LogBridgeInstrumentation = Shield360LogBridgeInstrumentation;
171
+ let instrumentation = null;
172
+ /** winston loaded before init(): patched in place, since its createLogger is read at call time. */
173
+ function patchLoadedWinston() {
174
+ try {
175
+ const cache = typeof require !== 'undefined' ? require.cache : undefined;
176
+ if (!cache)
177
+ return;
178
+ for (const [file, mod] of Object.entries(cache)) {
179
+ if (mod && /[\\/]node_modules[\\/]winston[\\/]lib[\\/]winston\.js$/.test(file))
180
+ patchWinston(mod.exports);
181
+ }
182
+ }
183
+ catch {
184
+ // Nothing loaded, or nothing to patch.
185
+ }
186
+ }
187
+ /** Hooks winston and pino (once). Called by init() when application logs are on. */
188
+ function enableLogBridges() {
189
+ try {
190
+ if (!instrumentation)
191
+ instrumentation = new Shield360LogBridgeInstrumentation();
192
+ else
193
+ instrumentation.enable();
194
+ patchLoadedWinston();
195
+ }
196
+ catch {
197
+ // Application logs still work through Shield360.logger() and the explicit bridges.
198
+ }
199
+ }
200
+ //# sourceMappingURL=log-auto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-auto.js","sourceRoot":"","sources":["../../src/otel/log-auto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { createLimiter, type LogLevel } from './app-logs';
2
+ export { createLimiter };
3
+ export type BridgeOptions = {
4
+ /** The instrumentation scope; defaults to the bridge's name (pino, winston, console). */
5
+ name?: string;
6
+ /** Records per second at most (default 500). */
7
+ maxPerSecond?: number;
8
+ };
9
+ export declare function pinoLevel(level: unknown): LogLevel;
10
+ /**
11
+ * A pino destination: `pino({}, pino.multistream([{ stream: process.stdout }, { stream: Shield360.pinoStream() }]))`.
12
+ * Each line pino writes is one JSON record; `msg` becomes the body, `level`
13
+ * the severity, `err` the exception attributes, the rest attributes.
14
+ */
15
+ export declare function pinoStream(options?: BridgeOptions): {
16
+ write(line: string): boolean;
17
+ };
18
+ type TransportBase = new (options?: Record<string, unknown>) => {
19
+ emit?(event: string, ...args: unknown[]): boolean;
20
+ };
21
+ export declare function winstonLevel(level: unknown): LogLevel;
22
+ /**
23
+ * A winston transport class on the app's own `winston-transport`:
24
+ *
25
+ * import Transport from 'winston-transport';
26
+ * const Shield360Transport = Shield360.winstonTransport(Transport);
27
+ * winston.createLogger({ transports: [new winston.transports.Console(), new Shield360Transport()] });
28
+ */
29
+ export declare function winstonTransport(Transport: TransportBase, options?: BridgeOptions): {
30
+ new (options?: Record<string, unknown>): {
31
+ log(info: Record<string | symbol, unknown>, callback?: () => void): void;
32
+ emit?(event: string, ...args: unknown[]): boolean;
33
+ };
34
+ };
35
+ /** Copies console output to Shield360 application logs (still printed as before). Call releaseConsole() to stop. */
36
+ export declare function captureConsole(options?: BridgeOptions): void;
37
+ /** Puts console back as it was. */
38
+ export declare function releaseConsole(): void;
39
+ type WritableLike = {
40
+ write: (...args: any[]) => boolean;
41
+ };
42
+ export type StdioOptions = BridgeOptions & {
43
+ /** The streams to copy; process.stdout and process.stderr by default (tests pass their own). */
44
+ stdout?: WritableLike;
45
+ stderr?: WritableLike;
46
+ };
47
+ /**
48
+ * Copies every line written to stdout and stderr to Shield360 application logs; the output itself
49
+ * is unchanged. JSON lines keep their level, message, fields and error; plain lines are info on
50
+ * stdout and error on stderr. Lines split across writes are joined. Call releaseStdio() to stop.
51
+ */
52
+ export declare function captureStdio(options?: StdioOptions): void;
53
+ /** Puts stdout and stderr back as they were. */
54
+ export declare function releaseStdio(): void;