@superblocksteam/telemetry 2.0.83-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/LICENSE.txt +87 -0
  2. package/README.md +155 -0
  3. package/dist/browser/index.d.ts +8 -0
  4. package/dist/browser/index.d.ts.map +1 -0
  5. package/dist/browser/index.js +19 -0
  6. package/dist/browser/index.js.map +1 -0
  7. package/dist/browser/init.d.ts +75 -0
  8. package/dist/browser/init.d.ts.map +1 -0
  9. package/dist/browser/init.js +169 -0
  10. package/dist/browser/init.js.map +1 -0
  11. package/dist/browser/resilient-exporter.d.ts +43 -0
  12. package/dist/browser/resilient-exporter.d.ts.map +1 -0
  13. package/dist/browser/resilient-exporter.js +88 -0
  14. package/dist/browser/resilient-exporter.js.map +1 -0
  15. package/dist/common/contracts/tier2-traces.d.ts +75 -0
  16. package/dist/common/contracts/tier2-traces.d.ts.map +1 -0
  17. package/dist/common/contracts/tier2-traces.js +186 -0
  18. package/dist/common/contracts/tier2-traces.js.map +1 -0
  19. package/dist/common/deployment-type.d.ts +18 -0
  20. package/dist/common/deployment-type.d.ts.map +1 -0
  21. package/dist/common/deployment-type.js +30 -0
  22. package/dist/common/deployment-type.js.map +1 -0
  23. package/dist/common/guardrails.d.ts +116 -0
  24. package/dist/common/guardrails.d.ts.map +1 -0
  25. package/dist/common/guardrails.js +189 -0
  26. package/dist/common/guardrails.js.map +1 -0
  27. package/dist/common/index.d.ts +16 -0
  28. package/dist/common/index.d.ts.map +1 -0
  29. package/dist/common/index.js +32 -0
  30. package/dist/common/index.js.map +1 -0
  31. package/dist/common/log-sanitizer.d.ts +78 -0
  32. package/dist/common/log-sanitizer.d.ts.map +1 -0
  33. package/dist/common/log-sanitizer.js +340 -0
  34. package/dist/common/log-sanitizer.js.map +1 -0
  35. package/dist/common/policy-evaluator.d.ts +103 -0
  36. package/dist/common/policy-evaluator.d.ts.map +1 -0
  37. package/dist/common/policy-evaluator.js +200 -0
  38. package/dist/common/policy-evaluator.js.map +1 -0
  39. package/dist/common/resource.d.ts +62 -0
  40. package/dist/common/resource.d.ts.map +1 -0
  41. package/dist/common/resource.js +106 -0
  42. package/dist/common/resource.js.map +1 -0
  43. package/dist/common/tier-hints.d.ts +182 -0
  44. package/dist/common/tier-hints.d.ts.map +1 -0
  45. package/dist/common/tier-hints.js +209 -0
  46. package/dist/common/tier-hints.js.map +1 -0
  47. package/dist/index.d.ts +43 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +76 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/lint/forbidden-attributes.d.ts +149 -0
  52. package/dist/lint/forbidden-attributes.d.ts.map +1 -0
  53. package/dist/lint/forbidden-attributes.js +214 -0
  54. package/dist/lint/forbidden-attributes.js.map +1 -0
  55. package/dist/lint/index.d.ts +9 -0
  56. package/dist/lint/index.d.ts.map +1 -0
  57. package/dist/lint/index.js +16 -0
  58. package/dist/lint/index.js.map +1 -0
  59. package/dist/llmobs/index.d.ts +22 -0
  60. package/dist/llmobs/index.d.ts.map +1 -0
  61. package/dist/llmobs/index.js +29 -0
  62. package/dist/llmobs/index.js.map +1 -0
  63. package/dist/llmobs/tier1-exporter.d.ts +146 -0
  64. package/dist/llmobs/tier1-exporter.d.ts.map +1 -0
  65. package/dist/llmobs/tier1-exporter.js +196 -0
  66. package/dist/llmobs/tier1-exporter.js.map +1 -0
  67. package/dist/llmobs/tier2-summarizer.d.ts +268 -0
  68. package/dist/llmobs/tier2-summarizer.d.ts.map +1 -0
  69. package/dist/llmobs/tier2-summarizer.js +650 -0
  70. package/dist/llmobs/tier2-summarizer.js.map +1 -0
  71. package/dist/node/exporters/resilient-exporter.d.ts +77 -0
  72. package/dist/node/exporters/resilient-exporter.d.ts.map +1 -0
  73. package/dist/node/exporters/resilient-exporter.js +129 -0
  74. package/dist/node/exporters/resilient-exporter.js.map +1 -0
  75. package/dist/node/index.d.ts +11 -0
  76. package/dist/node/index.d.ts.map +1 -0
  77. package/dist/node/index.js +24 -0
  78. package/dist/node/index.js.map +1 -0
  79. package/dist/node/init.d.ts +75 -0
  80. package/dist/node/init.d.ts.map +1 -0
  81. package/dist/node/init.js +245 -0
  82. package/dist/node/init.js.map +1 -0
  83. package/dist/node/log-processor.d.ts +83 -0
  84. package/dist/node/log-processor.d.ts.map +1 -0
  85. package/dist/node/log-processor.js +266 -0
  86. package/dist/node/log-processor.js.map +1 -0
  87. package/dist/node/metrics-client.d.ts +66 -0
  88. package/dist/node/metrics-client.d.ts.map +1 -0
  89. package/dist/node/metrics-client.js +193 -0
  90. package/dist/node/metrics-client.js.map +1 -0
  91. package/dist/node/traced-socket.d.ts +76 -0
  92. package/dist/node/traced-socket.d.ts.map +1 -0
  93. package/dist/node/traced-socket.js +261 -0
  94. package/dist/node/traced-socket.js.map +1 -0
  95. package/dist/testing/in-memory-exporter.d.ts +179 -0
  96. package/dist/testing/in-memory-exporter.d.ts.map +1 -0
  97. package/dist/testing/in-memory-exporter.js +254 -0
  98. package/dist/testing/in-memory-exporter.js.map +1 -0
  99. package/dist/testing/index.d.ts +8 -0
  100. package/dist/testing/index.d.ts.map +1 -0
  101. package/dist/testing/index.js +19 -0
  102. package/dist/testing/index.js.map +1 -0
  103. package/dist/testing/test-init.d.ts +80 -0
  104. package/dist/testing/test-init.d.ts.map +1 -0
  105. package/dist/testing/test-init.js +144 -0
  106. package/dist/testing/test-init.js.map +1 -0
  107. package/dist/types/index.d.ts +40 -0
  108. package/dist/types/index.d.ts.map +1 -0
  109. package/dist/types/index.js +23 -0
  110. package/dist/types/index.js.map +1 -0
  111. package/dist/types/policy.d.ts +92 -0
  112. package/dist/types/policy.d.ts.map +1 -0
  113. package/dist/types/policy.js +125 -0
  114. package/dist/types/policy.js.map +1 -0
  115. package/dist-esm/browser/index.d.ts +8 -0
  116. package/dist-esm/browser/index.d.ts.map +1 -0
  117. package/dist-esm/browser/index.js +9 -0
  118. package/dist-esm/browser/index.js.map +1 -0
  119. package/dist-esm/browser/init.d.ts +75 -0
  120. package/dist-esm/browser/init.d.ts.map +1 -0
  121. package/dist-esm/browser/init.js +162 -0
  122. package/dist-esm/browser/init.js.map +1 -0
  123. package/dist-esm/browser/resilient-exporter.d.ts +43 -0
  124. package/dist-esm/browser/resilient-exporter.d.ts.map +1 -0
  125. package/dist-esm/browser/resilient-exporter.js +84 -0
  126. package/dist-esm/browser/resilient-exporter.js.map +1 -0
  127. package/dist-esm/common/contracts/tier2-traces.d.ts +75 -0
  128. package/dist-esm/common/contracts/tier2-traces.d.ts.map +1 -0
  129. package/dist-esm/common/contracts/tier2-traces.js +178 -0
  130. package/dist-esm/common/contracts/tier2-traces.js.map +1 -0
  131. package/dist-esm/common/deployment-type.d.ts +18 -0
  132. package/dist-esm/common/deployment-type.d.ts.map +1 -0
  133. package/dist-esm/common/deployment-type.js +27 -0
  134. package/dist-esm/common/deployment-type.js.map +1 -0
  135. package/dist-esm/common/guardrails.d.ts +116 -0
  136. package/dist-esm/common/guardrails.d.ts.map +1 -0
  137. package/dist-esm/common/guardrails.js +179 -0
  138. package/dist-esm/common/guardrails.js.map +1 -0
  139. package/dist-esm/common/index.d.ts +16 -0
  140. package/dist-esm/common/index.d.ts.map +1 -0
  141. package/dist-esm/common/index.js +16 -0
  142. package/dist-esm/common/index.js.map +1 -0
  143. package/dist-esm/common/log-sanitizer.d.ts +78 -0
  144. package/dist-esm/common/log-sanitizer.d.ts.map +1 -0
  145. package/dist-esm/common/log-sanitizer.js +331 -0
  146. package/dist-esm/common/log-sanitizer.js.map +1 -0
  147. package/dist-esm/common/policy-evaluator.d.ts +103 -0
  148. package/dist-esm/common/policy-evaluator.d.ts.map +1 -0
  149. package/dist-esm/common/policy-evaluator.js +196 -0
  150. package/dist-esm/common/policy-evaluator.js.map +1 -0
  151. package/dist-esm/common/resource.d.ts +62 -0
  152. package/dist-esm/common/resource.d.ts.map +1 -0
  153. package/dist-esm/common/resource.js +100 -0
  154. package/dist-esm/common/resource.js.map +1 -0
  155. package/dist-esm/common/tier-hints.d.ts +182 -0
  156. package/dist-esm/common/tier-hints.d.ts.map +1 -0
  157. package/dist-esm/common/tier-hints.js +199 -0
  158. package/dist-esm/common/tier-hints.js.map +1 -0
  159. package/dist-esm/index.d.ts +43 -0
  160. package/dist-esm/index.d.ts.map +1 -0
  161. package/dist-esm/index.js +53 -0
  162. package/dist-esm/index.js.map +1 -0
  163. package/dist-esm/lint/forbidden-attributes.d.ts +149 -0
  164. package/dist-esm/lint/forbidden-attributes.d.ts.map +1 -0
  165. package/dist-esm/lint/forbidden-attributes.js +209 -0
  166. package/dist-esm/lint/forbidden-attributes.js.map +1 -0
  167. package/dist-esm/lint/index.d.ts +9 -0
  168. package/dist-esm/lint/index.d.ts.map +1 -0
  169. package/dist-esm/lint/index.js +9 -0
  170. package/dist-esm/lint/index.js.map +1 -0
  171. package/dist-esm/llmobs/index.d.ts +22 -0
  172. package/dist-esm/llmobs/index.d.ts.map +1 -0
  173. package/dist-esm/llmobs/index.js +22 -0
  174. package/dist-esm/llmobs/index.js.map +1 -0
  175. package/dist-esm/llmobs/tier1-exporter.d.ts +146 -0
  176. package/dist-esm/llmobs/tier1-exporter.d.ts.map +1 -0
  177. package/dist-esm/llmobs/tier1-exporter.js +190 -0
  178. package/dist-esm/llmobs/tier1-exporter.js.map +1 -0
  179. package/dist-esm/llmobs/tier2-summarizer.d.ts +268 -0
  180. package/dist-esm/llmobs/tier2-summarizer.d.ts.map +1 -0
  181. package/dist-esm/llmobs/tier2-summarizer.js +646 -0
  182. package/dist-esm/llmobs/tier2-summarizer.js.map +1 -0
  183. package/dist-esm/node/exporters/resilient-exporter.d.ts +77 -0
  184. package/dist-esm/node/exporters/resilient-exporter.d.ts.map +1 -0
  185. package/dist-esm/node/exporters/resilient-exporter.js +125 -0
  186. package/dist-esm/node/exporters/resilient-exporter.js.map +1 -0
  187. package/dist-esm/node/index.d.ts +11 -0
  188. package/dist-esm/node/index.d.ts.map +1 -0
  189. package/dist-esm/node/index.js +11 -0
  190. package/dist-esm/node/index.js.map +1 -0
  191. package/dist-esm/node/init.d.ts +75 -0
  192. package/dist-esm/node/init.d.ts.map +1 -0
  193. package/dist-esm/node/init.js +239 -0
  194. package/dist-esm/node/init.js.map +1 -0
  195. package/dist-esm/node/log-processor.d.ts +83 -0
  196. package/dist-esm/node/log-processor.d.ts.map +1 -0
  197. package/dist-esm/node/log-processor.js +261 -0
  198. package/dist-esm/node/log-processor.js.map +1 -0
  199. package/dist-esm/node/metrics-client.d.ts +66 -0
  200. package/dist-esm/node/metrics-client.d.ts.map +1 -0
  201. package/dist-esm/node/metrics-client.js +189 -0
  202. package/dist-esm/node/metrics-client.js.map +1 -0
  203. package/dist-esm/node/traced-socket.d.ts +76 -0
  204. package/dist-esm/node/traced-socket.d.ts.map +1 -0
  205. package/dist-esm/node/traced-socket.js +257 -0
  206. package/dist-esm/node/traced-socket.js.map +1 -0
  207. package/dist-esm/testing/in-memory-exporter.d.ts +179 -0
  208. package/dist-esm/testing/in-memory-exporter.d.ts.map +1 -0
  209. package/dist-esm/testing/in-memory-exporter.js +248 -0
  210. package/dist-esm/testing/in-memory-exporter.js.map +1 -0
  211. package/dist-esm/testing/index.d.ts +8 -0
  212. package/dist-esm/testing/index.d.ts.map +1 -0
  213. package/dist-esm/testing/index.js +8 -0
  214. package/dist-esm/testing/index.js.map +1 -0
  215. package/dist-esm/testing/test-init.d.ts +80 -0
  216. package/dist-esm/testing/test-init.d.ts.map +1 -0
  217. package/dist-esm/testing/test-init.js +137 -0
  218. package/dist-esm/testing/test-init.js.map +1 -0
  219. package/dist-esm/types/index.d.ts +40 -0
  220. package/dist-esm/types/index.d.ts.map +1 -0
  221. package/dist-esm/types/index.js +7 -0
  222. package/dist-esm/types/index.js.map +1 -0
  223. package/dist-esm/types/policy.d.ts +92 -0
  224. package/dist-esm/types/policy.d.ts.map +1 -0
  225. package/dist-esm/types/policy.js +122 -0
  226. package/dist-esm/types/policy.js.map +1 -0
  227. package/package.json +101 -0
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ /**
3
+ * Common Telemetry Utilities
4
+ *
5
+ * Shared utilities for resource building and policy evaluation.
6
+ *
7
+ * NOTE: Sanitization and routing are handled by the OTEL Collector
8
+ * in the tiered telemetry architecture. See obs/otel-collector/config-tiered.yaml.
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
22
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ __exportStar(require("./deployment-type.js"), exports);
26
+ __exportStar(require("./resource.js"), exports);
27
+ __exportStar(require("./policy-evaluator.js"), exports);
28
+ __exportStar(require("./guardrails.js"), exports);
29
+ __exportStar(require("./contracts/tier2-traces.js"), exports);
30
+ __exportStar(require("./log-sanitizer.js"), exports);
31
+ __exportStar(require("./tier-hints.js"), exports);
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;;;;;;;;;;;;AAEH,uDAAqC;AACrC,gDAA8B;AAC9B,wDAAsC;AACtC,kDAAgC;AAChC,8DAA4C;AAC5C,qDAAmC;AACnC,kDAAgC"}
@@ -0,0 +1,78 @@
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 only removes secrets that should
6
+ * NEVER appear in any log, anywhere.
7
+ *
8
+ * ARCHITECTURE:
9
+ * - Application layer (this file): Secrets-only sanitization (unconditional)
10
+ * - Pipeline layer (OTel Collector): Tier-based filtering for export
11
+ *
12
+ * Stack traces, emails, file paths are preserved for debugging. The pipeline
13
+ * layer handles redacting these for Tier 2 export in cloud-prem deployments.
14
+ *
15
+ * @see https://github.com/superblocksteam/engineering/blob/main/projects/o11y-refactor/epics/epic-c4-logging-strategy.md
16
+ */
17
+ /**
18
+ * Fields that contain secrets and should be stripped from log objects.
19
+ * Only includes actual secret field names - NOT debugging info.
20
+ *
21
+ * Pipeline-layer concerns (AI content, stack traces, PII) are NOT included here.
22
+ * Those are handled by the OTel Collector for tier-based export filtering.
23
+ */
24
+ export declare const SECRET_FIELDS: Set<string>;
25
+ /**
26
+ * Check if a field name contains secrets using word boundary matching.
27
+ */
28
+ export declare function isSecretField(fieldName: string): boolean;
29
+ /**
30
+ * @deprecated Use SECRET_FIELDS instead. This export is kept for backward
31
+ * compatibility but now only contains secret fields, not Tier 1 content fields.
32
+ */
33
+ export declare const TIER1_FORBIDDEN_LOG_FIELDS: Set<string>;
34
+ /**
35
+ * Sanitizes secrets from a log message string.
36
+ * Preserves debugging info (emails, file paths, etc.) for troubleshooting.
37
+ *
38
+ * @param message - The log message to sanitize
39
+ * @returns Message with secrets redacted
40
+ */
41
+ export declare function sanitizeLogMessage(message: string): string;
42
+ /**
43
+ * Sanitizes secrets within a stack trace while preserving the full trace.
44
+ * Stack traces are essential for debugging - only redact secrets within them.
45
+ *
46
+ * @param stack - The stack trace string
47
+ * @returns Stack trace with secrets redacted but structure preserved
48
+ */
49
+ export declare function redactStackTrace(stack: string): string;
50
+ /**
51
+ * Recursively sanitizes secrets from an object.
52
+ * Strips secret fields entirely, sanitizes secrets in string values.
53
+ * Preserves debugging info (stack traces, file paths, emails).
54
+ *
55
+ * @param obj - The object to sanitize
56
+ * @param depth - Current recursion depth (default: 0)
57
+ * @returns Object with secrets removed
58
+ */
59
+ export declare function sanitizeLogObject<T>(obj: T, depth?: number): T;
60
+ /**
61
+ * Sanitizes secrets from an error object.
62
+ * Preserves full stack traces for debugging.
63
+ *
64
+ * @param error - The error to sanitize
65
+ * @returns Error object with secrets redacted
66
+ */
67
+ export declare function sanitizeLogError(error: unknown): unknown;
68
+ /**
69
+ * Safe JSON stringify with secret sanitization.
70
+ * Handles circular references and non-serializable types.
71
+ * Preserves debugging info (stack traces, file paths, emails).
72
+ *
73
+ * @param obj - Object to stringify
74
+ * @param space - Indentation (optional)
75
+ * @returns JSON string with secrets redacted
76
+ */
77
+ export declare function safeJsonStringify(obj: unknown, space?: string | number): string;
78
+ //# sourceMappingURL=log-sanitizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-sanitizer.d.ts","sourceRoot":"","sources":["../../src/common/log-sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAmFH;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,aAqBxB,CAAC;AA+BH;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAMxD;AAMD;;;GAGG;AACH,eAAO,MAAM,0BAA0B,aAAgB,CAAC;AAMxD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAc1D;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,SAAI,GAAG,CAAC,CAyCzD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAsCxD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,OAAO,EACZ,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GACtB,MAAM,CA6DR"}
@@ -0,0 +1,340 @@
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 only removes secrets that should
7
+ * NEVER appear in any log, anywhere.
8
+ *
9
+ * ARCHITECTURE:
10
+ * - Application layer (this file): Secrets-only sanitization (unconditional)
11
+ * - Pipeline layer (OTel Collector): Tier-based filtering for export
12
+ *
13
+ * Stack traces, emails, file paths are preserved for debugging. The pipeline
14
+ * layer handles redacting these for Tier 2 export in cloud-prem deployments.
15
+ *
16
+ * @see https://github.com/superblocksteam/engineering/blob/main/projects/o11y-refactor/epics/epic-c4-logging-strategy.md
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.TIER1_FORBIDDEN_LOG_FIELDS = exports.SECRET_FIELDS = void 0;
20
+ exports.isSecretField = isSecretField;
21
+ exports.sanitizeLogMessage = sanitizeLogMessage;
22
+ exports.redactStackTrace = redactStackTrace;
23
+ exports.sanitizeLogObject = sanitizeLogObject;
24
+ exports.sanitizeLogError = sanitizeLogError;
25
+ exports.safeJsonStringify = safeJsonStringify;
26
+ // ============================================================================
27
+ // Secret Patterns - These should NEVER appear in any log
28
+ // ============================================================================
29
+ /**
30
+ * Patterns that indicate tokens, keys, and secrets in log messages.
31
+ * These use capture groups to preserve prefixes while redacting values.
32
+ */
33
+ const SECRET_PATTERNS = [
34
+ // Tokens and keys with prefixes
35
+ {
36
+ pattern: /(\bbearer\s+)[a-zA-Z0-9\-._~+/]+=*/gi,
37
+ replacement: "$1[REDACTED]",
38
+ },
39
+ { pattern: /(\bbasic\s+)\S+/gi, replacement: "$1[REDACTED]" },
40
+ { pattern: /(\bjwt\s+)[a-zA-Z0-9\-._~+/]+=*/gi, replacement: "$1[REDACTED]" },
41
+ {
42
+ pattern: /(\btoken[:\s=]+)[a-zA-Z0-9\-._~+/]+=*/gi,
43
+ replacement: "$1[REDACTED]",
44
+ },
45
+ {
46
+ pattern: /(\bapi[_\s]?key[:\s=]+)[a-zA-Z0-9\-._~+/]+=*/gi,
47
+ replacement: "$1[REDACTED]",
48
+ },
49
+ {
50
+ pattern: /(\baccess[_\s]?token[:\s=]+)[a-zA-Z0-9\-._~+/]+=*/gi,
51
+ replacement: "$1[REDACTED]",
52
+ },
53
+ {
54
+ pattern: /(\brefresh[_\s]?token[:\s=]+)[a-zA-Z0-9\-._~+/]+=*/gi,
55
+ replacement: "$1[REDACTED]",
56
+ },
57
+ // JWT pattern (base64.base64.base64) - standalone tokens
58
+ {
59
+ pattern: /\b[A-Za-z0-9-_]{20,}\.[A-Za-z0-9-_]{20,}\.[A-Za-z0-9-_]{20,}\b/g,
60
+ replacement: "[JWT_REDACTED]",
61
+ },
62
+ // OpenAI API keys
63
+ { pattern: /\bsk-[A-Za-z0-9]{48}\b/g, replacement: "[OPENAI_KEY_REDACTED]" },
64
+ // Anthropic API keys
65
+ {
66
+ pattern: /\bsk-ant-[A-Za-z0-9-]{32,}\b/g,
67
+ replacement: "[ANTHROPIC_KEY_REDACTED]",
68
+ },
69
+ // AWS access key IDs
70
+ { pattern: /\bAKIA[A-Z0-9]{16}\b/g, replacement: "[AWS_KEY_REDACTED]" },
71
+ // GitHub tokens
72
+ {
73
+ pattern: /\b(ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36,}\b/g,
74
+ replacement: "[GITHUB_TOKEN_REDACTED]",
75
+ },
76
+ // Generic API key patterns
77
+ {
78
+ pattern: /\b(sk|pk)-[a-zA-Z0-9]{32,}\b/g,
79
+ replacement: "[API_KEY_REDACTED]",
80
+ },
81
+ // Connection strings with credentials
82
+ {
83
+ pattern: /\b(postgres|mysql|mongodb|redis):\/\/[^\s]+:[^\s]+@[^\s]+/gi,
84
+ replacement: "[CONNECTION_STRING_REDACTED]",
85
+ },
86
+ // PEM blocks
87
+ {
88
+ pattern: /-----BEGIN\s+(RSA\s+)?(PRIVATE|PUBLIC)\s+KEY-----[\s\S]*?-----END\s+(RSA\s+)?(PRIVATE|PUBLIC)\s+KEY-----/g,
89
+ replacement: "[PEM_KEY_REDACTED]",
90
+ },
91
+ ];
92
+ // ============================================================================
93
+ // Secret Fields - Field names that contain secrets
94
+ // ============================================================================
95
+ /**
96
+ * Fields that contain secrets and should be stripped from log objects.
97
+ * Only includes actual secret field names - NOT debugging info.
98
+ *
99
+ * Pipeline-layer concerns (AI content, stack traces, PII) are NOT included here.
100
+ * Those are handled by the OTel Collector for tier-based export filtering.
101
+ */
102
+ exports.SECRET_FIELDS = new Set([
103
+ // Auth/secrets
104
+ "password",
105
+ "passwd",
106
+ "secret",
107
+ "private_key",
108
+ "privatekey",
109
+ "credentials",
110
+ "token",
111
+ "accesstoken",
112
+ "access_token",
113
+ "refreshtoken",
114
+ "refresh_token",
115
+ "jwt",
116
+ "bearer",
117
+ "apikey",
118
+ "api_key",
119
+ "auth_token",
120
+ "authorization",
121
+ "cookie",
122
+ "x-api-key",
123
+ ]);
124
+ /**
125
+ * Patterns for compound field names that contain secrets.
126
+ * Uses word boundary matching to avoid false positives.
127
+ */
128
+ const SECRET_FIELD_PATTERNS = [
129
+ // Password patterns
130
+ /(?:^|[._-])password(?:[._-]|$)/i,
131
+ /(?:^|[._-])passwd(?:[._-]|$)/i,
132
+ // Secret patterns
133
+ /(?:^|[._-])secret(?:[._-]|$)/i,
134
+ /(?:^|[._-])private[._-]?key(?:[._-]|$)/i,
135
+ // Token patterns
136
+ /(?:^|[._-])token(?:[._-]|$)/i,
137
+ /(?:^|[._-])jwt(?:[._-]|$)/i,
138
+ /(?:^|[._-])bearer(?:[._-]|$)/i,
139
+ // Credential patterns
140
+ /(?:^|[._-])credentials?(?:[._-]|$)/i,
141
+ // API key patterns
142
+ /api[._-]?key/i,
143
+ /x[._-]api[._-]key/i,
144
+ // Auth token patterns
145
+ /auth[._-]token/i,
146
+ ];
147
+ /**
148
+ * Check if a field name contains secrets using word boundary matching.
149
+ */
150
+ function isSecretField(fieldName) {
151
+ const lowerKey = fieldName.toLowerCase();
152
+ if (exports.SECRET_FIELDS.has(lowerKey)) {
153
+ return true;
154
+ }
155
+ return SECRET_FIELD_PATTERNS.some((pattern) => pattern.test(lowerKey));
156
+ }
157
+ // ============================================================================
158
+ // Legacy exports for backward compatibility
159
+ // ============================================================================
160
+ /**
161
+ * @deprecated Use SECRET_FIELDS instead. This export is kept for backward
162
+ * compatibility but now only contains secret fields, not Tier 1 content fields.
163
+ */
164
+ exports.TIER1_FORBIDDEN_LOG_FIELDS = exports.SECRET_FIELDS;
165
+ // ============================================================================
166
+ // Public API
167
+ // ============================================================================
168
+ /**
169
+ * Sanitizes secrets from a log message string.
170
+ * Preserves debugging info (emails, file paths, etc.) for troubleshooting.
171
+ *
172
+ * @param message - The log message to sanitize
173
+ * @returns Message with secrets redacted
174
+ */
175
+ function sanitizeLogMessage(message) {
176
+ if (!message || typeof message !== "string") {
177
+ return message;
178
+ }
179
+ let sanitized = message;
180
+ // Only apply secret patterns - preserve debugging info
181
+ for (const { pattern, replacement } of SECRET_PATTERNS) {
182
+ pattern.lastIndex = 0; // Reset regex state for global patterns
183
+ sanitized = sanitized.replace(pattern, replacement);
184
+ }
185
+ return sanitized;
186
+ }
187
+ /**
188
+ * Sanitizes secrets within a stack trace while preserving the full trace.
189
+ * Stack traces are essential for debugging - only redact secrets within them.
190
+ *
191
+ * @param stack - The stack trace string
192
+ * @returns Stack trace with secrets redacted but structure preserved
193
+ */
194
+ function redactStackTrace(stack) {
195
+ if (!stack || typeof stack !== "string") {
196
+ return stack;
197
+ }
198
+ // Preserve full stack trace, only sanitize secrets within
199
+ return sanitizeLogMessage(stack);
200
+ }
201
+ /**
202
+ * Recursively sanitizes secrets from an object.
203
+ * Strips secret fields entirely, sanitizes secrets in string values.
204
+ * Preserves debugging info (stack traces, file paths, emails).
205
+ *
206
+ * @param obj - The object to sanitize
207
+ * @param depth - Current recursion depth (default: 0)
208
+ * @returns Object with secrets removed
209
+ */
210
+ function sanitizeLogObject(obj, depth = 0) {
211
+ // Prevent infinite recursion
212
+ if (depth > 10) {
213
+ return "[MAX_DEPTH_REACHED]";
214
+ }
215
+ if (obj === null || obj === undefined) {
216
+ return obj;
217
+ }
218
+ if (typeof obj === "string") {
219
+ return sanitizeLogMessage(obj);
220
+ }
221
+ if (typeof obj === "number" || typeof obj === "boolean") {
222
+ return obj;
223
+ }
224
+ if (typeof obj !== "object") {
225
+ return obj;
226
+ }
227
+ if (Array.isArray(obj)) {
228
+ return obj.map((item) => sanitizeLogObject(item, depth + 1));
229
+ }
230
+ const sanitized = {};
231
+ for (const [key, value] of Object.entries(obj)) {
232
+ // Skip secret fields entirely
233
+ if (isSecretField(key)) {
234
+ continue;
235
+ }
236
+ // Recursively sanitize all other fields
237
+ sanitized[key] = sanitizeLogObject(value, depth + 1);
238
+ }
239
+ return sanitized;
240
+ }
241
+ /**
242
+ * Sanitizes secrets from an error object.
243
+ * Preserves full stack traces for debugging.
244
+ *
245
+ * @param error - The error to sanitize
246
+ * @returns Error object with secrets redacted
247
+ */
248
+ function sanitizeLogError(error) {
249
+ if (!error) {
250
+ return error;
251
+ }
252
+ // Check if already sanitized
253
+ const errorWithSanitized = error;
254
+ if (errorWithSanitized._sanitized) {
255
+ return error;
256
+ }
257
+ if (error instanceof Error) {
258
+ const sanitized = {
259
+ name: error.name,
260
+ message: sanitizeLogMessage(error.message),
261
+ // Preserve full stack trace, only sanitize secrets within
262
+ stack: sanitizeLogMessage(error.stack || ""),
263
+ _sanitized: true,
264
+ };
265
+ // Copy and sanitize enumerable properties
266
+ for (const [key, value] of Object.entries(error)) {
267
+ if (key !== "name" && key !== "message" && key !== "stack") {
268
+ // Skip secret fields
269
+ if (isSecretField(key)) {
270
+ continue;
271
+ }
272
+ sanitized[key] = sanitizeLogObject(value);
273
+ }
274
+ }
275
+ return sanitized;
276
+ }
277
+ // For non-Error objects, sanitize the entire object
278
+ const sanitized = sanitizeLogObject(error);
279
+ sanitized._sanitized = true;
280
+ return sanitized;
281
+ }
282
+ /**
283
+ * Safe JSON stringify with secret sanitization.
284
+ * Handles circular references and non-serializable types.
285
+ * Preserves debugging info (stack traces, file paths, emails).
286
+ *
287
+ * @param obj - Object to stringify
288
+ * @param space - Indentation (optional)
289
+ * @returns JSON string with secrets redacted
290
+ */
291
+ function safeJsonStringify(obj, space) {
292
+ if (obj === null || obj === undefined) {
293
+ return "{}";
294
+ }
295
+ if (typeof obj === "string") {
296
+ return sanitizeLogMessage(obj);
297
+ }
298
+ const seen = new WeakSet();
299
+ return JSON.stringify(obj, (key, value) => {
300
+ // Skip secret fields
301
+ if (key && isSecretField(key)) {
302
+ return undefined;
303
+ }
304
+ // Handle null/undefined
305
+ if (value === null || value === undefined) {
306
+ return value;
307
+ }
308
+ // Handle circular references
309
+ if (typeof value === "object") {
310
+ if (seen.has(value)) {
311
+ return "[Circular Reference]";
312
+ }
313
+ seen.add(value);
314
+ // Handle Error objects - preserve full stack trace
315
+ if (value instanceof Error) {
316
+ return {
317
+ name: value.name,
318
+ message: sanitizeLogMessage(value.message),
319
+ stack: sanitizeLogMessage(value.stack || ""),
320
+ };
321
+ }
322
+ }
323
+ // Sanitize string values
324
+ if (typeof value === "string") {
325
+ return sanitizeLogMessage(value);
326
+ }
327
+ // Handle non-serializable types
328
+ if (typeof value === "function") {
329
+ return `[Function: ${value.name || "anonymous"}]`;
330
+ }
331
+ if (typeof value === "symbol") {
332
+ return `[Symbol: ${value.toString()}]`;
333
+ }
334
+ if (typeof value === "bigint") {
335
+ return `[BigInt: ${value.toString()}]`;
336
+ }
337
+ return value;
338
+ }, space);
339
+ }
340
+ //# sourceMappingURL=log-sanitizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-sanitizer.js","sourceRoot":"","sources":["../../src/common/log-sanitizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Policy Evaluator
3
+ *
4
+ * Evaluates telemetry routing decisions based on policy configuration.
5
+ */
6
+ import { TelemetryPolicy, TelemetryTier } from "../types/policy.js";
7
+ /**
8
+ * Result of a policy evaluation.
9
+ */
10
+ export interface PolicyDecision {
11
+ /** Should this data be retained locally? */
12
+ retainLocal: boolean;
13
+ /** Should this data be exported? */
14
+ export: boolean;
15
+ /** Sampling decision */
16
+ sampled: boolean;
17
+ /** If blocked, the reason */
18
+ blockReason?: string;
19
+ }
20
+ /**
21
+ * Evaluator for telemetry policy decisions.
22
+ *
23
+ * IMPORTANT: This evaluator determines ROUTING eligibility, not trace sampling.
24
+ *
25
+ * For TRACES: Sampling must be handled by the OTel SDK Sampler (parent-based,
26
+ * trace-ID ratio) to ensure trace consistency.
27
+ *
28
+ * For METRICS/LOGS: sampleRate applies with deterministic trace-ID-based logic.
29
+ */
30
+ export declare class TelemetryPolicyEvaluator {
31
+ private readonly policy;
32
+ constructor(policy: TelemetryPolicy);
33
+ /**
34
+ * Get the current policy.
35
+ */
36
+ getPolicy(): TelemetryPolicy;
37
+ /**
38
+ * Evaluate whether a telemetry signal should be processed/exported.
39
+ *
40
+ * @param tier - The tier this signal belongs to
41
+ * @param orgId - Optional org ID for org-specific overrides
42
+ * @param traceId - Optional trace ID for deterministic sampling
43
+ * @returns PolicyDecision
44
+ */
45
+ evaluate(tier: TelemetryTier, orgId?: string, traceId?: string): PolicyDecision;
46
+ /**
47
+ * Check if export infrastructure should be created for a tier.
48
+ *
49
+ * This checks ONLY whether export is enabled in policy configuration.
50
+ * It does NOT apply sampling - use this for SDK initialization decisions.
51
+ *
52
+ * @param tier - The tier to check
53
+ * @param orgId - Optional org ID for org-specific overrides
54
+ * @returns true if export infrastructure should be created
55
+ */
56
+ isExportEnabled(tier: TelemetryTier, orgId?: string): boolean;
57
+ /**
58
+ * Check if an export attempt is allowed (includes sampling).
59
+ *
60
+ * This applies sampling logic and should be used for per-span/per-signal
61
+ * decisions at runtime, NOT for infrastructure initialization.
62
+ *
63
+ * @param tier - The tier to check
64
+ * @param orgId - Optional org ID for org-specific overrides
65
+ * @param traceId - Optional trace ID for deterministic sampling
66
+ * @returns true if export is allowed for this specific signal
67
+ */
68
+ canExport(tier: TelemetryTier, orgId?: string, traceId?: string): boolean;
69
+ /**
70
+ * Assert export is allowed, throwing or logging based on enforcement mode.
71
+ *
72
+ * @param tier - The tier to check
73
+ * @param orgId - Optional org ID for org-specific overrides
74
+ * @throws Error if in ENFORCE mode and export is blocked
75
+ */
76
+ assertCanExport(tier: TelemetryTier, orgId?: string): void;
77
+ /**
78
+ * Check if Tier 3 content export is enabled.
79
+ *
80
+ * @returns true if Tier 3 prompts/responses can be exported
81
+ */
82
+ canExportTier3Content(): boolean;
83
+ /**
84
+ * Get the effective policy for an org (applying overrides if present).
85
+ *
86
+ * Performs deep merge for nested objects (tiers, tier3Content) to ensure
87
+ * partial overrides don't clobber unspecified configurations.
88
+ *
89
+ * @param orgId - Optional org ID
90
+ * @returns Effective policy
91
+ */
92
+ private getEffectivePolicy;
93
+ /**
94
+ * Deterministic sampling based on trace ID (W3C TraceContext recommendation).
95
+ * Uses last 8 hex chars for uniform distribution in [0, 1).
96
+ *
97
+ * @param traceId - The trace ID (must be at least 8 hex characters)
98
+ * @param sampleRate - Sample rate (0.0 - 1.0)
99
+ * @returns true if sampled
100
+ */
101
+ private traceIdBasedSample;
102
+ }
103
+ //# sourceMappingURL=policy-evaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-evaluator.d.ts","sourceRoot":"","sources":["../../src/common/policy-evaluator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,eAAe,EACf,aAAa,EAEd,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,WAAW,EAAE,OAAO,CAAC;IACrB,oCAAoC;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,wBAAwB;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,6BAA6B;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,qBAAa,wBAAwB;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,eAAe;IAEpD;;OAEG;IACH,SAAS,IAAI,eAAe;IAI5B;;;;;;;OAOG;IACH,QAAQ,CACN,IAAI,EAAE,aAAa,EACnB,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,cAAc;IAoCjB;;;;;;;;;OASG;IACH,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO;IAM7D;;;;;;;;;;OAUG;IACH,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAKzE;;;;;;OAMG;IACH,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAW1D;;;;OAIG;IACH,qBAAqB,IAAI,OAAO;IAOhC;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IA2C1B;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB;CAwB3B"}