observability-toolkit 2.0.0 → 2.1.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 (1285) hide show
  1. package/README.md +166 -398
  2. package/dist/__tests__/find-constant-dedup.test.d.ts +11 -0
  3. package/dist/__tests__/find-constant-dedup.test.d.ts.map +1 -0
  4. package/dist/__tests__/find-constant-dedup.test.js +132 -0
  5. package/dist/__tests__/find-constant-dedup.test.js.map +1 -0
  6. package/dist/backends/backend-schemas.d.ts +309 -0
  7. package/dist/backends/backend-schemas.d.ts.map +1 -0
  8. package/dist/backends/backend-schemas.js +215 -0
  9. package/dist/backends/backend-schemas.js.map +1 -0
  10. package/dist/backends/cloud.d.ts +46 -0
  11. package/dist/backends/cloud.d.ts.map +1 -0
  12. package/dist/backends/cloud.js +520 -0
  13. package/dist/backends/cloud.js.map +1 -0
  14. package/dist/backends/cloud.test.d.ts +2 -0
  15. package/dist/backends/cloud.test.d.ts.map +1 -0
  16. package/dist/backends/cloud.test.js +436 -0
  17. package/dist/backends/cloud.test.js.map +1 -0
  18. package/dist/backends/index.d.ts +659 -386
  19. package/dist/backends/index.d.ts.map +1 -1
  20. package/dist/backends/index.js +318 -41
  21. package/dist/backends/index.js.map +1 -1
  22. package/dist/backends/index.test.js +578 -57
  23. package/dist/backends/index.test.js.map +1 -1
  24. package/dist/backends/local-jsonl-boolean-search.test.js +8 -7
  25. package/dist/backends/local-jsonl-boolean-search.test.js.map +1 -1
  26. package/dist/backends/local-jsonl-cache.test.js +33 -31
  27. package/dist/backends/local-jsonl-cache.test.js.map +1 -1
  28. package/dist/backends/local-jsonl-circuit-breaker.test.js +9 -7
  29. package/dist/backends/local-jsonl-circuit-breaker.test.js.map +1 -1
  30. package/dist/backends/local-jsonl-export.test.js +73 -58
  31. package/dist/backends/local-jsonl-export.test.js.map +1 -1
  32. package/dist/backends/local-jsonl-index.test.js +52 -50
  33. package/dist/backends/local-jsonl-index.test.js.map +1 -1
  34. package/dist/backends/local-jsonl-logs.test.js +47 -31
  35. package/dist/backends/local-jsonl-logs.test.js.map +1 -1
  36. package/dist/backends/local-jsonl-metrics.test.js +85 -82
  37. package/dist/backends/local-jsonl-metrics.test.js.map +1 -1
  38. package/dist/backends/local-jsonl-otlp-unwrap.test.d.ts +2 -0
  39. package/dist/backends/local-jsonl-otlp-unwrap.test.d.ts.map +1 -0
  40. package/dist/backends/local-jsonl-otlp-unwrap.test.js +602 -0
  41. package/dist/backends/local-jsonl-otlp-unwrap.test.js.map +1 -0
  42. package/dist/backends/local-jsonl-traces.test.js +161 -147
  43. package/dist/backends/local-jsonl-traces.test.js.map +1 -1
  44. package/dist/backends/local-jsonl.d.ts +37 -8
  45. package/dist/backends/local-jsonl.d.ts.map +1 -1
  46. package/dist/backends/local-jsonl.js +1088 -241
  47. package/dist/backends/local-jsonl.js.map +1 -1
  48. package/dist/backends/shared.d.ts +9 -0
  49. package/dist/backends/shared.d.ts.map +1 -0
  50. package/dist/backends/shared.js +9 -0
  51. package/dist/backends/shared.js.map +1 -0
  52. package/dist/generated/opentelemetry/proto/collector/logs/v1/logs_service_pb.d.ts +40 -0
  53. package/dist/generated/opentelemetry/proto/collector/logs/v1/logs_service_pb.d.ts.map +1 -0
  54. package/dist/generated/opentelemetry/proto/collector/logs/v1/logs_service_pb.js +27 -0
  55. package/dist/generated/opentelemetry/proto/collector/logs/v1/logs_service_pb.js.map +1 -0
  56. package/dist/generated/opentelemetry/proto/collector/metrics/v1/metrics_service_pb.d.ts +106 -0
  57. package/dist/generated/opentelemetry/proto/collector/metrics/v1/metrics_service_pb.d.ts.map +1 -0
  58. package/dist/generated/opentelemetry/proto/collector/metrics/v1/metrics_service_pb.js +43 -0
  59. package/dist/generated/opentelemetry/proto/collector/metrics/v1/metrics_service_pb.js.map +1 -0
  60. package/dist/generated/opentelemetry/proto/collector/profiles/v1development/profiles_service_pb.d.ts +111 -0
  61. package/dist/generated/opentelemetry/proto/collector/profiles/v1development/profiles_service_pb.d.ts.map +1 -0
  62. package/dist/generated/opentelemetry/proto/collector/profiles/v1development/profiles_service_pb.js +42 -0
  63. package/dist/generated/opentelemetry/proto/collector/profiles/v1development/profiles_service_pb.js.map +1 -0
  64. package/dist/generated/opentelemetry/proto/collector/trace/v1/trace_service_pb.d.ts +106 -0
  65. package/dist/generated/opentelemetry/proto/collector/trace/v1/trace_service_pb.d.ts.map +1 -0
  66. package/dist/generated/opentelemetry/proto/collector/trace/v1/trace_service_pb.js +43 -0
  67. package/dist/generated/opentelemetry/proto/collector/trace/v1/trace_service_pb.js.map +1 -0
  68. package/dist/generated/opentelemetry/proto/common/v1/common_pb.d.ts +243 -0
  69. package/dist/generated/opentelemetry/proto/common/v1/common_pb.d.ts.map +1 -0
  70. package/dist/generated/opentelemetry/proto/common/v1/common_pb.js +49 -0
  71. package/dist/generated/opentelemetry/proto/common/v1/common_pb.js.map +1 -0
  72. package/dist/generated/opentelemetry/proto/logs/v1/logs_pb.d.ts +90 -0
  73. package/dist/generated/opentelemetry/proto/logs/v1/logs_pb.d.ts.map +1 -0
  74. package/dist/generated/opentelemetry/proto/logs/v1/logs_pb.js +66 -0
  75. package/dist/generated/opentelemetry/proto/logs/v1/logs_pb.js.map +1 -0
  76. package/dist/generated/opentelemetry/proto/metrics/v1/metrics_pb.d.ts +1134 -0
  77. package/dist/generated/opentelemetry/proto/metrics/v1/metrics_pb.d.ts.map +1 -0
  78. package/dist/generated/opentelemetry/proto/metrics/v1/metrics_pb.js +223 -0
  79. package/dist/generated/opentelemetry/proto/metrics/v1/metrics_pb.js.map +1 -0
  80. package/dist/generated/opentelemetry/proto/profiles/v1development/profiles_pb.d.ts +678 -0
  81. package/dist/generated/opentelemetry/proto/profiles/v1development/profiles_pb.d.ts.map +1 -0
  82. package/dist/generated/opentelemetry/proto/profiles/v1development/profiles_pb.js +107 -0
  83. package/dist/generated/opentelemetry/proto/profiles/v1development/profiles_pb.js.map +1 -0
  84. package/dist/generated/opentelemetry/proto/resource/v1/resource_pb.d.ts +46 -0
  85. package/dist/generated/opentelemetry/proto/resource/v1/resource_pb.d.ts.map +1 -0
  86. package/dist/generated/opentelemetry/proto/resource/v1/resource_pb.js +25 -0
  87. package/dist/generated/opentelemetry/proto/resource/v1/resource_pb.js.map +1 -0
  88. package/dist/generated/opentelemetry/proto/trace/v1/trace_pb.d.ts +569 -0
  89. package/dist/generated/opentelemetry/proto/trace/v1/trace_pb.d.ts.map +1 -0
  90. package/dist/generated/opentelemetry/proto/trace/v1/trace_pb.js +195 -0
  91. package/dist/generated/opentelemetry/proto/trace/v1/trace_pb.js.map +1 -0
  92. package/dist/lib/agent-judge/agent-as-judge.d.ts +157 -0
  93. package/dist/lib/agent-judge/agent-as-judge.d.ts.map +1 -0
  94. package/dist/lib/agent-judge/agent-as-judge.js +137 -0
  95. package/dist/lib/agent-judge/agent-as-judge.js.map +1 -0
  96. package/dist/lib/agent-judge/agent-as-judge.test.d.ts.map +1 -0
  97. package/dist/lib/agent-judge/agent-as-judge.test.js +839 -0
  98. package/dist/lib/agent-judge/agent-as-judge.test.js.map +1 -0
  99. package/dist/lib/agent-judge/agent-eval-metrics.d.ts +293 -0
  100. package/dist/lib/agent-judge/agent-eval-metrics.d.ts.map +1 -0
  101. package/dist/lib/agent-judge/agent-eval-metrics.js +715 -0
  102. package/dist/lib/agent-judge/agent-eval-metrics.js.map +1 -0
  103. package/dist/lib/agent-judge/agent-eval-metrics.test.d.ts +5 -0
  104. package/dist/lib/agent-judge/agent-eval-metrics.test.d.ts.map +1 -0
  105. package/dist/lib/agent-judge/agent-eval-metrics.test.js +676 -0
  106. package/dist/lib/agent-judge/agent-eval-metrics.test.js.map +1 -0
  107. package/dist/lib/agent-judge/agent-judge-classes.d.ts +95 -0
  108. package/dist/lib/agent-judge/agent-judge-classes.d.ts.map +1 -0
  109. package/dist/lib/agent-judge/agent-judge-classes.js +222 -0
  110. package/dist/lib/agent-judge/agent-judge-classes.js.map +1 -0
  111. package/dist/lib/agent-judge/agent-judge-classes.test.d.ts +6 -0
  112. package/dist/lib/agent-judge/agent-judge-classes.test.d.ts.map +1 -0
  113. package/dist/lib/agent-judge/agent-judge-classes.test.js +271 -0
  114. package/dist/lib/agent-judge/agent-judge-classes.test.js.map +1 -0
  115. package/dist/lib/agent-judge/agent-judge-consensus.d.ts +58 -0
  116. package/dist/lib/agent-judge/agent-judge-consensus.d.ts.map +1 -0
  117. package/dist/lib/agent-judge/agent-judge-consensus.js +149 -0
  118. package/dist/lib/agent-judge/agent-judge-consensus.js.map +1 -0
  119. package/dist/lib/agent-judge/agent-judge-consensus.test.d.ts +2 -0
  120. package/dist/lib/agent-judge/agent-judge-consensus.test.d.ts.map +1 -0
  121. package/dist/lib/agent-judge/agent-judge-consensus.test.js +170 -0
  122. package/dist/lib/agent-judge/agent-judge-consensus.test.js.map +1 -0
  123. package/dist/lib/agent-judge/agent-judge-verification.d.ts +89 -0
  124. package/dist/lib/agent-judge/agent-judge-verification.d.ts.map +1 -0
  125. package/dist/lib/agent-judge/agent-judge-verification.js +235 -0
  126. package/dist/lib/agent-judge/agent-judge-verification.js.map +1 -0
  127. package/dist/lib/agent-judge/agent-judge-verification.test.d.ts +5 -0
  128. package/dist/lib/agent-judge/agent-judge-verification.test.d.ts.map +1 -0
  129. package/dist/lib/agent-judge/agent-judge-verification.test.js +399 -0
  130. package/dist/lib/agent-judge/agent-judge-verification.test.js.map +1 -0
  131. package/dist/lib/audit/agent-auditor-scoring.d.ts +167 -0
  132. package/dist/lib/audit/agent-auditor-scoring.d.ts.map +1 -0
  133. package/dist/lib/audit/agent-auditor-scoring.js +338 -0
  134. package/dist/lib/audit/agent-auditor-scoring.js.map +1 -0
  135. package/dist/lib/audit/agent-auditor-scoring.test.d.ts +2 -0
  136. package/dist/lib/audit/agent-auditor-scoring.test.d.ts.map +1 -0
  137. package/dist/lib/audit/agent-auditor-scoring.test.js +576 -0
  138. package/dist/lib/audit/agent-auditor-scoring.test.js.map +1 -0
  139. package/dist/lib/audit/audit-record.d.ts +139 -0
  140. package/dist/lib/audit/audit-record.d.ts.map +1 -0
  141. package/dist/lib/audit/audit-record.js +288 -0
  142. package/dist/lib/audit/audit-record.js.map +1 -0
  143. package/dist/lib/audit/audit-record.test.d.ts +5 -0
  144. package/dist/lib/audit/audit-record.test.d.ts.map +1 -0
  145. package/dist/lib/audit/audit-record.test.js +258 -0
  146. package/dist/lib/audit/audit-record.test.js.map +1 -0
  147. package/dist/lib/audit/audit-scoring-constants.d.ts +57 -0
  148. package/dist/lib/audit/audit-scoring-constants.d.ts.map +1 -0
  149. package/dist/lib/audit/audit-scoring-constants.js +59 -0
  150. package/dist/lib/audit/audit-scoring-constants.js.map +1 -0
  151. package/dist/lib/audit/compliance-report.d.ts +125 -0
  152. package/dist/lib/audit/compliance-report.d.ts.map +1 -0
  153. package/dist/lib/audit/compliance-report.js +205 -0
  154. package/dist/lib/audit/compliance-report.js.map +1 -0
  155. package/dist/lib/audit/compliance-report.test.d.ts +5 -0
  156. package/dist/lib/audit/compliance-report.test.d.ts.map +1 -0
  157. package/dist/lib/audit/compliance-report.test.js +290 -0
  158. package/dist/lib/audit/compliance-report.test.js.map +1 -0
  159. package/dist/lib/audit/retention-guard.d.ts +41 -0
  160. package/dist/lib/audit/retention-guard.d.ts.map +1 -0
  161. package/dist/lib/audit/retention-guard.js +103 -0
  162. package/dist/lib/audit/retention-guard.js.map +1 -0
  163. package/dist/lib/audit/retention-guard.test.d.ts +5 -0
  164. package/dist/lib/audit/retention-guard.test.d.ts.map +1 -0
  165. package/dist/lib/audit/retention-guard.test.js +109 -0
  166. package/dist/lib/audit/retention-guard.test.js.map +1 -0
  167. package/dist/lib/audit/skill-auditor-scoring.d.ts +69 -0
  168. package/dist/lib/audit/skill-auditor-scoring.d.ts.map +1 -0
  169. package/dist/lib/audit/skill-auditor-scoring.js +149 -0
  170. package/dist/lib/audit/skill-auditor-scoring.js.map +1 -0
  171. package/dist/lib/audit/skill-auditor-scoring.test.d.ts +2 -0
  172. package/dist/lib/audit/skill-auditor-scoring.test.d.ts.map +1 -0
  173. package/dist/lib/audit/skill-auditor-scoring.test.js +369 -0
  174. package/dist/lib/audit/skill-auditor-scoring.test.js.map +1 -0
  175. package/dist/lib/audit/verification-events.d.ts +119 -0
  176. package/dist/lib/audit/verification-events.d.ts.map +1 -0
  177. package/dist/lib/audit/verification-events.js +175 -0
  178. package/dist/lib/audit/verification-events.js.map +1 -0
  179. package/dist/lib/audit/verification-events.test.d.ts.map +1 -0
  180. package/dist/lib/audit/verification-events.test.js +197 -0
  181. package/dist/lib/audit/verification-events.test.js.map +1 -0
  182. package/dist/lib/core/constants-models.d.ts +90 -0
  183. package/dist/lib/core/constants-models.d.ts.map +1 -0
  184. package/dist/lib/core/constants-models.js +208 -0
  185. package/dist/lib/core/constants-models.js.map +1 -0
  186. package/dist/lib/core/constants-otel.d.ts +68 -0
  187. package/dist/lib/core/constants-otel.d.ts.map +1 -0
  188. package/dist/lib/core/constants-otel.js +128 -0
  189. package/dist/lib/core/constants-otel.js.map +1 -0
  190. package/dist/lib/core/constants-symlink.test.d.ts.map +1 -0
  191. package/dist/lib/core/constants-symlink.test.js +358 -0
  192. package/dist/lib/core/constants-symlink.test.js.map +1 -0
  193. package/dist/lib/core/constants-telemetry.d.ts +21 -0
  194. package/dist/lib/core/constants-telemetry.d.ts.map +1 -0
  195. package/dist/lib/core/constants-telemetry.js +162 -0
  196. package/dist/lib/core/constants-telemetry.js.map +1 -0
  197. package/dist/lib/core/constants.d.ts +152 -0
  198. package/dist/lib/core/constants.d.ts.map +1 -0
  199. package/dist/lib/core/constants.js +223 -0
  200. package/dist/lib/core/constants.js.map +1 -0
  201. package/dist/lib/core/constants.test.d.ts.map +1 -0
  202. package/dist/lib/core/constants.test.js +833 -0
  203. package/dist/lib/core/constants.test.js.map +1 -0
  204. package/dist/lib/core/doc-sync.test.d.ts +9 -0
  205. package/dist/lib/core/doc-sync.test.d.ts.map +1 -0
  206. package/dist/lib/core/doc-sync.test.js +159 -0
  207. package/dist/lib/core/doc-sync.test.js.map +1 -0
  208. package/dist/lib/core/edge-cases.test.d.ts.map +1 -0
  209. package/dist/lib/core/edge-cases.test.js +637 -0
  210. package/dist/lib/core/edge-cases.test.js.map +1 -0
  211. package/dist/lib/core/file-utils.d.ts +360 -0
  212. package/dist/lib/core/file-utils.d.ts.map +1 -0
  213. package/dist/lib/core/file-utils.js +890 -0
  214. package/dist/lib/core/file-utils.js.map +1 -0
  215. package/dist/lib/core/file-utils.test-constants.d.ts +38 -0
  216. package/dist/lib/core/file-utils.test-constants.d.ts.map +1 -0
  217. package/dist/lib/core/file-utils.test-constants.js +40 -0
  218. package/dist/lib/core/file-utils.test-constants.js.map +1 -0
  219. package/dist/lib/core/file-utils.test.d.ts.map +1 -0
  220. package/dist/lib/core/file-utils.test.js +1329 -0
  221. package/dist/lib/core/file-utils.test.js.map +1 -0
  222. package/dist/lib/core/input-validator.d.ts +125 -0
  223. package/dist/lib/core/input-validator.d.ts.map +1 -0
  224. package/dist/lib/core/input-validator.fuzz.test.d.ts.map +1 -0
  225. package/dist/lib/core/input-validator.fuzz.test.js +302 -0
  226. package/dist/lib/core/input-validator.fuzz.test.js.map +1 -0
  227. package/dist/lib/core/input-validator.js +348 -0
  228. package/dist/lib/core/input-validator.js.map +1 -0
  229. package/dist/lib/core/input-validator.test.d.ts.map +1 -0
  230. package/dist/lib/core/input-validator.test.js +465 -0
  231. package/dist/lib/core/input-validator.test.js.map +1 -0
  232. package/dist/lib/core/logger.d.ts +32 -0
  233. package/dist/lib/core/logger.d.ts.map +1 -0
  234. package/dist/lib/core/logger.js +104 -0
  235. package/dist/lib/core/logger.js.map +1 -0
  236. package/dist/lib/core/logger.test.d.ts.map +1 -0
  237. package/dist/lib/core/logger.test.js.map +1 -0
  238. package/dist/lib/core/schema-types.d.ts +37 -0
  239. package/dist/lib/core/schema-types.d.ts.map +1 -0
  240. package/dist/lib/core/schema-types.js +29 -0
  241. package/dist/lib/core/schema-types.js.map +1 -0
  242. package/dist/lib/core/server-utils.d.ts +98 -0
  243. package/dist/lib/core/server-utils.d.ts.map +1 -0
  244. package/dist/lib/core/server-utils.js +193 -0
  245. package/dist/lib/core/server-utils.js.map +1 -0
  246. package/dist/lib/core/shared-schemas.d.ts +301 -0
  247. package/dist/lib/core/shared-schemas.d.ts.map +1 -0
  248. package/dist/lib/core/shared-schemas.js +222 -0
  249. package/dist/lib/core/shared-schemas.js.map +1 -0
  250. package/dist/lib/core/shared-schemas.test.d.ts.map +1 -0
  251. package/dist/lib/core/shared-schemas.test.js +136 -0
  252. package/dist/lib/core/shared-schemas.test.js.map +1 -0
  253. package/dist/lib/core/units.d.ts +67 -0
  254. package/dist/lib/core/units.d.ts.map +1 -0
  255. package/dist/lib/core/units.js +88 -0
  256. package/dist/lib/core/units.js.map +1 -0
  257. package/dist/lib/cost/cost-estimation.d.ts +264 -0
  258. package/dist/lib/cost/cost-estimation.d.ts.map +1 -0
  259. package/dist/lib/cost/cost-estimation.js +541 -0
  260. package/dist/lib/cost/cost-estimation.js.map +1 -0
  261. package/dist/lib/cost/cost-estimation.test.d.ts +5 -0
  262. package/dist/lib/cost/cost-estimation.test.d.ts.map +1 -0
  263. package/dist/lib/cost/cost-estimation.test.js +701 -0
  264. package/dist/lib/cost/cost-estimation.test.js.map +1 -0
  265. package/dist/lib/cost/pricing-cache.d.ts +59 -0
  266. package/dist/lib/cost/pricing-cache.d.ts.map +1 -0
  267. package/dist/lib/cost/pricing-cache.js +120 -0
  268. package/dist/lib/cost/pricing-cache.js.map +1 -0
  269. package/dist/lib/cost/pricing-cache.test.d.ts +5 -0
  270. package/dist/lib/cost/pricing-cache.test.d.ts.map +1 -0
  271. package/dist/lib/cost/pricing-cache.test.js +176 -0
  272. package/dist/lib/cost/pricing-cache.test.js.map +1 -0
  273. package/dist/lib/dashboard-file-utils.d.ts +35 -0
  274. package/dist/lib/dashboard-file-utils.d.ts.map +1 -0
  275. package/dist/lib/dashboard-file-utils.js +94 -0
  276. package/dist/lib/dashboard-file-utils.js.map +1 -0
  277. package/dist/lib/errors/error-sanitizer.d.ts +62 -0
  278. package/dist/lib/errors/error-sanitizer.d.ts.map +1 -0
  279. package/dist/lib/errors/error-sanitizer.js +235 -0
  280. package/dist/lib/errors/error-sanitizer.js.map +1 -0
  281. package/dist/lib/errors/error-sanitizer.test.d.ts.map +1 -0
  282. package/dist/lib/errors/error-sanitizer.test.js +534 -0
  283. package/dist/lib/errors/error-sanitizer.test.js.map +1 -0
  284. package/dist/lib/errors/error-types.d.ts +59 -0
  285. package/dist/lib/errors/error-types.d.ts.map +1 -0
  286. package/dist/lib/errors/error-types.js +187 -0
  287. package/dist/lib/errors/error-types.js.map +1 -0
  288. package/dist/lib/errors/error-types.test.d.ts.map +1 -0
  289. package/dist/lib/errors/error-types.test.js +246 -0
  290. package/dist/lib/errors/error-types.test.js.map +1 -0
  291. package/dist/lib/errors/query-sanitizer.d.ts.map +1 -0
  292. package/dist/lib/errors/query-sanitizer.js +269 -0
  293. package/dist/lib/errors/query-sanitizer.js.map +1 -0
  294. package/dist/lib/errors/query-sanitizer.test.d.ts.map +1 -0
  295. package/dist/lib/errors/query-sanitizer.test.js +403 -0
  296. package/dist/lib/errors/query-sanitizer.test.js.map +1 -0
  297. package/dist/lib/exports/confident-export.d.ts +105 -0
  298. package/dist/lib/exports/confident-export.d.ts.map +1 -0
  299. package/dist/lib/exports/confident-export.js +385 -0
  300. package/dist/lib/exports/confident-export.js.map +1 -0
  301. package/dist/lib/exports/confident-export.test.d.ts.map +1 -0
  302. package/dist/lib/exports/confident-export.test.js +848 -0
  303. package/dist/lib/exports/confident-export.test.js.map +1 -0
  304. package/dist/lib/exports/datadog-export.d.ts +200 -0
  305. package/dist/lib/exports/datadog-export.d.ts.map +1 -0
  306. package/dist/lib/exports/datadog-export.js +488 -0
  307. package/dist/lib/exports/datadog-export.js.map +1 -0
  308. package/dist/lib/exports/datadog-export.test.d.ts +2 -0
  309. package/dist/lib/exports/datadog-export.test.d.ts.map +1 -0
  310. package/dist/lib/exports/datadog-export.test.js +890 -0
  311. package/dist/lib/exports/datadog-export.test.js.map +1 -0
  312. package/dist/lib/exports/export-config-schemas.d.ts +67 -0
  313. package/dist/lib/exports/export-config-schemas.d.ts.map +1 -0
  314. package/dist/lib/exports/export-config-schemas.js +120 -0
  315. package/dist/lib/exports/export-config-schemas.js.map +1 -0
  316. package/dist/lib/exports/export-config-schemas.test.d.ts +8 -0
  317. package/dist/lib/exports/export-config-schemas.test.d.ts.map +1 -0
  318. package/dist/lib/exports/export-config-schemas.test.js +503 -0
  319. package/dist/lib/exports/export-config-schemas.test.js.map +1 -0
  320. package/dist/lib/exports/export-utils.d.ts +127 -0
  321. package/dist/lib/exports/export-utils.d.ts.map +1 -0
  322. package/dist/lib/exports/export-utils.js +303 -0
  323. package/dist/lib/exports/export-utils.js.map +1 -0
  324. package/dist/lib/exports/export-utils.test.d.ts.map +1 -0
  325. package/dist/lib/exports/export-utils.test.js +344 -0
  326. package/dist/lib/exports/export-utils.test.js.map +1 -0
  327. package/dist/lib/exports/langfuse-export.d.ts +129 -0
  328. package/dist/lib/exports/langfuse-export.d.ts.map +1 -0
  329. package/dist/lib/exports/langfuse-export.js +370 -0
  330. package/dist/lib/exports/langfuse-export.js.map +1 -0
  331. package/dist/lib/exports/langfuse-export.test.d.ts.map +1 -0
  332. package/dist/lib/exports/langfuse-export.test.js +1020 -0
  333. package/dist/lib/exports/langfuse-export.test.js.map +1 -0
  334. package/dist/lib/exports/otlp-export.d.ts +179 -0
  335. package/dist/lib/exports/otlp-export.d.ts.map +1 -0
  336. package/dist/lib/exports/otlp-export.js +397 -0
  337. package/dist/lib/exports/otlp-export.js.map +1 -0
  338. package/dist/lib/exports/otlp-format-converter.d.ts +70 -0
  339. package/dist/lib/exports/otlp-format-converter.d.ts.map +1 -0
  340. package/dist/lib/exports/otlp-format-converter.js +401 -0
  341. package/dist/lib/exports/otlp-format-converter.js.map +1 -0
  342. package/dist/lib/exports/otlp-proto-encode.d.ts +53 -0
  343. package/dist/lib/exports/otlp-proto-encode.d.ts.map +1 -0
  344. package/dist/lib/exports/otlp-proto-encode.js +165 -0
  345. package/dist/lib/exports/otlp-proto-encode.js.map +1 -0
  346. package/dist/lib/exports/otlp-proto-encode.test.d.ts +7 -0
  347. package/dist/lib/exports/otlp-proto-encode.test.d.ts.map +1 -0
  348. package/dist/lib/exports/otlp-proto-encode.test.js +997 -0
  349. package/dist/lib/exports/otlp-proto-encode.test.js.map +1 -0
  350. package/dist/lib/exports/phoenix-export.d.ts +119 -0
  351. package/dist/lib/exports/phoenix-export.d.ts.map +1 -0
  352. package/dist/lib/exports/phoenix-export.js +448 -0
  353. package/dist/lib/exports/phoenix-export.js.map +1 -0
  354. package/dist/lib/exports/phoenix-export.test.d.ts.map +1 -0
  355. package/dist/lib/exports/phoenix-export.test.js +816 -0
  356. package/dist/lib/exports/phoenix-export.test.js.map +1 -0
  357. package/dist/lib/index.d.ts +16 -0
  358. package/dist/lib/index.d.ts.map +1 -0
  359. package/dist/lib/index.js +31 -0
  360. package/dist/lib/index.js.map +1 -0
  361. package/dist/lib/judge/evaluation-hooks-schemas.d.ts +186 -0
  362. package/dist/lib/judge/evaluation-hooks-schemas.d.ts.map +1 -0
  363. package/dist/lib/judge/evaluation-hooks-schemas.js +125 -0
  364. package/dist/lib/judge/evaluation-hooks-schemas.js.map +1 -0
  365. package/dist/lib/judge/evaluation-hooks.d.ts +88 -0
  366. package/dist/lib/judge/evaluation-hooks.d.ts.map +1 -0
  367. package/dist/lib/judge/evaluation-hooks.js +658 -0
  368. package/dist/lib/judge/evaluation-hooks.js.map +1 -0
  369. package/dist/lib/judge/evaluation-hooks.test.d.ts.map +1 -0
  370. package/dist/lib/judge/evaluation-hooks.test.js +934 -0
  371. package/dist/lib/judge/evaluation-hooks.test.js.map +1 -0
  372. package/dist/lib/judge/llm-as-judge.d.ts +138 -0
  373. package/dist/lib/judge/llm-as-judge.d.ts.map +1 -0
  374. package/dist/lib/judge/llm-as-judge.js +103 -0
  375. package/dist/lib/judge/llm-as-judge.js.map +1 -0
  376. package/dist/lib/judge/llm-as-judge.test.d.ts.map +1 -0
  377. package/dist/lib/judge/llm-as-judge.test.js +2179 -0
  378. package/dist/lib/judge/llm-as-judge.test.js.map +1 -0
  379. package/dist/lib/judge/llm-judge-bias.d.ts +44 -0
  380. package/dist/lib/judge/llm-judge-bias.d.ts.map +1 -0
  381. package/dist/lib/judge/llm-judge-bias.js +130 -0
  382. package/dist/lib/judge/llm-judge-bias.js.map +1 -0
  383. package/dist/lib/judge/llm-judge-bias.test.d.ts +2 -0
  384. package/dist/lib/judge/llm-judge-bias.test.d.ts.map +1 -0
  385. package/dist/lib/judge/llm-judge-bias.test.js +380 -0
  386. package/dist/lib/judge/llm-judge-bias.test.js.map +1 -0
  387. package/dist/lib/judge/llm-judge-code.d.ts +99 -0
  388. package/dist/lib/judge/llm-judge-code.d.ts.map +1 -0
  389. package/dist/lib/judge/llm-judge-code.js +261 -0
  390. package/dist/lib/judge/llm-judge-code.js.map +1 -0
  391. package/dist/lib/judge/llm-judge-code.test.d.ts +2 -0
  392. package/dist/lib/judge/llm-judge-code.test.d.ts.map +1 -0
  393. package/dist/lib/judge/llm-judge-code.test.js +981 -0
  394. package/dist/lib/judge/llm-judge-code.test.js.map +1 -0
  395. package/dist/lib/judge/llm-judge-config.d.ts +241 -0
  396. package/dist/lib/judge/llm-judge-config.d.ts.map +1 -0
  397. package/dist/lib/judge/llm-judge-config.js +390 -0
  398. package/dist/lib/judge/llm-judge-config.js.map +1 -0
  399. package/dist/lib/judge/llm-judge-config.test.d.ts +5 -0
  400. package/dist/lib/judge/llm-judge-config.test.d.ts.map +1 -0
  401. package/dist/lib/judge/llm-judge-config.test.js +392 -0
  402. package/dist/lib/judge/llm-judge-config.test.js.map +1 -0
  403. package/dist/lib/judge/llm-judge-constants.d.ts +111 -0
  404. package/dist/lib/judge/llm-judge-constants.d.ts.map +1 -0
  405. package/dist/lib/judge/llm-judge-constants.js +150 -0
  406. package/dist/lib/judge/llm-judge-constants.js.map +1 -0
  407. package/dist/lib/judge/llm-judge-dag.d.ts +57 -0
  408. package/dist/lib/judge/llm-judge-dag.d.ts.map +1 -0
  409. package/dist/lib/judge/llm-judge-dag.js +217 -0
  410. package/dist/lib/judge/llm-judge-dag.js.map +1 -0
  411. package/dist/lib/judge/llm-judge-dag.test.d.ts +8 -0
  412. package/dist/lib/judge/llm-judge-dag.test.d.ts.map +1 -0
  413. package/dist/lib/judge/llm-judge-dag.test.js +973 -0
  414. package/dist/lib/judge/llm-judge-dag.test.js.map +1 -0
  415. package/dist/lib/judge/llm-judge-domain.d.ts +42 -0
  416. package/dist/lib/judge/llm-judge-domain.d.ts.map +1 -0
  417. package/dist/lib/judge/llm-judge-domain.js +167 -0
  418. package/dist/lib/judge/llm-judge-domain.js.map +1 -0
  419. package/dist/lib/judge/llm-judge-domain.test.d.ts +6 -0
  420. package/dist/lib/judge/llm-judge-domain.test.d.ts.map +1 -0
  421. package/dist/lib/judge/llm-judge-domain.test.js +337 -0
  422. package/dist/lib/judge/llm-judge-domain.test.js.map +1 -0
  423. package/dist/lib/judge/llm-judge-geval.d.ts +42 -0
  424. package/dist/lib/judge/llm-judge-geval.d.ts.map +1 -0
  425. package/dist/lib/judge/llm-judge-geval.js +213 -0
  426. package/dist/lib/judge/llm-judge-geval.js.map +1 -0
  427. package/dist/lib/judge/llm-judge-geval.test.d.ts +2 -0
  428. package/dist/lib/judge/llm-judge-geval.test.d.ts.map +1 -0
  429. package/dist/lib/judge/llm-judge-geval.test.js +556 -0
  430. package/dist/lib/judge/llm-judge-geval.test.js.map +1 -0
  431. package/dist/lib/judge/llm-judge-otel.test.d.ts +9 -0
  432. package/dist/lib/judge/llm-judge-otel.test.d.ts.map +1 -0
  433. package/dist/lib/judge/llm-judge-otel.test.js +91 -0
  434. package/dist/lib/judge/llm-judge-otel.test.js.map +1 -0
  435. package/dist/lib/judge/llm-judge-qag.d.ts +38 -0
  436. package/dist/lib/judge/llm-judge-qag.d.ts.map +1 -0
  437. package/dist/lib/judge/llm-judge-qag.js +205 -0
  438. package/dist/lib/judge/llm-judge-qag.js.map +1 -0
  439. package/dist/lib/judge/llm-judge-qag.test.d.ts +2 -0
  440. package/dist/lib/judge/llm-judge-qag.test.d.ts.map +1 -0
  441. package/dist/lib/judge/llm-judge-qag.test.js +386 -0
  442. package/dist/lib/judge/llm-judge-qag.test.js.map +1 -0
  443. package/dist/lib/judge/llm-judge-resilience.d.ts +74 -0
  444. package/dist/lib/judge/llm-judge-resilience.d.ts.map +1 -0
  445. package/dist/lib/judge/llm-judge-resilience.js +146 -0
  446. package/dist/lib/judge/llm-judge-resilience.js.map +1 -0
  447. package/dist/lib/judge/llm-judge-resilience.test.d.ts +2 -0
  448. package/dist/lib/judge/llm-judge-resilience.test.d.ts.map +1 -0
  449. package/dist/lib/judge/llm-judge-resilience.test.js +353 -0
  450. package/dist/lib/judge/llm-judge-resilience.test.js.map +1 -0
  451. package/dist/lib/judge/llm-judge-security.d.ts +106 -0
  452. package/dist/lib/judge/llm-judge-security.d.ts.map +1 -0
  453. package/dist/lib/judge/llm-judge-security.js +314 -0
  454. package/dist/lib/judge/llm-judge-security.js.map +1 -0
  455. package/dist/lib/judge/llm-judge-security.test.d.ts +2 -0
  456. package/dist/lib/judge/llm-judge-security.test.d.ts.map +1 -0
  457. package/dist/lib/judge/llm-judge-security.test.js +1011 -0
  458. package/dist/lib/judge/llm-judge-security.test.js.map +1 -0
  459. package/dist/lib/observability/context-accumulator.d.ts +32 -0
  460. package/dist/lib/observability/context-accumulator.d.ts.map +1 -0
  461. package/dist/lib/observability/context-accumulator.js +87 -0
  462. package/dist/lib/observability/context-accumulator.js.map +1 -0
  463. package/dist/lib/observability/evaluation-events.d.ts +35 -0
  464. package/dist/lib/observability/evaluation-events.d.ts.map +1 -0
  465. package/dist/lib/observability/evaluation-events.js +90 -0
  466. package/dist/lib/observability/evaluation-events.js.map +1 -0
  467. package/dist/lib/observability/file-span-exporter.d.ts +17 -0
  468. package/dist/lib/observability/file-span-exporter.d.ts.map +1 -0
  469. package/dist/lib/observability/file-span-exporter.js +49 -0
  470. package/dist/lib/observability/file-span-exporter.js.map +1 -0
  471. package/dist/lib/observability/histogram-bucket-constants.d.ts +25 -0
  472. package/dist/lib/observability/histogram-bucket-constants.d.ts.map +1 -0
  473. package/dist/lib/observability/histogram-bucket-constants.js +60 -0
  474. package/dist/lib/observability/histogram-bucket-constants.js.map +1 -0
  475. package/dist/lib/observability/histogram.d.ts +112 -0
  476. package/dist/lib/observability/histogram.d.ts.map +1 -0
  477. package/dist/lib/observability/histogram.js +170 -0
  478. package/dist/lib/observability/histogram.js.map +1 -0
  479. package/dist/lib/observability/histogram.test.d.ts.map +1 -0
  480. package/dist/lib/observability/histogram.test.js +385 -0
  481. package/dist/lib/observability/histogram.test.js.map +1 -0
  482. package/dist/lib/observability/indexer.d.ts +114 -0
  483. package/dist/lib/observability/indexer.d.ts.map +1 -0
  484. package/dist/lib/observability/indexer.js +402 -0
  485. package/dist/lib/observability/indexer.js.map +1 -0
  486. package/dist/lib/observability/indexer.test.d.ts.map +1 -0
  487. package/dist/lib/observability/indexer.test.js +713 -0
  488. package/dist/lib/observability/indexer.test.js.map +1 -0
  489. package/dist/lib/observability/instrumentation-eval.test.d.ts +5 -0
  490. package/dist/lib/observability/instrumentation-eval.test.d.ts.map +1 -0
  491. package/dist/lib/observability/instrumentation-eval.test.js +63 -0
  492. package/dist/lib/observability/instrumentation-eval.test.js.map +1 -0
  493. package/dist/lib/observability/instrumentation-init-errors.test.d.ts +13 -0
  494. package/dist/lib/observability/instrumentation-init-errors.test.d.ts.map +1 -0
  495. package/dist/lib/observability/instrumentation-init-errors.test.js +194 -0
  496. package/dist/lib/observability/instrumentation-init-errors.test.js.map +1 -0
  497. package/dist/lib/observability/instrumentation-retry-timeout.test.d.ts +15 -0
  498. package/dist/lib/observability/instrumentation-retry-timeout.test.d.ts.map +1 -0
  499. package/dist/lib/observability/instrumentation-retry-timeout.test.js +188 -0
  500. package/dist/lib/observability/instrumentation-retry-timeout.test.js.map +1 -0
  501. package/dist/lib/observability/instrumentation-set-otel.test.d.ts +5 -0
  502. package/dist/lib/observability/instrumentation-set-otel.test.d.ts.map +1 -0
  503. package/dist/lib/observability/instrumentation-set-otel.test.js +59 -0
  504. package/dist/lib/observability/instrumentation-set-otel.test.js.map +1 -0
  505. package/dist/lib/observability/instrumentation.d.ts +158 -0
  506. package/dist/lib/observability/instrumentation.d.ts.map +1 -0
  507. package/dist/lib/observability/instrumentation.integration.test.d.ts.map +1 -0
  508. package/dist/lib/observability/instrumentation.integration.test.js +590 -0
  509. package/dist/lib/observability/instrumentation.integration.test.js.map +1 -0
  510. package/dist/lib/observability/instrumentation.js +512 -0
  511. package/dist/lib/observability/instrumentation.js.map +1 -0
  512. package/dist/lib/observability/instrumentation.test.d.ts.map +1 -0
  513. package/dist/lib/observability/instrumentation.test.js +822 -0
  514. package/dist/lib/observability/instrumentation.test.js.map +1 -0
  515. package/dist/lib/observability/mcp-semconv-constants.d.ts +98 -0
  516. package/dist/lib/observability/mcp-semconv-constants.d.ts.map +1 -0
  517. package/dist/lib/observability/mcp-semconv-constants.js +102 -0
  518. package/dist/lib/observability/mcp-semconv-constants.js.map +1 -0
  519. package/dist/lib/observability/mcp-semconv.d.ts +37 -0
  520. package/dist/lib/observability/mcp-semconv.d.ts.map +1 -0
  521. package/dist/lib/observability/mcp-semconv.js +87 -0
  522. package/dist/lib/observability/mcp-semconv.js.map +1 -0
  523. package/dist/lib/observability/mcp-semconv.test.d.ts +2 -0
  524. package/dist/lib/observability/mcp-semconv.test.d.ts.map +1 -0
  525. package/dist/lib/observability/mcp-semconv.test.js +168 -0
  526. package/dist/lib/observability/mcp-semconv.test.js.map +1 -0
  527. package/dist/lib/observability/metrics.d.ts +100 -0
  528. package/dist/lib/observability/metrics.d.ts.map +1 -0
  529. package/dist/lib/observability/metrics.js +429 -0
  530. package/dist/lib/observability/metrics.js.map +1 -0
  531. package/dist/lib/observability/metrics.test.d.ts.map +1 -0
  532. package/dist/lib/observability/metrics.test.js +191 -0
  533. package/dist/lib/observability/metrics.test.js.map +1 -0
  534. package/dist/lib/observability/observability-test-constants.d.ts +34 -0
  535. package/dist/lib/observability/observability-test-constants.d.ts.map +1 -0
  536. package/dist/lib/observability/observability-test-constants.js +55 -0
  537. package/dist/lib/observability/observability-test-constants.js.map +1 -0
  538. package/dist/lib/observability/opentelemetry-resources.test.d.ts +2 -0
  539. package/dist/lib/observability/opentelemetry-resources.test.d.ts.map +1 -0
  540. package/dist/lib/observability/opentelemetry-resources.test.js +19 -0
  541. package/dist/lib/observability/opentelemetry-resources.test.js.map +1 -0
  542. package/dist/lib/observability/parse-stats.d.ts.map +1 -0
  543. package/dist/lib/observability/parse-stats.js +207 -0
  544. package/dist/lib/observability/parse-stats.js.map +1 -0
  545. package/dist/lib/observability/parse-stats.test.d.ts.map +1 -0
  546. package/dist/lib/observability/parse-stats.test.js +287 -0
  547. package/dist/lib/observability/parse-stats.test.js.map +1 -0
  548. package/dist/lib/observability/render-trace-tree.d.ts +31 -0
  549. package/dist/lib/observability/render-trace-tree.d.ts.map +1 -0
  550. package/dist/lib/observability/render-trace-tree.js +95 -0
  551. package/dist/lib/observability/render-trace-tree.js.map +1 -0
  552. package/dist/lib/observability/render-trace-tree.test.d.ts +5 -0
  553. package/dist/lib/observability/render-trace-tree.test.d.ts.map +1 -0
  554. package/dist/lib/observability/render-trace-tree.test.js +97 -0
  555. package/dist/lib/observability/render-trace-tree.test.js.map +1 -0
  556. package/dist/lib/observability/span-attributes.d.ts +27 -0
  557. package/dist/lib/observability/span-attributes.d.ts.map +1 -0
  558. package/dist/lib/observability/span-attributes.js +85 -0
  559. package/dist/lib/observability/span-attributes.js.map +1 -0
  560. package/dist/lib/observability/trace-anomaly-detector.d.ts +23 -0
  561. package/dist/lib/observability/trace-anomaly-detector.d.ts.map +1 -0
  562. package/dist/lib/observability/trace-anomaly-detector.js +211 -0
  563. package/dist/lib/observability/trace-anomaly-detector.js.map +1 -0
  564. package/dist/lib/observability/trace-anomaly-detector.test.d.ts +5 -0
  565. package/dist/lib/observability/trace-anomaly-detector.test.d.ts.map +1 -0
  566. package/dist/lib/observability/trace-anomaly-detector.test.js +224 -0
  567. package/dist/lib/observability/trace-anomaly-detector.test.js.map +1 -0
  568. package/dist/lib/observability/trace-anomaly-schemas.d.ts +189 -0
  569. package/dist/lib/observability/trace-anomaly-schemas.d.ts.map +1 -0
  570. package/dist/lib/observability/trace-anomaly-schemas.js +167 -0
  571. package/dist/lib/observability/trace-anomaly-schemas.js.map +1 -0
  572. package/dist/lib/privacy/content-redaction.d.ts +141 -0
  573. package/dist/lib/privacy/content-redaction.d.ts.map +1 -0
  574. package/dist/lib/privacy/content-redaction.js +210 -0
  575. package/dist/lib/privacy/content-redaction.js.map +1 -0
  576. package/dist/lib/privacy/content-redaction.test.d.ts +2 -0
  577. package/dist/lib/privacy/content-redaction.test.d.ts.map +1 -0
  578. package/dist/lib/privacy/content-redaction.test.js +302 -0
  579. package/dist/lib/privacy/content-redaction.test.js.map +1 -0
  580. package/dist/lib/quality/bucket-utils.d.ts +17 -0
  581. package/dist/lib/quality/bucket-utils.d.ts.map +1 -0
  582. package/dist/lib/quality/bucket-utils.js +31 -0
  583. package/dist/lib/quality/bucket-utils.js.map +1 -0
  584. package/dist/lib/quality/bucket-utils.test.d.ts +2 -0
  585. package/dist/lib/quality/bucket-utils.test.d.ts.map +1 -0
  586. package/dist/lib/quality/bucket-utils.test.js +42 -0
  587. package/dist/lib/quality/bucket-utils.test.js.map +1 -0
  588. package/dist/lib/quality/qfe-backtest-detail.test.d.ts +5 -0
  589. package/dist/lib/quality/qfe-backtest-detail.test.d.ts.map +1 -0
  590. package/dist/lib/quality/qfe-backtest-detail.test.js +179 -0
  591. package/dist/lib/quality/qfe-backtest-detail.test.js.map +1 -0
  592. package/dist/lib/quality/qfe-calibration-paths.test.d.ts +5 -0
  593. package/dist/lib/quality/qfe-calibration-paths.test.d.ts.map +1 -0
  594. package/dist/lib/quality/qfe-calibration-paths.test.js +203 -0
  595. package/dist/lib/quality/qfe-calibration-paths.test.js.map +1 -0
  596. package/dist/lib/quality/qfe-correlation-helpers.test.d.ts +6 -0
  597. package/dist/lib/quality/qfe-correlation-helpers.test.d.ts.map +1 -0
  598. package/dist/lib/quality/qfe-correlation-helpers.test.js +143 -0
  599. package/dist/lib/quality/qfe-correlation-helpers.test.js.map +1 -0
  600. package/dist/lib/quality/qfe-cqi-paths.test.d.ts +6 -0
  601. package/dist/lib/quality/qfe-cqi-paths.test.d.ts.map +1 -0
  602. package/dist/lib/quality/qfe-cqi-paths.test.js +231 -0
  603. package/dist/lib/quality/qfe-cqi-paths.test.js.map +1 -0
  604. package/dist/lib/quality/qfe-critic-internals.test.d.ts +6 -0
  605. package/dist/lib/quality/qfe-critic-internals.test.d.ts.map +1 -0
  606. package/dist/lib/quality/qfe-critic-internals.test.js +191 -0
  607. package/dist/lib/quality/qfe-critic-internals.test.js.map +1 -0
  608. package/dist/lib/quality/qfe-derived-paths.test.d.ts +2 -0
  609. package/dist/lib/quality/qfe-derived-paths.test.d.ts.map +1 -0
  610. package/dist/lib/quality/qfe-derived-paths.test.js +372 -0
  611. package/dist/lib/quality/qfe-derived-paths.test.js.map +1 -0
  612. package/dist/lib/quality/qfe-dynamics-paths.test.d.ts +8 -0
  613. package/dist/lib/quality/qfe-dynamics-paths.test.d.ts.map +1 -0
  614. package/dist/lib/quality/qfe-dynamics-paths.test.js +223 -0
  615. package/dist/lib/quality/qfe-dynamics-paths.test.js.map +1 -0
  616. package/dist/lib/quality/qfe-granger-internals.test.d.ts +6 -0
  617. package/dist/lib/quality/qfe-granger-internals.test.d.ts.map +1 -0
  618. package/dist/lib/quality/qfe-granger-internals.test.js +158 -0
  619. package/dist/lib/quality/qfe-granger-internals.test.js.map +1 -0
  620. package/dist/lib/quality/qfe-label-normalize.test.d.ts +7 -0
  621. package/dist/lib/quality/qfe-label-normalize.test.d.ts.map +1 -0
  622. package/dist/lib/quality/qfe-label-normalize.test.js +332 -0
  623. package/dist/lib/quality/qfe-label-normalize.test.js.map +1 -0
  624. package/dist/lib/quality/qfe-ordinal-edge.test.d.ts +6 -0
  625. package/dist/lib/quality/qfe-ordinal-edge.test.d.ts.map +1 -0
  626. package/dist/lib/quality/qfe-ordinal-edge.test.js +98 -0
  627. package/dist/lib/quality/qfe-ordinal-edge.test.js.map +1 -0
  628. package/dist/lib/quality/qfe-roles-detail.test.d.ts +5 -0
  629. package/dist/lib/quality/qfe-roles-detail.test.d.ts.map +1 -0
  630. package/dist/lib/quality/qfe-roles-detail.test.js +115 -0
  631. package/dist/lib/quality/qfe-roles-detail.test.js.map +1 -0
  632. package/dist/lib/quality/qfe-rolling-detail.test.d.ts +7 -0
  633. package/dist/lib/quality/qfe-rolling-detail.test.d.ts.map +1 -0
  634. package/dist/lib/quality/qfe-rolling-detail.test.js +249 -0
  635. package/dist/lib/quality/qfe-rolling-detail.test.js.map +1 -0
  636. package/dist/lib/quality/qfe-stats-internals.test.d.ts +7 -0
  637. package/dist/lib/quality/qfe-stats-internals.test.d.ts.map +1 -0
  638. package/dist/lib/quality/qfe-stats-internals.test.js +143 -0
  639. package/dist/lib/quality/qfe-stats-internals.test.js.map +1 -0
  640. package/dist/lib/quality/qfe-streaming.test.d.ts +5 -0
  641. package/dist/lib/quality/qfe-streaming.test.d.ts.map +1 -0
  642. package/dist/lib/quality/qfe-streaming.test.js +239 -0
  643. package/dist/lib/quality/qfe-streaming.test.js.map +1 -0
  644. package/dist/lib/quality/qfe-sweep-detail.test.d.ts +6 -0
  645. package/dist/lib/quality/qfe-sweep-detail.test.d.ts.map +1 -0
  646. package/dist/lib/quality/qfe-sweep-detail.test.js +291 -0
  647. package/dist/lib/quality/qfe-sweep-detail.test.js.map +1 -0
  648. package/dist/lib/quality/quality-alerts.d.ts +23 -0
  649. package/dist/lib/quality/quality-alerts.d.ts.map +1 -0
  650. package/dist/lib/quality/quality-alerts.js +89 -0
  651. package/dist/lib/quality/quality-alerts.js.map +1 -0
  652. package/dist/lib/quality/quality-alerts.test.d.ts +2 -0
  653. package/dist/lib/quality/quality-alerts.test.d.ts.map +1 -0
  654. package/dist/lib/quality/quality-alerts.test.js +86 -0
  655. package/dist/lib/quality/quality-alerts.test.js.map +1 -0
  656. package/dist/lib/quality/quality-constants.d.ts +294 -0
  657. package/dist/lib/quality/quality-constants.d.ts.map +1 -0
  658. package/dist/lib/quality/quality-constants.js +335 -0
  659. package/dist/lib/quality/quality-constants.js.map +1 -0
  660. package/dist/lib/quality/quality-feature-engineering.d.ts +1071 -0
  661. package/dist/lib/quality/quality-feature-engineering.d.ts.map +1 -0
  662. package/dist/lib/quality/quality-feature-engineering.js +2076 -0
  663. package/dist/lib/quality/quality-feature-engineering.js.map +1 -0
  664. package/dist/lib/quality/quality-feature-engineering.test.d.ts +5 -0
  665. package/dist/lib/quality/quality-feature-engineering.test.d.ts.map +1 -0
  666. package/dist/lib/quality/quality-feature-engineering.test.js +2908 -0
  667. package/dist/lib/quality/quality-feature-engineering.test.js.map +1 -0
  668. package/dist/lib/quality/quality-metrics.d.ts +943 -0
  669. package/dist/lib/quality/quality-metrics.d.ts.map +1 -0
  670. package/dist/lib/quality/quality-metrics.js +1151 -0
  671. package/dist/lib/quality/quality-metrics.js.map +1 -0
  672. package/dist/lib/quality/quality-metrics.test.d.ts +5 -0
  673. package/dist/lib/quality/quality-metrics.test.d.ts.map +1 -0
  674. package/dist/lib/quality/quality-metrics.test.js +2766 -0
  675. package/dist/lib/quality/quality-metrics.test.js.map +1 -0
  676. package/dist/lib/quality/quality-multi-agent.d.ts +106 -0
  677. package/dist/lib/quality/quality-multi-agent.d.ts.map +1 -0
  678. package/dist/lib/quality/quality-multi-agent.js +124 -0
  679. package/dist/lib/quality/quality-multi-agent.js.map +1 -0
  680. package/dist/lib/quality/quality-multi-agent.test.d.ts +6 -0
  681. package/dist/lib/quality/quality-multi-agent.test.d.ts.map +1 -0
  682. package/dist/lib/quality/quality-multi-agent.test.js +163 -0
  683. package/dist/lib/quality/quality-multi-agent.test.js.map +1 -0
  684. package/dist/lib/quality/quality-sla.d.ts +35 -0
  685. package/dist/lib/quality/quality-sla.d.ts.map +1 -0
  686. package/dist/lib/quality/quality-sla.js +62 -0
  687. package/dist/lib/quality/quality-sla.js.map +1 -0
  688. package/dist/lib/quality/quality-sla.test.d.ts +5 -0
  689. package/dist/lib/quality/quality-sla.test.d.ts.map +1 -0
  690. package/dist/lib/quality/quality-sla.test.js +144 -0
  691. package/dist/lib/quality/quality-sla.test.js.map +1 -0
  692. package/dist/lib/quality/quality-test-constants.d.ts +23 -0
  693. package/dist/lib/quality/quality-test-constants.d.ts.map +1 -0
  694. package/dist/lib/quality/quality-test-constants.js +25 -0
  695. package/dist/lib/quality/quality-test-constants.js.map +1 -0
  696. package/dist/lib/quality/quality-trends.d.ts +101 -0
  697. package/dist/lib/quality/quality-trends.d.ts.map +1 -0
  698. package/dist/lib/quality/quality-trends.js +299 -0
  699. package/dist/lib/quality/quality-trends.js.map +1 -0
  700. package/dist/lib/quality/quality-trends.test.d.ts +6 -0
  701. package/dist/lib/quality/quality-trends.test.d.ts.map +1 -0
  702. package/dist/lib/quality/quality-trends.test.js +377 -0
  703. package/dist/lib/quality/quality-trends.test.js.map +1 -0
  704. package/dist/lib/quality/quality-views.d.ts +966 -0
  705. package/dist/lib/quality/quality-views.d.ts.map +1 -0
  706. package/dist/lib/quality/quality-views.js +367 -0
  707. package/dist/lib/quality/quality-views.js.map +1 -0
  708. package/dist/lib/quality/quality-views.test.d.ts +6 -0
  709. package/dist/lib/quality/quality-views.test.d.ts.map +1 -0
  710. package/dist/lib/quality/quality-views.test.js +262 -0
  711. package/dist/lib/quality/quality-views.test.js.map +1 -0
  712. package/dist/lib/quality/quality-visualization.d.ts +112 -0
  713. package/dist/lib/quality/quality-visualization.d.ts.map +1 -0
  714. package/dist/lib/quality/quality-visualization.js +136 -0
  715. package/dist/lib/quality/quality-visualization.js.map +1 -0
  716. package/dist/lib/quality/quality-visualization.test.d.ts +5 -0
  717. package/dist/lib/quality/quality-visualization.test.d.ts.map +1 -0
  718. package/dist/lib/quality/quality-visualization.test.js +189 -0
  719. package/dist/lib/quality/quality-visualization.test.js.map +1 -0
  720. package/dist/lib/resilience/cache.d.ts +56 -0
  721. package/dist/lib/resilience/cache.d.ts.map +1 -0
  722. package/dist/lib/resilience/cache.js +96 -0
  723. package/dist/lib/resilience/cache.js.map +1 -0
  724. package/dist/lib/resilience/cache.test.d.ts.map +1 -0
  725. package/dist/lib/resilience/cache.test.js +106 -0
  726. package/dist/lib/resilience/cache.test.js.map +1 -0
  727. package/dist/lib/resilience/circuit-breaker.d.ts +147 -0
  728. package/dist/lib/resilience/circuit-breaker.d.ts.map +1 -0
  729. package/dist/lib/resilience/circuit-breaker.js +251 -0
  730. package/dist/lib/resilience/circuit-breaker.js.map +1 -0
  731. package/dist/lib/resilience/circuit-breaker.test.d.ts.map +1 -0
  732. package/dist/lib/resilience/circuit-breaker.test.js +266 -0
  733. package/dist/lib/resilience/circuit-breaker.test.js.map +1 -0
  734. package/dist/lib/resilience/toon-encoder.d.ts +31 -0
  735. package/dist/lib/resilience/toon-encoder.d.ts.map +1 -0
  736. package/dist/lib/resilience/toon-encoder.js +66 -0
  737. package/dist/lib/resilience/toon-encoder.js.map +1 -0
  738. package/dist/lib/resilience/toon-encoder.test.d.ts.map +1 -0
  739. package/dist/lib/resilience/toon-encoder.test.js +86 -0
  740. package/dist/lib/resilience/toon-encoder.test.js.map +1 -0
  741. package/dist/lib/testing/mock-llm-builder.d.ts +139 -0
  742. package/dist/lib/testing/mock-llm-builder.d.ts.map +1 -0
  743. package/dist/lib/testing/mock-llm-builder.js +254 -0
  744. package/dist/lib/testing/mock-llm-builder.js.map +1 -0
  745. package/dist/lib/testing/mock-llm-builder.test.d.ts +5 -0
  746. package/dist/lib/testing/mock-llm-builder.test.d.ts.map +1 -0
  747. package/dist/lib/testing/mock-llm-builder.test.js +304 -0
  748. package/dist/lib/testing/mock-llm-builder.test.js.map +1 -0
  749. package/dist/lib/validation/api-schemas.d.ts +705 -0
  750. package/dist/lib/validation/api-schemas.d.ts.map +1 -0
  751. package/dist/lib/validation/api-schemas.js +351 -0
  752. package/dist/lib/validation/api-schemas.js.map +1 -0
  753. package/dist/lib/validation/api-schemas.test.d.ts +5 -0
  754. package/dist/lib/validation/api-schemas.test.d.ts.map +1 -0
  755. package/dist/lib/validation/api-schemas.test.js +427 -0
  756. package/dist/lib/validation/api-schemas.test.js.map +1 -0
  757. package/dist/lib/validation/dashboard-schemas.d.ts +203 -0
  758. package/dist/lib/validation/dashboard-schemas.d.ts.map +1 -0
  759. package/dist/lib/validation/dashboard-schemas.js +186 -0
  760. package/dist/lib/validation/dashboard-schemas.js.map +1 -0
  761. package/dist/lib/validation/dashboard-schemas.test.d.ts +5 -0
  762. package/dist/lib/validation/dashboard-schemas.test.d.ts.map +1 -0
  763. package/dist/lib/validation/dashboard-schemas.test.js +353 -0
  764. package/dist/lib/validation/dashboard-schemas.test.js.map +1 -0
  765. package/dist/server.d.ts +2 -1
  766. package/dist/server.d.ts.map +1 -1
  767. package/dist/server.js +158 -144
  768. package/dist/server.js.map +1 -1
  769. package/dist/server.test.js +102 -95
  770. package/dist/server.test.js.map +1 -1
  771. package/dist/test-helpers/assertions.d.ts +6 -0
  772. package/dist/test-helpers/assertions.d.ts.map +1 -0
  773. package/dist/test-helpers/assertions.js +11 -0
  774. package/dist/test-helpers/assertions.js.map +1 -0
  775. package/dist/test-helpers/env-utils.d.ts +0 -64
  776. package/dist/test-helpers/env-utils.d.ts.map +1 -1
  777. package/dist/test-helpers/env-utils.js +0 -100
  778. package/dist/test-helpers/env-utils.js.map +1 -1
  779. package/dist/test-helpers/fuzz-generators.d.ts.map +1 -1
  780. package/dist/test-helpers/fuzz-generators.js +62 -22
  781. package/dist/test-helpers/fuzz-generators.js.map +1 -1
  782. package/dist/test-helpers/index.d.ts +3 -2
  783. package/dist/test-helpers/index.d.ts.map +1 -1
  784. package/dist/test-helpers/index.js +4 -2
  785. package/dist/test-helpers/index.js.map +1 -1
  786. package/dist/test-helpers/memfs-utils.test.js +81 -76
  787. package/dist/test-helpers/memfs-utils.test.js.map +1 -1
  788. package/dist/test-helpers/mock-backends.d.ts +19 -17
  789. package/dist/test-helpers/mock-backends.d.ts.map +1 -1
  790. package/dist/test-helpers/mock-backends.js +16 -4
  791. package/dist/test-helpers/mock-backends.js.map +1 -1
  792. package/dist/test-helpers/mock-backends.test.js +43 -112
  793. package/dist/test-helpers/mock-backends.test.js.map +1 -1
  794. package/dist/test-helpers/race-condition-helpers.d.ts.map +1 -1
  795. package/dist/test-helpers/race-condition-helpers.js +3 -2
  796. package/dist/test-helpers/race-condition-helpers.js.map +1 -1
  797. package/dist/test-helpers/schema-validators.d.ts +2 -2
  798. package/dist/test-helpers/schema-validators.d.ts.map +1 -1
  799. package/dist/test-helpers/schema-validators.js +35 -31
  800. package/dist/test-helpers/schema-validators.js.map +1 -1
  801. package/dist/test-helpers/test-constants.d.ts +74 -0
  802. package/dist/test-helpers/test-constants.d.ts.map +1 -0
  803. package/dist/test-helpers/test-constants.js +78 -0
  804. package/dist/test-helpers/test-constants.js.map +1 -0
  805. package/dist/test-helpers/test-data-builders.d.ts +25 -7
  806. package/dist/test-helpers/test-data-builders.d.ts.map +1 -1
  807. package/dist/test-helpers/test-data-builders.js +32 -9
  808. package/dist/test-helpers/test-data-builders.js.map +1 -1
  809. package/dist/test-helpers/test-data-builders.test.js +116 -107
  810. package/dist/test-helpers/test-data-builders.test.js.map +1 -1
  811. package/dist/test-helpers/tool-validators.d.ts +1 -1
  812. package/dist/test-helpers/tool-validators.d.ts.map +1 -1
  813. package/dist/test-helpers/tool-validators.js +10 -10
  814. package/dist/test-helpers/tool-validators.js.map +1 -1
  815. package/dist/tools/audit-trail.d.ts +170 -0
  816. package/dist/tools/audit-trail.d.ts.map +1 -0
  817. package/dist/tools/audit-trail.js +109 -0
  818. package/dist/tools/audit-trail.js.map +1 -0
  819. package/dist/tools/audit-trail.test.d.ts +5 -0
  820. package/dist/tools/audit-trail.test.d.ts.map +1 -0
  821. package/dist/tools/audit-trail.test.js +122 -0
  822. package/dist/tools/audit-trail.test.js.map +1 -0
  823. package/dist/tools/context-stats.d.ts +6 -20
  824. package/dist/tools/context-stats.d.ts.map +1 -1
  825. package/dist/tools/context-stats.js +106 -88
  826. package/dist/tools/context-stats.js.map +1 -1
  827. package/dist/tools/context-stats.test.js +109 -60
  828. package/dist/tools/context-stats.test.js.map +1 -1
  829. package/dist/tools/detect-trace-anomalies.d.ts +123 -0
  830. package/dist/tools/detect-trace-anomalies.d.ts.map +1 -0
  831. package/dist/tools/detect-trace-anomalies.js +66 -0
  832. package/dist/tools/detect-trace-anomalies.js.map +1 -0
  833. package/dist/tools/estimate-cost.d.ts +77 -0
  834. package/dist/tools/estimate-cost.d.ts.map +1 -0
  835. package/dist/tools/estimate-cost.js +104 -0
  836. package/dist/tools/estimate-cost.js.map +1 -0
  837. package/dist/tools/estimate-cost.test.d.ts +5 -0
  838. package/dist/tools/estimate-cost.test.d.ts.map +1 -0
  839. package/dist/tools/estimate-cost.test.js +343 -0
  840. package/dist/tools/estimate-cost.test.js.map +1 -0
  841. package/dist/tools/export-base.d.ts +77 -0
  842. package/dist/tools/export-base.d.ts.map +1 -0
  843. package/dist/tools/export-base.js +150 -0
  844. package/dist/tools/export-base.js.map +1 -0
  845. package/dist/tools/export-base.test.d.ts +18 -0
  846. package/dist/tools/export-base.test.d.ts.map +1 -0
  847. package/dist/tools/export-base.test.js +220 -0
  848. package/dist/tools/export-base.test.js.map +1 -0
  849. package/dist/tools/export-confident.d.ts +94 -90
  850. package/dist/tools/export-confident.d.ts.map +1 -1
  851. package/dist/tools/export-confident.js +17 -115
  852. package/dist/tools/export-confident.js.map +1 -1
  853. package/dist/tools/export-confident.test.js +79 -75
  854. package/dist/tools/export-confident.test.js.map +1 -1
  855. package/dist/tools/export-datadog.d.ts +77 -116
  856. package/dist/tools/export-datadog.d.ts.map +1 -1
  857. package/dist/tools/export-datadog.js +38 -40
  858. package/dist/tools/export-datadog.js.map +1 -1
  859. package/dist/tools/export-datadog.test.js +122 -165
  860. package/dist/tools/export-datadog.test.js.map +1 -1
  861. package/dist/tools/export-jaeger.d.ts +100 -0
  862. package/dist/tools/export-jaeger.d.ts.map +1 -0
  863. package/dist/tools/export-jaeger.js +154 -0
  864. package/dist/tools/export-jaeger.js.map +1 -0
  865. package/dist/tools/export-jaeger.test.d.ts +2 -0
  866. package/dist/tools/export-jaeger.test.d.ts.map +1 -0
  867. package/dist/tools/export-jaeger.test.js +113 -0
  868. package/dist/tools/export-jaeger.test.js.map +1 -0
  869. package/dist/tools/export-langfuse.d.ts +78 -80
  870. package/dist/tools/export-langfuse.d.ts.map +1 -1
  871. package/dist/tools/export-langfuse.js +15 -113
  872. package/dist/tools/export-langfuse.js.map +1 -1
  873. package/dist/tools/export-langfuse.test.js +70 -81
  874. package/dist/tools/export-langfuse.test.js.map +1 -1
  875. package/dist/tools/export-phoenix.d.ts +115 -90
  876. package/dist/tools/export-phoenix.d.ts.map +1 -1
  877. package/dist/tools/export-phoenix.js +29 -117
  878. package/dist/tools/export-phoenix.js.map +1 -1
  879. package/dist/tools/export-phoenix.test.js +95 -94
  880. package/dist/tools/export-phoenix.test.js.map +1 -1
  881. package/dist/tools/get-trace-url.d.ts +2 -10
  882. package/dist/tools/get-trace-url.d.ts.map +1 -1
  883. package/dist/tools/get-trace-url.js +5 -8
  884. package/dist/tools/get-trace-url.js.map +1 -1
  885. package/dist/tools/get-trace-url.test.js +81 -399
  886. package/dist/tools/get-trace-url.test.js.map +1 -1
  887. package/dist/tools/hallucination-detection.d.ts +203 -0
  888. package/dist/tools/hallucination-detection.d.ts.map +1 -0
  889. package/dist/tools/hallucination-detection.js +189 -0
  890. package/dist/tools/hallucination-detection.js.map +1 -0
  891. package/dist/tools/hallucination-detection.test.d.ts +5 -0
  892. package/dist/tools/hallucination-detection.test.d.ts.map +1 -0
  893. package/dist/tools/hallucination-detection.test.js +529 -0
  894. package/dist/tools/hallucination-detection.test.js.map +1 -0
  895. package/dist/tools/health-check.d.ts +9 -16
  896. package/dist/tools/health-check.d.ts.map +1 -1
  897. package/dist/tools/health-check.js +88 -101
  898. package/dist/tools/health-check.js.map +1 -1
  899. package/dist/tools/health-check.test.js +72 -165
  900. package/dist/tools/health-check.test.js.map +1 -1
  901. package/dist/tools/index.d.ts +13 -0
  902. package/dist/tools/index.d.ts.map +1 -1
  903. package/dist/tools/index.js +13 -0
  904. package/dist/tools/index.js.map +1 -1
  905. package/dist/tools/ingest-constants.d.ts +8 -0
  906. package/dist/tools/ingest-constants.d.ts.map +1 -0
  907. package/dist/tools/ingest-constants.js +8 -0
  908. package/dist/tools/ingest-constants.js.map +1 -0
  909. package/dist/tools/ingest-spans.d.ts +45 -0
  910. package/dist/tools/ingest-spans.d.ts.map +1 -0
  911. package/dist/tools/ingest-spans.js +129 -0
  912. package/dist/tools/ingest-spans.js.map +1 -0
  913. package/dist/tools/ingest-spans.test.d.ts +5 -0
  914. package/dist/tools/ingest-spans.test.d.ts.map +1 -0
  915. package/dist/tools/ingest-spans.test.js +250 -0
  916. package/dist/tools/ingest-spans.test.js.map +1 -0
  917. package/dist/tools/ingest-traces.d.ts +76 -0
  918. package/dist/tools/ingest-traces.d.ts.map +1 -0
  919. package/dist/tools/ingest-traces.js +164 -0
  920. package/dist/tools/ingest-traces.js.map +1 -0
  921. package/dist/tools/ingest-traces.test.d.ts +5 -0
  922. package/dist/tools/ingest-traces.test.d.ts.map +1 -0
  923. package/dist/tools/ingest-traces.test.js +483 -0
  924. package/dist/tools/ingest-traces.test.js.map +1 -0
  925. package/dist/tools/inject-evaluations.d.ts +136 -1197
  926. package/dist/tools/inject-evaluations.d.ts.map +1 -1
  927. package/dist/tools/inject-evaluations.js +65 -53
  928. package/dist/tools/inject-evaluations.js.map +1 -1
  929. package/dist/tools/inject-evaluations.test.js +83 -71
  930. package/dist/tools/inject-evaluations.test.js.map +1 -1
  931. package/dist/tools/manage-datasets.d.ts +850 -0
  932. package/dist/tools/manage-datasets.d.ts.map +1 -0
  933. package/dist/tools/manage-datasets.js +139 -0
  934. package/dist/tools/manage-datasets.js.map +1 -0
  935. package/dist/tools/manage-datasets.test.d.ts +5 -0
  936. package/dist/tools/manage-datasets.test.d.ts.map +1 -0
  937. package/dist/tools/manage-datasets.test.js +430 -0
  938. package/dist/tools/manage-datasets.test.js.map +1 -0
  939. package/dist/tools/multi-agent-coordination.d.ts +178 -0
  940. package/dist/tools/multi-agent-coordination.d.ts.map +1 -0
  941. package/dist/tools/multi-agent-coordination.js +270 -0
  942. package/dist/tools/multi-agent-coordination.js.map +1 -0
  943. package/dist/tools/multi-agent-coordination.test.d.ts +5 -0
  944. package/dist/tools/multi-agent-coordination.test.d.ts.map +1 -0
  945. package/dist/tools/multi-agent-coordination.test.js +530 -0
  946. package/dist/tools/multi-agent-coordination.test.js.map +1 -0
  947. package/dist/tools/query-evaluations.d.ts +147 -105
  948. package/dist/tools/query-evaluations.d.ts.map +1 -1
  949. package/dist/tools/query-evaluations.js +205 -178
  950. package/dist/tools/query-evaluations.js.map +1 -1
  951. package/dist/tools/query-evaluations.test.js +386 -391
  952. package/dist/tools/query-evaluations.test.js.map +1 -1
  953. package/dist/tools/query-llm-events.d.ts +100 -75
  954. package/dist/tools/query-llm-events.d.ts.map +1 -1
  955. package/dist/tools/query-llm-events.js +106 -80
  956. package/dist/tools/query-llm-events.js.map +1 -1
  957. package/dist/tools/query-llm-events.test.js +183 -346
  958. package/dist/tools/query-llm-events.test.js.map +1 -1
  959. package/dist/tools/query-logs.d.ts +45 -58
  960. package/dist/tools/query-logs.d.ts.map +1 -1
  961. package/dist/tools/query-logs.js +54 -101
  962. package/dist/tools/query-logs.js.map +1 -1
  963. package/dist/tools/query-logs.test.js +118 -314
  964. package/dist/tools/query-logs.test.js.map +1 -1
  965. package/dist/tools/query-metric-histograms.d.ts +112 -0
  966. package/dist/tools/query-metric-histograms.d.ts.map +1 -0
  967. package/dist/tools/query-metric-histograms.js +69 -0
  968. package/dist/tools/query-metric-histograms.js.map +1 -0
  969. package/dist/tools/query-metric-histograms.test.d.ts +5 -0
  970. package/dist/tools/query-metric-histograms.test.d.ts.map +1 -0
  971. package/dist/tools/query-metric-histograms.test.js +209 -0
  972. package/dist/tools/query-metric-histograms.test.js.map +1 -0
  973. package/dist/tools/query-metrics.d.ts +159 -60
  974. package/dist/tools/query-metrics.d.ts.map +1 -1
  975. package/dist/tools/query-metrics.js +133 -111
  976. package/dist/tools/query-metrics.js.map +1 -1
  977. package/dist/tools/query-metrics.test.js +314 -389
  978. package/dist/tools/query-metrics.test.js.map +1 -1
  979. package/dist/tools/query-regressions.d.ts +76 -0
  980. package/dist/tools/query-regressions.d.ts.map +1 -0
  981. package/dist/tools/query-regressions.js +122 -0
  982. package/dist/tools/query-regressions.js.map +1 -0
  983. package/dist/tools/query-regressions.test.d.ts +8 -0
  984. package/dist/tools/query-regressions.test.d.ts.map +1 -0
  985. package/dist/tools/query-regressions.test.js +129 -0
  986. package/dist/tools/query-regressions.test.js.map +1 -0
  987. package/dist/tools/query-traces.d.ts +103 -71
  988. package/dist/tools/query-traces.d.ts.map +1 -1
  989. package/dist/tools/query-traces.js +75 -106
  990. package/dist/tools/query-traces.js.map +1 -1
  991. package/dist/tools/query-traces.test.js +140 -846
  992. package/dist/tools/query-traces.test.js.map +1 -1
  993. package/dist/tools/query-verifications.d.ts +55 -43
  994. package/dist/tools/query-verifications.d.ts.map +1 -1
  995. package/dist/tools/query-verifications.js +47 -46
  996. package/dist/tools/query-verifications.js.map +1 -1
  997. package/dist/tools/query-verifications.test.js +42 -35
  998. package/dist/tools/query-verifications.test.js.map +1 -1
  999. package/dist/tools/routing-telemetry.d.ts +168 -0
  1000. package/dist/tools/routing-telemetry.d.ts.map +1 -0
  1001. package/dist/tools/routing-telemetry.js +267 -0
  1002. package/dist/tools/routing-telemetry.js.map +1 -0
  1003. package/dist/tools/routing-telemetry.test.d.ts +5 -0
  1004. package/dist/tools/routing-telemetry.test.d.ts.map +1 -0
  1005. package/dist/tools/routing-telemetry.test.js +747 -0
  1006. package/dist/tools/routing-telemetry.test.js.map +1 -0
  1007. package/dist/tools/setup-claudeignore.d.ts +4 -32
  1008. package/dist/tools/setup-claudeignore.d.ts.map +1 -1
  1009. package/dist/tools/setup-claudeignore.js +18 -22
  1010. package/dist/tools/setup-claudeignore.js.map +1 -1
  1011. package/dist/tools/setup-claudeignore.test.js +50 -49
  1012. package/dist/tools/setup-claudeignore.test.js.map +1 -1
  1013. package/dist/tools/token-budget.d.ts +170 -0
  1014. package/dist/tools/token-budget.d.ts.map +1 -0
  1015. package/dist/tools/token-budget.js +219 -0
  1016. package/dist/tools/token-budget.js.map +1 -0
  1017. package/dist/tools/token-budget.test.d.ts +5 -0
  1018. package/dist/tools/token-budget.test.d.ts.map +1 -0
  1019. package/dist/tools/token-budget.test.js +293 -0
  1020. package/dist/tools/token-budget.test.js.map +1 -0
  1021. package/package.json +72 -10
  1022. package/dist/backends/local-jsonl.test.d.ts +0 -2
  1023. package/dist/backends/local-jsonl.test.d.ts.map +0 -1
  1024. package/dist/backends/local-jsonl.test.js +0 -4651
  1025. package/dist/backends/local-jsonl.test.js.map +0 -1
  1026. package/dist/backends/signoz-api-circuit-breaker.test.d.ts +0 -6
  1027. package/dist/backends/signoz-api-circuit-breaker.test.d.ts.map +0 -1
  1028. package/dist/backends/signoz-api-circuit-breaker.test.js +0 -548
  1029. package/dist/backends/signoz-api-circuit-breaker.test.js.map +0 -1
  1030. package/dist/backends/signoz-api-rate-limiter.test.d.ts +0 -6
  1031. package/dist/backends/signoz-api-rate-limiter.test.d.ts.map +0 -1
  1032. package/dist/backends/signoz-api-rate-limiter.test.js +0 -390
  1033. package/dist/backends/signoz-api-rate-limiter.test.js.map +0 -1
  1034. package/dist/backends/signoz-api-ssrf.test.d.ts +0 -6
  1035. package/dist/backends/signoz-api-ssrf.test.d.ts.map +0 -1
  1036. package/dist/backends/signoz-api-ssrf.test.js +0 -216
  1037. package/dist/backends/signoz-api-ssrf.test.js.map +0 -1
  1038. package/dist/backends/signoz-api-test-helpers.d.ts +0 -80
  1039. package/dist/backends/signoz-api-test-helpers.d.ts.map +0 -1
  1040. package/dist/backends/signoz-api-test-helpers.js +0 -79
  1041. package/dist/backends/signoz-api-test-helpers.js.map +0 -1
  1042. package/dist/backends/signoz-api.d.ts +0 -109
  1043. package/dist/backends/signoz-api.d.ts.map +0 -1
  1044. package/dist/backends/signoz-api.integration.test.d.ts +0 -8
  1045. package/dist/backends/signoz-api.integration.test.d.ts.map +0 -1
  1046. package/dist/backends/signoz-api.integration.test.js +0 -137
  1047. package/dist/backends/signoz-api.integration.test.js.map +0 -1
  1048. package/dist/backends/signoz-api.js +0 -1132
  1049. package/dist/backends/signoz-api.js.map +0 -1
  1050. package/dist/backends/signoz-api.test.d.ts +0 -11
  1051. package/dist/backends/signoz-api.test.d.ts.map +0 -1
  1052. package/dist/backends/signoz-api.test.js +0 -832
  1053. package/dist/backends/signoz-api.test.js.map +0 -1
  1054. package/dist/lib/agent-as-judge.d.ts +0 -388
  1055. package/dist/lib/agent-as-judge.d.ts.map +0 -1
  1056. package/dist/lib/agent-as-judge.js +0 -740
  1057. package/dist/lib/agent-as-judge.js.map +0 -1
  1058. package/dist/lib/agent-as-judge.test.d.ts.map +0 -1
  1059. package/dist/lib/agent-as-judge.test.js +0 -816
  1060. package/dist/lib/agent-as-judge.test.js.map +0 -1
  1061. package/dist/lib/cache.d.ts +0 -90
  1062. package/dist/lib/cache.d.ts.map +0 -1
  1063. package/dist/lib/cache.js +0 -133
  1064. package/dist/lib/cache.js.map +0 -1
  1065. package/dist/lib/cache.test.d.ts.map +0 -1
  1066. package/dist/lib/cache.test.js +0 -105
  1067. package/dist/lib/cache.test.js.map +0 -1
  1068. package/dist/lib/circuit-breaker.d.ts +0 -101
  1069. package/dist/lib/circuit-breaker.d.ts.map +0 -1
  1070. package/dist/lib/circuit-breaker.js +0 -158
  1071. package/dist/lib/circuit-breaker.js.map +0 -1
  1072. package/dist/lib/circuit-breaker.test.d.ts.map +0 -1
  1073. package/dist/lib/circuit-breaker.test.js +0 -263
  1074. package/dist/lib/circuit-breaker.test.js.map +0 -1
  1075. package/dist/lib/confident-export.d.ts +0 -101
  1076. package/dist/lib/confident-export.d.ts.map +0 -1
  1077. package/dist/lib/confident-export.js +0 -393
  1078. package/dist/lib/confident-export.js.map +0 -1
  1079. package/dist/lib/confident-export.test.d.ts.map +0 -1
  1080. package/dist/lib/confident-export.test.js +0 -835
  1081. package/dist/lib/confident-export.test.js.map +0 -1
  1082. package/dist/lib/constants-symlink.test.d.ts.map +0 -1
  1083. package/dist/lib/constants-symlink.test.js +0 -357
  1084. package/dist/lib/constants-symlink.test.js.map +0 -1
  1085. package/dist/lib/constants.d.ts +0 -183
  1086. package/dist/lib/constants.d.ts.map +0 -1
  1087. package/dist/lib/constants.js +0 -453
  1088. package/dist/lib/constants.js.map +0 -1
  1089. package/dist/lib/constants.test.d.ts.map +0 -1
  1090. package/dist/lib/constants.test.js +0 -717
  1091. package/dist/lib/constants.test.js.map +0 -1
  1092. package/dist/lib/datadog-export.d.ts +0 -156
  1093. package/dist/lib/datadog-export.d.ts.map +0 -1
  1094. package/dist/lib/datadog-export.js +0 -464
  1095. package/dist/lib/datadog-export.js.map +0 -1
  1096. package/dist/lib/datadog-export.test.d.ts +0 -14
  1097. package/dist/lib/datadog-export.test.d.ts.map +0 -1
  1098. package/dist/lib/datadog-export.test.js +0 -890
  1099. package/dist/lib/datadog-export.test.js.map +0 -1
  1100. package/dist/lib/edge-cases.test.d.ts.map +0 -1
  1101. package/dist/lib/edge-cases.test.js +0 -634
  1102. package/dist/lib/edge-cases.test.js.map +0 -1
  1103. package/dist/lib/error-sanitizer.d.ts +0 -57
  1104. package/dist/lib/error-sanitizer.d.ts.map +0 -1
  1105. package/dist/lib/error-sanitizer.js +0 -233
  1106. package/dist/lib/error-sanitizer.js.map +0 -1
  1107. package/dist/lib/error-sanitizer.test.d.ts.map +0 -1
  1108. package/dist/lib/error-sanitizer.test.js +0 -528
  1109. package/dist/lib/error-sanitizer.test.js.map +0 -1
  1110. package/dist/lib/error-types.d.ts +0 -54
  1111. package/dist/lib/error-types.d.ts.map +0 -1
  1112. package/dist/lib/error-types.js +0 -154
  1113. package/dist/lib/error-types.js.map +0 -1
  1114. package/dist/lib/error-types.test.d.ts.map +0 -1
  1115. package/dist/lib/error-types.test.js +0 -196
  1116. package/dist/lib/error-types.test.js.map +0 -1
  1117. package/dist/lib/evaluation-hooks.d.ts +0 -49
  1118. package/dist/lib/evaluation-hooks.d.ts.map +0 -1
  1119. package/dist/lib/evaluation-hooks.js +0 -488
  1120. package/dist/lib/evaluation-hooks.js.map +0 -1
  1121. package/dist/lib/evaluation-hooks.test.d.ts.map +0 -1
  1122. package/dist/lib/evaluation-hooks.test.js +0 -624
  1123. package/dist/lib/evaluation-hooks.test.js.map +0 -1
  1124. package/dist/lib/export-utils.d.ts +0 -99
  1125. package/dist/lib/export-utils.d.ts.map +0 -1
  1126. package/dist/lib/export-utils.js +0 -238
  1127. package/dist/lib/export-utils.js.map +0 -1
  1128. package/dist/lib/export-utils.test.d.ts.map +0 -1
  1129. package/dist/lib/export-utils.test.js +0 -193
  1130. package/dist/lib/export-utils.test.js.map +0 -1
  1131. package/dist/lib/file-utils.d.ts +0 -320
  1132. package/dist/lib/file-utils.d.ts.map +0 -1
  1133. package/dist/lib/file-utils.js +0 -816
  1134. package/dist/lib/file-utils.js.map +0 -1
  1135. package/dist/lib/file-utils.test.d.ts.map +0 -1
  1136. package/dist/lib/file-utils.test.js +0 -1333
  1137. package/dist/lib/file-utils.test.js.map +0 -1
  1138. package/dist/lib/histogram.d.ts +0 -119
  1139. package/dist/lib/histogram.d.ts.map +0 -1
  1140. package/dist/lib/histogram.js +0 -202
  1141. package/dist/lib/histogram.js.map +0 -1
  1142. package/dist/lib/histogram.test.d.ts.map +0 -1
  1143. package/dist/lib/histogram.test.js +0 -381
  1144. package/dist/lib/histogram.test.js.map +0 -1
  1145. package/dist/lib/indexer.d.ts +0 -96
  1146. package/dist/lib/indexer.d.ts.map +0 -1
  1147. package/dist/lib/indexer.js +0 -353
  1148. package/dist/lib/indexer.js.map +0 -1
  1149. package/dist/lib/indexer.test.d.ts.map +0 -1
  1150. package/dist/lib/indexer.test.js +0 -696
  1151. package/dist/lib/indexer.test.js.map +0 -1
  1152. package/dist/lib/input-validator.d.ts +0 -115
  1153. package/dist/lib/input-validator.d.ts.map +0 -1
  1154. package/dist/lib/input-validator.fuzz.test.d.ts.map +0 -1
  1155. package/dist/lib/input-validator.fuzz.test.js +0 -290
  1156. package/dist/lib/input-validator.fuzz.test.js.map +0 -1
  1157. package/dist/lib/input-validator.js +0 -304
  1158. package/dist/lib/input-validator.js.map +0 -1
  1159. package/dist/lib/input-validator.test.d.ts.map +0 -1
  1160. package/dist/lib/input-validator.test.js +0 -415
  1161. package/dist/lib/input-validator.test.js.map +0 -1
  1162. package/dist/lib/instrumentation.d.ts +0 -153
  1163. package/dist/lib/instrumentation.d.ts.map +0 -1
  1164. package/dist/lib/instrumentation.integration.test.d.ts.map +0 -1
  1165. package/dist/lib/instrumentation.integration.test.js +0 -589
  1166. package/dist/lib/instrumentation.integration.test.js.map +0 -1
  1167. package/dist/lib/instrumentation.js +0 -520
  1168. package/dist/lib/instrumentation.js.map +0 -1
  1169. package/dist/lib/instrumentation.test.d.ts.map +0 -1
  1170. package/dist/lib/instrumentation.test.js +0 -821
  1171. package/dist/lib/instrumentation.test.js.map +0 -1
  1172. package/dist/lib/langfuse-export.d.ts +0 -125
  1173. package/dist/lib/langfuse-export.d.ts.map +0 -1
  1174. package/dist/lib/langfuse-export.js +0 -367
  1175. package/dist/lib/langfuse-export.js.map +0 -1
  1176. package/dist/lib/langfuse-export.test.d.ts.map +0 -1
  1177. package/dist/lib/langfuse-export.test.js +0 -1007
  1178. package/dist/lib/langfuse-export.test.js.map +0 -1
  1179. package/dist/lib/llm-as-judge.d.ts +0 -657
  1180. package/dist/lib/llm-as-judge.d.ts.map +0 -1
  1181. package/dist/lib/llm-as-judge.js +0 -1397
  1182. package/dist/lib/llm-as-judge.js.map +0 -1
  1183. package/dist/lib/llm-as-judge.test.d.ts.map +0 -1
  1184. package/dist/lib/llm-as-judge.test.js +0 -2409
  1185. package/dist/lib/llm-as-judge.test.js.map +0 -1
  1186. package/dist/lib/logger.d.ts +0 -46
  1187. package/dist/lib/logger.d.ts.map +0 -1
  1188. package/dist/lib/logger.js +0 -81
  1189. package/dist/lib/logger.js.map +0 -1
  1190. package/dist/lib/logger.test.d.ts.map +0 -1
  1191. package/dist/lib/logger.test.js.map +0 -1
  1192. package/dist/lib/metrics.d.ts +0 -62
  1193. package/dist/lib/metrics.d.ts.map +0 -1
  1194. package/dist/lib/metrics.js +0 -166
  1195. package/dist/lib/metrics.js.map +0 -1
  1196. package/dist/lib/metrics.test.d.ts.map +0 -1
  1197. package/dist/lib/metrics.test.js +0 -189
  1198. package/dist/lib/metrics.test.js.map +0 -1
  1199. package/dist/lib/otlp-export.d.ts +0 -178
  1200. package/dist/lib/otlp-export.d.ts.map +0 -1
  1201. package/dist/lib/otlp-export.js +0 -382
  1202. package/dist/lib/otlp-export.js.map +0 -1
  1203. package/dist/lib/parse-stats.d.ts.map +0 -1
  1204. package/dist/lib/parse-stats.js +0 -206
  1205. package/dist/lib/parse-stats.js.map +0 -1
  1206. package/dist/lib/parse-stats.test.d.ts.map +0 -1
  1207. package/dist/lib/parse-stats.test.js +0 -283
  1208. package/dist/lib/parse-stats.test.js.map +0 -1
  1209. package/dist/lib/phoenix-export.d.ts +0 -109
  1210. package/dist/lib/phoenix-export.d.ts.map +0 -1
  1211. package/dist/lib/phoenix-export.js +0 -429
  1212. package/dist/lib/phoenix-export.js.map +0 -1
  1213. package/dist/lib/phoenix-export.test.d.ts.map +0 -1
  1214. package/dist/lib/phoenix-export.test.js +0 -725
  1215. package/dist/lib/phoenix-export.test.js.map +0 -1
  1216. package/dist/lib/query-sanitizer.d.ts.map +0 -1
  1217. package/dist/lib/query-sanitizer.js +0 -261
  1218. package/dist/lib/query-sanitizer.js.map +0 -1
  1219. package/dist/lib/query-sanitizer.test.d.ts.map +0 -1
  1220. package/dist/lib/query-sanitizer.test.js +0 -400
  1221. package/dist/lib/query-sanitizer.test.js.map +0 -1
  1222. package/dist/lib/server-utils.d.ts +0 -93
  1223. package/dist/lib/server-utils.d.ts.map +0 -1
  1224. package/dist/lib/server-utils.js +0 -181
  1225. package/dist/lib/server-utils.js.map +0 -1
  1226. package/dist/lib/shared-schemas.d.ts +0 -87
  1227. package/dist/lib/shared-schemas.d.ts.map +0 -1
  1228. package/dist/lib/shared-schemas.js +0 -87
  1229. package/dist/lib/shared-schemas.js.map +0 -1
  1230. package/dist/lib/shared-schemas.test.d.ts.map +0 -1
  1231. package/dist/lib/shared-schemas.test.js +0 -106
  1232. package/dist/lib/shared-schemas.test.js.map +0 -1
  1233. package/dist/lib/toon-encoder.d.ts +0 -26
  1234. package/dist/lib/toon-encoder.d.ts.map +0 -1
  1235. package/dist/lib/toon-encoder.js +0 -61
  1236. package/dist/lib/toon-encoder.js.map +0 -1
  1237. package/dist/lib/toon-encoder.test.d.ts.map +0 -1
  1238. package/dist/lib/toon-encoder.test.js +0 -85
  1239. package/dist/lib/toon-encoder.test.js.map +0 -1
  1240. package/dist/lib/verification-events.d.ts +0 -100
  1241. package/dist/lib/verification-events.d.ts.map +0 -1
  1242. package/dist/lib/verification-events.js +0 -162
  1243. package/dist/lib/verification-events.js.map +0 -1
  1244. package/dist/lib/verification-events.test.d.ts.map +0 -1
  1245. package/dist/lib/verification-events.test.js +0 -193
  1246. package/dist/lib/verification-events.test.js.map +0 -1
  1247. package/dist/tools/signoz.integration.test.d.ts +0 -8
  1248. package/dist/tools/signoz.integration.test.d.ts.map +0 -1
  1249. package/dist/tools/signoz.integration.test.js +0 -141
  1250. package/dist/tools/signoz.integration.test.js.map +0 -1
  1251. package/dist/types/evaluation-hooks.d.ts +0 -176
  1252. package/dist/types/evaluation-hooks.d.ts.map +0 -1
  1253. package/dist/types/evaluation-hooks.js +0 -49
  1254. package/dist/types/evaluation-hooks.js.map +0 -1
  1255. /package/dist/lib/{agent-as-judge.test.d.ts → agent-judge/agent-as-judge.test.d.ts} +0 -0
  1256. /package/dist/lib/{verification-events.test.d.ts → audit/verification-events.test.d.ts} +0 -0
  1257. /package/dist/lib/{constants-symlink.test.d.ts → core/constants-symlink.test.d.ts} +0 -0
  1258. /package/dist/lib/{constants.test.d.ts → core/constants.test.d.ts} +0 -0
  1259. /package/dist/lib/{edge-cases.test.d.ts → core/edge-cases.test.d.ts} +0 -0
  1260. /package/dist/lib/{file-utils.test.d.ts → core/file-utils.test.d.ts} +0 -0
  1261. /package/dist/lib/{input-validator.fuzz.test.d.ts → core/input-validator.fuzz.test.d.ts} +0 -0
  1262. /package/dist/lib/{input-validator.test.d.ts → core/input-validator.test.d.ts} +0 -0
  1263. /package/dist/lib/{logger.test.d.ts → core/logger.test.d.ts} +0 -0
  1264. /package/dist/lib/{logger.test.js → core/logger.test.js} +0 -0
  1265. /package/dist/lib/{shared-schemas.test.d.ts → core/shared-schemas.test.d.ts} +0 -0
  1266. /package/dist/lib/{error-sanitizer.test.d.ts → errors/error-sanitizer.test.d.ts} +0 -0
  1267. /package/dist/lib/{error-types.test.d.ts → errors/error-types.test.d.ts} +0 -0
  1268. /package/dist/lib/{query-sanitizer.d.ts → errors/query-sanitizer.d.ts} +0 -0
  1269. /package/dist/lib/{query-sanitizer.test.d.ts → errors/query-sanitizer.test.d.ts} +0 -0
  1270. /package/dist/lib/{confident-export.test.d.ts → exports/confident-export.test.d.ts} +0 -0
  1271. /package/dist/lib/{export-utils.test.d.ts → exports/export-utils.test.d.ts} +0 -0
  1272. /package/dist/lib/{langfuse-export.test.d.ts → exports/langfuse-export.test.d.ts} +0 -0
  1273. /package/dist/lib/{phoenix-export.test.d.ts → exports/phoenix-export.test.d.ts} +0 -0
  1274. /package/dist/lib/{evaluation-hooks.test.d.ts → judge/evaluation-hooks.test.d.ts} +0 -0
  1275. /package/dist/lib/{llm-as-judge.test.d.ts → judge/llm-as-judge.test.d.ts} +0 -0
  1276. /package/dist/lib/{histogram.test.d.ts → observability/histogram.test.d.ts} +0 -0
  1277. /package/dist/lib/{indexer.test.d.ts → observability/indexer.test.d.ts} +0 -0
  1278. /package/dist/lib/{instrumentation.integration.test.d.ts → observability/instrumentation.integration.test.d.ts} +0 -0
  1279. /package/dist/lib/{instrumentation.test.d.ts → observability/instrumentation.test.d.ts} +0 -0
  1280. /package/dist/lib/{metrics.test.d.ts → observability/metrics.test.d.ts} +0 -0
  1281. /package/dist/lib/{parse-stats.d.ts → observability/parse-stats.d.ts} +0 -0
  1282. /package/dist/lib/{parse-stats.test.d.ts → observability/parse-stats.test.d.ts} +0 -0
  1283. /package/dist/lib/{cache.test.d.ts → resilience/cache.test.d.ts} +0 -0
  1284. /package/dist/lib/{circuit-breaker.test.d.ts → resilience/circuit-breaker.test.d.ts} +0 -0
  1285. /package/dist/lib/{toon-encoder.test.d.ts → resilience/toon-encoder.test.d.ts} +0 -0
@@ -0,0 +1,1020 @@
1
+ /**
2
+ * Tests for langfuse-export.ts
3
+ *
4
+ * Covers config validation, auth header creation, OTLP conversion, and batching.
5
+ */
6
+ import { describe, it, beforeEach, afterEach, mock } from 'node:test';
7
+ import assert from 'node:assert';
8
+ import { validateLangfuseUrl, validateLangfuseConfig, createLangfuseAuthHeader, evaluationsToOTLPTraces, exportToLangfuse, } from './langfuse-export.js';
9
+ import { HttpStatus, OTLP_TRACE_ID_LENGTH } from '../core/constants.js';
10
+ import { ONE_MILLION, BYTES, } from '../core/units.js';
11
+ import { COUNT_HUNDRED, COUNT_THREE, COUNT_TWO, COUNT_TEN, COUNT_FIFTY, COUNT_FOUR, TEST_BEARER_TOKEN, } from '../../test-helpers/test-constants.js';
12
+ const DEFAULT_TIMEOUT_MS = 30_000;
13
+ const AUTH_HEADER_PREFIX_LENGTH = 6;
14
+ const TEST_EVAL_SCORE_RATIO = 0.85;
15
+ const ONE_DAY_NANOSECONDS = 86400000000000n;
16
+ const MEMORY_USAGE_HIGH_MB = 700;
17
+ const MEMORY_USAGE_BASELINE_MB = 100;
18
+ const MEMORY_USAGE_WARNING_MB = 450;
19
+ describe('langfuse-export', () => {
20
+ describe('validateLangfuseUrl', () => {
21
+ describe('valid URLs', () => {
22
+ it('accepts valid HTTPS URL', () => {
23
+ const url = 'https://cloud.langfuse.com';
24
+ assert.strictEqual(validateLangfuseUrl(url), 'https://cloud.langfuse.com');
25
+ });
26
+ it('accepts HTTPS URL with port', () => {
27
+ const url = 'https://langfuse.example.com:8443';
28
+ assert.strictEqual(validateLangfuseUrl(url), 'https://langfuse.example.com:8443');
29
+ });
30
+ it('preserves path for self-hosted Langfuse on subpath', () => {
31
+ // M4 FIX: Support Langfuse hosted on subpaths like /langfuse or /api
32
+ const url = 'https://example.com/langfuse';
33
+ assert.strictEqual(validateLangfuseUrl(url), 'https://example.com/langfuse');
34
+ });
35
+ it('preserves API path prefix', () => {
36
+ const url = 'https://cloud.langfuse.com/api/v1/traces';
37
+ assert.strictEqual(validateLangfuseUrl(url), 'https://cloud.langfuse.com/api/v1/traces');
38
+ });
39
+ it('strips trailing slash from path', () => {
40
+ const url = 'https://example.com/langfuse/';
41
+ assert.strictEqual(validateLangfuseUrl(url), 'https://example.com/langfuse');
42
+ });
43
+ it('strips query params from URL', () => {
44
+ const url = 'https://cloud.langfuse.com?key=value';
45
+ assert.strictEqual(validateLangfuseUrl(url), 'https://cloud.langfuse.com');
46
+ });
47
+ it('strips query params but preserves path', () => {
48
+ const url = 'https://example.com/langfuse?key=value';
49
+ assert.strictEqual(validateLangfuseUrl(url), 'https://example.com/langfuse');
50
+ });
51
+ });
52
+ describe('SSRF protection - rejects localhost', () => {
53
+ it('rejects localhost', () => {
54
+ assert.strictEqual(validateLangfuseUrl('https://localhost'), '');
55
+ });
56
+ it('rejects 127.0.0.1', () => {
57
+ assert.strictEqual(validateLangfuseUrl('https://127.0.0.1'), '');
58
+ });
59
+ it('rejects 127.x.x.x variants', () => {
60
+ assert.strictEqual(validateLangfuseUrl('https://127.100.200.1'), '');
61
+ });
62
+ it('rejects ::1 IPv6 localhost', () => {
63
+ assert.strictEqual(validateLangfuseUrl('https://[::1]'), '');
64
+ });
65
+ it('rejects 0.0.0.0', () => {
66
+ assert.strictEqual(validateLangfuseUrl('https://0.0.0.0'), '');
67
+ });
68
+ it('rejects .localhost TLD', () => {
69
+ assert.strictEqual(validateLangfuseUrl('https://app.localhost'), '');
70
+ });
71
+ });
72
+ describe('SSRF protection - rejects cloud metadata', () => {
73
+ it('rejects AWS/GCP/Azure metadata IP', () => {
74
+ assert.strictEqual(validateLangfuseUrl('https://169.254.169.254'), '');
75
+ });
76
+ it('rejects link-local range', () => {
77
+ assert.strictEqual(validateLangfuseUrl('https://169.254.0.1'), '');
78
+ });
79
+ });
80
+ describe('SSRF protection - rejects private networks', () => {
81
+ it('rejects 10.x.x.x', () => {
82
+ assert.strictEqual(validateLangfuseUrl('https://10.0.0.1'), '');
83
+ });
84
+ it('rejects 192.168.x.x', () => {
85
+ assert.strictEqual(validateLangfuseUrl('https://192.168.1.1'), '');
86
+ });
87
+ it('rejects 172.16-31.x.x', () => {
88
+ assert.strictEqual(validateLangfuseUrl('https://172.16.0.1'), '');
89
+ assert.strictEqual(validateLangfuseUrl('https://172.31.255.255'), '');
90
+ });
91
+ it('rejects fc/fd IPv6 ULA', () => {
92
+ assert.strictEqual(validateLangfuseUrl('https://[fc00::1]'), '');
93
+ assert.strictEqual(validateLangfuseUrl('https://[fd00::1]'), '');
94
+ });
95
+ it('rejects fe80 IPv6 link-local', () => {
96
+ assert.strictEqual(validateLangfuseUrl('https://[fe80::1]'), '');
97
+ });
98
+ });
99
+ describe('SSRF protection - rejects reserved domains', () => {
100
+ it('rejects .local TLD', () => {
101
+ assert.strictEqual(validateLangfuseUrl('https://server.local'), '');
102
+ });
103
+ it('rejects .internal TLD', () => {
104
+ assert.strictEqual(validateLangfuseUrl('https://api.internal'), '');
105
+ });
106
+ it('rejects .localdomain TLD', () => {
107
+ assert.strictEqual(validateLangfuseUrl('https://host.localdomain'), '');
108
+ });
109
+ it('rejects .home.arpa TLD', () => {
110
+ assert.strictEqual(validateLangfuseUrl('https://server.home.arpa'), '');
111
+ });
112
+ });
113
+ describe('SSRF protection - rejects HTTP', () => {
114
+ it('rejects HTTP protocol', () => {
115
+ assert.strictEqual(validateLangfuseUrl('http://cloud.langfuse.com'), '');
116
+ });
117
+ it('rejects file protocol', () => {
118
+ assert.strictEqual(validateLangfuseUrl('file:///etc/passwd'), '');
119
+ });
120
+ });
121
+ describe('edge cases', () => {
122
+ it('returns empty for empty string', () => {
123
+ assert.strictEqual(validateLangfuseUrl(''), '');
124
+ });
125
+ it('returns empty for invalid URL', () => {
126
+ assert.strictEqual(validateLangfuseUrl('not-a-url'), '');
127
+ });
128
+ });
129
+ });
130
+ describe('validateLangfuseConfig', () => {
131
+ const originalEnv = { ...process.env };
132
+ beforeEach(() => {
133
+ delete process.env.LANGFUSE_ENDPOINT;
134
+ delete process.env.LANGFUSE_PUBLIC_KEY;
135
+ delete process.env.LANGFUSE_SECRET_KEY;
136
+ delete process.env.LANGFUSE_BATCH_SIZE;
137
+ delete process.env.LANGFUSE_TIMEOUT_MS;
138
+ });
139
+ afterEach(() => {
140
+ Object.assign(process.env, originalEnv);
141
+ });
142
+ it('throws when endpoint not configured', () => {
143
+ assert.throws(() => validateLangfuseConfig(), /Langfuse endpoint must be a valid URL/);
144
+ });
145
+ it('throws when endpoint is invalid', () => {
146
+ assert.throws(() => validateLangfuseConfig({ endpoint: 'http://localhost' }), /Langfuse endpoint must be HTTPS/);
147
+ });
148
+ it('throws when public key not configured', () => {
149
+ assert.throws(() => validateLangfuseConfig({ endpoint: 'https://cloud.langfuse.com' }), /Langfuse public key is required/);
150
+ });
151
+ it('throws when secret key not configured', () => {
152
+ assert.throws(() => validateLangfuseConfig({
153
+ endpoint: 'https://cloud.langfuse.com',
154
+ publicKey: 'pk-test',
155
+ }), /Langfuse secret key is required/);
156
+ });
157
+ it('returns valid config with all required fields', () => {
158
+ const config = validateLangfuseConfig({
159
+ endpoint: 'https://cloud.langfuse.com',
160
+ publicKey: 'pk-test',
161
+ secretKey: 'sk-test',
162
+ });
163
+ assert.strictEqual(config.endpoint, 'https://cloud.langfuse.com');
164
+ assert.strictEqual(config.publicKey, 'pk-test');
165
+ assert.strictEqual(config.secretKey, 'sk-test');
166
+ assert.strictEqual(config.batchSize, COUNT_HUNDRED); // default
167
+ assert.strictEqual(config.timeoutMs, DEFAULT_TIMEOUT_MS); // default
168
+ });
169
+ it('uses custom batch size', () => {
170
+ const config = validateLangfuseConfig({
171
+ endpoint: 'https://cloud.langfuse.com',
172
+ publicKey: 'pk-test',
173
+ secretKey: 'sk-test',
174
+ batchSize: 50,
175
+ });
176
+ assert.strictEqual(config.batchSize, COUNT_FIFTY);
177
+ });
178
+ it('throws when batch size too small', () => {
179
+ assert.throws(() => validateLangfuseConfig({
180
+ endpoint: 'https://cloud.langfuse.com',
181
+ publicKey: 'pk-test',
182
+ secretKey: 'sk-test',
183
+ batchSize: 0,
184
+ }), /Batch size must be at/);
185
+ });
186
+ it('throws when batch size too large', () => {
187
+ assert.throws(() => validateLangfuseConfig({
188
+ endpoint: 'https://cloud.langfuse.com',
189
+ publicKey: 'pk-test',
190
+ secretKey: 'sk-test',
191
+ batchSize: 1001,
192
+ }), /Batch size must be at/);
193
+ });
194
+ it('throws when timeout too small', () => {
195
+ assert.throws(() => validateLangfuseConfig({
196
+ endpoint: 'https://cloud.langfuse.com',
197
+ publicKey: 'pk-test',
198
+ secretKey: 'sk-test',
199
+ timeoutMs: 500,
200
+ }), /Timeout must be at/);
201
+ });
202
+ it('throws when timeout too large', () => {
203
+ assert.throws(() => validateLangfuseConfig({
204
+ endpoint: 'https://cloud.langfuse.com',
205
+ publicKey: 'pk-test',
206
+ secretKey: 'sk-test',
207
+ timeoutMs: 200000,
208
+ }), /Timeout must be at/);
209
+ });
210
+ });
211
+ describe('createLangfuseAuthHeader', () => {
212
+ it('creates Basic auth header with base64 encoding', () => {
213
+ const header = createLangfuseAuthHeader('pk-test', 'sk-test');
214
+ assert.ok(header.startsWith('Basic '));
215
+ // Decode and verify
216
+ const encoded = header.slice(AUTH_HEADER_PREFIX_LENGTH);
217
+ const decoded = Buffer.from(encoded, 'base64').toString('utf-8');
218
+ assert.strictEqual(decoded, 'pk-test:sk-test');
219
+ });
220
+ it('handles special characters in keys', () => {
221
+ const header = createLangfuseAuthHeader('pk-test+special', 'sk-test=value');
222
+ const encoded = header.slice(AUTH_HEADER_PREFIX_LENGTH);
223
+ const decoded = Buffer.from(encoded, 'base64').toString('utf-8');
224
+ assert.strictEqual(decoded, 'pk-test+special:sk-test=value');
225
+ });
226
+ });
227
+ describe('evaluationsToOTLPTraces', () => {
228
+ const baseEvaluation = {
229
+ timestamp: '2024-01-15T10:00:00Z',
230
+ evaluationName: 'relevance',
231
+ scoreValue: TEST_EVAL_SCORE_RATIO,
232
+ scoreLabel: 'good',
233
+ scoreUnit: 'ratio_0_1',
234
+ explanation: 'The response was relevant',
235
+ evaluator: 'gpt-4',
236
+ evaluatorType: 'llm',
237
+ responseId: 'resp-123',
238
+ traceId: 'abc123def456',
239
+ sessionId: 'session-1',
240
+ };
241
+ it('converts single evaluation to OTLP trace', () => {
242
+ const result = evaluationsToOTLPTraces([baseEvaluation]);
243
+ assert.strictEqual(result.resourceSpans.length, 1);
244
+ assert.strictEqual(result.resourceSpans[0].scopeSpans.length, 1);
245
+ assert.strictEqual(result.resourceSpans[0].scopeSpans[0].spans.length, 1);
246
+ const span = result.resourceSpans[0].scopeSpans[0].spans[0];
247
+ assert.strictEqual(span.traceId, 'abc123def456');
248
+ assert.strictEqual(span.name, 'evaluation_export');
249
+ assert.ok(span.events);
250
+ assert.strictEqual(span.events.length, 1);
251
+ const event = span.events[0];
252
+ assert.strictEqual(event.name, 'gen_ai.evaluation.result');
253
+ assert.ok(event.attributes);
254
+ // Check evaluation attributes
255
+ const attrs = Object.fromEntries(event.attributes.map(a => [a.key, a.value.stringValue ?? a.value.doubleValue]));
256
+ assert.strictEqual(attrs['gen_ai.evaluation.name'], 'relevance');
257
+ assert.strictEqual(attrs['gen_ai.evaluation.score.value'], TEST_EVAL_SCORE_RATIO);
258
+ assert.strictEqual(attrs['gen_ai.evaluation.score.label'], 'good');
259
+ assert.strictEqual(attrs['gen_ai.evaluation.explanation'], 'The response was relevant');
260
+ });
261
+ it('groups multiple evaluations by traceId', () => {
262
+ const evaluations = [
263
+ { ...baseEvaluation, traceId: 'trace-1' },
264
+ { ...baseEvaluation, traceId: 'trace-1', evaluationName: 'quality' },
265
+ { ...baseEvaluation, traceId: 'trace-2' },
266
+ ];
267
+ const result = evaluationsToOTLPTraces(evaluations);
268
+ // Should have 2 spans (one per traceId)
269
+ const spans = result.resourceSpans[0].scopeSpans[0].spans;
270
+ assert.strictEqual(spans.length, COUNT_TWO);
271
+ // Find the trace-1 span
272
+ const trace1Span = spans.find(s => s.traceId === 'trace-1');
273
+ assert.ok(trace1Span);
274
+ assert.strictEqual(trace1Span.events?.length, COUNT_TWO); // Two evaluations for trace-1
275
+ // Find the trace-2 span
276
+ const trace2Span = spans.find(s => s.traceId === 'trace-2');
277
+ assert.ok(trace2Span);
278
+ assert.strictEqual(trace2Span.events?.length, 1);
279
+ });
280
+ it('generates traceId when not provided', () => {
281
+ const evaluation = { ...baseEvaluation };
282
+ delete evaluation.traceId;
283
+ const result = evaluationsToOTLPTraces([evaluation]);
284
+ const span = result.resourceSpans[0].scopeSpans[0].spans[0];
285
+ assert.ok(span.traceId);
286
+ assert.strictEqual(span.traceId.length, OTLP_TRACE_ID_LENGTH); // 32 hex chars
287
+ });
288
+ it('handles evaluations with missing optional fields', () => {
289
+ const minimalEvaluation = {
290
+ timestamp: '2024-01-15T10:00:00Z',
291
+ evaluationName: 'test',
292
+ };
293
+ const result = evaluationsToOTLPTraces([minimalEvaluation]);
294
+ const event = result.resourceSpans[0].scopeSpans[0].spans[0].events?.[0];
295
+ assert.ok(event);
296
+ assert.strictEqual(event.name, 'gen_ai.evaluation.result');
297
+ // Should only have the evaluation name attribute
298
+ const evalNameAttr = event.attributes?.find(a => a.key === 'gen_ai.evaluation.name');
299
+ assert.ok(evalNameAttr);
300
+ assert.strictEqual(evalNameAttr.value.stringValue, 'test');
301
+ });
302
+ it('includes resource attributes', () => {
303
+ const result = evaluationsToOTLPTraces([baseEvaluation]);
304
+ const resourceAttrs = result.resourceSpans[0].resource.attributes;
305
+ const serviceNameAttr = resourceAttrs.find(a => a.key === 'service.name');
306
+ assert.ok(serviceNameAttr);
307
+ assert.strictEqual(serviceNameAttr.value.stringValue, 'observability-toolkit');
308
+ });
309
+ it('handles empty evaluations array', () => {
310
+ const result = evaluationsToOTLPTraces([]);
311
+ assert.strictEqual(result.resourceSpans[0].scopeSpans[0].spans.length, 0);
312
+ });
313
+ // R4 BACKLOG: Extreme timestamp validation (year 3000+)
314
+ describe('extreme timestamp handling', () => {
315
+ it('accepts exactly year 2000 timestamp (minimum boundary)', () => {
316
+ // Year 2000 is exactly EARLIEST_VALID_TIMESTAMP_MS - should be VALID
317
+ const boundaryEval = {
318
+ timestamp: '2000-01-01T00:00:00.000Z',
319
+ evaluationName: 'test-boundary-min',
320
+ };
321
+ const result = evaluationsToOTLPTraces([boundaryEval]);
322
+ const span = result.resourceSpans[0].scopeSpans[0].spans[0];
323
+ // Year 2000 = 946684800000 ms from epoch
324
+ const startNano = BigInt(span.startTimeUnixNano);
325
+ const expectedMs = new Date('2000-01-01T00:00:00.000Z').getTime();
326
+ const expectedNs = BigInt(expectedMs) * BigInt(ONE_MILLION);
327
+ assert.strictEqual(startNano, expectedNs, 'Year 2000 boundary should be precise, not fallback');
328
+ });
329
+ it('accepts exactly year 3000 timestamp (maximum boundary)', () => {
330
+ // Year 3000 is exactly LATEST_VALID_TIMESTAMP_MS - should be VALID
331
+ const extremeEval = {
332
+ timestamp: '3000-01-01T00:00:00Z',
333
+ evaluationName: 'test-boundary-max',
334
+ };
335
+ const result = evaluationsToOTLPTraces([extremeEval]);
336
+ const span = result.resourceSpans[0].scopeSpans[0].spans[0];
337
+ const event = span.events?.[0];
338
+ // Verify the conversion succeeds
339
+ assert.ok(span.startTimeUnixNano, 'startTimeUnixNano should exist');
340
+ assert.ok(event?.timeUnixNano, 'event timeUnixNano should exist');
341
+ // Year 3000 = ~32503680000000 ms from epoch
342
+ const startNano = BigInt(span.startTimeUnixNano);
343
+ const expectedMs = new Date('3000-01-01T00:00:00Z').getTime();
344
+ const expectedNs = BigInt(expectedMs) * BigInt(ONE_MILLION);
345
+ assert.strictEqual(startNano, expectedNs, 'Year 3000 boundary should be precise, not fallback');
346
+ });
347
+ it('uses fallback for year 9999 timestamps (R4 validation)', () => {
348
+ // Year 9999 exceeds MAX_TIMESTAMP_MS (year 3000) - should use fallback
349
+ const maxEval = {
350
+ timestamp: '9999-12-31T23:59:59Z',
351
+ evaluationName: 'test-max-date',
352
+ };
353
+ const result = evaluationsToOTLPTraces([maxEval]);
354
+ const span = result.resourceSpans[0].scopeSpans[0].spans[0];
355
+ // Should use fallback time (Date.now), not the extreme timestamp
356
+ assert.ok(span.startTimeUnixNano);
357
+ const startNano = BigInt(span.startTimeUnixNano);
358
+ // Year 9999 would be ~253402300799000ms; fallback should be much smaller (near now)
359
+ const year9999Ms = new Date('9999-12-31T23:59:59Z').getTime();
360
+ const year9999Ns = BigInt(year9999Ms) * BigInt(ONE_MILLION);
361
+ // Verify we did NOT use the extreme timestamp
362
+ assert.ok(startNano < year9999Ns, 'Should use fallback time, not year 9999 timestamp');
363
+ // Fallback should be within 1 day of now
364
+ const nowNs = BigInt(Date.now()) * BigInt(ONE_MILLION);
365
+ const diff = startNano > nowNs ? startNano - nowNs : nowNs - startNano;
366
+ assert.ok(diff < ONE_DAY_NANOSECONDS, 'Fallback should be within 1 day of now');
367
+ });
368
+ it('uses fallback for invalid date strings', () => {
369
+ const invalidEval = {
370
+ timestamp: 'not-a-valid-date',
371
+ evaluationName: 'test-invalid',
372
+ };
373
+ const result = evaluationsToOTLPTraces([invalidEval]);
374
+ const span = result.resourceSpans[0].scopeSpans[0].spans[0];
375
+ const event = span.events?.[0];
376
+ // Should fall back to current time, not crash
377
+ assert.ok(span.startTimeUnixNano);
378
+ assert.ok(event?.timeUnixNano);
379
+ // Fallback time should be reasonable (within last day)
380
+ const nowNs = BigInt(Date.now()) * BigInt(ONE_MILLION);
381
+ const startNano = BigInt(span.startTimeUnixNano);
382
+ const diff = startNano - nowNs;
383
+ assert.ok(diff < ONE_DAY_NANOSECONDS, 'Fallback should be within 1 day of now');
384
+ });
385
+ it('uses fallback for timestamps before year 2000 (R4 validation)', () => {
386
+ // Year 1999 is before MIN_TIMESTAMP_MS (year 2000) - should use fallback
387
+ const oldEval = {
388
+ timestamp: '1999-12-31T23:59:59Z',
389
+ evaluationName: 'test-old-date',
390
+ };
391
+ const result = evaluationsToOTLPTraces([oldEval]);
392
+ const span = result.resourceSpans[0].scopeSpans[0].spans[0];
393
+ // Should use fallback time (Date.now), not the old timestamp
394
+ assert.ok(span.startTimeUnixNano);
395
+ const startNano = BigInt(span.startTimeUnixNano);
396
+ // Year 1999 would be ~946598399000ms; fallback should be larger (near now)
397
+ const year1999Ms = new Date('1999-12-31T23:59:59Z').getTime();
398
+ const year1999Ns = BigInt(year1999Ms) * BigInt(ONE_MILLION);
399
+ // Verify we did NOT use the old timestamp
400
+ assert.ok(startNano > year1999Ns, 'Should use fallback time, not year 1999 timestamp');
401
+ // Fallback should be within 1 day of now
402
+ const nowNs = BigInt(Date.now()) * BigInt(ONE_MILLION);
403
+ const diff = startNano > nowNs ? startNano - nowNs : nowNs - startNano;
404
+ assert.ok(diff < ONE_DAY_NANOSECONDS, 'Fallback should be within 1 day of now');
405
+ });
406
+ });
407
+ // H3 FIX: BigInt timestamp handling to prevent integer overflow
408
+ describe('BigInt timestamp handling', () => {
409
+ it('handles timestamps near MAX_SAFE_INTEGER without precision loss', () => {
410
+ // Far future timestamp: year 2100 = ~4102444800000 ms
411
+ const farFutureEval = {
412
+ timestamp: '2100-01-01T00:00:00Z',
413
+ evaluationName: 'test-future',
414
+ };
415
+ const result = evaluationsToOTLPTraces([farFutureEval]);
416
+ const span = result.resourceSpans[0].scopeSpans[0].spans[0];
417
+ const event = span.events?.[0];
418
+ // Verify nanosecond timestamps are valid strings
419
+ assert.ok(span.startTimeUnixNano, 'startTimeUnixNano should exist');
420
+ assert.ok(span.endTimeUnixNano, 'endTimeUnixNano should exist');
421
+ assert.ok(event?.timeUnixNano, 'event timeUnixNano should exist');
422
+ // Parse and verify precision (should be 19+ digits for ns timestamps)
423
+ const startNano = BigInt(span.startTimeUnixNano);
424
+ const eventTimeUnixNano = event?.timeUnixNano;
425
+ assert.ok(eventTimeUnixNano);
426
+ const eventNano = BigInt(eventTimeUnixNano);
427
+ // Year 2100 in nanoseconds should be ~4.1e18 - well beyond MAX_SAFE_INTEGER
428
+ assert.ok(startNano > BigInt(Number.MAX_SAFE_INTEGER), 'Timestamp should exceed MAX_SAFE_INTEGER');
429
+ // Verify no precision loss by checking string representation
430
+ // Without BigInt, the result would have trailing zeros or incorrect digits
431
+ const expectedNs = BigInt(new Date('2100-01-01T00:00:00Z').getTime()) * BigInt(ONE_MILLION);
432
+ assert.strictEqual(startNano, expectedNs, 'Nanosecond value should match expected');
433
+ assert.strictEqual(eventNano, expectedNs, 'Event timestamp should match');
434
+ });
435
+ it('handles current timestamps correctly', () => {
436
+ const currentEval = {
437
+ timestamp: '2026-02-01T10:00:00Z',
438
+ evaluationName: 'test-current',
439
+ };
440
+ const result = evaluationsToOTLPTraces([currentEval]);
441
+ const span = result.resourceSpans[0].scopeSpans[0].spans[0];
442
+ // Current timestamps also exceed MAX_SAFE_INTEGER when converted to ns
443
+ const startNano = BigInt(span.startTimeUnixNano);
444
+ const expectedMs = new Date('2026-02-01T10:00:00Z').getTime();
445
+ const expectedNs = BigInt(expectedMs) * BigInt(ONE_MILLION);
446
+ assert.strictEqual(startNano, expectedNs, 'Current timestamp should be precise');
447
+ });
448
+ });
449
+ });
450
+ describe('exportToLangfuse', () => {
451
+ const mockConfig = {
452
+ endpoint: 'https://cloud.langfuse.com',
453
+ publicKey: 'pk-test',
454
+ secretKey: 'sk-test',
455
+ batchSize: 2,
456
+ timeoutMs: 5000,
457
+ };
458
+ const testEvaluations = [
459
+ { timestamp: '2024-01-15T10:00:00Z', evaluationName: 'eval1', scoreValue: 0.8 },
460
+ { timestamp: '2024-01-15T10:00:01Z', evaluationName: 'eval2', scoreValue: 0.9 },
461
+ { timestamp: '2024-01-15T10:00:02Z', evaluationName: 'eval3', scoreValue: 0.7 },
462
+ ];
463
+ it('batches evaluations correctly', async () => {
464
+ const fetchCalls = [];
465
+ // Mock global fetch
466
+ const originalFetch = globalThis.fetch;
467
+ globalThis.fetch = mock.fn(async (url, opts) => {
468
+ fetchCalls.push({ url: url.toString(), body: opts?.body });
469
+ return new Response('{}', { status: HttpStatus.OK });
470
+ });
471
+ try {
472
+ const result = await exportToLangfuse(testEvaluations, mockConfig);
473
+ assert.strictEqual(result.success, true);
474
+ assert.strictEqual(result.evaluationsExported, COUNT_THREE);
475
+ assert.strictEqual(result.batches, COUNT_TWO); // 3 evals / batch size 2 = 2 batches
476
+ assert.strictEqual(result.failed, 0);
477
+ assert.ok(result.durationMs >= 0);
478
+ // Verify fetch was called twice (2 batches)
479
+ assert.strictEqual(fetchCalls.length, COUNT_TWO);
480
+ assert.ok(fetchCalls[0].url.includes('/v1/traces'));
481
+ }
482
+ finally {
483
+ globalThis.fetch = originalFetch;
484
+ }
485
+ });
486
+ it('handles HTTP errors', async () => {
487
+ const originalFetch = globalThis.fetch;
488
+ globalThis.fetch = mock.fn(async () => {
489
+ return new Response('Unauthorized', { status: HttpStatus.UNAUTHORIZED });
490
+ });
491
+ try {
492
+ const result = await exportToLangfuse([testEvaluations[0]], mockConfig);
493
+ assert.strictEqual(result.success, false);
494
+ assert.strictEqual(result.evaluationsExported, 0);
495
+ assert.strictEqual(result.failed, 1);
496
+ assert.ok(result.errors);
497
+ assert.ok(result.errors[0].includes('HTTP 401'));
498
+ }
499
+ finally {
500
+ globalThis.fetch = originalFetch;
501
+ }
502
+ });
503
+ it('handles network errors', async () => {
504
+ const originalFetch = globalThis.fetch;
505
+ globalThis.fetch = mock.fn(async () => {
506
+ throw new Error('Network error');
507
+ });
508
+ try {
509
+ const result = await exportToLangfuse([testEvaluations[0]], mockConfig);
510
+ assert.strictEqual(result.success, false);
511
+ assert.strictEqual(result.failed, 1);
512
+ assert.ok(result.errors);
513
+ assert.ok(result.errors[0].includes('Network error'));
514
+ }
515
+ finally {
516
+ globalThis.fetch = originalFetch;
517
+ }
518
+ });
519
+ it('handles empty evaluations array', async () => {
520
+ const result = await exportToLangfuse([], mockConfig);
521
+ assert.strictEqual(result.success, true);
522
+ assert.strictEqual(result.evaluationsExported, 0);
523
+ assert.strictEqual(result.batches, 0);
524
+ assert.strictEqual(result.failed, 0);
525
+ });
526
+ it('includes correct authorization header', async () => {
527
+ let capturedHeaders = {};
528
+ const originalFetch = globalThis.fetch;
529
+ globalThis.fetch = mock.fn(async (_url, opts) => {
530
+ capturedHeaders = Object.fromEntries(Object.entries(opts?.headers || {}));
531
+ return new Response('{}', { status: HttpStatus.OK });
532
+ });
533
+ try {
534
+ await exportToLangfuse([testEvaluations[0]], mockConfig);
535
+ assert.ok(capturedHeaders['Authorization']);
536
+ assert.ok(capturedHeaders['Authorization'].startsWith('Basic '));
537
+ assert.strictEqual(capturedHeaders['Content-Type'], 'application/json');
538
+ }
539
+ finally {
540
+ globalThis.fetch = originalFetch;
541
+ }
542
+ });
543
+ it('handles partial batch failures', async () => {
544
+ let callCount = 0;
545
+ const originalFetch = globalThis.fetch;
546
+ globalThis.fetch = mock.fn(async () => {
547
+ callCount++;
548
+ if (callCount === 1) {
549
+ return new Response('{}', { status: HttpStatus.OK });
550
+ }
551
+ return new Response('Server Error', { status: HttpStatus.INTERNAL_SERVER_ERROR });
552
+ });
553
+ try {
554
+ const result = await exportToLangfuse(testEvaluations, {
555
+ ...mockConfig,
556
+ batchSize: 2,
557
+ });
558
+ // First batch of 2 succeeds, second batch of 1 fails
559
+ assert.strictEqual(result.success, false);
560
+ assert.strictEqual(result.evaluationsExported, COUNT_TWO);
561
+ assert.strictEqual(result.failed, 1);
562
+ assert.strictEqual(result.batches, COUNT_TWO);
563
+ }
564
+ finally {
565
+ globalThis.fetch = originalFetch;
566
+ }
567
+ });
568
+ // C2 FIX: Credential sanitization tests
569
+ describe('credential sanitization in error responses', () => {
570
+ it('sanitizes Basic auth tokens in error text', async () => {
571
+ const originalFetch = globalThis.fetch;
572
+ const originalConsoleError = console.error;
573
+ let loggedMessage = '';
574
+ console.error = (msg) => { loggedMessage = msg; };
575
+ globalThis.fetch = mock.fn(async () => {
576
+ return new Response('Invalid credentials: Basic cGstdGVzdDpzay10ZXN0', { status: HttpStatus.UNAUTHORIZED });
577
+ });
578
+ try {
579
+ await exportToLangfuse([testEvaluations[0]], mockConfig);
580
+ assert.ok(!loggedMessage.includes('cGstdGVzdDpzay10ZXN0'), 'Base64 credentials should be redacted');
581
+ assert.ok(loggedMessage.includes('[REDACTED]'), 'Should contain [REDACTED]');
582
+ }
583
+ finally {
584
+ globalThis.fetch = originalFetch;
585
+ console.error = originalConsoleError;
586
+ }
587
+ });
588
+ it('sanitizes pk-xxx:sk-xxx patterns in error text', async () => {
589
+ const originalFetch = globalThis.fetch;
590
+ const originalConsoleError = console.error;
591
+ let loggedMessage = '';
592
+ console.error = (msg) => { loggedMessage = msg; };
593
+ globalThis.fetch = mock.fn(async () => {
594
+ return new Response('Bad key: pk-mykey123:sk-mysecret456', { status: HttpStatus.UNAUTHORIZED });
595
+ });
596
+ try {
597
+ await exportToLangfuse([testEvaluations[0]], mockConfig);
598
+ assert.ok(!loggedMessage.includes('pk-mykey123'), 'Public key should be redacted');
599
+ assert.ok(!loggedMessage.includes('sk-mysecret456'), 'Secret key should be redacted');
600
+ assert.ok(loggedMessage.includes('[REDACTED]'), 'Should contain [REDACTED]');
601
+ }
602
+ finally {
603
+ globalThis.fetch = originalFetch;
604
+ console.error = originalConsoleError;
605
+ }
606
+ });
607
+ it('sanitizes Bearer tokens in error text', async () => {
608
+ const originalFetch = globalThis.fetch;
609
+ const originalConsoleError = console.error;
610
+ let loggedMessage = '';
611
+ console.error = (msg) => { loggedMessage = msg; };
612
+ globalThis.fetch = mock.fn(async () => {
613
+ return new Response(`Invalid Bearer ${TEST_BEARER_TOKEN}`, { status: HttpStatus.UNAUTHORIZED });
614
+ });
615
+ try {
616
+ await exportToLangfuse([testEvaluations[0]], mockConfig);
617
+ assert.ok(!loggedMessage.includes(TEST_BEARER_TOKEN), 'JWT should be redacted');
618
+ assert.ok(loggedMessage.includes('[REDACTED]'), 'Should contain [REDACTED]');
619
+ }
620
+ finally {
621
+ globalThis.fetch = originalFetch;
622
+ console.error = originalConsoleError;
623
+ }
624
+ });
625
+ });
626
+ // BACKLOG: Concurrent exports test
627
+ describe('concurrent exports', () => {
628
+ it('handles multiple simultaneous exports without interference', async () => {
629
+ const fetchCalls = [];
630
+ let batchCounter = 0;
631
+ const originalFetch = globalThis.fetch;
632
+ globalThis.fetch = mock.fn(async () => {
633
+ const batch = ++batchCounter;
634
+ fetchCalls.push({ batch, timestamp: Date.now() });
635
+ // Simulate network latency
636
+ await new Promise(resolve => setTimeout(resolve, COUNT_TEN));
637
+ return new Response('{}', { status: HttpStatus.OK });
638
+ });
639
+ try {
640
+ // Launch 3 concurrent exports
641
+ const [result1, result2, result3] = await Promise.all([
642
+ exportToLangfuse([testEvaluations[0]], { ...mockConfig, batchSize: 1 }),
643
+ exportToLangfuse([testEvaluations[1]], { ...mockConfig, batchSize: 1 }),
644
+ exportToLangfuse([testEvaluations[2]], { ...mockConfig, batchSize: 1 }),
645
+ ]);
646
+ // All exports should succeed
647
+ assert.strictEqual(result1.success, true);
648
+ assert.strictEqual(result2.success, true);
649
+ assert.strictEqual(result3.success, true);
650
+ // Total should be 3 fetches
651
+ assert.strictEqual(fetchCalls.length, COUNT_THREE);
652
+ // Combined exports should total 3 evaluations
653
+ const totalExported = result1.evaluationsExported + result2.evaluationsExported + result3.evaluationsExported;
654
+ assert.strictEqual(totalExported, COUNT_THREE);
655
+ }
656
+ finally {
657
+ globalThis.fetch = originalFetch;
658
+ }
659
+ });
660
+ it('prevents cascade failures in concurrent exports', async () => {
661
+ const originalFetch = globalThis.fetch;
662
+ globalThis.fetch = mock.fn(async (_url, options) => {
663
+ // Parse the body to identify which export this is by evaluation name
664
+ const body = options?.body;
665
+ const isSecondExport = body?.includes('eval2');
666
+ // Second export fails with 400 (client error, not retried)
667
+ if (isSecondExport) {
668
+ return new Response('Bad Request', { status: HttpStatus.BAD_REQUEST });
669
+ }
670
+ return new Response('{}', { status: HttpStatus.OK });
671
+ });
672
+ try {
673
+ const [result1, result2, result3] = await Promise.all([
674
+ exportToLangfuse([testEvaluations[0]], { ...mockConfig, batchSize: 1, timeoutMs: 1000 }),
675
+ exportToLangfuse([testEvaluations[1]], { ...mockConfig, batchSize: 1, timeoutMs: 1000 }),
676
+ exportToLangfuse([testEvaluations[2]], { ...mockConfig, batchSize: 1, timeoutMs: 1000 }),
677
+ ]);
678
+ // First and third exports should succeed, second should fail
679
+ // This verifies failures don't cascade to other concurrent exports
680
+ assert.ok(result1.success, 'First export should succeed');
681
+ assert.ok(!result2.success, 'Second export should fail (400 client error)');
682
+ assert.ok(result3.success, 'Third export should succeed');
683
+ }
684
+ finally {
685
+ globalThis.fetch = originalFetch;
686
+ }
687
+ });
688
+ });
689
+ // BACKLOG: Memory threshold behavior test
690
+ describe('memory protection', () => {
691
+ it('aborts export when memory exceeds threshold', async () => {
692
+ // Mock process.memoryUsage to return high heap usage
693
+ const originalMemoryUsage = process.memoryUsage;
694
+ let memoryCallCount = 0;
695
+ process.memoryUsage = (() => {
696
+ memoryCallCount++;
697
+ // After first batch, simulate high memory (700MB)
698
+ const heapUsed = memoryCallCount > 1
699
+ ? MEMORY_USAGE_HIGH_MB * BYTES.MB
700
+ : MEMORY_USAGE_BASELINE_MB * BYTES.MB;
701
+ return {
702
+ heapUsed,
703
+ heapTotal: BYTES.KB * BYTES.MB,
704
+ external: 0,
705
+ arrayBuffers: 0,
706
+ rss: 0,
707
+ };
708
+ });
709
+ const originalFetch = globalThis.fetch;
710
+ globalThis.fetch = mock.fn(async () => {
711
+ return new Response('{}', { status: HttpStatus.OK });
712
+ });
713
+ try {
714
+ const manyEvaluations = Array.from({ length: COUNT_HUNDRED }, (_, i) => ({
715
+ timestamp: '2024-01-15T10:00:00Z',
716
+ evaluationName: `eval-${i}`,
717
+ scoreValue: 0.5,
718
+ }));
719
+ const result = await exportToLangfuse(manyEvaluations, {
720
+ ...mockConfig,
721
+ batchSize: COUNT_TEN, // 10 batches needed
722
+ });
723
+ // Should abort partway through
724
+ assert.strictEqual(result.success, false);
725
+ assert.ok(result.failed > 0, 'Should have some failed evaluations');
726
+ assert.ok(result.errors?.some(e => e.includes('Memory limit exceeded')));
727
+ // Should not export all 100
728
+ assert.ok(result.evaluationsExported < COUNT_HUNDRED, 'Should abort before exporting all');
729
+ }
730
+ finally {
731
+ process.memoryUsage = originalMemoryUsage;
732
+ globalThis.fetch = originalFetch;
733
+ }
734
+ });
735
+ it('logs warning when memory is high but continues', async () => {
736
+ const warnings = [];
737
+ const originalWarn = console.warn;
738
+ console.warn = (msg) => { warnings.push(msg); };
739
+ // Mock process.memoryUsage to return moderately high usage (450MB)
740
+ const originalMemoryUsage = process.memoryUsage;
741
+ process.memoryUsage = (() => ({
742
+ heapUsed: MEMORY_USAGE_WARNING_MB * BYTES.MB, // Above 400MB warning threshold
743
+ heapTotal: BYTES.KB * BYTES.MB,
744
+ external: 0,
745
+ arrayBuffers: 0,
746
+ rss: 0,
747
+ }));
748
+ const originalFetch = globalThis.fetch;
749
+ globalThis.fetch = mock.fn(async () => {
750
+ return new Response('{}', { status: HttpStatus.OK });
751
+ });
752
+ try {
753
+ const evaluations = Array.from({ length: COUNT_TEN }, (_, i) => ({
754
+ timestamp: '2024-01-15T10:00:00Z',
755
+ evaluationName: `eval-${i}`,
756
+ scoreValue: 0.5,
757
+ }));
758
+ const result = await exportToLangfuse(evaluations, {
759
+ ...mockConfig,
760
+ batchSize: COUNT_TEN,
761
+ });
762
+ // Should succeed despite high memory (below abort threshold)
763
+ assert.strictEqual(result.success, true);
764
+ assert.strictEqual(result.evaluationsExported, COUNT_TEN);
765
+ // Should have logged a memory warning
766
+ assert.ok(warnings.some(w => w.includes('High memory usage')), 'Should warn about high memory usage');
767
+ }
768
+ finally {
769
+ console.warn = originalWarn;
770
+ process.memoryUsage = originalMemoryUsage;
771
+ globalThis.fetch = originalFetch;
772
+ }
773
+ });
774
+ });
775
+ // C1 FIX: DNS rebinding protection tests
776
+ describe('DNS rebinding protection', () => {
777
+ it('re-validates endpoint before each batch', async () => {
778
+ let fetchCallCount = 0;
779
+ const originalFetch = globalThis.fetch;
780
+ globalThis.fetch = mock.fn(async () => {
781
+ fetchCallCount++;
782
+ return new Response('{}', { status: HttpStatus.OK });
783
+ });
784
+ try {
785
+ // With batch size 1 and 3 evaluations, should call fetch 3 times
786
+ // Each call should re-validate the URL
787
+ const result = await exportToLangfuse(testEvaluations, {
788
+ ...mockConfig,
789
+ batchSize: 1,
790
+ });
791
+ assert.strictEqual(result.success, true);
792
+ assert.strictEqual(result.batches, COUNT_THREE);
793
+ assert.strictEqual(fetchCallCount, COUNT_THREE);
794
+ }
795
+ finally {
796
+ globalThis.fetch = originalFetch;
797
+ }
798
+ });
799
+ it('fails batch if endpoint becomes invalid mid-export', async () => {
800
+ // This tests the DNS rebinding protection: if the endpoint
801
+ // was modified to point to a blocked address between batches,
802
+ // subsequent batches should fail validation
803
+ let fetchCallCount = 0;
804
+ const originalFetch = globalThis.fetch;
805
+ globalThis.fetch = mock.fn(async () => {
806
+ fetchCallCount++;
807
+ return new Response('{}', { status: HttpStatus.OK });
808
+ });
809
+ try {
810
+ // Use an invalid endpoint that will fail re-validation
811
+ const result = await exportToLangfuse(testEvaluations, {
812
+ ...mockConfig,
813
+ endpoint: 'http://localhost', // HTTP not allowed, will fail validation
814
+ batchSize: 1,
815
+ });
816
+ // All batches should fail due to invalid endpoint
817
+ assert.strictEqual(result.success, false);
818
+ assert.strictEqual(result.failed, COUNT_THREE);
819
+ assert.strictEqual(fetchCallCount, 0); // No fetch calls made
820
+ assert.ok(result.errors?.some(e => e.includes('Endpoint validation failed')));
821
+ }
822
+ finally {
823
+ globalThis.fetch = originalFetch;
824
+ }
825
+ });
826
+ it('continues processing valid batches after endpoint re-validation', async () => {
827
+ let fetchCallCount = 0;
828
+ const originalFetch = globalThis.fetch;
829
+ globalThis.fetch = mock.fn(async () => {
830
+ fetchCallCount++;
831
+ return new Response('{}', { status: HttpStatus.OK });
832
+ });
833
+ try {
834
+ const result = await exportToLangfuse(testEvaluations, {
835
+ ...mockConfig,
836
+ batchSize: 2,
837
+ });
838
+ assert.strictEqual(result.success, true);
839
+ assert.strictEqual(result.batches, COUNT_TWO); // 3 evals / batch 2 = 2 batches
840
+ assert.strictEqual(fetchCallCount, COUNT_TWO);
841
+ }
842
+ finally {
843
+ globalThis.fetch = originalFetch;
844
+ }
845
+ });
846
+ });
847
+ // H1 FIX: Retry logic tests
848
+ describe('retry logic for transient failures', () => {
849
+ it('retries on 429 rate limit response', async () => {
850
+ let fetchCallCount = 0;
851
+ const originalFetch = globalThis.fetch;
852
+ globalThis.fetch = mock.fn(async () => {
853
+ fetchCallCount++;
854
+ // First 2 calls return 429, third succeeds
855
+ if (fetchCallCount <= COUNT_TWO) {
856
+ return new Response('Rate limited', { status: HttpStatus.TOO_MANY_REQUESTS });
857
+ }
858
+ return new Response('{}', { status: HttpStatus.OK });
859
+ });
860
+ try {
861
+ const result = await exportToLangfuse([testEvaluations[0]], {
862
+ ...mockConfig,
863
+ timeoutMs: 100, // Short timeout for faster test
864
+ });
865
+ // Should succeed after retries
866
+ assert.strictEqual(result.success, true);
867
+ assert.strictEqual(result.evaluationsExported, 1);
868
+ // Retried 2 times + 1 successful = 3 calls
869
+ assert.strictEqual(fetchCallCount, COUNT_THREE);
870
+ }
871
+ finally {
872
+ globalThis.fetch = originalFetch;
873
+ }
874
+ });
875
+ it('retries on 500 server error', async () => {
876
+ let fetchCallCount = 0;
877
+ const originalFetch = globalThis.fetch;
878
+ globalThis.fetch = mock.fn(async () => {
879
+ fetchCallCount++;
880
+ // First call returns 500, second succeeds
881
+ if (fetchCallCount === 1) {
882
+ return new Response('Internal Server Error', { status: HttpStatus.INTERNAL_SERVER_ERROR });
883
+ }
884
+ return new Response('{}', { status: HttpStatus.OK });
885
+ });
886
+ try {
887
+ const result = await exportToLangfuse([testEvaluations[0]], {
888
+ ...mockConfig,
889
+ timeoutMs: 100,
890
+ });
891
+ assert.strictEqual(result.success, true);
892
+ assert.strictEqual(result.evaluationsExported, 1);
893
+ assert.strictEqual(fetchCallCount, COUNT_TWO);
894
+ }
895
+ finally {
896
+ globalThis.fetch = originalFetch;
897
+ }
898
+ });
899
+ it('retries on 503 service unavailable', async () => {
900
+ let fetchCallCount = 0;
901
+ const originalFetch = globalThis.fetch;
902
+ globalThis.fetch = mock.fn(async () => {
903
+ fetchCallCount++;
904
+ if (fetchCallCount === 1) {
905
+ return new Response('Service Unavailable', { status: HttpStatus.SERVICE_UNAVAILABLE });
906
+ }
907
+ return new Response('{}', { status: HttpStatus.OK });
908
+ });
909
+ try {
910
+ const result = await exportToLangfuse([testEvaluations[0]], {
911
+ ...mockConfig,
912
+ timeoutMs: 100,
913
+ });
914
+ assert.strictEqual(result.success, true);
915
+ assert.strictEqual(fetchCallCount, COUNT_TWO);
916
+ }
917
+ finally {
918
+ globalThis.fetch = originalFetch;
919
+ }
920
+ });
921
+ it('does not retry on 400 bad request', async () => {
922
+ let fetchCallCount = 0;
923
+ const originalFetch = globalThis.fetch;
924
+ globalThis.fetch = mock.fn(async () => {
925
+ fetchCallCount++;
926
+ return new Response('Bad Request', { status: HttpStatus.BAD_REQUEST });
927
+ });
928
+ try {
929
+ const result = await exportToLangfuse([testEvaluations[0]], {
930
+ ...mockConfig,
931
+ timeoutMs: 100,
932
+ });
933
+ // Should fail without retry on 4xx (except 429)
934
+ assert.strictEqual(result.success, false);
935
+ assert.strictEqual(result.failed, 1);
936
+ assert.strictEqual(fetchCallCount, 1);
937
+ }
938
+ finally {
939
+ globalThis.fetch = originalFetch;
940
+ }
941
+ });
942
+ it('gives up after max retries on persistent 5xx', async () => {
943
+ let fetchCallCount = 0;
944
+ const originalFetch = globalThis.fetch;
945
+ globalThis.fetch = mock.fn(async () => {
946
+ fetchCallCount++;
947
+ return new Response('Server Error', { status: HttpStatus.INTERNAL_SERVER_ERROR });
948
+ });
949
+ try {
950
+ const result = await exportToLangfuse([testEvaluations[0]], {
951
+ ...mockConfig,
952
+ timeoutMs: 100,
953
+ });
954
+ // Should fail after 4 attempts (initial + 3 retries)
955
+ assert.strictEqual(result.success, false);
956
+ assert.strictEqual(result.failed, 1);
957
+ assert.strictEqual(fetchCallCount, COUNT_FOUR); // 1 initial + 3 retries
958
+ assert.ok(result.errors?.[0].includes('HTTP 500'));
959
+ }
960
+ finally {
961
+ globalThis.fetch = originalFetch;
962
+ }
963
+ });
964
+ // CRITICAL FIX: Test that network errors are retried (not just AbortError)
965
+ it('retries on network errors (DNS failure, connection reset)', async () => {
966
+ let fetchCallCount = 0;
967
+ const originalFetch = globalThis.fetch;
968
+ globalThis.fetch = mock.fn(async () => {
969
+ fetchCallCount++;
970
+ // First 2 calls throw network error, third succeeds
971
+ if (fetchCallCount <= COUNT_TWO) {
972
+ const error = new TypeError('fetch failed');
973
+ error.cause = new Error('getaddrinfo ENOTFOUND invalid-host.example.com');
974
+ throw error;
975
+ }
976
+ return new Response('{}', { status: HttpStatus.OK });
977
+ });
978
+ try {
979
+ const result = await exportToLangfuse([testEvaluations[0]], {
980
+ ...mockConfig,
981
+ timeoutMs: 100,
982
+ });
983
+ // Should succeed after retrying network errors
984
+ assert.strictEqual(result.success, true);
985
+ assert.strictEqual(result.evaluationsExported, 1);
986
+ // Retried 2 times + 1 successful = 3 calls
987
+ assert.strictEqual(fetchCallCount, COUNT_THREE);
988
+ }
989
+ finally {
990
+ globalThis.fetch = originalFetch;
991
+ }
992
+ });
993
+ it('gives up after max retries on persistent network errors', async () => {
994
+ let fetchCallCount = 0;
995
+ const originalFetch = globalThis.fetch;
996
+ globalThis.fetch = mock.fn(async () => {
997
+ fetchCallCount++;
998
+ const error = new TypeError('fetch failed');
999
+ error.cause = new Error('ECONNREFUSED');
1000
+ throw error;
1001
+ });
1002
+ try {
1003
+ const result = await exportToLangfuse([testEvaluations[0]], {
1004
+ ...mockConfig,
1005
+ timeoutMs: 100,
1006
+ });
1007
+ // Should fail after 4 attempts (initial + 3 retries)
1008
+ assert.strictEqual(result.success, false);
1009
+ assert.strictEqual(result.failed, 1);
1010
+ assert.strictEqual(fetchCallCount, COUNT_FOUR); // 1 initial + 3 retries
1011
+ assert.ok(result.errors?.[0].includes('retries exhausted'));
1012
+ }
1013
+ finally {
1014
+ globalThis.fetch = originalFetch;
1015
+ }
1016
+ });
1017
+ });
1018
+ });
1019
+ });
1020
+ //# sourceMappingURL=langfuse-export.test.js.map