@superblocksteam/telemetry 2.0.0-SNAPSHOT.11cd2e1f764851e4

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