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
@@ -1,30 +1,58 @@
1
1
  /**
2
2
  * Tests for query-evaluations tool
3
3
  */
4
- import { describe, it, beforeEach, afterEach, mock } from 'node:test';
4
+ import { describe, it, beforeEach, afterEach, vi } from 'vitest';
5
5
  import assert from 'node:assert';
6
- import { queryEvaluations, queryEvaluationsSchema, queryEvaluationsTool, buildAggregations } from './query-evaluations.js';
6
+ import { queryEvaluations, queryEvaluationsSchema, queryEvaluationsTool, buildAggregations, MAX_RETURNED_EVALUATIONS, MAX_AGGREGATION_GROUPS, } from './query-evaluations.js';
7
7
  import { LocalJsonlBackend } from '../backends/local-jsonl.js';
8
+ import { DEFAULT_LIMIT } from '../lib/core/input-validator.js';
8
9
  import { validateToolDefinition } from '../test-helpers/tool-validators.js';
9
10
  import { validateLimitSchema, validateDateRangeSchema } from '../test-helpers/schema-validators.js';
10
- import { TEST_TIMESTAMP_ISO } from '../test-helpers/test-data-builders.js';
11
- describe('queryEvaluations', () => {
11
+ import { TEST_TIMESTAMP_ISO, FLOAT_TOLERANCE, testTraceId } from '../test-helpers/test-data-builders.js';
12
+ // ---------------------------------------------------------------------------
13
+ // Test fixture score values
14
+ // ---------------------------------------------------------------------------
15
+ const SCORE_HIGH = 0.9;
16
+ const SCORE_MID = 0.8;
17
+ const SCORE_LOW = 0.7;
18
+ const SCORE_FAIL = 0.3;
19
+ const SCORE_HALF = 0.5;
20
+ const SCORE_DETAIL = 0.92;
21
+ const SCORE_SINGLE = 0.75;
22
+ const SCORE_AVG_MID_HIGH = 0.85; // (0.8 + 0.9) / 2
23
+ const SCORE_AVG_THREE = 0.9; // (0.8 + 0.9 + 1.0) / 3
24
+ // Test fixture expected percentile bounds
25
+ const P95_LOWER = 0.95;
26
+ const P95_UPPER = 0.96;
27
+ const P99_LOWER = 0.99;
28
+ const P50_INTERPOLATED = 0.25; // R-7: interpolate between 0.2 and 0.3
29
+ // Test fixture generation
30
+ const SCORE_BASE = 0.8;
31
+ const SCORE_INCREMENT = 0.01;
32
+ const PERCENTILE_SAMPLE_COUNT = 100;
33
+ const MANY_EVALUATIONS_COUNT = 30;
34
+ const UNKNOWN_UNIT_SCORE = 5;
35
+ const TIMESTAMP_PAD_LENGTH = 2;
36
+ // Expected assertion counts
37
+ const EXPECTED_PAIR_COUNT = 2;
38
+ const EXPECTED_TRIPLE_COUNT = 3;
39
+ void describe('queryEvaluations', () => {
12
40
  // Use shared schema validators
13
- validateLimitSchema(queryEvaluationsSchema, 'queryEvaluationsSchema', 50);
41
+ validateLimitSchema(queryEvaluationsSchema, 'queryEvaluationsSchema', DEFAULT_LIMIT);
14
42
  validateDateRangeSchema(queryEvaluationsSchema, 'queryEvaluationsSchema');
15
- describe('schema validation', () => {
16
- it('should accept empty input with defaults', () => {
43
+ void describe('schema validation', () => {
44
+ void it('should accept empty input with defaults', () => {
17
45
  const result = queryEvaluationsSchema.parse({});
18
- assert.strictEqual(result.limit, 50);
46
+ assert.strictEqual(result.limit, DEFAULT_LIMIT);
19
47
  });
20
- it('should accept all optional parameters', () => {
48
+ void it('should accept all optional parameters', () => {
21
49
  const input = {
22
50
  evaluationName: 'Relevance',
23
- scoreMin: 0.5,
51
+ scoreMin: SCORE_HALF,
24
52
  scoreMax: 1.0,
25
53
  scoreLabel: 'pass',
26
54
  responseId: 'resp-123',
27
- traceId: 'trace-123',
55
+ traceId: testTraceId(1),
28
56
  sessionId: 'sess-123',
29
57
  startDate: '2026-01-28',
30
58
  endDate: '2026-01-28',
@@ -32,164 +60,153 @@ describe('queryEvaluations', () => {
32
60
  };
33
61
  const result = queryEvaluationsSchema.parse(input);
34
62
  assert.strictEqual(result.evaluationName, 'Relevance');
35
- assert.strictEqual(result.scoreMin, 0.5);
63
+ assert.strictEqual(result.scoreMin, SCORE_HALF);
36
64
  assert.strictEqual(result.scoreMax, 1.0);
37
65
  assert.strictEqual(result.scoreLabel, 'pass');
38
66
  });
39
- it('should enforce max limit of 1000', () => {
67
+ void it('should enforce max limit of 1000', () => {
40
68
  assert.throws(() => {
41
69
  queryEvaluationsSchema.parse({ limit: 1001 });
42
70
  });
43
71
  });
44
72
  });
45
- describe('score range validation (P1-3)', () => {
73
+ void describe('score range validation (P1-3)', () => {
46
74
  let originalQueryEvaluations;
47
75
  beforeEach(() => {
48
76
  originalQueryEvaluations = LocalJsonlBackend.prototype.queryEvaluations;
49
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => []);
77
+ LocalJsonlBackend.prototype.queryEvaluations = vi.fn(async () => []);
50
78
  });
51
79
  afterEach(() => {
52
80
  LocalJsonlBackend.prototype.queryEvaluations = originalQueryEvaluations;
53
81
  });
54
- it('should reject inverted score range (scoreMin > scoreMax)', async () => {
55
- await assert.rejects(async () => queryEvaluations({ scoreMin: 0.9, scoreMax: 0.1 }), /Invalid score range.*scoreMin.*cannot exceed.*scoreMax/);
82
+ void it('should reject inverted score range (scoreMin > scoreMax)', async () => {
83
+ await assert.rejects(async () => queryEvaluations({ scoreMin: 0.9, scoreMax: 0.1 }), /scoreMin.*cannot exceed.*scoreMax/);
56
84
  });
57
- it('should accept valid score range (scoreMin < scoreMax)', async () => {
58
- const result = await queryEvaluations({ scoreMin: 0.3, scoreMax: 0.8 });
85
+ void it('should accept valid score range (scoreMin < scoreMax)', async () => {
86
+ const result = await queryEvaluations({ scoreMin: SCORE_FAIL, scoreMax: SCORE_MID });
59
87
  assert.strictEqual(result.count, 0); // Empty mocked response
60
88
  });
61
- it('should accept equal scoreMin and scoreMax', async () => {
62
- const result = await queryEvaluations({ scoreMin: 0.5, scoreMax: 0.5 });
89
+ void it('should accept equal scoreMin and scoreMax', async () => {
90
+ const result = await queryEvaluations({ scoreMin: SCORE_HALF, scoreMax: SCORE_HALF });
63
91
  assert.strictEqual(result.count, 0);
64
92
  });
65
- it('should accept scoreMin without scoreMax', async () => {
66
- const result = await queryEvaluations({ scoreMin: 0.5 });
93
+ void it('should accept scoreMin without scoreMax', async () => {
94
+ const result = await queryEvaluations({ scoreMin: SCORE_HALF });
67
95
  assert.strictEqual(result.count, 0);
68
96
  });
69
- it('should accept scoreMax without scoreMin', async () => {
70
- const result = await queryEvaluations({ scoreMax: 0.8 });
97
+ void it('should accept scoreMax without scoreMin', async () => {
98
+ const result = await queryEvaluations({ scoreMax: SCORE_MID });
71
99
  assert.strictEqual(result.count, 0);
72
100
  });
73
101
  });
74
- describe('handler with mocked backend', () => {
75
- let originalQueryEvaluations;
76
- beforeEach(() => {
77
- originalQueryEvaluations = LocalJsonlBackend.prototype.queryEvaluations;
78
- });
79
- afterEach(() => {
80
- LocalJsonlBackend.prototype.queryEvaluations = originalQueryEvaluations;
81
- });
82
- it('should return empty results when no evaluations found', async () => {
83
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => []);
84
- const result = await queryEvaluations({});
102
+ void describe('handler with mocked backend', () => {
103
+ function createMockBackend(queryFn) {
104
+ return { queryEvaluations: queryFn };
105
+ }
106
+ void it('should return empty results when no evaluations found', async () => {
107
+ const mockBackend = createMockBackend(vi.fn(async () => []));
108
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
85
109
  assert.strictEqual(result.count, 0);
86
110
  assert.deepStrictEqual(result.evaluations, []);
87
111
  assert.strictEqual(result.summary.averageScore, undefined);
88
112
  });
89
- it('should summarize evaluations by name and label', async () => {
90
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
91
- { timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Relevance', scoreValue: 0.9, scoreLabel: 'pass' },
92
- { timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Relevance', scoreValue: 0.8, scoreLabel: 'pass' },
93
- { timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Faithfulness', scoreValue: 0.7, scoreLabel: 'fail' },
94
- ]);
95
- const result = await queryEvaluations({});
96
- assert.strictEqual(result.count, 3);
97
- assert.strictEqual(result.summary.byEvaluationName['Relevance'], 2);
113
+ void it('should summarize evaluations by name and label', async () => {
114
+ const mockBackend = createMockBackend(vi.fn(async () => [
115
+ { timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Relevance', scoreValue: SCORE_HIGH, scoreLabel: 'pass' },
116
+ { timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Relevance', scoreValue: SCORE_MID, scoreLabel: 'pass' },
117
+ { timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Faithfulness', scoreValue: SCORE_LOW, scoreLabel: 'fail' },
118
+ ]));
119
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
120
+ assert.strictEqual(result.count, EXPECTED_TRIPLE_COUNT);
121
+ assert.strictEqual(result.summary.byEvaluationName['Relevance'], EXPECTED_PAIR_COUNT);
98
122
  assert.strictEqual(result.summary.byEvaluationName['Faithfulness'], 1);
99
- assert.strictEqual(result.summary.byScoreLabel['pass'], 2);
123
+ assert.strictEqual(result.summary.byScoreLabel['pass'], EXPECTED_PAIR_COUNT);
100
124
  assert.strictEqual(result.summary.byScoreLabel['fail'], 1);
101
125
  });
102
- it('should calculate average score correctly', async () => {
103
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
104
- { timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Relevance', scoreValue: 0.8 },
105
- { timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Relevance', scoreValue: 0.9 },
126
+ void it('should calculate average score correctly', async () => {
127
+ const mockBackend = createMockBackend(vi.fn(async () => [
128
+ { timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Relevance', scoreValue: SCORE_MID },
129
+ { timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Relevance', scoreValue: SCORE_HIGH },
106
130
  { timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Relevance', scoreValue: 1.0 },
107
- ]);
108
- const result = await queryEvaluations({});
109
- assert.strictEqual(result.summary.averageScore, 0.9);
131
+ ]));
132
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
133
+ assert.strictEqual(result.summary.averageScore, SCORE_AVG_THREE);
110
134
  });
111
- it('should handle evaluations without scores', async () => {
112
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
135
+ void it('should handle evaluations without scores', async () => {
136
+ const mockBackend = createMockBackend(vi.fn(async () => [
113
137
  { timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'ToolCorrectness', scoreLabel: 'pass' },
114
138
  { timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'ToolCorrectness', scoreLabel: 'fail' },
115
- ]);
116
- const result = await queryEvaluations({});
117
- assert.strictEqual(result.count, 2);
139
+ ]));
140
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
141
+ assert.strictEqual(result.count, EXPECTED_PAIR_COUNT);
118
142
  assert.strictEqual(result.summary.averageScore, undefined);
119
143
  assert.strictEqual(result.summary.byScoreLabel['pass'], 1);
120
144
  assert.strictEqual(result.summary.byScoreLabel['fail'], 1);
121
145
  });
122
- it('should include all fields in evaluation response', async () => {
123
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
146
+ void it('should include all fields in evaluation response', async () => {
147
+ const mockBackend = createMockBackend(vi.fn(async () => [
124
148
  {
125
149
  timestamp: '2026-01-28T10:00:00Z',
126
150
  evaluationName: 'Relevance',
127
- scoreValue: 0.92,
151
+ scoreValue: SCORE_DETAIL,
128
152
  scoreLabel: 'relevant',
129
153
  explanation: 'Response directly addresses the query',
130
154
  responseId: 'resp-abc123',
131
155
  traceId: 'trace-xyz789',
132
156
  sessionId: 'sess-def456',
133
157
  },
134
- ]);
135
- const result = await queryEvaluations({});
158
+ ]));
159
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
136
160
  const evaluation = result.evaluations[0];
137
161
  assert.strictEqual(evaluation.timestamp, '2026-01-28T10:00:00Z');
138
162
  assert.strictEqual(evaluation.evaluationName, 'Relevance');
139
- assert.strictEqual(evaluation.scoreValue, 0.92);
163
+ assert.strictEqual(evaluation.scoreValue, SCORE_DETAIL);
140
164
  assert.strictEqual(evaluation.scoreLabel, 'relevant');
141
165
  assert.strictEqual(evaluation.explanation, 'Response directly addresses the query');
142
166
  assert.strictEqual(evaluation.responseId, 'resp-abc123');
143
167
  assert.strictEqual(evaluation.traceId, 'trace-xyz789');
144
168
  assert.strictEqual(evaluation.sessionId, 'sess-def456');
145
169
  });
146
- it('should limit returned evaluations to 20', async () => {
147
- const manyEvaluations = Array.from({ length: 30 }, (_, i) => ({
148
- timestamp: `2026-01-28T10:${String(i).padStart(2, '0')}:00Z`,
170
+ void it('should limit returned evaluations to MAX_RETURNED_EVALUATIONS', async () => {
171
+ const manyEvaluations = Array.from({ length: MANY_EVALUATIONS_COUNT }, (_, i) => ({
172
+ timestamp: `2026-01-28T10:${String(i).padStart(TIMESTAMP_PAD_LENGTH, '0')}:00Z`,
149
173
  evaluationName: 'Relevance',
150
- scoreValue: 0.8 + (i * 0.01),
174
+ scoreValue: SCORE_BASE + (i * SCORE_INCREMENT),
151
175
  }));
152
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => manyEvaluations);
153
- const result = await queryEvaluations({});
154
- assert.strictEqual(result.count, 30);
155
- assert.strictEqual(result.evaluations.length, 20);
176
+ const mockBackend = { queryEvaluations: vi.fn(async () => manyEvaluations) };
177
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
178
+ assert.strictEqual(result.count, MANY_EVALUATIONS_COUNT);
179
+ assert.strictEqual(result.evaluations.length, MAX_RETURNED_EVALUATIONS);
156
180
  });
157
181
  });
158
- describe('OTel GenAI compliance', () => {
159
- let originalQueryEvaluations;
160
- beforeEach(() => {
161
- originalQueryEvaluations = LocalJsonlBackend.prototype.queryEvaluations;
162
- });
163
- afterEach(() => {
164
- LocalJsonlBackend.prototype.queryEvaluations = originalQueryEvaluations;
165
- });
166
- it('should accept evaluationName filter', () => {
182
+ void describe('OTel GenAI compliance', () => {
183
+ void it('should accept evaluationName filter', () => {
167
184
  const input = { evaluationName: 'Relevance' };
168
185
  const result = queryEvaluationsSchema.parse(input);
169
186
  assert.strictEqual(result.evaluationName, 'Relevance');
170
187
  });
171
- it('should accept score range filters', () => {
172
- const input = { scoreMin: 0.5, scoreMax: 0.9 };
188
+ void it('should accept score range filters', () => {
189
+ const input = { scoreMin: SCORE_HALF, scoreMax: SCORE_HIGH };
173
190
  const result = queryEvaluationsSchema.parse(input);
174
- assert.strictEqual(result.scoreMin, 0.5);
175
- assert.strictEqual(result.scoreMax, 0.9);
191
+ assert.strictEqual(result.scoreMin, SCORE_HALF);
192
+ assert.strictEqual(result.scoreMax, SCORE_HIGH);
176
193
  });
177
- it('should accept scoreLabel filter', () => {
194
+ void it('should accept scoreLabel filter', () => {
178
195
  const input = { scoreLabel: 'pass' };
179
196
  const result = queryEvaluationsSchema.parse(input);
180
197
  assert.strictEqual(result.scoreLabel, 'pass');
181
198
  });
182
- it('should accept responseId filter for correlation', () => {
199
+ void it('should accept responseId filter for correlation', () => {
183
200
  const input = { responseId: 'resp-12345' };
184
201
  const result = queryEvaluationsSchema.parse(input);
185
202
  assert.strictEqual(result.responseId, 'resp-12345');
186
203
  });
187
- it('should accept traceId filter for trace correlation', () => {
188
- const input = { traceId: 'trace-12345' };
204
+ void it('should accept traceId filter for trace correlation', () => {
205
+ const input = { traceId: testTraceId(2) };
189
206
  const result = queryEvaluationsSchema.parse(input);
190
- assert.strictEqual(result.traceId, 'trace-12345');
207
+ assert.strictEqual(result.traceId, testTraceId(2));
191
208
  });
192
- it('should accept sessionId filter for session-scoped queries', () => {
209
+ void it('should accept sessionId filter for session-scoped queries', () => {
193
210
  const input = { sessionId: 'session-12345' };
194
211
  const result = queryEvaluationsSchema.parse(input);
195
212
  assert.strictEqual(result.sessionId, 'session-12345');
@@ -197,539 +214,517 @@ describe('queryEvaluations', () => {
197
214
  });
198
215
  // Use shared tool definition validator
199
216
  validateToolDefinition(queryEvaluationsTool, 'obs_query_evaluations', queryEvaluationsSchema, queryEvaluations, ['gen_ai.evaluation.result', 'aggregations']);
200
- describe('aggregation schema', () => {
201
- it('should accept aggregation parameter', () => {
217
+ void describe('aggregation schema', () => {
218
+ void it('should accept aggregation parameter', () => {
202
219
  const input = { aggregation: 'avg' };
203
220
  const result = queryEvaluationsSchema.parse(input);
204
221
  assert.strictEqual(result.aggregation, 'avg');
205
222
  });
206
- it('should accept all aggregation types', () => {
223
+ void it('should accept all aggregation types', () => {
207
224
  const types = ['avg', 'min', 'max', 'count', 'p50', 'p95', 'p99'];
208
225
  for (const type of types) {
209
226
  const result = queryEvaluationsSchema.parse({ aggregation: type });
210
227
  assert.strictEqual(result.aggregation, type);
211
228
  }
212
229
  });
213
- it('should reject invalid aggregation type', () => {
230
+ void it('should reject invalid aggregation type', () => {
214
231
  assert.throws(() => {
215
232
  queryEvaluationsSchema.parse({ aggregation: 'invalid' });
216
233
  });
217
234
  });
218
- it('should accept groupBy parameter', () => {
235
+ void it('should accept groupBy parameter', () => {
219
236
  const input = { groupBy: ['evaluationName'] };
220
237
  const result = queryEvaluationsSchema.parse(input);
221
238
  assert.deepStrictEqual(result.groupBy, ['evaluationName']);
222
239
  });
223
- it('should accept multiple groupBy fields', () => {
240
+ void it('should accept multiple groupBy fields', () => {
224
241
  const input = { groupBy: ['evaluationName', 'scoreLabel'] };
225
242
  const result = queryEvaluationsSchema.parse(input);
226
243
  assert.deepStrictEqual(result.groupBy, ['evaluationName', 'scoreLabel']);
227
244
  });
228
- it('should reject invalid groupBy field', () => {
245
+ void it('should reject invalid groupBy field', () => {
229
246
  assert.throws(() => {
230
247
  queryEvaluationsSchema.parse({ groupBy: ['invalidField'] });
231
248
  });
232
249
  });
233
250
  });
234
- describe('aggregation handler', () => {
235
- let originalQueryEvaluations;
236
- beforeEach(() => {
237
- originalQueryEvaluations = LocalJsonlBackend.prototype.queryEvaluations;
238
- });
239
- afterEach(() => {
240
- LocalJsonlBackend.prototype.queryEvaluations = originalQueryEvaluations;
241
- });
242
- it('should calculate avg aggregation', async () => {
243
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
244
- { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.8 },
245
- { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.9 },
251
+ void describe('aggregation handler', () => {
252
+ function createMockBackend(queryFn) {
253
+ return { queryEvaluations: queryFn };
254
+ }
255
+ void it('should calculate avg aggregation', async () => {
256
+ const mockBackend = createMockBackend(vi.fn(async () => [
257
+ { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID },
258
+ { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH },
246
259
  { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: 1.0 },
247
- ]);
248
- const result = await queryEvaluations({ aggregation: 'avg' });
260
+ ]));
261
+ const result = await queryEvaluations({ aggregation: 'avg' }, { localBackend: mockBackend });
249
262
  assert.ok(result.summary.aggregations);
250
263
  assert.strictEqual(result.summary.aggregations.length, 1);
251
- assert.strictEqual(result.summary.aggregations[0].value, 0.9);
252
- assert.strictEqual(result.summary.aggregations[0].count, 3);
253
- });
254
- it('should calculate min aggregation', async () => {
255
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
256
- { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.8 },
257
- { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.5 },
258
- { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: 0.9 },
259
- ]);
260
- const result = await queryEvaluations({ aggregation: 'min' });
264
+ assert.strictEqual(result.summary.aggregations[0].value, SCORE_AVG_THREE);
265
+ assert.strictEqual(result.summary.aggregations[0].count, EXPECTED_TRIPLE_COUNT);
266
+ });
267
+ void it('should calculate min aggregation', async () => {
268
+ const mockBackend = createMockBackend(vi.fn(async () => [
269
+ { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID },
270
+ { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HALF },
271
+ { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH },
272
+ ]));
273
+ const result = await queryEvaluations({ aggregation: 'min' }, { localBackend: mockBackend });
261
274
  assert.ok(result.summary.aggregations);
262
- assert.strictEqual(result.summary.aggregations[0].value, 0.5);
263
- });
264
- it('should calculate max aggregation', async () => {
265
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
266
- { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.8 },
267
- { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.5 },
268
- { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: 0.9 },
269
- ]);
270
- const result = await queryEvaluations({ aggregation: 'max' });
275
+ assert.strictEqual(result.summary.aggregations[0].value, SCORE_HALF);
276
+ });
277
+ void it('should calculate max aggregation', async () => {
278
+ const mockBackend = createMockBackend(vi.fn(async () => [
279
+ { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID },
280
+ { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HALF },
281
+ { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH },
282
+ ]));
283
+ const result = await queryEvaluations({ aggregation: 'max' }, { localBackend: mockBackend });
271
284
  assert.ok(result.summary.aggregations);
272
- assert.strictEqual(result.summary.aggregations[0].value, 0.9);
285
+ assert.strictEqual(result.summary.aggregations[0].value, SCORE_HIGH);
273
286
  });
274
- it('should calculate count aggregation', async () => {
275
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
276
- { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.8 },
277
- { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.5 },
287
+ void it('should calculate count aggregation', async () => {
288
+ const mockBackend = createMockBackend(vi.fn(async () => [
289
+ { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID },
290
+ { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HALF },
278
291
  { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Faithfulness', scoreLabel: 'pass' },
279
- ]);
280
- const result = await queryEvaluations({ aggregation: 'count' });
292
+ ]));
293
+ const result = await queryEvaluations({ aggregation: 'count' }, { localBackend: mockBackend });
281
294
  assert.ok(result.summary.aggregations);
282
- assert.strictEqual(result.summary.aggregations[0].count, 3);
283
- assert.strictEqual(result.summary.aggregations[0].value, 3);
295
+ assert.strictEqual(result.summary.aggregations[0].count, EXPECTED_TRIPLE_COUNT);
296
+ assert.strictEqual(result.summary.aggregations[0].value, EXPECTED_TRIPLE_COUNT);
284
297
  });
285
- it('should calculate p50 percentile', async () => {
286
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
298
+ void it('should calculate p50 percentile', async () => {
299
+ const mockBackend = createMockBackend(vi.fn(async () => [
287
300
  { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.1 },
288
- { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.5 },
289
- { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: 0.9 },
290
- ]);
291
- const result = await queryEvaluations({ aggregation: 'p50' });
301
+ { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HALF },
302
+ { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH },
303
+ ]));
304
+ const result = await queryEvaluations({ aggregation: 'p50' }, { localBackend: mockBackend });
292
305
  assert.ok(result.summary.aggregations);
293
- assert.strictEqual(result.summary.aggregations[0].value, 0.5);
306
+ assert.strictEqual(result.summary.aggregations[0].value, SCORE_HALF);
294
307
  });
295
- it('should calculate p95 percentile with linear interpolation', async () => {
296
- const values = Array.from({ length: 100 }, (_, i) => ({
308
+ void it('should calculate p95 percentile with linear interpolation', async () => {
309
+ const values = Array.from({ length: PERCENTILE_SAMPLE_COUNT }, (_, i) => ({
297
310
  timestamp: '2026-01-28T10:00:00Z',
298
311
  evaluationName: 'Relevance',
299
- scoreValue: (i + 1) / 100,
312
+ scoreValue: (i + 1) / PERCENTILE_SAMPLE_COUNT,
300
313
  }));
301
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => values);
302
- const result = await queryEvaluations({ aggregation: 'p95', limit: 1000 });
314
+ const mockBackend = createMockBackend(vi.fn(async () => values));
315
+ const result = await queryEvaluations({ aggregation: 'p95', limit: 1000 }, { localBackend: mockBackend });
303
316
  assert.ok(result.summary.aggregations);
304
317
  // R-7 linear interpolation: rank = 0.95 * 99 = 94.05
305
318
  // Interpolate between index 94 (0.95) and index 95 (0.96)
306
319
  const value = result.summary.aggregations[0].value;
307
- assert.ok(value >= 0.95 && value <= 0.96, `Expected p95 between 0.95-0.96, got ${value}`);
320
+ assert.ok(value !== undefined);
321
+ assert.ok(value >= P95_LOWER && value <= P95_UPPER, `Expected p95 between 0.95-0.96, got ${value}`);
308
322
  });
309
- it('should calculate p99 percentile with linear interpolation', async () => {
310
- const values = Array.from({ length: 100 }, (_, i) => ({
323
+ void it('should calculate p99 percentile with linear interpolation', async () => {
324
+ const values = Array.from({ length: PERCENTILE_SAMPLE_COUNT }, (_, i) => ({
311
325
  timestamp: '2026-01-28T10:00:00Z',
312
326
  evaluationName: 'Relevance',
313
- scoreValue: (i + 1) / 100,
327
+ scoreValue: (i + 1) / PERCENTILE_SAMPLE_COUNT,
314
328
  }));
315
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => values);
316
- const result = await queryEvaluations({ aggregation: 'p99', limit: 1000 });
329
+ const mockBackend = createMockBackend(vi.fn(async () => values));
330
+ const result = await queryEvaluations({ aggregation: 'p99', limit: 1000 }, { localBackend: mockBackend });
317
331
  assert.ok(result.summary.aggregations);
318
332
  // R-7 linear interpolation: rank = 0.99 * 99 = 98.01
319
333
  // Interpolate between index 98 (0.99) and index 99 (1.00)
320
334
  const value = result.summary.aggregations[0].value;
321
- assert.ok(value >= 0.99 && value <= 1.0, `Expected p99 between 0.99-1.0, got ${value}`);
322
- });
323
- it('should group by evaluationName', async () => {
324
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
325
- { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.8 },
326
- { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.9 },
327
- { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Faithfulness', scoreValue: 0.7 },
328
- ]);
329
- const result = await queryEvaluations({ aggregation: 'avg', groupBy: ['evaluationName'] });
335
+ assert.ok(value !== undefined);
336
+ assert.ok(value >= P99_LOWER && value <= 1.0, `Expected p99 between 0.99-1.0, got ${value}`);
337
+ });
338
+ void it('should group by evaluationName', async () => {
339
+ const mockBackend = createMockBackend(vi.fn(async () => [
340
+ { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID },
341
+ { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH },
342
+ { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Faithfulness', scoreValue: SCORE_LOW },
343
+ ]));
344
+ const result = await queryEvaluations({ aggregation: 'avg', groupBy: ['evaluationName'] }, { localBackend: mockBackend });
330
345
  assert.ok(result.summary.aggregations);
331
- assert.strictEqual(result.summary.aggregations.length, 2);
346
+ assert.strictEqual(result.summary.aggregations.length, EXPECTED_PAIR_COUNT);
332
347
  const relevance = result.summary.aggregations.find(a => a.evaluationName === 'Relevance');
333
348
  const faithfulness = result.summary.aggregations.find(a => a.evaluationName === 'Faithfulness');
334
349
  assert.ok(relevance);
335
- assert.ok(Math.abs((relevance.value ?? 0) - 0.85) < 0.0001, `Expected ~0.85, got ${relevance.value}`);
336
- assert.strictEqual(relevance.count, 2);
350
+ assert.ok(Math.abs((relevance.value ?? 0) - SCORE_AVG_MID_HIGH) < FLOAT_TOLERANCE, `Expected ~0.85, got ${relevance.value}`);
351
+ assert.strictEqual(relevance.count, EXPECTED_PAIR_COUNT);
337
352
  assert.ok(faithfulness);
338
- assert.strictEqual(faithfulness.value, 0.7);
353
+ assert.strictEqual(faithfulness.value, SCORE_LOW);
339
354
  assert.strictEqual(faithfulness.count, 1);
340
355
  });
341
- it('should group by scoreLabel', async () => {
342
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
343
- { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.9, scoreLabel: 'pass' },
344
- { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.8, scoreLabel: 'pass' },
345
- { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: 0.3, scoreLabel: 'fail' },
346
- ]);
347
- const result = await queryEvaluations({ aggregation: 'avg', groupBy: ['scoreLabel'] });
356
+ void it('should group by scoreLabel', async () => {
357
+ const mockBackend = createMockBackend(vi.fn(async () => [
358
+ { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, scoreLabel: 'pass' },
359
+ { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID, scoreLabel: 'pass' },
360
+ { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: SCORE_FAIL, scoreLabel: 'fail' },
361
+ ]));
362
+ const result = await queryEvaluations({ aggregation: 'avg', groupBy: ['scoreLabel'] }, { localBackend: mockBackend });
348
363
  assert.ok(result.summary.aggregations);
349
- assert.strictEqual(result.summary.aggregations.length, 2);
364
+ assert.strictEqual(result.summary.aggregations.length, EXPECTED_PAIR_COUNT);
350
365
  const pass = result.summary.aggregations.find(a => a.scoreLabel === 'pass');
351
366
  const fail = result.summary.aggregations.find(a => a.scoreLabel === 'fail');
352
367
  assert.ok(pass);
353
- assert.ok(Math.abs((pass.value ?? 0) - 0.85) < 0.0001, `Expected ~0.85, got ${pass.value}`);
368
+ assert.ok(Math.abs((pass.value ?? 0) - SCORE_AVG_MID_HIGH) < FLOAT_TOLERANCE, `Expected ~0.85, got ${pass.value}`);
354
369
  assert.ok(fail);
355
- assert.strictEqual(fail.value, 0.3);
356
- });
357
- it('should group by multiple fields', async () => {
358
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
359
- { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.9, scoreLabel: 'pass' },
360
- { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.3, scoreLabel: 'fail' },
361
- { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Faithfulness', scoreValue: 0.8, scoreLabel: 'pass' },
362
- ]);
363
- const result = await queryEvaluations({ aggregation: 'count', groupBy: ['evaluationName', 'scoreLabel'] });
370
+ assert.strictEqual(fail.value, SCORE_FAIL);
371
+ });
372
+ void it('should group by multiple fields', async () => {
373
+ const mockBackend = createMockBackend(vi.fn(async () => [
374
+ { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, scoreLabel: 'pass' },
375
+ { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_FAIL, scoreLabel: 'fail' },
376
+ { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Faithfulness', scoreValue: SCORE_MID, scoreLabel: 'pass' },
377
+ ]));
378
+ const result = await queryEvaluations({ aggregation: 'count', groupBy: ['evaluationName', 'scoreLabel'] }, { localBackend: mockBackend });
364
379
  assert.ok(result.summary.aggregations);
365
- assert.strictEqual(result.summary.aggregations.length, 3);
380
+ assert.strictEqual(result.summary.aggregations.length, EXPECTED_TRIPLE_COUNT);
366
381
  });
367
- it('should handle empty results with aggregation', async () => {
368
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => []);
369
- const result = await queryEvaluations({ aggregation: 'avg' });
382
+ void it('should handle empty results with aggregation', async () => {
383
+ const mockBackend = createMockBackend(vi.fn(async () => []));
384
+ const result = await queryEvaluations({ aggregation: 'avg' }, { localBackend: mockBackend });
370
385
  assert.ok(result.summary.aggregations);
371
386
  assert.strictEqual(result.summary.aggregations.length, 0);
372
387
  });
373
- it('should handle evaluations without scores in aggregation', async () => {
374
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
388
+ void it('should handle evaluations without scores in aggregation', async () => {
389
+ const mockBackend = createMockBackend(vi.fn(async () => [
375
390
  { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'ToolCorrectness', scoreLabel: 'pass' },
376
391
  { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'ToolCorrectness', scoreLabel: 'fail' },
377
- ]);
378
- const result = await queryEvaluations({ aggregation: 'avg' });
392
+ ]));
393
+ const result = await queryEvaluations({ aggregation: 'avg' }, { localBackend: mockBackend });
379
394
  assert.ok(result.summary.aggregations);
380
- assert.strictEqual(result.summary.aggregations[0].count, 2);
395
+ assert.strictEqual(result.summary.aggregations[0].count, EXPECTED_PAIR_COUNT);
381
396
  assert.strictEqual(result.summary.aggregations[0].value, undefined);
382
397
  });
383
- it('should not include aggregations when aggregation not requested', async () => {
384
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
385
- { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.8 },
386
- ]);
387
- const result = await queryEvaluations({});
398
+ void it('should not include aggregations when aggregation not requested', async () => {
399
+ const mockBackend = createMockBackend(vi.fn(async () => [
400
+ { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID },
401
+ ]));
402
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
388
403
  assert.strictEqual(result.summary.aggregations, undefined);
389
404
  });
390
405
  // P1-2: min/max should return undefined, not Infinity, when no scores
391
- it('should return undefined for min aggregation when no scores (P1-2)', async () => {
392
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
406
+ void it('should return undefined for min aggregation when no scores (P1-2)', async () => {
407
+ const mockBackend = createMockBackend(vi.fn(async () => [
393
408
  { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'ToolCorrectness', scoreLabel: 'pass' },
394
409
  { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'ToolCorrectness', scoreLabel: 'fail' },
395
- ]);
396
- const result = await queryEvaluations({ aggregation: 'min' });
410
+ ]));
411
+ const result = await queryEvaluations({ aggregation: 'min' }, { localBackend: mockBackend });
397
412
  assert.ok(result.summary.aggregations);
398
- assert.strictEqual(result.summary.aggregations[0].count, 2);
413
+ assert.strictEqual(result.summary.aggregations[0].count, EXPECTED_PAIR_COUNT);
399
414
  assert.strictEqual(result.summary.aggregations[0].value, undefined);
400
415
  });
401
- it('should return undefined for max aggregation when no scores (P1-2)', async () => {
402
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
416
+ void it('should return undefined for max aggregation when no scores (P1-2)', async () => {
417
+ const mockBackend = createMockBackend(vi.fn(async () => [
403
418
  { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'ToolCorrectness', scoreLabel: 'pass' },
404
- ]);
405
- const result = await queryEvaluations({ aggregation: 'max' });
419
+ ]));
420
+ const result = await queryEvaluations({ aggregation: 'max' }, { localBackend: mockBackend });
406
421
  assert.ok(result.summary.aggregations);
407
422
  assert.strictEqual(result.summary.aggregations[0].value, undefined);
408
423
  });
409
424
  // P1-1: Linear interpolation percentile tests
410
- it('should calculate p50 with linear interpolation for even-length array (P1-1)', async () => {
411
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
425
+ void it('should calculate p50 with linear interpolation for even-length array (P1-1)', async () => {
426
+ const mockBackend = createMockBackend(vi.fn(async () => [
412
427
  { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.1 },
413
428
  { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.2 },
414
429
  { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: 0.3 },
415
430
  { timestamp: '2026-01-28T10:03:00Z', evaluationName: 'Relevance', scoreValue: 0.4 },
416
- ]);
417
- const result = await queryEvaluations({ aggregation: 'p50' });
431
+ ]));
432
+ const result = await queryEvaluations({ aggregation: 'p50' }, { localBackend: mockBackend });
418
433
  assert.ok(result.summary.aggregations);
419
434
  // R-7 method: rank = 0.5 * (4-1) = 1.5, interpolate between index 1 (0.2) and 2 (0.3)
420
435
  // value = 0.2 * 0.5 + 0.3 * 0.5 = 0.25
421
- assert.strictEqual(result.summary.aggregations[0].value, 0.25);
436
+ assert.strictEqual(result.summary.aggregations[0].value, P50_INTERPOLATED);
422
437
  });
423
- it('should handle single value for percentile (P1-1)', async () => {
424
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
425
- { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.75 },
426
- ]);
427
- const result = await queryEvaluations({ aggregation: 'p95' });
438
+ void it('should handle single value for percentile (P1-1)', async () => {
439
+ const mockBackend = createMockBackend(vi.fn(async () => [
440
+ { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_SINGLE },
441
+ ]));
442
+ const result = await queryEvaluations({ aggregation: 'p95' }, { localBackend: mockBackend });
428
443
  assert.ok(result.summary.aggregations);
429
- assert.strictEqual(result.summary.aggregations[0].value, 0.75);
444
+ assert.strictEqual(result.summary.aggregations[0].value, SCORE_SINGLE);
430
445
  });
431
446
  // P1-3: Empty string scoreLabel normalization tests
432
- it('should treat empty string scoreLabel as missing (P1-3)', async () => {
433
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
434
- { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.8, scoreLabel: '' },
435
- { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.9, scoreLabel: ' ' },
436
- { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: 0.7, scoreLabel: 'pass' },
437
- ]);
438
- const result = await queryEvaluations({});
447
+ void it('should treat empty string scoreLabel as missing (P1-3)', async () => {
448
+ const mockBackend = createMockBackend(vi.fn(async () => [
449
+ { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID, scoreLabel: '' },
450
+ { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, scoreLabel: ' ' },
451
+ { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: SCORE_LOW, scoreLabel: 'pass' },
452
+ ]));
453
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
439
454
  // Empty and whitespace-only labels should not be counted
440
455
  assert.strictEqual(result.summary.byScoreLabel['pass'], 1);
441
456
  assert.strictEqual(result.summary.byScoreLabel[''], undefined);
442
457
  assert.strictEqual(result.summary.byScoreLabel[' '], undefined);
443
458
  });
444
- it('should group empty scoreLabels together (P1-3)', async () => {
445
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
446
- { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.8, scoreLabel: '' },
447
- { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.9 },
448
- ]);
449
- const result = await queryEvaluations({ aggregation: 'count', groupBy: ['scoreLabel'] });
459
+ void it('should group empty scoreLabels together (P1-3)', async () => {
460
+ const mockBackend = createMockBackend(vi.fn(async () => [
461
+ { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID, scoreLabel: '' },
462
+ { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH },
463
+ ]));
464
+ const result = await queryEvaluations({ aggregation: 'count', groupBy: ['scoreLabel'] }, { localBackend: mockBackend });
450
465
  assert.ok(result.summary.aggregations);
451
466
  // Both should be grouped together as missing label
452
467
  assert.strictEqual(result.summary.aggregations.length, 1);
453
- assert.strictEqual(result.summary.aggregations[0].count, 2);
468
+ assert.strictEqual(result.summary.aggregations[0].count, EXPECTED_PAIR_COUNT);
454
469
  });
455
470
  });
456
- describe('score range validation (P2-2)', () => {
457
- let originalQueryEvaluations;
458
- beforeEach(() => {
459
- originalQueryEvaluations = LocalJsonlBackend.prototype.queryEvaluations;
460
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => []);
461
- });
462
- afterEach(() => {
463
- LocalJsonlBackend.prototype.queryEvaluations = originalQueryEvaluations;
464
- });
465
- it('should reject NaN scoreMin (via Zod)', async () => {
471
+ void describe('score range validation (P2-2)', () => {
472
+ void it('should reject NaN scoreMin (via Zod)', async () => {
466
473
  await assert.rejects(async () => queryEvaluations({ scoreMin: NaN }), /received.*nan/i);
467
474
  });
468
- it('should reject NaN scoreMax (via Zod)', async () => {
475
+ void it('should reject NaN scoreMax (via Zod)', async () => {
469
476
  await assert.rejects(async () => queryEvaluations({ scoreMax: NaN }), /received.*nan/i);
470
477
  });
471
- it('should reject Infinity scoreMin', async () => {
472
- await assert.rejects(async () => queryEvaluations({ scoreMin: Infinity }), /Invalid scoreMin.*finite number/);
478
+ void it('should reject Infinity scoreMin', async () => {
479
+ await assert.rejects(async () => queryEvaluations({ scoreMin: Infinity }), /received.*infinity/i);
473
480
  });
474
- it('should reject -Infinity scoreMax', async () => {
475
- await assert.rejects(async () => queryEvaluations({ scoreMax: -Infinity }), /Invalid scoreMax.*finite number/);
481
+ void it('should reject -Infinity scoreMax', async () => {
482
+ await assert.rejects(async () => queryEvaluations({ scoreMax: -Infinity }), /received.*infinity/i);
476
483
  });
477
- it('should accept negative score ranges', async () => {
478
- const result = await queryEvaluations({ scoreMin: -1.0, scoreMax: 0.5 });
484
+ void it('should accept negative score ranges', async () => {
485
+ const result = await queryEvaluations({ scoreMin: -2.0, scoreMax: -1.5 });
479
486
  assert.strictEqual(result.count, 0);
480
487
  });
481
488
  });
482
- describe('evaluator field (Phase 3)', () => {
483
- describe('schema validation', () => {
484
- it('should accept evaluator filter', () => {
489
+ void describe('evaluator field (Phase 3)', () => {
490
+ void describe('schema validation', () => {
491
+ void it('should accept evaluator filter', () => {
485
492
  const input = { evaluator: 'gpt-4-as-judge' };
486
493
  const result = queryEvaluationsSchema.parse(input);
487
494
  assert.strictEqual(result.evaluator, 'gpt-4-as-judge');
488
495
  });
489
- it('should accept evaluatorType filter', () => {
496
+ void it('should accept evaluatorType filter', () => {
490
497
  const input = { evaluatorType: 'llm' };
491
498
  const result = queryEvaluationsSchema.parse(input);
492
499
  assert.strictEqual(result.evaluatorType, 'llm');
493
500
  });
494
- it('should accept all valid evaluatorType values', () => {
501
+ void it('should accept all valid evaluatorType values', () => {
495
502
  const types = ['llm', 'human', 'rule', 'classifier'];
496
503
  for (const type of types) {
497
504
  const result = queryEvaluationsSchema.parse({ evaluatorType: type });
498
505
  assert.strictEqual(result.evaluatorType, type);
499
506
  }
500
507
  });
501
- it('should reject invalid evaluatorType', () => {
508
+ void it('should reject invalid evaluatorType', () => {
502
509
  assert.throws(() => {
503
510
  queryEvaluationsSchema.parse({ evaluatorType: 'invalid' });
504
511
  });
505
512
  });
506
- it('should accept evaluator in groupBy', () => {
513
+ void it('should accept evaluator in groupBy', () => {
507
514
  const input = { groupBy: ['evaluator'] };
508
515
  const result = queryEvaluationsSchema.parse(input);
509
516
  assert.deepStrictEqual(result.groupBy, ['evaluator']);
510
517
  });
511
- it('should accept evaluator with other groupBy fields', () => {
518
+ void it('should accept evaluator with other groupBy fields', () => {
512
519
  const input = { groupBy: ['evaluationName', 'evaluator'] };
513
520
  const result = queryEvaluationsSchema.parse(input);
514
521
  assert.deepStrictEqual(result.groupBy, ['evaluationName', 'evaluator']);
515
522
  });
516
523
  });
517
- describe('handler with mocked backend', () => {
518
- let originalQueryEvaluations;
519
- beforeEach(() => {
520
- originalQueryEvaluations = LocalJsonlBackend.prototype.queryEvaluations;
521
- });
522
- afterEach(() => {
523
- LocalJsonlBackend.prototype.queryEvaluations = originalQueryEvaluations;
524
- });
525
- it('should include evaluator and evaluatorType in response', async () => {
526
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
524
+ void describe('handler with mocked backend', () => {
525
+ function createMockBackend(queryFn) {
526
+ return { queryEvaluations: queryFn };
527
+ }
528
+ void it('should include evaluator and evaluatorType in response', async () => {
529
+ const mockBackend = createMockBackend(vi.fn(async () => [
527
530
  {
528
531
  timestamp: '2026-01-28T10:00:00Z',
529
532
  evaluationName: 'Relevance',
530
- scoreValue: 0.92,
533
+ scoreValue: SCORE_DETAIL,
531
534
  evaluator: 'gpt-4-as-judge',
532
535
  evaluatorType: 'llm',
533
536
  },
534
- ]);
535
- const result = await queryEvaluations({});
537
+ ]));
538
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
536
539
  const evaluation = result.evaluations[0];
537
540
  assert.strictEqual(evaluation.evaluator, 'gpt-4-as-judge');
538
541
  assert.strictEqual(evaluation.evaluatorType, 'llm');
539
542
  });
540
- it('should summarize evaluations by evaluator', async () => {
541
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
542
- { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.9, evaluator: 'gpt-4-as-judge' },
543
- { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.8, evaluator: 'gpt-4-as-judge' },
544
- { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: 0.85, evaluator: 'human-reviewer' },
545
- ]);
546
- const result = await queryEvaluations({});
547
- assert.strictEqual(result.summary.byEvaluator['gpt-4-as-judge'], 2);
543
+ void it('should summarize evaluations by evaluator', async () => {
544
+ const mockBackend = createMockBackend(vi.fn(async () => [
545
+ { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, evaluator: 'gpt-4-as-judge' },
546
+ { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID, evaluator: 'gpt-4-as-judge' },
547
+ { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: SCORE_AVG_MID_HIGH, evaluator: 'human-reviewer' },
548
+ ]));
549
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
550
+ assert.strictEqual(result.summary.byEvaluator['gpt-4-as-judge'], EXPECTED_PAIR_COUNT);
548
551
  assert.strictEqual(result.summary.byEvaluator['human-reviewer'], 1);
549
552
  });
550
- it('should not count evaluations without evaluator in byEvaluator', async () => {
551
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
552
- { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.9, evaluator: 'gpt-4-as-judge' },
553
- { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.8 }, // no evaluator
554
- ]);
555
- const result = await queryEvaluations({});
553
+ void it('should not count evaluations without evaluator in byEvaluator', async () => {
554
+ const mockBackend = createMockBackend(vi.fn(async () => [
555
+ { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, evaluator: 'gpt-4-as-judge' },
556
+ { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID }, // no evaluator
557
+ ]));
558
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
556
559
  assert.strictEqual(result.summary.byEvaluator['gpt-4-as-judge'], 1);
557
560
  assert.strictEqual(Object.keys(result.summary.byEvaluator).length, 1);
558
561
  });
559
- it('should group by evaluator', async () => {
560
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
561
- { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.9, evaluator: 'gpt-4-as-judge' },
562
- { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.8, evaluator: 'gpt-4-as-judge' },
563
- { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: 0.7, evaluator: 'human-reviewer' },
564
- ]);
565
- const result = await queryEvaluations({ aggregation: 'avg', groupBy: ['evaluator'] });
562
+ void it('should group by evaluator', async () => {
563
+ const mockBackend = createMockBackend(vi.fn(async () => [
564
+ { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, evaluator: 'gpt-4-as-judge' },
565
+ { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID, evaluator: 'gpt-4-as-judge' },
566
+ { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: SCORE_LOW, evaluator: 'human-reviewer' },
567
+ ]));
568
+ const result = await queryEvaluations({ aggregation: 'avg', groupBy: ['evaluator'] }, { localBackend: mockBackend });
566
569
  assert.ok(result.summary.aggregations);
567
- assert.strictEqual(result.summary.aggregations.length, 2);
570
+ assert.strictEqual(result.summary.aggregations.length, EXPECTED_PAIR_COUNT);
568
571
  const gpt4 = result.summary.aggregations.find(a => a.evaluator === 'gpt-4-as-judge');
569
572
  const human = result.summary.aggregations.find(a => a.evaluator === 'human-reviewer');
570
573
  assert.ok(gpt4);
571
- assert.ok(Math.abs((gpt4.value ?? 0) - 0.85) < 0.0001, `Expected ~0.85, got ${gpt4.value}`);
572
- assert.strictEqual(gpt4.count, 2);
574
+ assert.ok(Math.abs((gpt4.value ?? 0) - SCORE_AVG_MID_HIGH) < FLOAT_TOLERANCE, `Expected ~0.85, got ${gpt4.value}`);
575
+ assert.strictEqual(gpt4.count, EXPECTED_PAIR_COUNT);
573
576
  assert.ok(human);
574
- assert.strictEqual(human.value, 0.7);
577
+ assert.strictEqual(human.value, SCORE_LOW);
575
578
  assert.strictEqual(human.count, 1);
576
579
  });
577
- it('should group by evaluationName and evaluator', async () => {
578
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
579
- { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.9, evaluator: 'gpt-4-as-judge' },
580
- { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Faithfulness', scoreValue: 0.8, evaluator: 'gpt-4-as-judge' },
581
- { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: 0.7, evaluator: 'human-reviewer' },
582
- ]);
583
- const result = await queryEvaluations({ aggregation: 'count', groupBy: ['evaluationName', 'evaluator'] });
580
+ void it('should group by evaluationName and evaluator', async () => {
581
+ const mockBackend = createMockBackend(vi.fn(async () => [
582
+ { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, evaluator: 'gpt-4-as-judge' },
583
+ { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Faithfulness', scoreValue: SCORE_MID, evaluator: 'gpt-4-as-judge' },
584
+ { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: SCORE_LOW, evaluator: 'human-reviewer' },
585
+ ]));
586
+ const result = await queryEvaluations({ aggregation: 'count', groupBy: ['evaluationName', 'evaluator'] }, { localBackend: mockBackend });
584
587
  assert.ok(result.summary.aggregations);
585
- assert.strictEqual(result.summary.aggregations.length, 3);
588
+ assert.strictEqual(result.summary.aggregations.length, EXPECTED_TRIPLE_COUNT);
586
589
  });
587
- it('should handle evaluations without evaluator in groupBy', async () => {
588
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
589
- { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.9, evaluator: 'gpt-4-as-judge' },
590
- { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.8 }, // no evaluator
591
- ]);
592
- const result = await queryEvaluations({ aggregation: 'count', groupBy: ['evaluator'] });
590
+ void it('should handle evaluations without evaluator in groupBy', async () => {
591
+ const mockBackend = createMockBackend(vi.fn(async () => [
592
+ { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, evaluator: 'gpt-4-as-judge' },
593
+ { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID }, // no evaluator
594
+ ]));
595
+ const result = await queryEvaluations({ aggregation: 'count', groupBy: ['evaluator'] }, { localBackend: mockBackend });
593
596
  assert.ok(result.summary.aggregations);
594
597
  // Should have two groups: one with evaluator, one without
595
- assert.strictEqual(result.summary.aggregations.length, 2);
598
+ assert.strictEqual(result.summary.aggregations.length, EXPECTED_PAIR_COUNT);
596
599
  });
597
- it('should include all evaluatorType values in response', async () => {
598
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
600
+ void it('should include all evaluatorType values in response', async () => {
601
+ const mockBackend = createMockBackend(vi.fn(async () => [
599
602
  { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', evaluatorType: 'llm' },
600
603
  { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'ToolUse', evaluatorType: 'rule' },
601
604
  { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'UserSatisfaction', evaluatorType: 'human' },
602
605
  { timestamp: '2026-01-28T10:03:00Z', evaluationName: 'Intent', evaluatorType: 'classifier' },
603
- ]);
604
- const result = await queryEvaluations({});
606
+ ]));
607
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
605
608
  // Results are sorted by timestamp DESC, so order is reversed
606
609
  const types = result.evaluations.map(e => e.evaluatorType).sort();
607
610
  assert.deepStrictEqual(types, ['classifier', 'human', 'llm', 'rule']);
608
611
  });
609
612
  });
610
613
  });
611
- describe('scoreUnit field (Phase 1)', () => {
612
- describe('handler with mocked backend', () => {
613
- let originalQueryEvaluations;
614
- beforeEach(() => {
615
- originalQueryEvaluations = LocalJsonlBackend.prototype.queryEvaluations;
616
- });
617
- afterEach(() => {
618
- LocalJsonlBackend.prototype.queryEvaluations = originalQueryEvaluations;
619
- });
620
- it('should include scoreUnit in response', async () => {
621
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
614
+ void describe('scoreUnit field (Phase 1)', () => {
615
+ void describe('handler with mocked backend', () => {
616
+ function createMockBackend(queryFn) {
617
+ return { queryEvaluations: queryFn };
618
+ }
619
+ void it('should include scoreUnit in response', async () => {
620
+ const mockBackend = createMockBackend(vi.fn(async () => [
622
621
  {
623
622
  timestamp: '2026-01-28T10:00:00Z',
624
623
  evaluationName: 'Relevance',
625
624
  scoreValue: 85,
626
625
  scoreUnit: 'percentage',
627
626
  },
628
- ]);
629
- const result = await queryEvaluations({});
627
+ ]));
628
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
630
629
  assert.strictEqual(result.evaluations[0].scoreUnit, 'percentage');
631
630
  });
632
- it('should normalize percentage scores for averageScore', async () => {
633
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
631
+ void it('should normalize percentage scores for averageScore', async () => {
632
+ const mockBackend = createMockBackend(vi.fn(async () => [
634
633
  { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 80, scoreUnit: 'percentage' },
635
634
  { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 90, scoreUnit: 'percentage' },
636
- ]);
637
- const result = await queryEvaluations({});
635
+ ]));
636
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
638
637
  // (80/100 + 90/100) / 2 = 0.85
639
- assert.ok(Math.abs((result.summary.averageScore ?? 0) - 0.85) < 0.0001, `Expected ~0.85, got ${result.summary.averageScore}`);
638
+ assert.ok(Math.abs((result.summary.averageScore ?? 0) - SCORE_AVG_MID_HIGH) < FLOAT_TOLERANCE, `Expected ~0.85, got ${result.summary.averageScore}`);
640
639
  });
641
- it('should not change ratio_0_1 scores for averageScore', async () => {
642
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
643
- { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.8, scoreUnit: 'ratio_0_1' },
644
- { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.9, scoreUnit: 'ratio_0_1' },
645
- ]);
646
- const result = await queryEvaluations({});
640
+ void it('should not change ratio_0_1 scores for averageScore', async () => {
641
+ const mockBackend = createMockBackend(vi.fn(async () => [
642
+ { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID, scoreUnit: 'ratio_0_1' },
643
+ { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, scoreUnit: 'ratio_0_1' },
644
+ ]));
645
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
647
646
  // (0.8 + 0.9) / 2 = 0.85
648
- assert.ok(Math.abs((result.summary.averageScore ?? 0) - 0.85) < 0.0001, `Expected ~0.85, got ${result.summary.averageScore}`);
647
+ assert.ok(Math.abs((result.summary.averageScore ?? 0) - SCORE_AVG_MID_HIGH) < FLOAT_TOLERANCE, `Expected ~0.85, got ${result.summary.averageScore}`);
649
648
  });
650
- it('should not change scores without unit for averageScore', async () => {
651
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
652
- { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.8 },
653
- { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.9 },
654
- ]);
655
- const result = await queryEvaluations({});
649
+ void it('should not change scores without unit for averageScore', async () => {
650
+ const mockBackend = createMockBackend(vi.fn(async () => [
651
+ { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID },
652
+ { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH },
653
+ ]));
654
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
656
655
  // (0.8 + 0.9) / 2 = 0.85
657
- assert.ok(Math.abs((result.summary.averageScore ?? 0) - 0.85) < 0.0001, `Expected ~0.85, got ${result.summary.averageScore}`);
656
+ assert.ok(Math.abs((result.summary.averageScore ?? 0) - SCORE_AVG_MID_HIGH) < FLOAT_TOLERANCE, `Expected ~0.85, got ${result.summary.averageScore}`);
658
657
  });
659
- it('should handle mixed units for averageScore', async () => {
660
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
658
+ void it('should handle mixed units for averageScore', async () => {
659
+ const mockBackend = createMockBackend(vi.fn(async () => [
661
660
  { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 80, scoreUnit: 'percentage' },
662
- { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.9, scoreUnit: 'ratio_0_1' },
663
- { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: 0.85 }, // no unit, defaults to ratio
664
- ]);
665
- const result = await queryEvaluations({});
661
+ { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, scoreUnit: 'ratio_0_1' },
662
+ { timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: SCORE_AVG_MID_HIGH }, // no unit, defaults to ratio
663
+ ]));
664
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
666
665
  // (0.8 + 0.9 + 0.85) / 3 = 0.85
667
- assert.ok(Math.abs((result.summary.averageScore ?? 0) - 0.85) < 0.0001, `Expected ~0.85, got ${result.summary.averageScore}`);
666
+ assert.ok(Math.abs((result.summary.averageScore ?? 0) - SCORE_AVG_MID_HIGH) < FLOAT_TOLERANCE, `Expected ~0.85, got ${result.summary.averageScore}`);
668
667
  });
669
- it('should handle percent as alias for percentage', async () => {
670
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
668
+ void it('should handle percent as alias for percentage', async () => {
669
+ const mockBackend = createMockBackend(vi.fn(async () => [
671
670
  { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 100, scoreUnit: 'percent' },
672
- ]);
673
- const result = await queryEvaluations({});
671
+ ]));
672
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
674
673
  // 100/100 = 1.0
675
674
  assert.strictEqual(result.summary.averageScore, 1.0);
676
675
  });
677
- it('should handle case-insensitive unit names', async () => {
678
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
676
+ void it('should handle case-insensitive unit names', async () => {
677
+ const mockBackend = createMockBackend(vi.fn(async () => [
679
678
  { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 50, scoreUnit: 'PERCENTAGE' },
680
679
  { timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 50, scoreUnit: 'Percentage' },
681
- ]);
682
- const result = await queryEvaluations({});
680
+ ]));
681
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
683
682
  // (50/100 + 50/100) / 2 = 0.5
684
- assert.strictEqual(result.summary.averageScore, 0.5);
683
+ assert.strictEqual(result.summary.averageScore, SCORE_HALF);
685
684
  });
686
- it('should not normalize unknown units', async () => {
687
- LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
688
- { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 5, scoreUnit: 'stars_1_5' },
689
- ]);
690
- const result = await queryEvaluations({});
685
+ void it('should not normalize unknown units', async () => {
686
+ const mockBackend = createMockBackend(vi.fn(async () => [
687
+ { timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: UNKNOWN_UNIT_SCORE, scoreUnit: 'stars_1_5' },
688
+ ]));
689
+ const result = await queryEvaluations({}, { localBackend: mockBackend });
691
690
  // Unknown unit, keep as-is
692
- assert.strictEqual(result.summary.averageScore, 5);
691
+ assert.strictEqual(result.summary.averageScore, UNKNOWN_UNIT_SCORE);
693
692
  });
694
693
  });
695
694
  });
696
- describe('aggregation group limit (M5)', () => {
697
- describe('buildAggregations', () => {
698
- it('should throw when exceeding MAX_AGGREGATION_GROUPS', () => {
699
- // Generate evaluations that would create > 10000 groups
695
+ void describe('aggregation group limit (M5)', () => {
696
+ void describe('buildAggregations', () => {
697
+ void it('should throw when exceeding MAX_AGGREGATION_GROUPS', () => {
700
698
  const evaluations = [];
701
- // Create 10001 unique evaluation names
702
- for (let i = 0; i <= 10000; i++) {
699
+ // Create MAX_AGGREGATION_GROUPS + 1 unique evaluation names
700
+ for (let i = 0; i <= MAX_AGGREGATION_GROUPS; i++) {
703
701
  evaluations.push({
704
702
  timestamp: '2026-01-28T10:00:00Z',
705
703
  evaluationName: `Eval-${i}`,
706
- scoreValue: 0.5,
704
+ scoreValue: SCORE_HALF,
707
705
  });
708
706
  }
709
- // This should throw because we're grouping by evaluationName with 10001 unique values
710
- assert.throws(() => buildAggregations(evaluations, 'avg', ['evaluationName']), /Aggregation group limit exceeded: 10000 max groups/);
707
+ assert.throws(() => buildAggregations(evaluations, 'avg', ['evaluationName']), /Aggregation group limit exceeded/);
711
708
  });
712
- it('should allow up to MAX_AGGREGATION_GROUPS groups', () => {
713
- // Generate evaluations that create exactly 10000 groups (the limit)
709
+ void it('should allow up to MAX_AGGREGATION_GROUPS groups', () => {
714
710
  const evaluations = [];
715
- for (let i = 0; i < 10000; i++) {
711
+ for (let i = 0; i < MAX_AGGREGATION_GROUPS; i++) {
716
712
  evaluations.push({
717
713
  timestamp: '2026-01-28T10:00:00Z',
718
714
  evaluationName: `Eval-${i}`,
719
- scoreValue: 0.5,
715
+ scoreValue: SCORE_HALF,
720
716
  });
721
717
  }
722
- // This should succeed with exactly 10000 groups
723
718
  const result = buildAggregations(evaluations, 'count', ['evaluationName']);
724
- assert.strictEqual(result.length, 10000);
719
+ assert.strictEqual(result.length, MAX_AGGREGATION_GROUPS);
725
720
  });
726
- it('should include helpful error message when limit exceeded', () => {
721
+ void it('should include helpful error message when limit exceeded', () => {
727
722
  const evaluations = [];
728
- for (let i = 0; i <= 10000; i++) {
723
+ for (let i = 0; i <= MAX_AGGREGATION_GROUPS; i++) {
729
724
  evaluations.push({
730
725
  timestamp: '2026-01-28T10:00:00Z',
731
726
  evaluationName: `Eval-${i}`,
732
- scoreValue: 0.5,
727
+ scoreValue: SCORE_HALF,
733
728
  });
734
729
  }
735
730
  assert.throws(() => buildAggregations(evaluations, 'avg', ['evaluationName']), /Reduce groupBy cardinality or add filters/);