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,1333 +0,0 @@
1
- import { describe, it, beforeEach, afterEach } from 'node:test';
2
- import assert from 'node:assert';
3
- import * as fs from 'fs';
4
- import * as path from 'path';
5
- import * as os from 'os';
6
- import { gzipSync, gunzipSync } from 'zlib';
7
- import { expandTilde, loadJson, loadJsonSafe, getDateString, listFiles, parseDateFromFilename, readJsonlSync, readJsonlSyncWithStats, streamJsonl, filterByDateRange, paginateResults, hasReachedLimit, cleanupOldFiles, isGzipFile, createJsonlStream, BatchWriter, StreamingAggregator, enforceMemoryLimit, shouldUseStreamingAggregation, getMemoryLimits, hasCircularReference, estimateByteSize, CONSERVATIVE_FALLBACK_SIZE, } from './file-utils.js';
8
- describe('file-utils', () => {
9
- let testDir;
10
- beforeEach(() => {
11
- // Create a unique temp directory for each test
12
- testDir = fs.mkdtempSync(path.join(os.tmpdir(), 'file-utils-test-'));
13
- });
14
- afterEach(() => {
15
- // Clean up temp directory
16
- if (testDir && fs.existsSync(testDir)) {
17
- fs.rmSync(testDir, { recursive: true, force: true });
18
- }
19
- });
20
- describe('expandTilde', () => {
21
- it('should return path as-is if it does not start with tilde', () => {
22
- const result = expandTilde('/absolute/path');
23
- assert.strictEqual(result, '/absolute/path');
24
- });
25
- it('should expand tilde to home directory for ~ alone', () => {
26
- const result = expandTilde('~');
27
- assert.strictEqual(result, os.homedir());
28
- });
29
- it('should expand tilde to home directory for ~/path', () => {
30
- const result = expandTilde('~/documents/file.txt');
31
- assert.strictEqual(result, path.join(os.homedir(), 'documents/file.txt'));
32
- });
33
- it('should return ~user/path as-is (not supported)', () => {
34
- const result = expandTilde('~someuser/path');
35
- assert.strictEqual(result, '~someuser/path');
36
- });
37
- it('should handle multiple directory levels', () => {
38
- const result = expandTilde('~/a/b/c/d');
39
- assert.strictEqual(result, path.join(os.homedir(), 'a/b/c/d'));
40
- });
41
- });
42
- describe('loadJson', () => {
43
- it('should load and parse valid JSON file', () => {
44
- const testData = { key: 'value', num: 42 };
45
- const filePath = path.join(testDir, 'test.json');
46
- fs.writeFileSync(filePath, JSON.stringify(testData));
47
- const result = loadJson(filePath);
48
- assert.deepStrictEqual(result, testData);
49
- });
50
- it('should return null if file does not exist', () => {
51
- const result = loadJson(path.join(testDir, 'nonexistent.json'));
52
- assert.strictEqual(result, null);
53
- });
54
- it('should return null on JSON parse error', () => {
55
- const filePath = path.join(testDir, 'invalid.json');
56
- fs.writeFileSync(filePath, 'invalid json {');
57
- const result = loadJson(filePath);
58
- assert.strictEqual(result, null);
59
- });
60
- it('should return fallback value if file does not exist', () => {
61
- const fallback = { default: true };
62
- const result = loadJson(path.join(testDir, 'nonexistent.json'), fallback);
63
- assert.deepStrictEqual(result, fallback);
64
- });
65
- it('should return fallback value on parse error', () => {
66
- const fallback = { default: true };
67
- const filePath = path.join(testDir, 'invalid.json');
68
- fs.writeFileSync(filePath, 'invalid json');
69
- const result = loadJson(filePath, fallback);
70
- assert.deepStrictEqual(result, fallback);
71
- });
72
- it('should handle empty JSON file', () => {
73
- const filePath = path.join(testDir, 'empty.json');
74
- fs.writeFileSync(filePath, '');
75
- const result = loadJson(filePath);
76
- assert.strictEqual(result, null);
77
- });
78
- it('should parse complex nested JSON', () => {
79
- const testData = {
80
- nested: { deep: { value: 'test' } },
81
- array: [1, 2, 3],
82
- };
83
- const filePath = path.join(testDir, 'complex.json');
84
- fs.writeFileSync(filePath, JSON.stringify(testData));
85
- const result = loadJson(filePath);
86
- assert.deepStrictEqual(result, testData);
87
- });
88
- });
89
- describe('loadJsonSafe', () => {
90
- it('should return loaded JSON if file exists and is valid', () => {
91
- const testData = { key: 'value' };
92
- const fallback = { fallback: true };
93
- const filePath = path.join(testDir, 'test.json');
94
- fs.writeFileSync(filePath, JSON.stringify(testData));
95
- const result = loadJsonSafe(filePath, fallback);
96
- assert.deepStrictEqual(result, testData);
97
- });
98
- it('should return fallback if file does not exist', () => {
99
- const fallback = { fallback: true };
100
- const result = loadJsonSafe(path.join(testDir, 'nonexistent.json'), fallback);
101
- assert.deepStrictEqual(result, fallback);
102
- });
103
- it('should return fallback on parse error', () => {
104
- const fallback = { fallback: true };
105
- const filePath = path.join(testDir, 'invalid.json');
106
- fs.writeFileSync(filePath, 'invalid json');
107
- const result = loadJsonSafe(filePath, fallback);
108
- assert.deepStrictEqual(result, fallback);
109
- });
110
- it('should never return null', () => {
111
- const fallback = { key: 'default' };
112
- const result = loadJsonSafe(path.join(testDir, 'nonexistent.json'), fallback);
113
- assert.notStrictEqual(result, null);
114
- });
115
- });
116
- describe('getDateString', () => {
117
- it('should format date as YYYY-MM-DD', () => {
118
- const date = new Date('2026-01-28T12:34:56.789Z');
119
- const result = getDateString(date);
120
- assert.strictEqual(result, '2026-01-28');
121
- });
122
- it('should use current date if none provided', () => {
123
- const result = getDateString();
124
- const now = new Date();
125
- const expected = now.toISOString().split('T')[0];
126
- assert.strictEqual(result, expected);
127
- });
128
- it('should handle leap year date', () => {
129
- const date = new Date('2024-02-29T00:00:00.000Z');
130
- const result = getDateString(date);
131
- assert.strictEqual(result, '2024-02-29');
132
- });
133
- it('should handle year boundary', () => {
134
- const date = new Date('2025-12-31T23:59:59.999Z');
135
- const result = getDateString(date);
136
- assert.strictEqual(result, '2025-12-31');
137
- });
138
- it('should handle January 1st', () => {
139
- const date = new Date('2026-01-01T00:00:00.000Z');
140
- const result = getDateString(date);
141
- assert.strictEqual(result, '2026-01-01');
142
- });
143
- });
144
- describe('listFiles', () => {
145
- it('should return empty array if directory does not exist', () => {
146
- const result = listFiles(path.join(testDir, 'nonexistent'), /\.json$/);
147
- assert.deepStrictEqual(result, []);
148
- });
149
- it('should filter files by pattern', () => {
150
- fs.writeFileSync(path.join(testDir, 'file1.json'), '{}');
151
- fs.writeFileSync(path.join(testDir, 'file2.json'), '{}');
152
- fs.writeFileSync(path.join(testDir, 'file3.txt'), 'text');
153
- fs.writeFileSync(path.join(testDir, 'file4.json'), '{}');
154
- const result = listFiles(testDir, /\.json$/);
155
- assert.strictEqual(result.length, 3);
156
- assert(result.every(f => f.endsWith('.json')));
157
- });
158
- it('should return full paths', () => {
159
- fs.writeFileSync(path.join(testDir, 'file1.json'), '{}');
160
- fs.writeFileSync(path.join(testDir, 'file2.json'), '{}');
161
- const result = listFiles(testDir, /\.json$/);
162
- assert(result.every(f => f.startsWith(testDir)));
163
- });
164
- it('should sort by modification time (newest first)', async () => {
165
- // Create files with different modification times
166
- const file1 = path.join(testDir, 'file1.json');
167
- const file2 = path.join(testDir, 'file2.json');
168
- const file3 = path.join(testDir, 'file3.json');
169
- fs.writeFileSync(file1, '{}');
170
- // Small delay to ensure different mtimes
171
- await new Promise(resolve => setTimeout(resolve, 50));
172
- fs.writeFileSync(file2, '{}');
173
- await new Promise(resolve => setTimeout(resolve, 50));
174
- fs.writeFileSync(file3, '{}');
175
- const result = listFiles(testDir, /\.json$/);
176
- assert.strictEqual(result[0], file3); // newest first
177
- assert.strictEqual(result[1], file2);
178
- assert.strictEqual(result[2], file1); // oldest last
179
- });
180
- it('should handle empty directory', () => {
181
- const result = listFiles(testDir, /\.json$/);
182
- assert.deepStrictEqual(result, []);
183
- });
184
- it('should match complex regex patterns', () => {
185
- fs.writeFileSync(path.join(testDir, 'traces-2026-01-28.jsonl'), '{}');
186
- fs.writeFileSync(path.join(testDir, 'metrics-2026-01-28.jsonl'), '{}');
187
- fs.writeFileSync(path.join(testDir, 'logs-2026-01-28.jsonl'), '{}');
188
- fs.writeFileSync(path.join(testDir, 'other.txt'), 'text');
189
- const result = listFiles(testDir, /^\w+-\d{4}-\d{2}-\d{2}\.jsonl$/);
190
- assert.strictEqual(result.length, 3);
191
- });
192
- });
193
- describe('parseDateFromFilename', () => {
194
- it('should extract date from filename with format traces-YYYY-MM-DD.jsonl', () => {
195
- const result = parseDateFromFilename('traces-2026-01-28.jsonl');
196
- assert.strictEqual(result, '2026-01-28');
197
- });
198
- it('should extract date from filename with format metrics-YYYY-MM-DD.jsonl', () => {
199
- const result = parseDateFromFilename('metrics-2026-12-25.jsonl');
200
- assert.strictEqual(result, '2026-12-25');
201
- });
202
- it('should return null if no date found', () => {
203
- const result = parseDateFromFilename('nodatehere.jsonl');
204
- assert.strictEqual(result, null);
205
- });
206
- it('should handle full path', () => {
207
- const result = parseDateFromFilename('/path/to/traces-2026-01-28.jsonl');
208
- assert.strictEqual(result, '2026-01-28');
209
- });
210
- it('should extract first matching date pattern', () => {
211
- const result = parseDateFromFilename('traces-2026-01-28-backup-2026-01-29.jsonl');
212
- assert.strictEqual(result, '2026-01-28');
213
- });
214
- it('should return null for invalid date 9999-99-99 (invalid month/day/year)', () => {
215
- const result = parseDateFromFilename('file-9999-99-99.jsonl');
216
- assert.strictEqual(result, null);
217
- });
218
- it('should return null for invalid month 13', () => {
219
- const result = parseDateFromFilename('file-2024-13-01.jsonl');
220
- assert.strictEqual(result, null);
221
- });
222
- it('should return null for invalid month 00', () => {
223
- const result = parseDateFromFilename('file-2024-00-15.jsonl');
224
- assert.strictEqual(result, null);
225
- });
226
- it('should return null for invalid day 00', () => {
227
- const result = parseDateFromFilename('file-2024-05-00.jsonl');
228
- assert.strictEqual(result, null);
229
- });
230
- it('should return null for invalid day 32', () => {
231
- const result = parseDateFromFilename('file-2024-05-32.jsonl');
232
- assert.strictEqual(result, null);
233
- });
234
- it('should return null for year before 2000', () => {
235
- const result = parseDateFromFilename('file-1999-06-15.jsonl');
236
- assert.strictEqual(result, null);
237
- });
238
- it('should return null for year after 2100', () => {
239
- const result = parseDateFromFilename('file-2101-06-15.jsonl');
240
- assert.strictEqual(result, null);
241
- });
242
- it('should accept year 2000 (boundary)', () => {
243
- const result = parseDateFromFilename('file-2000-01-01.jsonl');
244
- assert.strictEqual(result, '2000-01-01');
245
- });
246
- it('should accept year 2100 (boundary)', () => {
247
- const result = parseDateFromFilename('file-2100-12-31.jsonl');
248
- assert.strictEqual(result, '2100-12-31');
249
- });
250
- it('should return null for incomplete date patterns', () => {
251
- const result = parseDateFromFilename('file-2026-01.jsonl');
252
- assert.strictEqual(result, null);
253
- });
254
- it('should handle leap year date', () => {
255
- const result = parseDateFromFilename('traces-2024-02-29.jsonl');
256
- assert.strictEqual(result, '2024-02-29');
257
- });
258
- });
259
- describe('readJsonlSync', () => {
260
- it('should return empty array if file does not exist', () => {
261
- const result = readJsonlSync(path.join(testDir, 'nonexistent.jsonl'));
262
- assert.deepStrictEqual(result, []);
263
- });
264
- it('should parse JSONL file with multiple lines', () => {
265
- const filePath = path.join(testDir, 'test.jsonl');
266
- fs.writeFileSync(filePath, '{"id":1,"name":"first"}\n{"id":2,"name":"second"}\n{"id":3,"name":"third"}');
267
- const result = readJsonlSync(filePath);
268
- assert.strictEqual(result.length, 3);
269
- assert.deepStrictEqual(result[0], { id: 1, name: 'first' });
270
- assert.deepStrictEqual(result[1], { id: 2, name: 'second' });
271
- assert.deepStrictEqual(result[2], { id: 3, name: 'third' });
272
- });
273
- it('should skip empty lines', () => {
274
- const filePath = path.join(testDir, 'test.jsonl');
275
- fs.writeFileSync(filePath, '{"id":1}\n\n{"id":2}\n \n{"id":3}');
276
- const result = readJsonlSync(filePath);
277
- assert.strictEqual(result.length, 3);
278
- });
279
- it('should skip malformed JSON lines', () => {
280
- const filePath = path.join(testDir, 'test.jsonl');
281
- fs.writeFileSync(filePath, '{"id":1}\n{invalid json}\n{"id":2}');
282
- const result = readJsonlSync(filePath);
283
- assert.strictEqual(result.length, 2);
284
- assert.deepStrictEqual(result[0], { id: 1 });
285
- assert.deepStrictEqual(result[1], { id: 2 });
286
- });
287
- it('should respect limit parameter', () => {
288
- const filePath = path.join(testDir, 'test.jsonl');
289
- fs.writeFileSync(filePath, '{"id":1}\n{"id":2}\n{"id":3}\n{"id":4}\n{"id":5}');
290
- const result = readJsonlSync(filePath, 3);
291
- assert.strictEqual(result.length, 3);
292
- });
293
- it('should stop reading at limit even with more lines', () => {
294
- const filePath = path.join(testDir, 'test.jsonl');
295
- fs.writeFileSync(filePath, '{"id":1}\n{"id":2}\n{"id":3}\n{"id":4}');
296
- const result = readJsonlSync(filePath, 2);
297
- assert.strictEqual(result.length, 2);
298
- assert.deepStrictEqual(result[1], { id: 2 });
299
- });
300
- it('should handle file with trailing whitespace', () => {
301
- const filePath = path.join(testDir, 'test.jsonl');
302
- fs.writeFileSync(filePath, '{"id":1}\n{"id":2}\n ');
303
- const result = readJsonlSync(filePath);
304
- assert.strictEqual(result.length, 2);
305
- });
306
- it('should handle single line file', () => {
307
- const filePath = path.join(testDir, 'test.jsonl');
308
- fs.writeFileSync(filePath, '{"id":1}');
309
- const result = readJsonlSync(filePath);
310
- assert.strictEqual(result.length, 1);
311
- assert.deepStrictEqual(result[0], { id: 1 });
312
- });
313
- it('should handle complex JSON objects', () => {
314
- const filePath = path.join(testDir, 'test.jsonl');
315
- fs.writeFileSync(filePath, '{"nested":{"deep":{"value":1}}}\n{"array":[1,2,3]}');
316
- const result = readJsonlSync(filePath);
317
- assert.deepStrictEqual(result[0], { nested: { deep: { value: 1 } } });
318
- assert.deepStrictEqual(result[1], { array: [1, 2, 3] });
319
- });
320
- });
321
- describe('isGzipFile', () => {
322
- it('should return true for .gz extension', () => {
323
- assert.strictEqual(isGzipFile('file.jsonl.gz'), true);
324
- assert.strictEqual(isGzipFile('/path/to/traces-2026-01-28.jsonl.gz'), true);
325
- });
326
- it('should return false for non-.gz extension', () => {
327
- assert.strictEqual(isGzipFile('file.jsonl'), false);
328
- assert.strictEqual(isGzipFile('/path/to/traces.json'), false);
329
- assert.strictEqual(isGzipFile('file.gz.bak'), false);
330
- });
331
- });
332
- describe('createJsonlStream', () => {
333
- it('should return a readable stream for plain file', async () => {
334
- const filePath = path.join(testDir, 'test.jsonl');
335
- fs.writeFileSync(filePath, '{"id":1}\n{"id":2}');
336
- const stream = createJsonlStream(filePath);
337
- assert.ok(stream);
338
- assert.ok('pipe' in stream);
339
- // Consume the stream to avoid async activity after test ends
340
- const chunks = [];
341
- for await (const chunk of stream) {
342
- chunks.push(Buffer.from(chunk));
343
- }
344
- assert.ok(chunks.length > 0);
345
- });
346
- it('should return a decompressing stream for gzip file', async () => {
347
- const filePath = path.join(testDir, 'test.jsonl.gz');
348
- const content = '{"id":1}\n{"id":2}';
349
- fs.writeFileSync(filePath, gzipSync(content));
350
- const stream = createJsonlStream(filePath);
351
- assert.ok(stream);
352
- // Read and verify content is decompressed
353
- const chunks = [];
354
- for await (const chunk of stream) {
355
- chunks.push(Buffer.from(chunk));
356
- }
357
- const result = Buffer.concat(chunks).toString('utf-8');
358
- assert.strictEqual(result, content);
359
- });
360
- });
361
- describe('streamJsonl', () => {
362
- it('should yield nothing if file does not exist', async () => {
363
- const results = [];
364
- for await (const item of streamJsonl(path.join(testDir, 'nonexistent.jsonl'))) {
365
- results.push(item);
366
- }
367
- assert.strictEqual(results.length, 0);
368
- });
369
- it('should yield parsed JSON objects from file', async () => {
370
- const filePath = path.join(testDir, 'test.jsonl');
371
- fs.writeFileSync(filePath, '{"id":1}\n{"id":2}\n{"id":3}');
372
- const results = [];
373
- for await (const item of streamJsonl(filePath)) {
374
- results.push(item);
375
- }
376
- assert.strictEqual(results.length, 3);
377
- assert.deepStrictEqual(results[0], { id: 1 });
378
- assert.deepStrictEqual(results[1], { id: 2 });
379
- assert.deepStrictEqual(results[2], { id: 3 });
380
- });
381
- it('should skip empty lines', async () => {
382
- const filePath = path.join(testDir, 'test.jsonl');
383
- fs.writeFileSync(filePath, '{"id":1}\n\n \n{"id":2}');
384
- const results = [];
385
- for await (const item of streamJsonl(filePath)) {
386
- results.push(item);
387
- }
388
- assert.strictEqual(results.length, 2);
389
- });
390
- it('should skip malformed JSON lines', async () => {
391
- const filePath = path.join(testDir, 'test.jsonl');
392
- fs.writeFileSync(filePath, '{"id":1}\n{invalid}\n{"id":2}');
393
- const results = [];
394
- for await (const item of streamJsonl(filePath)) {
395
- results.push(item);
396
- }
397
- assert.strictEqual(results.length, 2);
398
- assert.deepStrictEqual(results[0], { id: 1 });
399
- assert.deepStrictEqual(results[1], { id: 2 });
400
- });
401
- it('should handle large JSONL files efficiently', async () => {
402
- const filePath = path.join(testDir, 'large.jsonl');
403
- const lines = Array.from({ length: 1000 }, (_, i) => JSON.stringify({ id: i })).join('\n');
404
- fs.writeFileSync(filePath, lines);
405
- let count = 0;
406
- for await (const _item of streamJsonl(filePath)) {
407
- count++;
408
- }
409
- assert.strictEqual(count, 1000);
410
- });
411
- it('should stream gzipped JSONL file', async () => {
412
- const filePath = path.join(testDir, 'test.jsonl.gz');
413
- const content = '{"id":1}\n{"id":2}\n{"id":3}';
414
- fs.writeFileSync(filePath, gzipSync(content));
415
- const results = [];
416
- for await (const item of streamJsonl(filePath)) {
417
- results.push(item);
418
- }
419
- assert.strictEqual(results.length, 3);
420
- assert.deepStrictEqual(results[0], { id: 1 });
421
- assert.deepStrictEqual(results[1], { id: 2 });
422
- assert.deepStrictEqual(results[2], { id: 3 });
423
- });
424
- it('should skip malformed lines in gzipped file', async () => {
425
- const filePath = path.join(testDir, 'test.jsonl.gz');
426
- const content = '{"id":1}\n{invalid}\n{"id":2}';
427
- fs.writeFileSync(filePath, gzipSync(content));
428
- const results = [];
429
- for await (const item of streamJsonl(filePath)) {
430
- results.push(item);
431
- }
432
- assert.strictEqual(results.length, 2);
433
- assert.deepStrictEqual(results[0], { id: 1 });
434
- assert.deepStrictEqual(results[1], { id: 2 });
435
- });
436
- it('should track parse stats when statsTracker is provided', async () => {
437
- const filePath = path.join(testDir, 'test.jsonl');
438
- // 2 valid, 1 invalid, 2 empty
439
- fs.writeFileSync(filePath, '{"id":1}\n\n{invalid}\n \n{"id":2}');
440
- const tracker = {
441
- successes: 0,
442
- failures: 0,
443
- empties: 0,
444
- recordSuccess(_path) { this.successes++; },
445
- recordFailure(_path) { this.failures++; },
446
- recordEmpty(_path) { this.empties++; },
447
- };
448
- const results = [];
449
- for await (const item of streamJsonl(filePath, { statsTracker: tracker })) {
450
- results.push(item);
451
- }
452
- assert.strictEqual(results.length, 2);
453
- assert.strictEqual(tracker.successes, 2);
454
- assert.strictEqual(tracker.failures, 1);
455
- assert.strictEqual(tracker.empties, 2);
456
- });
457
- it('should work without statsTracker (backward compatible)', async () => {
458
- const filePath = path.join(testDir, 'test.jsonl');
459
- fs.writeFileSync(filePath, '{"id":1}\n{"id":2}');
460
- const results = [];
461
- for await (const item of streamJsonl(filePath)) {
462
- results.push(item);
463
- }
464
- assert.strictEqual(results.length, 2);
465
- });
466
- });
467
- describe('filterByDateRange', () => {
468
- const items = [
469
- { id: 1, timestamp: '2026-01-10' },
470
- { id: 2, timestamp: '2026-01-15' },
471
- { id: 3, timestamp: '2026-01-20' },
472
- { id: 4, timestamp: '2026-01-25' },
473
- ];
474
- it('should return all items if no date range specified', () => {
475
- const result = filterByDateRange(items);
476
- assert.strictEqual(result.length, 4);
477
- });
478
- it('should filter items after startDate', () => {
479
- const result = filterByDateRange(items, '2026-01-15');
480
- assert.strictEqual(result.length, 3);
481
- assert.deepStrictEqual(result[0], { id: 2, timestamp: '2026-01-15' });
482
- });
483
- it('should filter items before endDate', () => {
484
- const result = filterByDateRange(items, undefined, '2026-01-20');
485
- assert.strictEqual(result.length, 3);
486
- assert.deepStrictEqual(result[2], { id: 3, timestamp: '2026-01-20' });
487
- });
488
- it('should filter items between startDate and endDate', () => {
489
- const result = filterByDateRange(items, '2026-01-12', '2026-01-22');
490
- assert.strictEqual(result.length, 2);
491
- assert.deepStrictEqual(result[0], { id: 2, timestamp: '2026-01-15' });
492
- assert.deepStrictEqual(result[1], { id: 3, timestamp: '2026-01-20' });
493
- });
494
- it('should include items with exact startDate', () => {
495
- const result = filterByDateRange(items, '2026-01-15');
496
- assert(result.some(item => item.id === 2));
497
- });
498
- it('should include items with exact endDate', () => {
499
- const result = filterByDateRange(items, undefined, '2026-01-15');
500
- assert(result.some(item => item.id === 2));
501
- });
502
- it('should include items without timestamp', () => {
503
- const itemsWithoutTs = [
504
- { id: 1, timestamp: '2026-01-10' },
505
- { id: 2 },
506
- { id: 3, timestamp: '2026-01-20' },
507
- ];
508
- const result = filterByDateRange(itemsWithoutTs, '2026-01-15');
509
- assert.strictEqual(result.length, 2);
510
- assert(result.some(item => item.id === 2));
511
- });
512
- it('should return empty array if no items in range', () => {
513
- const result = filterByDateRange(items, '2026-02-01', '2026-02-28');
514
- assert.deepStrictEqual(result, []);
515
- });
516
- it('should handle empty items array', () => {
517
- const result = filterByDateRange([], '2026-01-01', '2026-12-31');
518
- assert.deepStrictEqual(result, []);
519
- });
520
- it('should work with time component in timestamp', () => {
521
- const itemsWithTime = [
522
- { id: 1, timestamp: '2026-01-15T10:00:00' },
523
- { id: 2, timestamp: '2026-01-15T15:00:00' },
524
- { id: 3, timestamp: '2026-01-16T10:00:00' },
525
- ];
526
- // Note: filterByDateRange uses lexicographic comparison
527
- // '2026-01-15T...' > '2026-01-15' due to 'T', so use end of day
528
- const result = filterByDateRange(itemsWithTime, '2026-01-15', '2026-01-15T23:59:59');
529
- assert.strictEqual(result.length, 2);
530
- });
531
- it('should handle lexicographic string comparison correctly', () => {
532
- const itemsWithDates = [
533
- { id: 1, timestamp: '2026-01-01' },
534
- { id: 2, timestamp: '2026-02-01' },
535
- { id: 3, timestamp: '2026-10-01' },
536
- ];
537
- const result = filterByDateRange(itemsWithDates, '2026-02-01', '2026-10-01');
538
- assert.strictEqual(result.length, 2);
539
- });
540
- it('should handle generic type with optional timestamp', () => {
541
- const customItems = [
542
- { name: 'item1', timestamp: '2026-01-10' },
543
- { name: 'item2' },
544
- ];
545
- const result = filterByDateRange(customItems, '2026-01-09', '2026-01-11');
546
- assert.strictEqual(result.length, 2);
547
- });
548
- });
549
- describe('paginateResults', () => {
550
- const items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
551
- it('should return items from offset to offset + limit', () => {
552
- const result = paginateResults(items, 2, 3);
553
- assert.deepStrictEqual(result, [3, 4, 5]);
554
- });
555
- it('should return from start when offset is 0', () => {
556
- const result = paginateResults(items, 0, 5);
557
- assert.deepStrictEqual(result, [1, 2, 3, 4, 5]);
558
- });
559
- it('should handle offset at end of array', () => {
560
- const result = paginateResults(items, 8, 5);
561
- assert.deepStrictEqual(result, [9, 10]);
562
- });
563
- it('should return empty array when offset exceeds length', () => {
564
- const result = paginateResults(items, 15, 5);
565
- assert.deepStrictEqual(result, []);
566
- });
567
- it('should handle limit larger than remaining items', () => {
568
- const result = paginateResults(items, 7, 10);
569
- assert.deepStrictEqual(result, [8, 9, 10]);
570
- });
571
- it('should handle empty array', () => {
572
- const result = paginateResults([], 0, 10);
573
- assert.deepStrictEqual(result, []);
574
- });
575
- it('should work with object arrays', () => {
576
- const objs = [{ id: 1 }, { id: 2 }, { id: 3 }];
577
- const result = paginateResults(objs, 1, 2);
578
- assert.deepStrictEqual(result, [{ id: 2 }, { id: 3 }]);
579
- });
580
- });
581
- describe('hasReachedLimit', () => {
582
- it('should return true when results equal offset + limit', () => {
583
- const result = hasReachedLimit(10, 5, 5);
584
- assert.strictEqual(result, true);
585
- });
586
- it('should return true when results exceed offset + limit', () => {
587
- const result = hasReachedLimit(15, 5, 5);
588
- assert.strictEqual(result, true);
589
- });
590
- it('should return false when results are less than offset + limit', () => {
591
- const result = hasReachedLimit(8, 5, 5);
592
- assert.strictEqual(result, false);
593
- });
594
- it('should return false with zero results', () => {
595
- const result = hasReachedLimit(0, 0, 10);
596
- assert.strictEqual(result, false);
597
- });
598
- it('should handle zero offset', () => {
599
- const result = hasReachedLimit(10, 0, 10);
600
- assert.strictEqual(result, true);
601
- });
602
- });
603
- describe('readJsonlSyncWithStats', () => {
604
- it('should return data and stats', () => {
605
- const filePath = path.join(testDir, 'test.jsonl');
606
- fs.writeFileSync(filePath, '{"id":1}\n{"id":2}\n{"id":3}');
607
- const result = readJsonlSyncWithStats(filePath);
608
- assert.ok('data' in result);
609
- assert.ok('stats' in result);
610
- assert.strictEqual(result.data.length, 3);
611
- assert.strictEqual(result.stats.totalLines, 3);
612
- assert.strictEqual(result.stats.parsedLines, 3);
613
- assert.strictEqual(result.stats.skippedLines, 0);
614
- assert.strictEqual(result.stats.emptyLines, 0);
615
- });
616
- it('should count skipped lines', () => {
617
- const filePath = path.join(testDir, 'test.jsonl');
618
- fs.writeFileSync(filePath, '{"id":1}\n{invalid json}\n{"id":2}\n{also invalid}');
619
- const result = readJsonlSyncWithStats(filePath);
620
- assert.strictEqual(result.data.length, 2);
621
- assert.strictEqual(result.stats.parsedLines, 2);
622
- assert.strictEqual(result.stats.skippedLines, 2);
623
- });
624
- it('should count empty lines', () => {
625
- const filePath = path.join(testDir, 'test.jsonl');
626
- // Note: trailing empty lines are removed by trim(), so only internal empty lines are counted
627
- fs.writeFileSync(filePath, '{"id":1}\n\n \n{"id":2}');
628
- const result = readJsonlSyncWithStats(filePath);
629
- assert.strictEqual(result.data.length, 2);
630
- assert.strictEqual(result.stats.emptyLines, 2);
631
- });
632
- it('should respect limit parameter', () => {
633
- const filePath = path.join(testDir, 'test.jsonl');
634
- fs.writeFileSync(filePath, '{"id":1}\n{"id":2}\n{"id":3}\n{"id":4}\n{"id":5}');
635
- const result = readJsonlSyncWithStats(filePath, 3);
636
- assert.strictEqual(result.data.length, 3);
637
- assert.strictEqual(result.stats.parsedLines, 3);
638
- });
639
- it('should return empty stats for non-existent file', () => {
640
- const result = readJsonlSyncWithStats(path.join(testDir, 'nonexistent.jsonl'));
641
- assert.deepStrictEqual(result.data, []);
642
- assert.strictEqual(result.stats.totalLines, 0);
643
- assert.strictEqual(result.stats.parsedLines, 0);
644
- });
645
- it('should track all stats together', () => {
646
- const filePath = path.join(testDir, 'test.jsonl');
647
- fs.writeFileSync(filePath, '{"id":1}\n\n{bad}\n{"id":2}\n \n{invalid}\n{"id":3}');
648
- const result = readJsonlSyncWithStats(filePath);
649
- assert.strictEqual(result.data.length, 3);
650
- assert.strictEqual(result.stats.totalLines, 7);
651
- assert.strictEqual(result.stats.parsedLines, 3);
652
- assert.strictEqual(result.stats.skippedLines, 2);
653
- assert.strictEqual(result.stats.emptyLines, 2);
654
- });
655
- });
656
- describe('cleanupOldFiles', () => {
657
- it('should return empty result for non-existent directory', () => {
658
- const result = cleanupOldFiles(path.join(testDir, 'nonexistent'));
659
- assert.strictEqual(result.deleted, 0);
660
- assert.deepStrictEqual(result.errors, []);
661
- });
662
- it('should delete files older than retention period', () => {
663
- // Create files with dates in the past
664
- const oldDate = '2020-01-01';
665
- const recentDate = new Date().toISOString().split('T')[0];
666
- fs.writeFileSync(path.join(testDir, `traces-${oldDate}.jsonl`), '{}');
667
- fs.writeFileSync(path.join(testDir, `logs-${oldDate}.jsonl`), '{}');
668
- fs.writeFileSync(path.join(testDir, `traces-${recentDate}.jsonl`), '{}');
669
- const result = cleanupOldFiles(testDir, 7);
670
- assert.strictEqual(result.deleted, 2);
671
- assert.deepStrictEqual(result.errors, []);
672
- // Verify old files are deleted
673
- assert.strictEqual(fs.existsSync(path.join(testDir, `traces-${oldDate}.jsonl`)), false);
674
- assert.strictEqual(fs.existsSync(path.join(testDir, `logs-${oldDate}.jsonl`)), false);
675
- // Verify recent file is kept
676
- assert.strictEqual(fs.existsSync(path.join(testDir, `traces-${recentDate}.jsonl`)), true);
677
- });
678
- it('should not delete files within retention period', () => {
679
- const today = new Date();
680
- const yesterday = new Date(today.getTime() - 24 * 60 * 60 * 1000);
681
- const yesterdayStr = yesterday.toISOString().split('T')[0];
682
- fs.writeFileSync(path.join(testDir, `traces-${yesterdayStr}.jsonl`), '{}');
683
- const result = cleanupOldFiles(testDir, 7);
684
- assert.strictEqual(result.deleted, 0);
685
- assert.strictEqual(fs.existsSync(path.join(testDir, `traces-${yesterdayStr}.jsonl`)), true);
686
- });
687
- it('should skip files without parseable dates', () => {
688
- fs.writeFileSync(path.join(testDir, 'some-random-file.jsonl'), '{}');
689
- fs.writeFileSync(path.join(testDir, 'no-date.jsonl'), '{}');
690
- const result = cleanupOldFiles(testDir, 7);
691
- assert.strictEqual(result.deleted, 0);
692
- assert.strictEqual(fs.existsSync(path.join(testDir, 'some-random-file.jsonl')), true);
693
- assert.strictEqual(fs.existsSync(path.join(testDir, 'no-date.jsonl')), true);
694
- });
695
- it('should only process .jsonl files', () => {
696
- const oldDate = '2020-01-01';
697
- fs.writeFileSync(path.join(testDir, `traces-${oldDate}.jsonl`), '{}');
698
- fs.writeFileSync(path.join(testDir, `traces-${oldDate}.json`), '{}');
699
- fs.writeFileSync(path.join(testDir, `traces-${oldDate}.txt`), 'text');
700
- const result = cleanupOldFiles(testDir, 7);
701
- assert.strictEqual(result.deleted, 1);
702
- // Only .jsonl file should be deleted
703
- assert.strictEqual(fs.existsSync(path.join(testDir, `traces-${oldDate}.jsonl`)), false);
704
- assert.strictEqual(fs.existsSync(path.join(testDir, `traces-${oldDate}.json`)), true);
705
- assert.strictEqual(fs.existsSync(path.join(testDir, `traces-${oldDate}.txt`)), true);
706
- });
707
- it('should respect custom retention period', () => {
708
- const today = new Date();
709
- // Create file from 5 days ago
710
- const fiveDaysAgo = new Date(today.getTime() - 5 * 24 * 60 * 60 * 1000);
711
- const fiveDaysAgoStr = fiveDaysAgo.toISOString().split('T')[0];
712
- fs.writeFileSync(path.join(testDir, `traces-${fiveDaysAgoStr}.jsonl`), '{}');
713
- // With 7 day retention, file should be kept
714
- let result = cleanupOldFiles(testDir, 7);
715
- assert.strictEqual(result.deleted, 0);
716
- assert.strictEqual(fs.existsSync(path.join(testDir, `traces-${fiveDaysAgoStr}.jsonl`)), true);
717
- // With 3 day retention, file should be deleted
718
- result = cleanupOldFiles(testDir, 3);
719
- assert.strictEqual(result.deleted, 1);
720
- assert.strictEqual(fs.existsSync(path.join(testDir, `traces-${fiveDaysAgoStr}.jsonl`)), false);
721
- });
722
- it('should handle empty directory', () => {
723
- const result = cleanupOldFiles(testDir, 7);
724
- assert.strictEqual(result.deleted, 0);
725
- assert.deepStrictEqual(result.errors, []);
726
- });
727
- it('should reject directories outside allowed paths', () => {
728
- const outsideDir = fs.mkdtempSync(path.join(os.tmpdir(), 'outside-'));
729
- try {
730
- fs.writeFileSync(path.join(outsideDir, 'traces-2020-01-01.jsonl'), '{}');
731
- const result = cleanupOldFiles(outsideDir, 7, [testDir]);
732
- assert.strictEqual(result.deleted, 0);
733
- assert.strictEqual(result.errors.length, 1);
734
- assert(result.errors[0].includes('not within allowed paths'));
735
- // File should still exist
736
- assert.strictEqual(fs.existsSync(path.join(outsideDir, 'traces-2020-01-01.jsonl')), true);
737
- }
738
- finally {
739
- fs.rmSync(outsideDir, { recursive: true, force: true });
740
- }
741
- });
742
- it('should allow directories within allowed paths', () => {
743
- const subDir = path.join(testDir, 'subdir');
744
- fs.mkdirSync(subDir);
745
- fs.writeFileSync(path.join(subDir, 'traces-2020-01-01.jsonl'), '{}');
746
- const result = cleanupOldFiles(subDir, 7, [testDir]);
747
- assert.strictEqual(result.deleted, 1);
748
- assert.deepStrictEqual(result.errors, []);
749
- });
750
- it('should handle file types: traces, logs, metrics', () => {
751
- const oldDate = '2020-01-01';
752
- fs.writeFileSync(path.join(testDir, `traces-${oldDate}.jsonl`), '{}');
753
- fs.writeFileSync(path.join(testDir, `logs-${oldDate}.jsonl`), '{}');
754
- fs.writeFileSync(path.join(testDir, `metrics-${oldDate}.jsonl`), '{}');
755
- const result = cleanupOldFiles(testDir, 7);
756
- assert.strictEqual(result.deleted, 3);
757
- assert.deepStrictEqual(result.errors, []);
758
- });
759
- it('should use default retention of 7 days', () => {
760
- const today = new Date();
761
- // Create file from 8 days ago
762
- const eightDaysAgo = new Date(today.getTime() - 8 * 24 * 60 * 60 * 1000);
763
- const eightDaysAgoStr = eightDaysAgo.toISOString().split('T')[0];
764
- // Create file from 6 days ago
765
- const sixDaysAgo = new Date(today.getTime() - 6 * 24 * 60 * 60 * 1000);
766
- const sixDaysAgoStr = sixDaysAgo.toISOString().split('T')[0];
767
- fs.writeFileSync(path.join(testDir, `traces-${eightDaysAgoStr}.jsonl`), '{}');
768
- fs.writeFileSync(path.join(testDir, `traces-${sixDaysAgoStr}.jsonl`), '{}');
769
- // Use default retention (7 days)
770
- const result = cleanupOldFiles(testDir);
771
- assert.strictEqual(result.deleted, 1);
772
- assert.strictEqual(fs.existsSync(path.join(testDir, `traces-${eightDaysAgoStr}.jsonl`)), false);
773
- assert.strictEqual(fs.existsSync(path.join(testDir, `traces-${sixDaysAgoStr}.jsonl`)), true);
774
- });
775
- it('should delete old .jsonl.gz files', () => {
776
- const oldDate = '2020-01-01';
777
- const recentDate = new Date().toISOString().split('T')[0];
778
- fs.writeFileSync(path.join(testDir, `traces-${oldDate}.jsonl.gz`), gzipSync('{}'));
779
- fs.writeFileSync(path.join(testDir, `logs-${oldDate}.jsonl.gz`), gzipSync('{}'));
780
- fs.writeFileSync(path.join(testDir, `traces-${recentDate}.jsonl.gz`), gzipSync('{}'));
781
- const result = cleanupOldFiles(testDir, 7);
782
- assert.strictEqual(result.deleted, 2);
783
- assert.strictEqual(fs.existsSync(path.join(testDir, `traces-${oldDate}.jsonl.gz`)), false);
784
- assert.strictEqual(fs.existsSync(path.join(testDir, `logs-${oldDate}.jsonl.gz`)), false);
785
- assert.strictEqual(fs.existsSync(path.join(testDir, `traces-${recentDate}.jsonl.gz`)), true);
786
- });
787
- it('should handle mixed .jsonl and .jsonl.gz files', () => {
788
- const oldDate = '2020-01-01';
789
- fs.writeFileSync(path.join(testDir, `traces-${oldDate}.jsonl`), '{}');
790
- fs.writeFileSync(path.join(testDir, `logs-${oldDate}.jsonl.gz`), gzipSync('{}'));
791
- const result = cleanupOldFiles(testDir, 7);
792
- assert.strictEqual(result.deleted, 2);
793
- assert.strictEqual(fs.existsSync(path.join(testDir, `traces-${oldDate}.jsonl`)), false);
794
- assert.strictEqual(fs.existsSync(path.join(testDir, `logs-${oldDate}.jsonl.gz`)), false);
795
- });
796
- });
797
- describe('BatchWriter', () => {
798
- it('should write records to file when batch size is reached', () => {
799
- const filePath = path.join(testDir, 'batch.jsonl');
800
- const writer = new BatchWriter(filePath, { batchSize: 3 });
801
- writer.write({ id: 1 });
802
- writer.write({ id: 2 });
803
- assert.strictEqual(fs.existsSync(filePath), false); // Not flushed yet
804
- writer.write({ id: 3 }); // Triggers flush
805
- assert.strictEqual(fs.existsSync(filePath), true);
806
- writer.close();
807
- const content = fs.readFileSync(filePath, 'utf-8');
808
- const lines = content.trim().split('\n');
809
- assert.strictEqual(lines.length, 3);
810
- });
811
- it('should flush remaining records on close', () => {
812
- const filePath = path.join(testDir, 'batch.jsonl');
813
- const writer = new BatchWriter(filePath, { batchSize: 10 });
814
- writer.write({ id: 1 });
815
- writer.write({ id: 2 });
816
- const stats = writer.close();
817
- assert.strictEqual(stats.recordsWritten, 2);
818
- assert.strictEqual(fs.existsSync(filePath), true);
819
- const content = fs.readFileSync(filePath, 'utf-8');
820
- const lines = content.trim().split('\n');
821
- assert.strictEqual(lines.length, 2);
822
- });
823
- it('should append to file on multiple flushes', () => {
824
- const filePath = path.join(testDir, 'batch.jsonl');
825
- const writer = new BatchWriter(filePath, { batchSize: 2 });
826
- writer.write({ id: 1 });
827
- writer.write({ id: 2 }); // Flush 1
828
- writer.write({ id: 3 });
829
- writer.write({ id: 4 }); // Flush 2
830
- writer.write({ id: 5 });
831
- writer.close(); // Flush 3
832
- const content = fs.readFileSync(filePath, 'utf-8');
833
- const lines = content.trim().split('\n');
834
- assert.strictEqual(lines.length, 5);
835
- // Verify content
836
- assert.deepStrictEqual(JSON.parse(lines[0]), { id: 1 });
837
- assert.deepStrictEqual(JSON.parse(lines[4]), { id: 5 });
838
- });
839
- it('should write gzip compressed output', () => {
840
- const filePath = path.join(testDir, 'batch.jsonl.gz');
841
- const writer = new BatchWriter(filePath, { batchSize: 10, gzip: true });
842
- writer.write({ id: 1 });
843
- writer.write({ id: 2 });
844
- writer.close();
845
- // File should be gzip compressed
846
- const compressed = fs.readFileSync(filePath);
847
- const decompressed = gunzipSync(compressed).toString('utf-8');
848
- const lines = decompressed.trim().split('\n');
849
- assert.strictEqual(lines.length, 2);
850
- });
851
- it('should handle gzip append correctly', () => {
852
- const filePath = path.join(testDir, 'batch.jsonl.gz');
853
- const writer = new BatchWriter(filePath, { batchSize: 2, gzip: true });
854
- writer.write({ id: 1 });
855
- writer.write({ id: 2 }); // Flush 1
856
- writer.write({ id: 3 });
857
- writer.close(); // Flush 2
858
- const compressed = fs.readFileSync(filePath);
859
- const decompressed = gunzipSync(compressed).toString('utf-8');
860
- const lines = decompressed.trim().split('\n');
861
- assert.strictEqual(lines.length, 3);
862
- });
863
- it('should create parent directories if mkdirp is true', () => {
864
- const filePath = path.join(testDir, 'nested', 'dir', 'batch.jsonl');
865
- const writer = new BatchWriter(filePath, { mkdirp: true });
866
- writer.write({ id: 1 });
867
- writer.close();
868
- assert.strictEqual(fs.existsSync(filePath), true);
869
- });
870
- it('should use default batch size of 100', () => {
871
- const filePath = path.join(testDir, 'batch.jsonl');
872
- const writer = new BatchWriter(filePath);
873
- // Write 99 records - should not flush
874
- for (let i = 0; i < 99; i++) {
875
- writer.write({ id: i });
876
- }
877
- assert.strictEqual(fs.existsSync(filePath), false);
878
- // 100th record triggers flush
879
- writer.write({ id: 99 });
880
- assert.strictEqual(fs.existsSync(filePath), true);
881
- writer.close();
882
- });
883
- it('should track statistics correctly', () => {
884
- const filePath = path.join(testDir, 'batch.jsonl');
885
- const writer = new BatchWriter(filePath, { batchSize: 2 });
886
- writer.write({ id: 1 });
887
- writer.write({ id: 2 }); // Flush 1
888
- writer.write({ id: 3 });
889
- const stats = writer.close(); // Flush 2
890
- assert.strictEqual(stats.recordsWritten, 3);
891
- assert.strictEqual(stats.flushCount, 2);
892
- assert.ok(stats.bytesWritten > 0);
893
- });
894
- it('should report buffered count correctly', () => {
895
- const filePath = path.join(testDir, 'batch.jsonl');
896
- const writer = new BatchWriter(filePath, { batchSize: 5 });
897
- assert.strictEqual(writer.bufferedCount, 0);
898
- writer.write({ id: 1 });
899
- assert.strictEqual(writer.bufferedCount, 1);
900
- writer.write({ id: 2 });
901
- assert.strictEqual(writer.bufferedCount, 2);
902
- writer.close();
903
- assert.strictEqual(writer.bufferedCount, 0);
904
- });
905
- it('should handle writeAll for multiple records', () => {
906
- const filePath = path.join(testDir, 'batch.jsonl');
907
- const writer = new BatchWriter(filePath, { batchSize: 10 });
908
- writer.writeAll([{ id: 1 }, { id: 2 }, { id: 3 }]);
909
- writer.close();
910
- const content = fs.readFileSync(filePath, 'utf-8');
911
- const lines = content.trim().split('\n');
912
- assert.strictEqual(lines.length, 3);
913
- });
914
- it('should handle empty close gracefully', () => {
915
- const filePath = path.join(testDir, 'batch.jsonl');
916
- const writer = new BatchWriter(filePath);
917
- const stats = writer.close();
918
- assert.strictEqual(stats.recordsWritten, 0);
919
- assert.strictEqual(stats.flushCount, 0);
920
- assert.strictEqual(fs.existsSync(filePath), false);
921
- });
922
- });
923
- describe('StreamingAggregator', () => {
924
- it('should compute count correctly', () => {
925
- const aggregator = new StreamingAggregator();
926
- aggregator.add(1);
927
- aggregator.add(2);
928
- aggregator.add(3);
929
- assert.strictEqual(aggregator.getResult('count'), 3);
930
- assert.strictEqual(aggregator.getCount(), 3);
931
- });
932
- it('should compute sum correctly', () => {
933
- const aggregator = new StreamingAggregator();
934
- aggregator.add(10);
935
- aggregator.add(20);
936
- aggregator.add(30);
937
- assert.strictEqual(aggregator.getResult('sum'), 60);
938
- });
939
- it('should compute avg correctly', () => {
940
- const aggregator = new StreamingAggregator();
941
- aggregator.add(10);
942
- aggregator.add(20);
943
- aggregator.add(30);
944
- assert.strictEqual(aggregator.getResult('avg'), 20);
945
- });
946
- it('should compute min correctly', () => {
947
- const aggregator = new StreamingAggregator();
948
- aggregator.add(5);
949
- aggregator.add(2);
950
- aggregator.add(8);
951
- assert.strictEqual(aggregator.getResult('min'), 2);
952
- });
953
- it('should compute max correctly', () => {
954
- const aggregator = new StreamingAggregator();
955
- aggregator.add(5);
956
- aggregator.add(2);
957
- aggregator.add(8);
958
- assert.strictEqual(aggregator.getResult('max'), 8);
959
- });
960
- it('should compute p50 (median) correctly', () => {
961
- const aggregator = new StreamingAggregator();
962
- // Add values 1-100 for predictable p50
963
- for (let i = 1; i <= 100; i++) {
964
- aggregator.add(i);
965
- }
966
- const p50 = aggregator.getResult('p50');
967
- assert.ok(p50 !== undefined);
968
- // p50 should be close to 50.5 for 1-100
969
- assert.ok(Math.abs(p50 - 50.5) < 1);
970
- });
971
- it('should compute p95 correctly', () => {
972
- const aggregator = new StreamingAggregator();
973
- for (let i = 1; i <= 100; i++) {
974
- aggregator.add(i);
975
- }
976
- const p95 = aggregator.getResult('p95');
977
- assert.ok(p95 !== undefined);
978
- // p95 should be close to 95.05 for 1-100
979
- assert.ok(Math.abs(p95 - 95.05) < 1);
980
- });
981
- it('should compute p99 correctly', () => {
982
- const aggregator = new StreamingAggregator();
983
- for (let i = 1; i <= 100; i++) {
984
- aggregator.add(i);
985
- }
986
- const p99 = aggregator.getResult('p99');
987
- assert.ok(p99 !== undefined);
988
- // p99 should be close to 99.01 for 1-100
989
- assert.ok(Math.abs(p99 - 99.01) < 1);
990
- });
991
- it('should return undefined for aggregations on empty aggregator', () => {
992
- const aggregator = new StreamingAggregator();
993
- assert.strictEqual(aggregator.getResult('count'), 0);
994
- assert.strictEqual(aggregator.getResult('sum'), undefined);
995
- assert.strictEqual(aggregator.getResult('avg'), undefined);
996
- assert.strictEqual(aggregator.getResult('min'), undefined);
997
- assert.strictEqual(aggregator.getResult('max'), undefined);
998
- assert.strictEqual(aggregator.getResult('p50'), undefined);
999
- });
1000
- it('should handle single value', () => {
1001
- const aggregator = new StreamingAggregator();
1002
- aggregator.add(42);
1003
- assert.strictEqual(aggregator.getResult('count'), 1);
1004
- assert.strictEqual(aggregator.getResult('sum'), 42);
1005
- assert.strictEqual(aggregator.getResult('avg'), 42);
1006
- assert.strictEqual(aggregator.getResult('min'), 42);
1007
- assert.strictEqual(aggregator.getResult('max'), 42);
1008
- assert.strictEqual(aggregator.getResult('p50'), 42);
1009
- });
1010
- it('should handle negative values', () => {
1011
- const aggregator = new StreamingAggregator();
1012
- aggregator.add(-10);
1013
- aggregator.add(-5);
1014
- aggregator.add(0);
1015
- aggregator.add(5);
1016
- aggregator.add(10);
1017
- assert.strictEqual(aggregator.getResult('sum'), 0);
1018
- assert.strictEqual(aggregator.getResult('min'), -10);
1019
- assert.strictEqual(aggregator.getResult('max'), 10);
1020
- assert.strictEqual(aggregator.getResult('avg'), 0);
1021
- });
1022
- it('should skip non-finite values', () => {
1023
- const aggregator = new StreamingAggregator();
1024
- aggregator.add(10);
1025
- aggregator.add(Infinity);
1026
- aggregator.add(-Infinity);
1027
- aggregator.add(NaN);
1028
- aggregator.add(20);
1029
- assert.strictEqual(aggregator.getResult('count'), 2);
1030
- assert.strictEqual(aggregator.getResult('sum'), 30);
1031
- assert.strictEqual(aggregator.getResult('avg'), 15);
1032
- });
1033
- it('should support addAll for multiple values', () => {
1034
- const aggregator = new StreamingAggregator();
1035
- aggregator.addAll([1, 2, 3, 4, 5]);
1036
- assert.strictEqual(aggregator.getResult('count'), 5);
1037
- assert.strictEqual(aggregator.getResult('sum'), 15);
1038
- assert.strictEqual(aggregator.getResult('avg'), 3);
1039
- });
1040
- it('should reset correctly', () => {
1041
- const aggregator = new StreamingAggregator();
1042
- aggregator.addAll([1, 2, 3, 4, 5]);
1043
- aggregator.reset();
1044
- assert.strictEqual(aggregator.getResult('count'), 0);
1045
- assert.strictEqual(aggregator.getResult('sum'), undefined);
1046
- assert.strictEqual(aggregator.getCount(), 0);
1047
- });
1048
- it('should return all stats via getStats()', () => {
1049
- const aggregator = new StreamingAggregator();
1050
- aggregator.addAll([1, 2, 3, 4, 5]);
1051
- const stats = aggregator.getStats();
1052
- assert.strictEqual(stats.count, 5);
1053
- assert.strictEqual(stats.sum, 15);
1054
- assert.strictEqual(stats.avg, 3);
1055
- assert.strictEqual(stats.min, 1);
1056
- assert.strictEqual(stats.max, 5);
1057
- assert.ok(stats.p50 !== undefined);
1058
- });
1059
- it('should handle large datasets with reservoir sampling', () => {
1060
- const aggregator = new StreamingAggregator();
1061
- // Add 50000 values - larger than reservoir size
1062
- for (let i = 1; i <= 50000; i++) {
1063
- aggregator.add(i);
1064
- }
1065
- assert.strictEqual(aggregator.getResult('count'), 50000);
1066
- assert.strictEqual(aggregator.getResult('sum'), (50000 * 50001) / 2);
1067
- assert.strictEqual(aggregator.getResult('min'), 1);
1068
- assert.strictEqual(aggregator.getResult('max'), 50000);
1069
- // Percentiles should be approximately correct (within 10% error due to sampling)
1070
- const p50 = aggregator.getResult('p50');
1071
- assert.ok(p50 !== undefined);
1072
- assert.ok(Math.abs(p50 - 25000) / 25000 < 0.10);
1073
- const p95 = aggregator.getResult('p95');
1074
- assert.ok(p95 !== undefined);
1075
- assert.ok(Math.abs(p95 - 47500) / 47500 < 0.10);
1076
- });
1077
- it('should handle decimal values', () => {
1078
- const aggregator = new StreamingAggregator();
1079
- aggregator.add(0.1);
1080
- aggregator.add(0.2);
1081
- aggregator.add(0.3);
1082
- const sum = aggregator.getResult('sum');
1083
- assert.ok(sum !== undefined);
1084
- assert.ok(Math.abs(sum - 0.6) < 0.0001);
1085
- });
1086
- });
1087
- describe('enforceMemoryLimit', () => {
1088
- it('should return results unchanged when under limit', () => {
1089
- const items = [1, 2, 3, 4, 5];
1090
- const result = enforceMemoryLimit(items, 10);
1091
- assert.deepStrictEqual(result.results, items);
1092
- assert.strictEqual(result.truncated, false);
1093
- assert.strictEqual(result.originalCount, 5);
1094
- });
1095
- it('should truncate results when over limit', () => {
1096
- const items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1097
- const result = enforceMemoryLimit(items, 5);
1098
- assert.deepStrictEqual(result.results, [1, 2, 3, 4, 5]);
1099
- assert.strictEqual(result.truncated, true);
1100
- assert.strictEqual(result.originalCount, 10);
1101
- });
1102
- it('should return exactly at limit without truncation', () => {
1103
- const items = [1, 2, 3, 4, 5];
1104
- const result = enforceMemoryLimit(items, 5);
1105
- assert.deepStrictEqual(result.results, items);
1106
- assert.strictEqual(result.truncated, false);
1107
- assert.strictEqual(result.originalCount, 5);
1108
- });
1109
- it('should handle empty array', () => {
1110
- const result = enforceMemoryLimit([], 10);
1111
- assert.deepStrictEqual(result.results, []);
1112
- assert.strictEqual(result.truncated, false);
1113
- assert.strictEqual(result.originalCount, 0);
1114
- });
1115
- it('should work with object arrays', () => {
1116
- const items = [{ id: 1 }, { id: 2 }, { id: 3 }];
1117
- const result = enforceMemoryLimit(items, 2);
1118
- assert.deepStrictEqual(result.results, [{ id: 1 }, { id: 2 }]);
1119
- assert.strictEqual(result.truncated, true);
1120
- });
1121
- it('should use default limit when not specified', () => {
1122
- const items = Array.from({ length: 100 }, (_, i) => i);
1123
- const result = enforceMemoryLimit(items);
1124
- // Default is 10000, so 100 items should not be truncated
1125
- assert.strictEqual(result.truncated, false);
1126
- assert.strictEqual(result.results.length, 100);
1127
- });
1128
- it('should log warning when truncating (verify via side effect)', () => {
1129
- // Store original console.warn
1130
- const originalWarn = console.warn;
1131
- let warnCalled = false;
1132
- let warnMessage = '';
1133
- console.warn = (msg) => {
1134
- warnCalled = true;
1135
- warnMessage = msg;
1136
- };
1137
- try {
1138
- const items = [1, 2, 3, 4, 5];
1139
- enforceMemoryLimit(items, 3);
1140
- assert.strictEqual(warnCalled, true);
1141
- assert.ok(warnMessage.includes('[MEMORY]'));
1142
- assert.ok(warnMessage.includes('5'));
1143
- assert.ok(warnMessage.includes('3'));
1144
- }
1145
- finally {
1146
- console.warn = originalWarn;
1147
- }
1148
- });
1149
- });
1150
- describe('shouldUseStreamingAggregation', () => {
1151
- it('should return false when count is below threshold', () => {
1152
- assert.strictEqual(shouldUseStreamingAggregation(100, 5000), false);
1153
- assert.strictEqual(shouldUseStreamingAggregation(4999, 5000), false);
1154
- assert.strictEqual(shouldUseStreamingAggregation(5000, 5000), false);
1155
- });
1156
- it('should return true when count exceeds threshold', () => {
1157
- assert.strictEqual(shouldUseStreamingAggregation(5001, 5000), true);
1158
- assert.strictEqual(shouldUseStreamingAggregation(10000, 5000), true);
1159
- });
1160
- it('should use default threshold when not specified', () => {
1161
- // Default is 5000
1162
- assert.strictEqual(shouldUseStreamingAggregation(4000), false);
1163
- });
1164
- it('should work with custom threshold', () => {
1165
- assert.strictEqual(shouldUseStreamingAggregation(500, 100), true);
1166
- assert.strictEqual(shouldUseStreamingAggregation(50, 100), false);
1167
- });
1168
- });
1169
- describe('getMemoryLimits', () => {
1170
- it('should return memory limit constants', () => {
1171
- const limits = getMemoryLimits();
1172
- assert.ok('maxResults' in limits);
1173
- assert.ok('streamingThreshold' in limits);
1174
- assert.strictEqual(typeof limits.maxResults, 'number');
1175
- assert.strictEqual(typeof limits.streamingThreshold, 'number');
1176
- assert.ok(limits.maxResults > 0);
1177
- assert.ok(limits.streamingThreshold > 0);
1178
- });
1179
- });
1180
- describe('hasCircularReference', () => {
1181
- it('should return false for primitive values', () => {
1182
- assert.strictEqual(hasCircularReference(null), false);
1183
- assert.strictEqual(hasCircularReference(undefined), false);
1184
- assert.strictEqual(hasCircularReference(42), false);
1185
- assert.strictEqual(hasCircularReference('string'), false);
1186
- assert.strictEqual(hasCircularReference(true), false);
1187
- });
1188
- it('should return false for simple objects', () => {
1189
- assert.strictEqual(hasCircularReference({ a: 1, b: 2 }), false);
1190
- assert.strictEqual(hasCircularReference({ nested: { deep: { value: 1 } } }), false);
1191
- });
1192
- it('should return false for simple arrays', () => {
1193
- assert.strictEqual(hasCircularReference([1, 2, 3]), false);
1194
- assert.strictEqual(hasCircularReference([{ id: 1 }, { id: 2 }]), false);
1195
- });
1196
- it('should detect self-referencing object', () => {
1197
- const obj = { a: 1 };
1198
- obj.self = obj;
1199
- assert.strictEqual(hasCircularReference(obj), true);
1200
- });
1201
- it('should detect self-referencing array', () => {
1202
- const arr = [1, 2, 3];
1203
- arr.push(arr);
1204
- assert.strictEqual(hasCircularReference(arr), true);
1205
- });
1206
- it('should detect nested circular reference', () => {
1207
- const obj = { a: { b: { c: {} } } };
1208
- obj.a.b = obj;
1209
- assert.strictEqual(hasCircularReference(obj), true);
1210
- });
1211
- it('should detect circular reference in array of objects', () => {
1212
- const obj1 = { id: 1 };
1213
- const obj2 = { id: 2, ref: obj1 };
1214
- obj1.ref = obj2;
1215
- assert.strictEqual(hasCircularReference([obj1, obj2]), true);
1216
- });
1217
- it('should handle deeply nested non-circular structures', () => {
1218
- const deep = { a: { b: { c: { d: { e: { f: 1 } } } } } };
1219
- assert.strictEqual(hasCircularReference(deep), false);
1220
- });
1221
- });
1222
- describe('estimateByteSize', () => {
1223
- it('should return 0 for empty array', () => {
1224
- assert.strictEqual(estimateByteSize([]), 0);
1225
- });
1226
- it('should return correct size for small arrays', () => {
1227
- const items = [{ id: 1 }, { id: 2 }];
1228
- const expected = JSON.stringify(items).length;
1229
- assert.strictEqual(estimateByteSize(items), expected);
1230
- });
1231
- it('should return conservative estimate for circular references in small array', () => {
1232
- const obj = { id: 1 };
1233
- obj.self = obj;
1234
- const result = estimateByteSize([obj]);
1235
- assert.strictEqual(result, CONSERVATIVE_FALLBACK_SIZE);
1236
- });
1237
- it('should return conservative estimate for circular references in large array', () => {
1238
- // Create array larger than sample size (100)
1239
- const circularObj = { id: 1 };
1240
- circularObj.self = circularObj;
1241
- const items = [];
1242
- for (let i = 0; i < 200; i++) {
1243
- items.push(circularObj);
1244
- }
1245
- const result = estimateByteSize(items);
1246
- assert.strictEqual(result, CONSERVATIVE_FALLBACK_SIZE);
1247
- });
1248
- it('should handle mixed circular and non-circular items in large array', () => {
1249
- // Create array with some circular and some non-circular items
1250
- const circularObj = { id: 1 };
1251
- circularObj.self = circularObj;
1252
- const items = [];
1253
- // Add 150 normal items (75% of 200)
1254
- for (let i = 0; i < 150; i++) {
1255
- items.push({ id: i, data: 'normal' });
1256
- }
1257
- // Add 50 circular items (25% of 200)
1258
- for (let i = 0; i < 50; i++) {
1259
- items.push(circularObj);
1260
- }
1261
- // Since less than 50% failed, should extrapolate from successful samples
1262
- const result = estimateByteSize(items);
1263
- assert.ok(result > 0);
1264
- // Should not return conservative fallback since <50% failed
1265
- assert.notStrictEqual(result, CONSERVATIVE_FALLBACK_SIZE);
1266
- });
1267
- it('should return conservative estimate when >50% of samples fail', () => {
1268
- // Create array where most items are circular
1269
- const circularObj = { id: 1 };
1270
- circularObj.self = circularObj;
1271
- const items = [];
1272
- // Add 40 normal items (20% of 200)
1273
- for (let i = 0; i < 40; i++) {
1274
- items.push({ id: i });
1275
- }
1276
- // Add 160 circular items (80% of 200)
1277
- for (let i = 0; i < 160; i++) {
1278
- items.push(circularObj);
1279
- }
1280
- const result = estimateByteSize(items);
1281
- // Should return conservative fallback since >50% failed
1282
- assert.strictEqual(result, CONSERVATIVE_FALLBACK_SIZE);
1283
- });
1284
- it('should extrapolate size for large non-circular arrays', () => {
1285
- // Create array larger than sample size
1286
- const items = Array.from({ length: 200 }, (_, i) => ({ id: i, name: `item-${i}` }));
1287
- const result = estimateByteSize(items);
1288
- // Result should be positive and reasonable
1289
- assert.ok(result > 0);
1290
- // Rough estimate: each item is ~25 bytes, so 200 items ~5000 bytes
1291
- assert.ok(result > 1000);
1292
- assert.ok(result < 100000);
1293
- });
1294
- });
1295
- describe('enforceMemoryLimit with circular references', () => {
1296
- it('should trigger size-based truncation for circular references', () => {
1297
- // Create items with circular references
1298
- const obj = { id: 1, data: 'test' };
1299
- obj.self = obj;
1300
- // The circular reference should cause estimateByteSize to return 1MB
1301
- // which exceeds the 50MB limit would not trigger, but the detection
1302
- // prevents bypass (the conservative estimate ensures the check works)
1303
- const items = [obj];
1304
- const result = enforceMemoryLimit(items, 10000);
1305
- // Since a single item with circular ref returns 1MB estimate,
1306
- // and 1MB < 50MB limit, it won't truncate
1307
- // But the important thing is it doesn't crash and returns valid result
1308
- assert.ok(Array.isArray(result.results));
1309
- assert.strictEqual(result.originalCount, 1);
1310
- });
1311
- it('should handle array with nested circular references without crashing', () => {
1312
- const obj1 = { id: 1 };
1313
- const obj2 = { id: 2 };
1314
- obj1.ref = obj2;
1315
- obj2.ref = obj1;
1316
- const items = [obj1, obj2, { normal: 'object' }];
1317
- const result = enforceMemoryLimit(items, 10000);
1318
- assert.ok(Array.isArray(result.results));
1319
- assert.strictEqual(result.originalCount, 3);
1320
- });
1321
- it('should not crash when JSON.stringify would throw', () => {
1322
- // Create an object that would cause JSON.stringify to throw
1323
- const obj = {};
1324
- obj.circular = obj;
1325
- const items = Array.from({ length: 50 }, () => obj);
1326
- const result = enforceMemoryLimit(items, 10000);
1327
- // Should not throw and should return valid result
1328
- assert.ok(Array.isArray(result.results));
1329
- assert.strictEqual(result.originalCount, 50);
1330
- });
1331
- });
1332
- });
1333
- //# sourceMappingURL=file-utils.test.js.map