@superblocksteam/telemetry 2.0.0-SNAPSHOT.329be19cb7ca892b

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 (388) hide show
  1. package/LICENSE.txt +87 -0
  2. package/README.md +298 -0
  3. package/dist/browser/console-logging.d.ts +18 -0
  4. package/dist/browser/console-logging.d.ts.map +1 -0
  5. package/dist/browser/console-logging.js +32 -0
  6. package/dist/browser/console-logging.js.map +1 -0
  7. package/dist/browser/early-console-buffer.d.ts +49 -0
  8. package/dist/browser/early-console-buffer.d.ts.map +1 -0
  9. package/dist/browser/early-console-buffer.js +182 -0
  10. package/dist/browser/early-console-buffer.js.map +1 -0
  11. package/dist/browser/index.d.ts +17 -0
  12. package/dist/browser/index.d.ts.map +1 -0
  13. package/dist/browser/index.js +50 -0
  14. package/dist/browser/index.js.map +1 -0
  15. package/dist/browser/init.d.ts +101 -0
  16. package/dist/browser/init.d.ts.map +1 -0
  17. package/dist/browser/init.js +329 -0
  18. package/dist/browser/init.js.map +1 -0
  19. package/dist/browser/instrumentations.d.ts +67 -0
  20. package/dist/browser/instrumentations.d.ts.map +1 -0
  21. package/dist/browser/instrumentations.js +83 -0
  22. package/dist/browser/instrumentations.js.map +1 -0
  23. package/dist/browser/logs.d.ts +55 -0
  24. package/dist/browser/logs.d.ts.map +1 -0
  25. package/dist/browser/logs.js +86 -0
  26. package/dist/browser/logs.js.map +1 -0
  27. package/dist/browser/metrics.d.ts +29 -0
  28. package/dist/browser/metrics.d.ts.map +1 -0
  29. package/dist/browser/metrics.js +49 -0
  30. package/dist/browser/metrics.js.map +1 -0
  31. package/dist/browser/resilient-exporter.d.ts +43 -0
  32. package/dist/browser/resilient-exporter.d.ts.map +1 -0
  33. package/dist/browser/resilient-exporter.js +88 -0
  34. package/dist/browser/resilient-exporter.js.map +1 -0
  35. package/dist/browser/sanitizer.d.ts +35 -0
  36. package/dist/browser/sanitizer.d.ts.map +1 -0
  37. package/dist/browser/sanitizer.js +211 -0
  38. package/dist/browser/sanitizer.js.map +1 -0
  39. package/dist/browser/traced-socket.d.ts +102 -0
  40. package/dist/browser/traced-socket.d.ts.map +1 -0
  41. package/dist/browser/traced-socket.js +203 -0
  42. package/dist/browser/traced-socket.js.map +1 -0
  43. package/dist/common/contracts/tier2-traces.d.ts +116 -0
  44. package/dist/common/contracts/tier2-traces.d.ts.map +1 -0
  45. package/dist/common/contracts/tier2-traces.js +736 -0
  46. package/dist/common/contracts/tier2-traces.js.map +1 -0
  47. package/dist/common/deployment-type.d.ts +18 -0
  48. package/dist/common/deployment-type.d.ts.map +1 -0
  49. package/dist/common/deployment-type.js +30 -0
  50. package/dist/common/deployment-type.js.map +1 -0
  51. package/dist/common/guardrails.d.ts +116 -0
  52. package/dist/common/guardrails.d.ts.map +1 -0
  53. package/dist/common/guardrails.js +189 -0
  54. package/dist/common/guardrails.js.map +1 -0
  55. package/dist/common/index.d.ts +18 -0
  56. package/dist/common/index.d.ts.map +1 -0
  57. package/dist/common/index.js +34 -0
  58. package/dist/common/index.js.map +1 -0
  59. package/dist/common/log-sanitizer.d.ts +170 -0
  60. package/dist/common/log-sanitizer.d.ts.map +1 -0
  61. package/dist/common/log-sanitizer.js +690 -0
  62. package/dist/common/log-sanitizer.js.map +1 -0
  63. package/dist/common/normalize-metric-path.d.ts +2 -0
  64. package/dist/common/normalize-metric-path.d.ts.map +1 -0
  65. package/dist/common/normalize-metric-path.js +22 -0
  66. package/dist/common/normalize-metric-path.js.map +1 -0
  67. package/dist/common/policy-evaluator.d.ts +103 -0
  68. package/dist/common/policy-evaluator.d.ts.map +1 -0
  69. package/dist/common/policy-evaluator.js +200 -0
  70. package/dist/common/policy-evaluator.js.map +1 -0
  71. package/dist/common/resource.d.ts +79 -0
  72. package/dist/common/resource.d.ts.map +1 -0
  73. package/dist/common/resource.js +128 -0
  74. package/dist/common/resource.js.map +1 -0
  75. package/dist/common/tier-hints.d.ts +182 -0
  76. package/dist/common/tier-hints.d.ts.map +1 -0
  77. package/dist/common/tier-hints.js +209 -0
  78. package/dist/common/tier-hints.js.map +1 -0
  79. package/dist/common/trace-sanitizer.d.ts +82 -0
  80. package/dist/common/trace-sanitizer.d.ts.map +1 -0
  81. package/dist/common/trace-sanitizer.js +234 -0
  82. package/dist/common/trace-sanitizer.js.map +1 -0
  83. package/dist/common/traced-socket-types.d.ts +43 -0
  84. package/dist/common/traced-socket-types.d.ts.map +1 -0
  85. package/dist/common/traced-socket-types.js +17 -0
  86. package/dist/common/traced-socket-types.js.map +1 -0
  87. package/dist/index.d.ts +45 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +88 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/lint/forbidden-attributes.d.ts +149 -0
  92. package/dist/lint/forbidden-attributes.d.ts.map +1 -0
  93. package/dist/lint/forbidden-attributes.js +215 -0
  94. package/dist/lint/forbidden-attributes.js.map +1 -0
  95. package/dist/lint/index.d.ts +9 -0
  96. package/dist/lint/index.d.ts.map +1 -0
  97. package/dist/lint/index.js +16 -0
  98. package/dist/lint/index.js.map +1 -0
  99. package/dist/llmobs/index.d.ts +22 -0
  100. package/dist/llmobs/index.d.ts.map +1 -0
  101. package/dist/llmobs/index.js +29 -0
  102. package/dist/llmobs/index.js.map +1 -0
  103. package/dist/llmobs/tier1-exporter.d.ts +146 -0
  104. package/dist/llmobs/tier1-exporter.d.ts.map +1 -0
  105. package/dist/llmobs/tier1-exporter.js +199 -0
  106. package/dist/llmobs/tier1-exporter.js.map +1 -0
  107. package/dist/llmobs/tier2-summarizer.d.ts +268 -0
  108. package/dist/llmobs/tier2-summarizer.d.ts.map +1 -0
  109. package/dist/llmobs/tier2-summarizer.js +656 -0
  110. package/dist/llmobs/tier2-summarizer.js.map +1 -0
  111. package/dist/node/dynamic-attribute-processor.d.ts +43 -0
  112. package/dist/node/dynamic-attribute-processor.d.ts.map +1 -0
  113. package/dist/node/dynamic-attribute-processor.js +79 -0
  114. package/dist/node/dynamic-attribute-processor.js.map +1 -0
  115. package/dist/node/exporters/resilient-exporter.d.ts +91 -0
  116. package/dist/node/exporters/resilient-exporter.d.ts.map +1 -0
  117. package/dist/node/exporters/resilient-exporter.js +136 -0
  118. package/dist/node/exporters/resilient-exporter.js.map +1 -0
  119. package/dist/node/index.d.ts +13 -0
  120. package/dist/node/index.d.ts.map +1 -0
  121. package/dist/node/index.js +32 -0
  122. package/dist/node/index.js.map +1 -0
  123. package/dist/node/init.d.ts +97 -0
  124. package/dist/node/init.d.ts.map +1 -0
  125. package/dist/node/init.js +365 -0
  126. package/dist/node/init.js.map +1 -0
  127. package/dist/node/local-obs-mode.d.ts +17 -0
  128. package/dist/node/local-obs-mode.d.ts.map +1 -0
  129. package/dist/node/local-obs-mode.js +22 -0
  130. package/dist/node/local-obs-mode.js.map +1 -0
  131. package/dist/node/log-processor.d.ts +132 -0
  132. package/dist/node/log-processor.d.ts.map +1 -0
  133. package/dist/node/log-processor.js +397 -0
  134. package/dist/node/log-processor.js.map +1 -0
  135. package/dist/node/metrics-client.d.ts +88 -0
  136. package/dist/node/metrics-client.d.ts.map +1 -0
  137. package/dist/node/metrics-client.js +209 -0
  138. package/dist/node/metrics-client.js.map +1 -0
  139. package/dist/node/safe-logger.d.ts +55 -0
  140. package/dist/node/safe-logger.d.ts.map +1 -0
  141. package/dist/node/safe-logger.js +158 -0
  142. package/dist/node/safe-logger.js.map +1 -0
  143. package/dist/node/sanitizing-processor.d.ts +67 -0
  144. package/dist/node/sanitizing-processor.d.ts.map +1 -0
  145. package/dist/node/sanitizing-processor.js +167 -0
  146. package/dist/node/sanitizing-processor.js.map +1 -0
  147. package/dist/node/service-tracers.d.ts +52 -0
  148. package/dist/node/service-tracers.d.ts.map +1 -0
  149. package/dist/node/service-tracers.js +81 -0
  150. package/dist/node/service-tracers.js.map +1 -0
  151. package/dist/node/traced-socket.d.ts +120 -0
  152. package/dist/node/traced-socket.d.ts.map +1 -0
  153. package/dist/node/traced-socket.js +338 -0
  154. package/dist/node/traced-socket.js.map +1 -0
  155. package/dist/npm-registry/emitter.d.ts +310 -0
  156. package/dist/npm-registry/emitter.d.ts.map +1 -0
  157. package/dist/npm-registry/emitter.js +537 -0
  158. package/dist/npm-registry/emitter.js.map +1 -0
  159. package/dist/npm-registry/index.d.ts +12 -0
  160. package/dist/npm-registry/index.d.ts.map +1 -0
  161. package/dist/npm-registry/index.js +28 -0
  162. package/dist/npm-registry/index.js.map +1 -0
  163. package/dist/npm-registry/sanitize.d.ts +174 -0
  164. package/dist/npm-registry/sanitize.d.ts.map +1 -0
  165. package/dist/npm-registry/sanitize.js +342 -0
  166. package/dist/npm-registry/sanitize.js.map +1 -0
  167. package/dist/npm-registry/spans.d.ts +61 -0
  168. package/dist/npm-registry/spans.d.ts.map +1 -0
  169. package/dist/npm-registry/spans.js +91 -0
  170. package/dist/npm-registry/spans.js.map +1 -0
  171. package/dist/testing/in-memory-exporter.d.ts +179 -0
  172. package/dist/testing/in-memory-exporter.d.ts.map +1 -0
  173. package/dist/testing/in-memory-exporter.js +256 -0
  174. package/dist/testing/in-memory-exporter.js.map +1 -0
  175. package/dist/testing/index.d.ts +9 -0
  176. package/dist/testing/index.d.ts.map +1 -0
  177. package/dist/testing/index.js +21 -0
  178. package/dist/testing/index.js.map +1 -0
  179. package/dist/testing/metrics-capture.d.ts +29 -0
  180. package/dist/testing/metrics-capture.d.ts.map +1 -0
  181. package/dist/testing/metrics-capture.js +74 -0
  182. package/dist/testing/metrics-capture.js.map +1 -0
  183. package/dist/testing/test-init.d.ts +80 -0
  184. package/dist/testing/test-init.d.ts.map +1 -0
  185. package/dist/testing/test-init.js +144 -0
  186. package/dist/testing/test-init.js.map +1 -0
  187. package/dist/types/index.d.ts +84 -0
  188. package/dist/types/index.d.ts.map +1 -0
  189. package/dist/types/index.js +23 -0
  190. package/dist/types/index.js.map +1 -0
  191. package/dist/types/policy.d.ts +92 -0
  192. package/dist/types/policy.d.ts.map +1 -0
  193. package/dist/types/policy.js +125 -0
  194. package/dist/types/policy.js.map +1 -0
  195. package/dist-esm/browser/console-logging.d.ts +18 -0
  196. package/dist-esm/browser/console-logging.d.ts.map +1 -0
  197. package/dist-esm/browser/console-logging.js +27 -0
  198. package/dist-esm/browser/console-logging.js.map +1 -0
  199. package/dist-esm/browser/early-console-buffer.d.ts +49 -0
  200. package/dist-esm/browser/early-console-buffer.d.ts.map +1 -0
  201. package/dist-esm/browser/early-console-buffer.js +180 -0
  202. package/dist-esm/browser/early-console-buffer.js.map +1 -0
  203. package/dist-esm/browser/index.d.ts +17 -0
  204. package/dist-esm/browser/index.d.ts.map +1 -0
  205. package/dist-esm/browser/index.js +22 -0
  206. package/dist-esm/browser/index.js.map +1 -0
  207. package/dist-esm/browser/init.d.ts +101 -0
  208. package/dist-esm/browser/init.d.ts.map +1 -0
  209. package/dist-esm/browser/init.js +319 -0
  210. package/dist-esm/browser/init.js.map +1 -0
  211. package/dist-esm/browser/instrumentations.d.ts +67 -0
  212. package/dist-esm/browser/instrumentations.d.ts.map +1 -0
  213. package/dist-esm/browser/instrumentations.js +79 -0
  214. package/dist-esm/browser/instrumentations.js.map +1 -0
  215. package/dist-esm/browser/logs.d.ts +55 -0
  216. package/dist-esm/browser/logs.d.ts.map +1 -0
  217. package/dist-esm/browser/logs.js +79 -0
  218. package/dist-esm/browser/logs.js.map +1 -0
  219. package/dist-esm/browser/metrics.d.ts +29 -0
  220. package/dist-esm/browser/metrics.d.ts.map +1 -0
  221. package/dist-esm/browser/metrics.js +46 -0
  222. package/dist-esm/browser/metrics.js.map +1 -0
  223. package/dist-esm/browser/resilient-exporter.d.ts +43 -0
  224. package/dist-esm/browser/resilient-exporter.d.ts.map +1 -0
  225. package/dist-esm/browser/resilient-exporter.js +84 -0
  226. package/dist-esm/browser/resilient-exporter.js.map +1 -0
  227. package/dist-esm/browser/sanitizer.d.ts +35 -0
  228. package/dist-esm/browser/sanitizer.d.ts.map +1 -0
  229. package/dist-esm/browser/sanitizer.js +207 -0
  230. package/dist-esm/browser/sanitizer.js.map +1 -0
  231. package/dist-esm/browser/traced-socket.d.ts +102 -0
  232. package/dist-esm/browser/traced-socket.d.ts.map +1 -0
  233. package/dist-esm/browser/traced-socket.js +199 -0
  234. package/dist-esm/browser/traced-socket.js.map +1 -0
  235. package/dist-esm/common/contracts/tier2-traces.d.ts +116 -0
  236. package/dist-esm/common/contracts/tier2-traces.d.ts.map +1 -0
  237. package/dist-esm/common/contracts/tier2-traces.js +725 -0
  238. package/dist-esm/common/contracts/tier2-traces.js.map +1 -0
  239. package/dist-esm/common/deployment-type.d.ts +18 -0
  240. package/dist-esm/common/deployment-type.d.ts.map +1 -0
  241. package/dist-esm/common/deployment-type.js +27 -0
  242. package/dist-esm/common/deployment-type.js.map +1 -0
  243. package/dist-esm/common/guardrails.d.ts +116 -0
  244. package/dist-esm/common/guardrails.d.ts.map +1 -0
  245. package/dist-esm/common/guardrails.js +179 -0
  246. package/dist-esm/common/guardrails.js.map +1 -0
  247. package/dist-esm/common/index.d.ts +18 -0
  248. package/dist-esm/common/index.d.ts.map +1 -0
  249. package/dist-esm/common/index.js +18 -0
  250. package/dist-esm/common/index.js.map +1 -0
  251. package/dist-esm/common/log-sanitizer.d.ts +170 -0
  252. package/dist-esm/common/log-sanitizer.d.ts.map +1 -0
  253. package/dist-esm/common/log-sanitizer.js +672 -0
  254. package/dist-esm/common/log-sanitizer.js.map +1 -0
  255. package/dist-esm/common/normalize-metric-path.d.ts +2 -0
  256. package/dist-esm/common/normalize-metric-path.d.ts.map +1 -0
  257. package/dist-esm/common/normalize-metric-path.js +19 -0
  258. package/dist-esm/common/normalize-metric-path.js.map +1 -0
  259. package/dist-esm/common/policy-evaluator.d.ts +103 -0
  260. package/dist-esm/common/policy-evaluator.d.ts.map +1 -0
  261. package/dist-esm/common/policy-evaluator.js +196 -0
  262. package/dist-esm/common/policy-evaluator.js.map +1 -0
  263. package/dist-esm/common/resource.d.ts +79 -0
  264. package/dist-esm/common/resource.d.ts.map +1 -0
  265. package/dist-esm/common/resource.js +121 -0
  266. package/dist-esm/common/resource.js.map +1 -0
  267. package/dist-esm/common/tier-hints.d.ts +182 -0
  268. package/dist-esm/common/tier-hints.d.ts.map +1 -0
  269. package/dist-esm/common/tier-hints.js +199 -0
  270. package/dist-esm/common/tier-hints.js.map +1 -0
  271. package/dist-esm/common/trace-sanitizer.d.ts +82 -0
  272. package/dist-esm/common/trace-sanitizer.d.ts.map +1 -0
  273. package/dist-esm/common/trace-sanitizer.js +230 -0
  274. package/dist-esm/common/trace-sanitizer.js.map +1 -0
  275. package/dist-esm/common/traced-socket-types.d.ts +43 -0
  276. package/dist-esm/common/traced-socket-types.d.ts.map +1 -0
  277. package/dist-esm/common/traced-socket-types.js +16 -0
  278. package/dist-esm/common/traced-socket-types.js.map +1 -0
  279. package/dist-esm/index.d.ts +45 -0
  280. package/dist-esm/index.d.ts.map +1 -0
  281. package/dist-esm/index.js +56 -0
  282. package/dist-esm/index.js.map +1 -0
  283. package/dist-esm/lint/forbidden-attributes.d.ts +149 -0
  284. package/dist-esm/lint/forbidden-attributes.d.ts.map +1 -0
  285. package/dist-esm/lint/forbidden-attributes.js +210 -0
  286. package/dist-esm/lint/forbidden-attributes.js.map +1 -0
  287. package/dist-esm/lint/index.d.ts +9 -0
  288. package/dist-esm/lint/index.d.ts.map +1 -0
  289. package/dist-esm/lint/index.js +9 -0
  290. package/dist-esm/lint/index.js.map +1 -0
  291. package/dist-esm/llmobs/index.d.ts +22 -0
  292. package/dist-esm/llmobs/index.d.ts.map +1 -0
  293. package/dist-esm/llmobs/index.js +22 -0
  294. package/dist-esm/llmobs/index.js.map +1 -0
  295. package/dist-esm/llmobs/tier1-exporter.d.ts +146 -0
  296. package/dist-esm/llmobs/tier1-exporter.d.ts.map +1 -0
  297. package/dist-esm/llmobs/tier1-exporter.js +193 -0
  298. package/dist-esm/llmobs/tier1-exporter.js.map +1 -0
  299. package/dist-esm/llmobs/tier2-summarizer.d.ts +268 -0
  300. package/dist-esm/llmobs/tier2-summarizer.d.ts.map +1 -0
  301. package/dist-esm/llmobs/tier2-summarizer.js +652 -0
  302. package/dist-esm/llmobs/tier2-summarizer.js.map +1 -0
  303. package/dist-esm/node/dynamic-attribute-processor.d.ts +43 -0
  304. package/dist-esm/node/dynamic-attribute-processor.d.ts.map +1 -0
  305. package/dist-esm/node/dynamic-attribute-processor.js +74 -0
  306. package/dist-esm/node/dynamic-attribute-processor.js.map +1 -0
  307. package/dist-esm/node/exporters/resilient-exporter.d.ts +91 -0
  308. package/dist-esm/node/exporters/resilient-exporter.d.ts.map +1 -0
  309. package/dist-esm/node/exporters/resilient-exporter.js +132 -0
  310. package/dist-esm/node/exporters/resilient-exporter.js.map +1 -0
  311. package/dist-esm/node/index.d.ts +13 -0
  312. package/dist-esm/node/index.d.ts.map +1 -0
  313. package/dist-esm/node/index.js +13 -0
  314. package/dist-esm/node/index.js.map +1 -0
  315. package/dist-esm/node/init.d.ts +97 -0
  316. package/dist-esm/node/init.d.ts.map +1 -0
  317. package/dist-esm/node/init.js +359 -0
  318. package/dist-esm/node/init.js.map +1 -0
  319. package/dist-esm/node/local-obs-mode.d.ts +17 -0
  320. package/dist-esm/node/local-obs-mode.d.ts.map +1 -0
  321. package/dist-esm/node/local-obs-mode.js +19 -0
  322. package/dist-esm/node/local-obs-mode.js.map +1 -0
  323. package/dist-esm/node/log-processor.d.ts +132 -0
  324. package/dist-esm/node/log-processor.d.ts.map +1 -0
  325. package/dist-esm/node/log-processor.js +389 -0
  326. package/dist-esm/node/log-processor.js.map +1 -0
  327. package/dist-esm/node/metrics-client.d.ts +88 -0
  328. package/dist-esm/node/metrics-client.d.ts.map +1 -0
  329. package/dist-esm/node/metrics-client.js +205 -0
  330. package/dist-esm/node/metrics-client.js.map +1 -0
  331. package/dist-esm/node/safe-logger.d.ts +55 -0
  332. package/dist-esm/node/safe-logger.d.ts.map +1 -0
  333. package/dist-esm/node/safe-logger.js +154 -0
  334. package/dist-esm/node/safe-logger.js.map +1 -0
  335. package/dist-esm/node/sanitizing-processor.d.ts +67 -0
  336. package/dist-esm/node/sanitizing-processor.d.ts.map +1 -0
  337. package/dist-esm/node/sanitizing-processor.js +163 -0
  338. package/dist-esm/node/sanitizing-processor.js.map +1 -0
  339. package/dist-esm/node/service-tracers.d.ts +52 -0
  340. package/dist-esm/node/service-tracers.d.ts.map +1 -0
  341. package/dist-esm/node/service-tracers.js +78 -0
  342. package/dist-esm/node/service-tracers.js.map +1 -0
  343. package/dist-esm/node/traced-socket.d.ts +120 -0
  344. package/dist-esm/node/traced-socket.d.ts.map +1 -0
  345. package/dist-esm/node/traced-socket.js +334 -0
  346. package/dist-esm/node/traced-socket.js.map +1 -0
  347. package/dist-esm/npm-registry/emitter.d.ts +310 -0
  348. package/dist-esm/npm-registry/emitter.d.ts.map +1 -0
  349. package/dist-esm/npm-registry/emitter.js +525 -0
  350. package/dist-esm/npm-registry/emitter.js.map +1 -0
  351. package/dist-esm/npm-registry/index.d.ts +12 -0
  352. package/dist-esm/npm-registry/index.d.ts.map +1 -0
  353. package/dist-esm/npm-registry/index.js +12 -0
  354. package/dist-esm/npm-registry/index.js.map +1 -0
  355. package/dist-esm/npm-registry/sanitize.d.ts +174 -0
  356. package/dist-esm/npm-registry/sanitize.d.ts.map +1 -0
  357. package/dist-esm/npm-registry/sanitize.js +331 -0
  358. package/dist-esm/npm-registry/sanitize.js.map +1 -0
  359. package/dist-esm/npm-registry/spans.d.ts +61 -0
  360. package/dist-esm/npm-registry/spans.d.ts.map +1 -0
  361. package/dist-esm/npm-registry/spans.js +86 -0
  362. package/dist-esm/npm-registry/spans.js.map +1 -0
  363. package/dist-esm/package.json +1 -0
  364. package/dist-esm/testing/in-memory-exporter.d.ts +179 -0
  365. package/dist-esm/testing/in-memory-exporter.d.ts.map +1 -0
  366. package/dist-esm/testing/in-memory-exporter.js +250 -0
  367. package/dist-esm/testing/in-memory-exporter.js.map +1 -0
  368. package/dist-esm/testing/index.d.ts +9 -0
  369. package/dist-esm/testing/index.d.ts.map +1 -0
  370. package/dist-esm/testing/index.js +9 -0
  371. package/dist-esm/testing/index.js.map +1 -0
  372. package/dist-esm/testing/metrics-capture.d.ts +29 -0
  373. package/dist-esm/testing/metrics-capture.d.ts.map +1 -0
  374. package/dist-esm/testing/metrics-capture.js +71 -0
  375. package/dist-esm/testing/metrics-capture.js.map +1 -0
  376. package/dist-esm/testing/test-init.d.ts +80 -0
  377. package/dist-esm/testing/test-init.d.ts.map +1 -0
  378. package/dist-esm/testing/test-init.js +137 -0
  379. package/dist-esm/testing/test-init.js.map +1 -0
  380. package/dist-esm/types/index.d.ts +84 -0
  381. package/dist-esm/types/index.d.ts.map +1 -0
  382. package/dist-esm/types/index.js +7 -0
  383. package/dist-esm/types/index.js.map +1 -0
  384. package/dist-esm/types/policy.d.ts +92 -0
  385. package/dist-esm/types/policy.d.ts.map +1 -0
  386. package/dist-esm/types/policy.js +122 -0
  387. package/dist-esm/types/policy.js.map +1 -0
  388. package/package.json +102 -0
@@ -0,0 +1,672 @@
1
+ /**
2
+ * Log Sanitizer for Application-Level Secret Protection
3
+ *
4
+ * Sanitizes secrets from log messages while preserving debugging information.
5
+ * This operates at the APPLICATION layer and removes values that should NEVER
6
+ * appear in any log, anywhere.
7
+ *
8
+ * ARCHITECTURE:
9
+ * - Application layer (this file): secret sanitization only (unconditional, all deployments)
10
+ * - Policy layer (DEFAULT_SENSITIVE_PATTERNS / export path): PII redaction (deployment-specific;
11
+ * cloud-prem redacts emails, cloud does not)
12
+ * - Pipeline layer (OTel Collector): Tier-based filtering for export
13
+ *
14
+ * Stack traces and file paths are preserved for debugging. The pipeline layer
15
+ * handles additional tier-based redaction for exported logs.
16
+ *
17
+ * @see https://github.com/superblocksteam/engineering/blob/main/projects/o11y-refactor/epics/epic-c4-logging-strategy.md
18
+ */
19
+ // ============================================================================
20
+ // Secret Patterns - These should NEVER appear in any log
21
+ // ============================================================================
22
+ /**
23
+ * Patterns that indicate tokens, keys, and secrets in log messages.
24
+ * These use capture groups to preserve prefixes while redacting values.
25
+ * Exported as DEFAULT_SECRET_PATTERNS for use in LoggingPolicyConfig (e.g. cloud-prem).
26
+ */
27
+ export const DEFAULT_SECRET_PATTERNS = [
28
+ // Tokens and keys with prefixes
29
+ {
30
+ pattern: /(\bbearer\s+)[a-zA-Z0-9\-._~+/]+=*/gi,
31
+ replacement: "$1[REDACTED]",
32
+ },
33
+ { pattern: /(\bbasic\s+)\S+/gi, replacement: "$1[REDACTED]" },
34
+ { pattern: /(\bjwt\s+)[a-zA-Z0-9\-._~+/]+=*/gi, replacement: "$1[REDACTED]" },
35
+ {
36
+ pattern: /(\btoken[:\s=]+)[a-zA-Z0-9\-._~+/]{16,}=*/gi,
37
+ replacement: "$1[REDACTED]",
38
+ },
39
+ {
40
+ pattern: /(\bapi[_\s]?key[:\s=]+)[a-zA-Z0-9\-._~+/]{16,}=*/gi,
41
+ replacement: "$1[REDACTED]",
42
+ },
43
+ {
44
+ pattern: /(\baccess[_\s]?token[:\s=]+)[a-zA-Z0-9\-._~+/]{16,}=*/gi,
45
+ replacement: "$1[REDACTED]",
46
+ },
47
+ {
48
+ pattern: /(\brefresh[_\s]?token[:\s=]+)[a-zA-Z0-9\-._~+/]{16,}=*/gi,
49
+ replacement: "$1[REDACTED]",
50
+ },
51
+ // JWT pattern (base64.base64.base64) - standalone tokens
52
+ {
53
+ pattern: /\b[A-Za-z0-9-_]{20,}\.[A-Za-z0-9-_]{20,}\.[A-Za-z0-9-_]{20,}\b/g,
54
+ replacement: "[JWT_REDACTED]",
55
+ },
56
+ // OpenAI API keys
57
+ { pattern: /\bsk-[A-Za-z0-9]{48}\b/g, replacement: "[OPENAI_KEY_REDACTED]" },
58
+ // Anthropic API keys
59
+ {
60
+ pattern: /\bsk-ant-[A-Za-z0-9-]{32,}\b/g,
61
+ replacement: "[ANTHROPIC_KEY_REDACTED]",
62
+ },
63
+ // AWS access key IDs
64
+ { pattern: /\bAKIA[A-Z0-9]{16}\b/g, replacement: "[AWS_KEY_REDACTED]" },
65
+ // GitHub tokens
66
+ {
67
+ pattern: /\b(ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36,}\b/g,
68
+ replacement: "[GITHUB_TOKEN_REDACTED]",
69
+ },
70
+ // Generic API key patterns
71
+ {
72
+ pattern: /\b(sk|pk)-[a-zA-Z0-9]{32,}\b/g,
73
+ replacement: "[API_KEY_REDACTED]",
74
+ },
75
+ // Connection strings with credentials
76
+ {
77
+ pattern: /\b(postgres|mysql|mongodb|redis):\/\/[^\s]+:[^\s]+@[^\s]+/gi,
78
+ replacement: "[CONNECTION_STRING_REDACTED]",
79
+ },
80
+ // PEM blocks
81
+ {
82
+ pattern: /-----BEGIN\s+(RSA\s+)?(PRIVATE|PUBLIC)\s+KEY-----[\s\S]*?-----END\s+(RSA\s+)?(PRIVATE|PUBLIC)\s+KEY-----/g,
83
+ replacement: "[PEM_KEY_REDACTED]",
84
+ },
85
+ ];
86
+ const DEFAULT_PII_PATTERNS = [
87
+ // Match email addresses; requires an alphabetic TLD to avoid false positives on @mentions and
88
+ // npm/pnpm version strings (e.g. package@1.2.3 has a numeric suffix, not a TLD)
89
+ {
90
+ pattern: /[\w.+-]+@(?:[\w-]+\.)+[a-zA-Z]{2,}/g,
91
+ replacement: "[EMAIL REDACTED]",
92
+ },
93
+ ];
94
+ const PROMPT_PAYLOAD_LOG_PATTERNS = [
95
+ {
96
+ pattern: /^(\[llm-generating\] (?:System prompt|User message):)\s*[\s\S]*$/g,
97
+ replacement: "$1 [REDACTED]",
98
+ },
99
+ ];
100
+ // ============================================================================
101
+ // Secret Fields - Field names that contain secrets
102
+ // ============================================================================
103
+ /**
104
+ * Fields that contain secrets and should be stripped from log objects.
105
+ * Only includes actual secret field names - NOT debugging info.
106
+ *
107
+ * Pipeline-layer concerns (AI content, stack traces, PII) are NOT included here.
108
+ * Those are handled by the OTel Collector for tier-based export filtering.
109
+ */
110
+ export const SECRET_FIELDS = new Set([
111
+ // Auth/secrets
112
+ "password",
113
+ "passwd",
114
+ "secret",
115
+ "private_key",
116
+ "privatekey",
117
+ "credentials",
118
+ "token",
119
+ "accesstoken",
120
+ "access_token",
121
+ "refreshtoken",
122
+ "refresh_token",
123
+ "jwt",
124
+ "bearer",
125
+ "apikey",
126
+ "api_key",
127
+ "auth_token",
128
+ "authorization",
129
+ "cookie",
130
+ "x-api-key",
131
+ ]);
132
+ /**
133
+ * Patterns for compound field names that contain secrets.
134
+ * Uses word boundary matching to avoid false positives.
135
+ * Exported for use in LoggingPolicyConfig (e.g. cloud-prem).
136
+ */
137
+ export const SECRET_FIELD_PATTERNS = [
138
+ // Password patterns
139
+ /(?:^|[._-])password(?:[._-]|$)/i,
140
+ /(?:^|[._-])passwd(?:[._-]|$)/i,
141
+ // Secret patterns
142
+ /(?:^|[._-])secret(?:[._-]|$)/i,
143
+ /(?:^|[._-])private[._-]?key(?:[._-]|$)/i,
144
+ // Token patterns
145
+ /(?:^|[._-])token(?:[._-]|$)/i,
146
+ /(?:^|[._-])jwt(?:[._-]|$)/i,
147
+ /(?:^|[._-])bearer(?:[._-]|$)/i,
148
+ // Credential patterns
149
+ /(?:^|[._-])credentials?(?:[._-]|$)/i,
150
+ // API key patterns
151
+ /api[._-]?key/i,
152
+ /x[._-]api[._-]key/i,
153
+ // Auth token patterns
154
+ /auth[._-]token/i,
155
+ ];
156
+ /**
157
+ * Check if a field name contains secrets using word boundary matching.
158
+ */
159
+ export function isSecretField(fieldName) {
160
+ return isSecretFieldFromPolicy(fieldName, SECRET_FIELDS, SECRET_FIELD_PATTERNS);
161
+ }
162
+ /**
163
+ * Policy-driven secret field check. When names and patterns are empty, returns false.
164
+ * Used by PolicyAwareLogProcessor so cloud can pass empty set/array for no redaction.
165
+ */
166
+ export function isSecretFieldFromPolicy(fieldName, secretFieldNames, secretFieldPatterns) {
167
+ if (secretFieldNames.size === 0 && secretFieldPatterns.length === 0) {
168
+ return false;
169
+ }
170
+ const lowerKey = fieldName.toLowerCase();
171
+ if (secretFieldNames.has(lowerKey)) {
172
+ return true;
173
+ }
174
+ return secretFieldPatterns.some((pattern) => pattern.test(lowerKey));
175
+ }
176
+ // ============================================================================
177
+ // Export-forbidden fields (Tier 1 content - must not appear in exported logs)
178
+ // ============================================================================
179
+ /**
180
+ * Placeholder string used when redacting forbidden or secret fields in logs.
181
+ * Use this constant so all packages (server, telemetry) share one value.
182
+ */
183
+ export const REDACTED_PLACEHOLDER = "[REDACTED]";
184
+ /**
185
+ * Field names that must never be included in exported logs (stack, prompt, code, etc.).
186
+ * Used as the base for both cloud and cloud-prem.
187
+ */
188
+ export const BASE_EXPORT_FORBIDDEN_FIELDS = new Set([
189
+ "code",
190
+ "error.stack",
191
+ "exception.stacktrace",
192
+ "filecontent",
193
+ "filepath",
194
+ "prompt",
195
+ "stack",
196
+ ]);
197
+ /** Email-related keys forbidden in cloud-prem export only (allowed in cloud). */
198
+ const EXPORT_FORBIDDEN_EMAIL_KEYS = new Set([
199
+ "user.email",
200
+ "user-email", // server req.logTags key (OBS_TAG_USER_EMAIL) for child logger bindings
201
+ ]);
202
+ /** Export-forbidden fields for cloud (base only; email keys allowed). */
203
+ export const EXPORT_FORBIDDEN_FIELDS_CLOUD = new Set(BASE_EXPORT_FORBIDDEN_FIELDS);
204
+ /** Export-forbidden fields for cloud-prem (base + email keys). */
205
+ export const EXPORT_FORBIDDEN_FIELDS_CLOUD_PREM = new Set([
206
+ ...BASE_EXPORT_FORBIDDEN_FIELDS,
207
+ ...EXPORT_FORBIDDEN_EMAIL_KEYS,
208
+ ]);
209
+ /**
210
+ * Attribute keys that conventionally hold stack traces (epic C4). Value-based
211
+ * sanitization (containsStackTrace) redacts stack content in any key.
212
+ */
213
+ const STACK_ATTRIBUTE_KEYS = new Set([
214
+ "error.stack",
215
+ "exception.stacktrace",
216
+ "stack",
217
+ ]);
218
+ export function isStackAttributeKey(key) {
219
+ return STACK_ATTRIBUTE_KEYS.has(key.toLowerCase());
220
+ }
221
+ /**
222
+ * Check if a string contains a stack trace (for export redaction).
223
+ */
224
+ export function containsStackTrace(text) {
225
+ if (!text || typeof text !== "string")
226
+ return false;
227
+ if (/at .{1,4096}?\(.{1,4096}?:\d+:\d+\)/.test(text))
228
+ return true;
229
+ if (/goroutine \d+ \[[^\]]{1,4096}\]:/.test(text))
230
+ return true;
231
+ if (/File "[^"]{1,4096}", line \d+/.test(text))
232
+ return true;
233
+ if (/at \w+\.\w+\([^()]{1,4096}\.java:\d+\)/.test(text))
234
+ return true;
235
+ return false;
236
+ }
237
+ /** Placeholder for stack trace redaction in exported logs. Exported for use in log-processor. */
238
+ export const STACK_TRACE_REDACTED_PLACEHOLDER = "[STACK TRACE REDACTED - Tier 1 only]";
239
+ /**
240
+ * Apply redact patterns to a string with a single replacement (resets lastIndex on each pattern).
241
+ */
242
+ export function applyRedactPatterns(str, patterns, replacement = REDACTED_PLACEHOLDER) {
243
+ if (!str || typeof str !== "string")
244
+ return str;
245
+ let out = str;
246
+ for (const pattern of patterns) {
247
+ pattern.lastIndex = 0;
248
+ out = out.replace(pattern, replacement);
249
+ }
250
+ return out;
251
+ }
252
+ /**
253
+ * File extensions whose paths are redacted on the export path. Covers front-end
254
+ * source/build artifacts so customer file paths in bundler output are redacted.
255
+ * Declaration order here does NOT matter — the alternation is sorted
256
+ * longest-first at construction (below).
257
+ */
258
+ const PATH_REDACTION_EXTENSIONS = [
259
+ "tsx",
260
+ "jsx",
261
+ "json",
262
+ "mjs",
263
+ "cjs",
264
+ "html",
265
+ "css",
266
+ "scss",
267
+ "ts",
268
+ "js",
269
+ "go",
270
+ "py",
271
+ "java",
272
+ "sql",
273
+ ];
274
+ // Sort longest-first so overlapping suffixes always match fully (e.g. `.tsx`
275
+ // before `.ts`, `.json` before `.js`) instead of leaving a dangling fragment
276
+ // like `[PATH REDACTED]x`. A prefix is always strictly shorter than the string
277
+ // it prefixes, so length-descending order makes the invariant self-enforcing —
278
+ // adding a new extension can never break it regardless of where it's inserted.
279
+ const PATH_REDACTION_ALTERNATION = [...PATH_REDACTION_EXTENSIONS]
280
+ .sort((a, b) => b.length - a.length)
281
+ .join("|");
282
+ /** Sensitive patterns for cloud: path only (emails are not redacted in cloud). */
283
+ export const SENSITIVE_PATTERNS_CLOUD = [
284
+ {
285
+ // Trailing \b stops a partial match like `.jsonl`/`.json5` from matching
286
+ // `.json` and leaving a dangling fragment (`[PATH REDACTED]l`); such paths
287
+ // are left untouched instead.
288
+ pattern: new RegExp(`/[\\w\\-./]+\\.(${PATH_REDACTION_ALTERNATION})\\b`, "gi"),
289
+ replacement: "[PATH REDACTED]",
290
+ },
291
+ ];
292
+ /** Default sensitive patterns (path, email) for cloud-prem and when export is strict. */
293
+ export const DEFAULT_SENSITIVE_PATTERNS = [
294
+ ...SENSITIVE_PATTERNS_CLOUD,
295
+ ...DEFAULT_PII_PATTERNS,
296
+ ];
297
+ /**
298
+ * Regex patterns for cloud-prem log export: matched content is replaced with [REDACTED].
299
+ * Used as redactPatterns in LoggingPolicyConfig when deploymentType is CLOUD_PREM.
300
+ */
301
+ export const CLOUD_PREM_REDACT_PATTERNS = [
302
+ // JWT pattern (base64.base64.base64) - standalone tokens
303
+ /\b[A-Za-z0-9-_]{20,}\.[A-Za-z0-9-_]{20,}\.[A-Za-z0-9-_]{20,}\b/g,
304
+ // Bearer tokens
305
+ /\bbearer\s+[a-zA-Z0-9\-._~+/]+=*/gi,
306
+ // API keys
307
+ /\bapi[_\s]?key[:\s=]+[a-zA-Z0-9\-._~+/]{16,}=*/gi,
308
+ ];
309
+ /**
310
+ * Apply sensitive patterns (pattern + replacement) to text.
311
+ * Used with policy.sensitivePatterns whenever redacting values for export.
312
+ */
313
+ export function redactSensitivePatterns(text, patterns) {
314
+ if (!text || typeof text !== "string")
315
+ return text;
316
+ let out = text;
317
+ for (const { pattern, replacement } of patterns) {
318
+ pattern.lastIndex = 0;
319
+ out = out.replace(pattern, replacement);
320
+ }
321
+ return out;
322
+ }
323
+ /**
324
+ * Redact stack trace for export: keep first line (error message) after sanitizing
325
+ * it with sensitive patterns, replace the rest with a placeholder.
326
+ * Use when exporting logs so stack traces never leave the environment.
327
+ *
328
+ * @param messageSecretPatterns - When non-empty, applied to first line before sensitivePatterns (policy-driven). When empty, uses sanitizeLogMessage for first line.
329
+ */
330
+ export function redactStackTraceForExport(text, sensitivePatterns = [], messageSecretPatterns = []) {
331
+ if (!text || typeof text !== "string")
332
+ return text;
333
+ if (!containsStackTrace(text))
334
+ return text;
335
+ const lines = text.split("\n");
336
+ if (lines.length <= 1)
337
+ return text;
338
+ const firstLineRaw = messageSecretPatterns.length > 0
339
+ ? redactSensitivePatterns(lines[0], messageSecretPatterns)
340
+ : sanitizeLogMessage(lines[0]);
341
+ const firstLine = redactSensitivePatterns(firstLineRaw, sensitivePatterns);
342
+ return firstLine + "\n" + STACK_TRACE_REDACTED_PLACEHOLDER;
343
+ }
344
+ /**
345
+ * Sanitize a log message string for export: sensitive patterns, then policy redact patterns, then
346
+ * stack trace redaction. Use for the message argument in log calls (e.g. safe logger stdout path).
347
+ */
348
+ export function sanitizeLogMessageForExport(message, redactPatterns, sensitivePatterns) {
349
+ if (!message || typeof message !== "string")
350
+ return message;
351
+ let out = redactSensitivePatterns(sanitizeLogMessage(message), sensitivePatterns);
352
+ out = applyRedactPatterns(out, redactPatterns);
353
+ if (containsStackTrace(out)) {
354
+ return redactStackTraceForExport(sanitizeLogMessage(out), sensitivePatterns);
355
+ }
356
+ return out;
357
+ }
358
+ /**
359
+ * Apply value-based sanitization to a string (sensitive patterns, policy redact patterns, then stack).
360
+ * Used by sanitizeLogRecordForExport for string values.
361
+ */
362
+ function sanitizeStringValueForExport(value, key, redactPatterns, sensitivePatterns) {
363
+ let out = redactSensitivePatterns(sanitizeLogMessage(value), sensitivePatterns);
364
+ out = applyRedactPatterns(out, redactPatterns);
365
+ if (isStackAttributeKey(key)) {
366
+ return containsStackTrace(out)
367
+ ? redactStackTraceForExport(sanitizeLogMessage(out), sensitivePatterns)
368
+ : STACK_TRACE_REDACTED_PLACEHOLDER;
369
+ }
370
+ if (containsStackTrace(out)) {
371
+ return redactStackTraceForExport(sanitizeLogMessage(out), sensitivePatterns);
372
+ }
373
+ return out;
374
+ }
375
+ // ============================================================================
376
+ // Legacy exports for backward compatibility
377
+ // ============================================================================
378
+ /**
379
+ * @deprecated Use SECRET_FIELDS instead. This export is kept for backward
380
+ * compatibility but now only contains secret fields, not Tier 1 content fields.
381
+ */
382
+ export const TIER1_FORBIDDEN_LOG_FIELDS = SECRET_FIELDS;
383
+ // ============================================================================
384
+ // Public API
385
+ // ============================================================================
386
+ /**
387
+ * Sanitizes secrets from a log message string.
388
+ * Preserves debugging info (emails, file paths, stack traces, etc.) for troubleshooting.
389
+ * Email redaction is deployment-specific and handled via DEFAULT_SENSITIVE_PATTERNS
390
+ * on the export path (cloud-prem only).
391
+ *
392
+ * @param message - The log message to sanitize
393
+ * @returns Message with secrets redacted
394
+ */
395
+ export function sanitizeLogMessage(message) {
396
+ if (!message || typeof message !== "string") {
397
+ return message;
398
+ }
399
+ let sanitized = message;
400
+ for (const { pattern, replacement } of [
401
+ ...PROMPT_PAYLOAD_LOG_PATTERNS,
402
+ ...DEFAULT_SECRET_PATTERNS,
403
+ ]) {
404
+ pattern.lastIndex = 0; // Reset regex state for global patterns
405
+ sanitized = sanitized.replace(pattern, replacement);
406
+ }
407
+ return sanitized;
408
+ }
409
+ /**
410
+ * Sanitizes secrets within a stack trace while preserving the full trace.
411
+ * Stack traces are essential for debugging - only redact secrets within them.
412
+ *
413
+ * @param stack - The stack trace string
414
+ * @returns Stack trace with secrets redacted but structure preserved
415
+ */
416
+ export function redactStackTrace(stack) {
417
+ if (!stack || typeof stack !== "string") {
418
+ return stack;
419
+ }
420
+ // Preserve full stack trace, only sanitize secrets within
421
+ return sanitizeLogMessage(stack);
422
+ }
423
+ /**
424
+ * Recursively sanitizes secrets and high-risk PII from an object.
425
+ * Strips secret fields entirely, sanitizes string values.
426
+ * Preserves low-risk debugging info (stack traces, file paths).
427
+ *
428
+ * @param obj - The object to sanitize
429
+ * @param depth - Current recursion depth (default: 0)
430
+ * @returns Object with secrets removed
431
+ */
432
+ export function sanitizeLogObject(obj, depth = 0) {
433
+ // Prevent infinite recursion
434
+ if (depth > 10) {
435
+ return "[MAX_DEPTH_REACHED]";
436
+ }
437
+ if (obj === null || obj === undefined) {
438
+ return obj;
439
+ }
440
+ if (typeof obj === "string") {
441
+ return sanitizeLogMessage(obj);
442
+ }
443
+ if (typeof obj === "number" || typeof obj === "boolean") {
444
+ return obj;
445
+ }
446
+ if (typeof obj !== "object") {
447
+ return obj;
448
+ }
449
+ if (Array.isArray(obj)) {
450
+ return obj.map((item) => sanitizeLogObject(item, depth + 1));
451
+ }
452
+ const sanitized = {};
453
+ for (const [key, value] of Object.entries(obj)) {
454
+ // Skip secret fields entirely
455
+ if (isSecretField(key)) {
456
+ continue;
457
+ }
458
+ // Recursively sanitize all other fields
459
+ sanitized[key] = sanitizeLogObject(value, depth + 1);
460
+ }
461
+ return sanitized;
462
+ }
463
+ /**
464
+ * Sanitize an object for export: exclude forbidden keys (omitted), redact secret keys (key kept, value [REDACTED]),
465
+ * and apply sensitive patterns to string values. Used by PolicyAwareLogProcessor when exporting log body objects.
466
+ */
467
+ export function sanitizeLogObjectForExport(obj, forbiddenFields, depth = 0, sensitivePatterns = []) {
468
+ if (depth > 10) {
469
+ return "[MAX_DEPTH_REACHED]";
470
+ }
471
+ if (obj === null || obj === undefined) {
472
+ return obj;
473
+ }
474
+ if (typeof obj === "string") {
475
+ return redactSensitivePatterns(sanitizeLogMessage(obj), sensitivePatterns);
476
+ }
477
+ if (typeof obj === "number" || typeof obj === "boolean") {
478
+ return obj;
479
+ }
480
+ if (typeof obj !== "object") {
481
+ return obj;
482
+ }
483
+ if (Array.isArray(obj)) {
484
+ return obj.map((item) => sanitizeLogObjectForExport(item, forbiddenFields, depth + 1, sensitivePatterns));
485
+ }
486
+ const result = {};
487
+ for (const [key, value] of Object.entries(obj)) {
488
+ const lowerKey = key.toLowerCase();
489
+ // Secret fields: keep key, redact value (consistent with sanitizeAttributes)
490
+ if (isSecretField(key)) {
491
+ result[key] = REDACTED_PLACEHOLDER;
492
+ continue;
493
+ }
494
+ // Forbidden fields (e.g. prompt, code, stack): exclude from export (omit key and value).
495
+ if (forbiddenFields.has(lowerKey)) {
496
+ continue;
497
+ }
498
+ // String values: redact stack traces by key or content, then sensitive patterns
499
+ if (typeof value === "string") {
500
+ if (isStackAttributeKey(key)) {
501
+ result[key] = containsStackTrace(value)
502
+ ? redactStackTraceForExport(sanitizeLogMessage(value), sensitivePatterns)
503
+ : STACK_TRACE_REDACTED_PLACEHOLDER;
504
+ }
505
+ else if (containsStackTrace(value)) {
506
+ result[key] = redactStackTraceForExport(sanitizeLogMessage(value), sensitivePatterns);
507
+ }
508
+ else {
509
+ result[key] = redactSensitivePatterns(sanitizeLogMessage(value), sensitivePatterns);
510
+ }
511
+ continue;
512
+ }
513
+ result[key] = sanitizeLogObjectForExport(value, forbiddenFields, depth + 1, sensitivePatterns);
514
+ }
515
+ return result;
516
+ }
517
+ /**
518
+ * Sanitize a log record for export with both key-based and value-based redaction.
519
+ * Applies sensitivePatterns and redactPatterns to every string value.
520
+ * Use for the server stdout path (safe logger and RemoteLogger redactRecord) so exported logs match OTLP behavior.
521
+ */
522
+ export function sanitizeLogRecordForExport(obj, forbiddenFields, redactPatterns, sensitivePatterns, depth = 0) {
523
+ if (depth > 10) {
524
+ return "[MAX_DEPTH_REACHED]";
525
+ }
526
+ if (obj === null || obj === undefined) {
527
+ return obj;
528
+ }
529
+ if (typeof obj === "string") {
530
+ return sanitizeLogMessageForExport(obj, redactPatterns, sensitivePatterns);
531
+ }
532
+ if (typeof obj === "number" || typeof obj === "boolean") {
533
+ return obj;
534
+ }
535
+ if (typeof obj !== "object") {
536
+ return obj;
537
+ }
538
+ // Error instances have non-enumerable message/name/stack; convert so we can redact them.
539
+ if (obj instanceof Error) {
540
+ const plain = {
541
+ message: obj.message,
542
+ name: obj.name,
543
+ stack: obj.stack,
544
+ };
545
+ for (const key of Object.keys(obj)) {
546
+ if (!Object.prototype.hasOwnProperty.call(plain, key)) {
547
+ plain[key] = obj[key];
548
+ }
549
+ }
550
+ return sanitizeLogRecordForExport(plain, forbiddenFields, redactPatterns, sensitivePatterns, depth);
551
+ }
552
+ if (Array.isArray(obj)) {
553
+ return obj.map((item) => sanitizeLogRecordForExport(item, forbiddenFields, redactPatterns, sensitivePatterns, depth + 1));
554
+ }
555
+ const result = {};
556
+ for (const [key, value] of Object.entries(obj)) {
557
+ const lowerKey = key.toLowerCase();
558
+ if (isSecretField(key)) {
559
+ result[key] = REDACTED_PLACEHOLDER;
560
+ continue;
561
+ }
562
+ if (forbiddenFields.has(lowerKey)) {
563
+ continue;
564
+ }
565
+ if (typeof value === "string") {
566
+ result[key] = sanitizeStringValueForExport(value, key, redactPatterns, sensitivePatterns);
567
+ continue;
568
+ }
569
+ result[key] = sanitizeLogRecordForExport(value, forbiddenFields, redactPatterns, sensitivePatterns, depth + 1);
570
+ }
571
+ return result;
572
+ }
573
+ /**
574
+ * Sanitizes secrets from an error object.
575
+ * Preserves full stack traces for debugging.
576
+ *
577
+ * @param error - The error to sanitize
578
+ * @returns Error object with secrets redacted
579
+ */
580
+ export function sanitizeLogError(error) {
581
+ if (!error) {
582
+ return error;
583
+ }
584
+ // Check if already sanitized
585
+ const errorWithSanitized = error;
586
+ if (errorWithSanitized._sanitized) {
587
+ return error;
588
+ }
589
+ if (error instanceof Error) {
590
+ const sanitized = {
591
+ name: error.name,
592
+ message: sanitizeLogMessage(error.message),
593
+ // Preserve full stack trace, only sanitize secrets within
594
+ stack: sanitizeLogMessage(error.stack || ""),
595
+ _sanitized: true,
596
+ };
597
+ // Copy and sanitize enumerable properties
598
+ for (const [key, value] of Object.entries(error)) {
599
+ if (key !== "name" && key !== "message" && key !== "stack") {
600
+ // Skip secret fields
601
+ if (isSecretField(key)) {
602
+ continue;
603
+ }
604
+ sanitized[key] = sanitizeLogObject(value);
605
+ }
606
+ }
607
+ return sanitized;
608
+ }
609
+ // For non-Error objects, sanitize the entire object
610
+ const sanitized = sanitizeLogObject(error);
611
+ sanitized._sanitized = true;
612
+ return sanitized;
613
+ }
614
+ /**
615
+ * Safe JSON stringify with secret sanitization.
616
+ * Handles circular references and non-serializable types.
617
+ * Preserves debugging info (stack traces, file paths, emails).
618
+ *
619
+ * @param obj - Object to stringify
620
+ * @param space - Indentation (optional)
621
+ * @returns JSON string with secrets redacted
622
+ */
623
+ export function safeJsonStringify(obj, space) {
624
+ if (obj === null || obj === undefined) {
625
+ return "{}";
626
+ }
627
+ if (typeof obj === "string") {
628
+ return sanitizeLogMessage(obj);
629
+ }
630
+ const seen = new WeakSet();
631
+ return JSON.stringify(obj, (key, value) => {
632
+ // Skip secret fields
633
+ if (key && isSecretField(key)) {
634
+ return undefined;
635
+ }
636
+ // Handle null/undefined
637
+ if (value === null || value === undefined) {
638
+ return value;
639
+ }
640
+ // Handle circular references
641
+ if (typeof value === "object") {
642
+ if (seen.has(value)) {
643
+ return "[Circular Reference]";
644
+ }
645
+ seen.add(value);
646
+ // Handle Error objects - preserve full stack trace
647
+ if (value instanceof Error) {
648
+ return {
649
+ name: value.name,
650
+ message: sanitizeLogMessage(value.message),
651
+ stack: sanitizeLogMessage(value.stack || ""),
652
+ };
653
+ }
654
+ }
655
+ // Sanitize string values
656
+ if (typeof value === "string") {
657
+ return sanitizeLogMessage(value);
658
+ }
659
+ // Handle non-serializable types
660
+ if (typeof value === "function") {
661
+ return `[Function: ${value.name || "anonymous"}]`;
662
+ }
663
+ if (typeof value === "symbol") {
664
+ return `[Symbol: ${value.toString()}]`;
665
+ }
666
+ if (typeof value === "bigint") {
667
+ return `[BigInt: ${value.toString()}]`;
668
+ }
669
+ return value;
670
+ }, space);
671
+ }
672
+ //# sourceMappingURL=log-sanitizer.js.map