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,28 +1,38 @@
1
1
  /**
2
2
  * Local JSONL backend for reading telemetry data from ~/.claude/telemetry/
3
3
  *
4
- * The local telemetry files use a flat JSONL format where each line is a complete
5
- * span or log record, not the batched OpenTelemetry export format.
4
+ * Supports two JSONL line formats:
5
+ * - **Flat**: one span/log/metric per line with embedded resource (original hooks format)
6
+ * - **OTLP envelope**: one ResourceSpans/ResourceLogs/ResourceMetrics envelope per line
7
+ * (as produced by the L5 batch migration script or future OTLP writers)
8
+ *
9
+ * Format detection is automatic via the unwrap adapters (A4 items 1-6).
6
10
  */
7
11
  import { join } from 'path';
8
- import { GENAI_EVALUATION_ATTRIBUTES, GENAI_AGENT_ATTRIBUTES, AGENT_JUDGE_ATTRIBUTES, } from './index.js';
9
- import { convertToOTLPTraces, convertToOTLPLogs, convertToOTLPMetrics, } from '../lib/otlp-export.js';
10
- import { TELEMETRY_DIR, getTelemetryDirectories, getSpanKind, getStatusCodeName, WORST_FILES_LIMIT } from '../lib/constants.js';
11
- import { listFiles, streamJsonl, parseDateFromFilename, getDateString, paginateResults, hasReachedLimit, } from '../lib/file-utils.js';
12
- import { QueryCache, makeCacheKey } from '../lib/cache.js';
13
- import { recordQueryDuration, recordCacheHit } from '../lib/metrics.js';
14
- import { Histogram } from '../lib/histogram.js';
15
- import { getIndexPath, readIndex, isIndexStale, queryIndex, readLinesByNumber, } from '../lib/indexer.js';
16
- import { sanitizePath } from '../lib/error-sanitizer.js';
17
- import { CircuitBreaker } from '../lib/circuit-breaker.js';
18
- import { withSpan } from '../lib/instrumentation.js';
12
+ import { datasetRecordSchema, datasetTraceRecordSchema, datasetRunRecordSchema, rawEvaluatorTypeSchema, } from '../lib/validation/api-schemas.js';
13
+ import { homedir } from 'os';
14
+ import { GENAI_EVALUATION_ATTRIBUTES, GENAI_RESPONSE_ATTRIBUTES, GENAI_AGENT_ATTRIBUTES, AGENT_JUDGE_ATTRIBUTES, AGGREGATION_TEMPORALITY, } from './index.js';
15
+ import { convertToOTLPTraces, convertToOTLPLogs, convertToOTLPMetrics, } from '../lib/exports/otlp-export.js';
16
+ import { DEFAULT_QUERY_RESULT_LIMIT, DATASET_TRACE_TRUNCATION_LIMIT, MAX_STEP_SCORES, MAX_TOOL_VERIFICATIONS, HOOKS_TELEMETRY_DIR, WORST_FILES_LIMIT, getOtelLogSeverityNumber, getSpanKind, getStatusCodeName, getTelemetryDirectories, normalizeOtelLogSeverity } from '../lib/core/constants.js';
17
+ import { ONE_MILLION, NANOSECONDS_PER_SECOND, NANOSECONDS_PER_SECOND_BIGINT, TIME_MS, PERCENTILE, PERCENT_MULTIPLIER, } from '../lib/core/units.js';
18
+ import { listFiles, streamJsonl, parseDateFromFilename, getDateString, paginateResults, hasReachedLimit, } from '../lib/core/file-utils.js';
19
+ import { QueryCache, makeCacheKey, CACHE_TTL_MS, DEFAULT_CACHE_SIZE } from '../lib/resilience/cache.js';
20
+ import { recordQueryDuration, recordCacheHit } from '../lib/observability/metrics.js';
21
+ import { Histogram } from '../lib/observability/histogram.js';
22
+ import { getIndexPath, readIndex, isIndexStale, queryIndex, readLinesByNumber, } from '../lib/observability/indexer.js';
23
+ import { sanitizePath } from '../lib/errors/error-sanitizer.js';
24
+ import { CircuitBreaker } from '../lib/resilience/circuit-breaker.js';
25
+ import { withSpan } from '../lib/observability/instrumentation.js';
19
26
  import { existsSync } from 'fs';
20
- import { ParseStatsTracker } from '../lib/parse-stats.js';
27
+ import { appendFile, mkdir, readFile, writeFile, rename } from 'fs/promises';
28
+ import { randomUUID } from 'crypto';
29
+ import { ParseStatsTracker } from '../lib/observability/parse-stats.js';
30
+ import { createLogger } from '../lib/core/logger.js';
31
+ const queryLog = createLogger('query');
32
+ const configLog = createLogger('config');
21
33
  function startTiming() {
22
34
  const start = performance.now();
23
- return {
24
- end: () => performance.now() - start
25
- };
35
+ return { end: () => performance.now() - start };
26
36
  }
27
37
  const SLOW_QUERY_THRESHOLD_MS = 500;
28
38
  /**
@@ -33,31 +43,39 @@ const regexCache = new Map();
33
43
  const MAX_CACHED_REGEX_PATTERNS = 100;
34
44
  /**
35
45
  * Get a cached regex or compile and cache a new one.
46
+ * Accepts an optional pre-compiled RegExp to seed the cache on first miss (CR-L3).
36
47
  * Returns null for invalid patterns (logs warning).
37
48
  */
38
- function getCachedRegex(pattern) {
49
+ function getCachedRegex(pattern, precompiled) {
39
50
  const cached = regexCache.get(pattern);
40
51
  if (cached) {
52
+ // Move to end of Map for proper LRU ordering
53
+ regexCache.delete(pattern);
54
+ regexCache.set(pattern, cached);
41
55
  return cached;
42
56
  }
43
- try {
44
- const regex = new RegExp(pattern);
45
- // LRU eviction: remove oldest entry if at capacity
46
- if (regexCache.size >= MAX_CACHED_REGEX_PATTERNS) {
47
- const firstKey = regexCache.keys().next().value;
48
- if (firstKey !== undefined) {
49
- regexCache.delete(firstKey);
50
- }
57
+ // Use pre-compiled regex if provided (avoids double-compilation when validator returns RegExp)
58
+ const regex = precompiled ?? (() => {
59
+ try {
60
+ return new RegExp(pattern);
51
61
  }
52
- regexCache.set(pattern, regex);
53
- return regex;
54
- }
55
- catch {
56
- // Security: Truncate pattern in log to prevent log injection/info disclosure
57
- const truncatedPattern = pattern.length > 50 ? pattern.slice(0, 50) + '...' : pattern;
58
- console.warn(`Invalid regex pattern: ${truncatedPattern.replace(/[\n\r]/g, ' ')}`);
62
+ catch {
63
+ const truncatedPattern = pattern.length > PERCENTILE.P50 ? pattern.slice(0, PERCENTILE.P50) + '...' : pattern;
64
+ configLog.warn(`Invalid regex pattern: ${truncatedPattern.replace(/[\n\r]/g, ' ')}`);
65
+ return null;
66
+ }
67
+ })();
68
+ if (!regex)
59
69
  return null;
70
+ // LRU eviction: remove oldest entry if at capacity
71
+ if (regexCache.size >= MAX_CACHED_REGEX_PATTERNS) {
72
+ const firstKey = regexCache.keys().next().value;
73
+ if (firstKey !== undefined) {
74
+ regexCache.delete(firstKey);
75
+ }
60
76
  }
77
+ regexCache.set(pattern, regex);
78
+ return regex;
61
79
  }
62
80
  /**
63
81
  * Insert item into a sorted array, maintaining sort order and max size.
@@ -138,11 +156,11 @@ function parseTimeBucket(bucket) {
138
156
  const unit = match[2];
139
157
  switch (unit) {
140
158
  case 'm':
141
- return value * 60 * 1000; // minutes to ms
159
+ return value * TIME_MS.MINUTE; // minutes to ms
142
160
  case 'h':
143
- return value * 60 * 60 * 1000; // hours to ms
161
+ return value * TIME_MS.HOUR; // hours to ms
144
162
  case 'd':
145
- return value * 24 * 60 * 60 * 1000; // days to ms
163
+ return value * TIME_MS.DAY; // days to ms
146
164
  default:
147
165
  return null;
148
166
  }
@@ -154,6 +172,325 @@ function floorToBucket(timestamp, bucketMs) {
154
172
  const ts = new Date(timestamp).getTime();
155
173
  return Math.floor(ts / bucketMs) * bucketMs;
156
174
  }
175
+ // ---------------------------------------------------------------------------
176
+ // OTLP envelope unwrap adapters (A4 items 1-6)
177
+ //
178
+ // When the L5 batch migration script converts flat JSONL to OTLP format,
179
+ // each JSONL line becomes an OTLP envelope wrapping one or more records.
180
+ // These adapters detect envelope lines and unwrap them to Flat* shapes
181
+ // so the existing normalize* functions can process them unchanged.
182
+ // ---------------------------------------------------------------------------
183
+ /** Reserved keys that must not be set on plain objects to prevent prototype pollution */
184
+ const RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
185
+ /** Convert OTLP KeyValue array to flat attributes record (null-prototype to prevent pollution) */
186
+ function fromOTLPAttributes(kvs) {
187
+ if (!kvs)
188
+ return Object.create(null);
189
+ const out = Object.create(null);
190
+ for (const kv of kvs) {
191
+ if (RESERVED_KEYS.has(kv.key))
192
+ continue;
193
+ out[kv.key] = fromOTLPValue(kv.value);
194
+ }
195
+ return out;
196
+ }
197
+ /** Convert a single OTLP AnyValue to a JS primitive/object */
198
+ function fromOTLPValue(v) {
199
+ if (!v)
200
+ return undefined;
201
+ if (v.stringValue !== undefined)
202
+ return v.stringValue;
203
+ if (v.intValue !== undefined) {
204
+ const n = Number(v.intValue);
205
+ return Number.isFinite(n) ? n : undefined;
206
+ }
207
+ if (v.doubleValue !== undefined)
208
+ return v.doubleValue;
209
+ if (v.boolValue !== undefined)
210
+ return v.boolValue;
211
+ if (v.arrayValue)
212
+ return v.arrayValue.values.map(fromOTLPValue);
213
+ if (v.kvlistValue)
214
+ return fromOTLPAttributes(v.kvlistValue.values);
215
+ return undefined;
216
+ }
217
+ /** Convert OTLP nanosecond string to [seconds, nanoseconds] tuple. Returns undefined on invalid input. */
218
+ function nanoStrToTuple(ns) {
219
+ if (!ns)
220
+ return undefined;
221
+ try {
222
+ const n = BigInt(ns);
223
+ return [
224
+ Number(n / NANOSECONDS_PER_SECOND_BIGINT),
225
+ Number(n % NANOSECONDS_PER_SECOND_BIGINT),
226
+ ];
227
+ }
228
+ catch {
229
+ return undefined;
230
+ }
231
+ }
232
+ /** Convert OTLP nanosecond string to epoch milliseconds. Returns undefined on invalid input. */
233
+ function nanoStrToMs(ns) {
234
+ if (!ns)
235
+ return undefined;
236
+ try {
237
+ return Number(BigInt(ns) / BigInt(ONE_MILLION));
238
+ }
239
+ catch {
240
+ return undefined;
241
+ }
242
+ }
243
+ /** Convert OTLP nanosecond string to ISO-8601 timestamp. Returns undefined on invalid input. */
244
+ function nanoStrToISO(ns) {
245
+ const ms = nanoStrToMs(ns);
246
+ return ms !== undefined ? new Date(ms).toISOString() : undefined;
247
+ }
248
+ /** Extract numeric value from OTLP data point (asDouble preferred, asInt fallback with precision guard). */
249
+ function dataPointValue(dp) {
250
+ if (dp.asDouble !== undefined) {
251
+ const d = Number(dp.asDouble);
252
+ return Number.isFinite(d) ? d : 0;
253
+ }
254
+ const n = Number(dp.asInt ?? '0');
255
+ return Number.isFinite(n) ? n : 0;
256
+ }
257
+ /**
258
+ * Extract service.name and service.version from OTLP resource attributes.
259
+ * Only these two fields are mapped; all other resource attributes (host.name,
260
+ * process.pid, telemetry.sdk.*, etc.) are intentionally dropped because flat
261
+ * records carry them in span-level attributes and the normalize* functions
262
+ * already handle that shape.
263
+ */
264
+ function extractResource(attrs) {
265
+ if (!attrs)
266
+ return undefined;
267
+ let serviceName;
268
+ let serviceVersion;
269
+ for (const kv of attrs) {
270
+ if (kv.key === 'service.name' && kv.value?.stringValue)
271
+ serviceName = kv.value.stringValue;
272
+ if (kv.key === 'service.version' && kv.value?.stringValue)
273
+ serviceVersion = kv.value.stringValue;
274
+ if (serviceName && serviceVersion)
275
+ break;
276
+ }
277
+ return (serviceName || serviceVersion) ? { serviceName, serviceVersion } : undefined;
278
+ }
279
+ /**
280
+ * Detect and unwrap an OTLP trace envelope line to FlatSpan[].
281
+ * Returns null if the record is not an OTLP envelope (i.e., it's a flat span).
282
+ */
283
+ function unwrapOTLPSpans(record) {
284
+ if (!record || typeof record !== 'object' || !('resourceSpans' in record))
285
+ return null;
286
+ const envelope = record;
287
+ const results = [];
288
+ for (const rs of envelope.resourceSpans) {
289
+ const resource = extractResource(rs.resource?.attributes);
290
+ for (const ss of rs.scopeSpans ?? []) {
291
+ const instrumentationScope = ss.scope
292
+ ? { name: ss.scope.name, version: ss.scope.version }
293
+ : undefined;
294
+ for (const span of ss.spans ?? []) {
295
+ const attrs = fromOTLPAttributes(span.attributes);
296
+ // Merge resource attributes into span attributes (service.name, etc.)
297
+ if (resource?.serviceName)
298
+ attrs['service.name'] = resource.serviceName;
299
+ if (resource?.serviceVersion)
300
+ attrs['service.version'] = resource.serviceVersion;
301
+ results.push({
302
+ traceId: span.traceId,
303
+ spanId: span.spanId,
304
+ parentSpanId: span.parentSpanId,
305
+ name: span.name,
306
+ kind: span.kind,
307
+ startTime: nanoStrToTuple(span.startTimeUnixNano),
308
+ endTime: nanoStrToTuple(span.endTimeUnixNano),
309
+ status: span.status,
310
+ attributes: attrs,
311
+ events: span.events?.map(e => ({
312
+ name: e.name,
313
+ timestamp: nanoStrToMs(e.timeUnixNano),
314
+ attributes: fromOTLPAttributes(e.attributes),
315
+ })),
316
+ links: span.links?.map(l => ({
317
+ context: { traceId: l.traceId, spanId: l.spanId },
318
+ attributes: fromOTLPAttributes(l.attributes),
319
+ })),
320
+ resource,
321
+ instrumentationScope,
322
+ });
323
+ }
324
+ }
325
+ }
326
+ return results;
327
+ }
328
+ /**
329
+ * Detect and unwrap an OTLP log envelope line to FlatLog[].
330
+ * Returns null if the record is not an OTLP envelope.
331
+ */
332
+ function unwrapOTLPLogs(record) {
333
+ if (!record || typeof record !== 'object' || !('resourceLogs' in record))
334
+ return null;
335
+ const envelope = record;
336
+ const results = [];
337
+ for (const rl of envelope.resourceLogs) {
338
+ const resource = extractResource(rl.resource?.attributes);
339
+ for (const sl of rl.scopeLogs ?? []) {
340
+ const instrumentationScope = sl.scope
341
+ ? { name: sl.scope.name, version: sl.scope.version }
342
+ : undefined;
343
+ for (const log of sl.logRecords ?? []) {
344
+ const attrs = fromOTLPAttributes(log.attributes);
345
+ const bodyValue = log.body;
346
+ results.push({
347
+ timestamp: nanoStrToISO(log.timeUnixNano) ?? '',
348
+ severityText: log.severityText,
349
+ body: bodyValue?.stringValue ?? '',
350
+ traceId: log.traceId,
351
+ spanId: log.spanId,
352
+ attributes: attrs,
353
+ resource: resource ? { serviceName: resource.serviceName } : undefined,
354
+ instrumentationScope,
355
+ });
356
+ }
357
+ }
358
+ }
359
+ return results;
360
+ }
361
+ /**
362
+ * Detect and unwrap an OTLP metric envelope line to FlatMetric[].
363
+ * Returns null if the record is not an OTLP envelope.
364
+ */
365
+ function unwrapOTLPMetrics(record) {
366
+ if (!record || typeof record !== 'object' || !('resourceMetrics' in record))
367
+ return null;
368
+ const envelope = record;
369
+ const results = [];
370
+ for (const rm of envelope.resourceMetrics) {
371
+ const resource = extractResource(rm.resource?.attributes);
372
+ for (const sm of rm.scopeMetrics ?? []) {
373
+ for (const metric of sm.metrics ?? []) {
374
+ const name = metric.name;
375
+ const unit = metric.unit;
376
+ // Determine metric type and extract data points
377
+ const gauge = metric.gauge;
378
+ const sum = metric.sum;
379
+ const histogram = metric.histogram;
380
+ if (histogram?.dataPoints) {
381
+ for (const dp of histogram.dataPoints) {
382
+ const attrs = fromOTLPAttributes(dp.attributes);
383
+ const bucketCounts = dp.bucketCounts ?? [];
384
+ const explicitBounds = dp.explicitBounds ?? [];
385
+ // Convert OTLP per-bucket counts + explicitBounds to cumulative {le, count}
386
+ let cumulative = 0;
387
+ const buckets = [];
388
+ for (let i = 0; i < bucketCounts.length; i++) {
389
+ cumulative += Number(bucketCounts[i]);
390
+ buckets.push({ le: i < explicitBounds.length ? explicitBounds[i] : Infinity, count: cumulative });
391
+ }
392
+ const histSum = dp.sum ?? 0;
393
+ results.push({
394
+ timestamp: nanoStrToISO(dp.timeUnixNano) ?? '',
395
+ name,
396
+ value: histSum,
397
+ type: 'histogram',
398
+ unit,
399
+ attributes: attrs,
400
+ resource: resource ? { serviceName: resource.serviceName } : undefined,
401
+ histogram: { buckets, sum: histSum, count: Number(dp.count ?? 0) },
402
+ aggregationTemporality: histogram.aggregationTemporality,
403
+ });
404
+ }
405
+ }
406
+ else if (sum?.dataPoints) {
407
+ for (const dp of sum.dataPoints) {
408
+ const attrs = fromOTLPAttributes(dp.attributes);
409
+ results.push({
410
+ timestamp: nanoStrToISO(dp.timeUnixNano) ?? '',
411
+ name,
412
+ value: dataPointValue(dp),
413
+ type: 'counter',
414
+ unit,
415
+ attributes: attrs,
416
+ resource: resource ? { serviceName: resource.serviceName } : undefined,
417
+ aggregationTemporality: sum.aggregationTemporality,
418
+ });
419
+ }
420
+ }
421
+ else if (gauge?.dataPoints) {
422
+ for (const dp of gauge.dataPoints) {
423
+ const attrs = fromOTLPAttributes(dp.attributes);
424
+ results.push({
425
+ timestamp: nanoStrToISO(dp.timeUnixNano) ?? '',
426
+ name,
427
+ value: dataPointValue(dp),
428
+ type: 'gauge',
429
+ unit,
430
+ attributes: attrs,
431
+ resource: resource ? { serviceName: resource.serviceName } : undefined,
432
+ });
433
+ }
434
+ }
435
+ }
436
+ }
437
+ }
438
+ return results;
439
+ }
440
+ /**
441
+ * Detect and unwrap an OTLP trace envelope containing evaluation events.
442
+ * Evaluations in OTLP are span events with name "gen_ai.evaluation.result".
443
+ * Returns null if the record is not an OTLP envelope.
444
+ */
445
+ function unwrapOTLPEvaluations(record) {
446
+ if (!record || typeof record !== 'object' || !('resourceSpans' in record))
447
+ return null;
448
+ const envelope = record;
449
+ const results = [];
450
+ for (const rs of envelope.resourceSpans) {
451
+ for (const ss of rs.scopeSpans ?? []) {
452
+ for (const span of ss.spans ?? []) {
453
+ for (const event of span.events ?? []) {
454
+ if (event.name !== 'gen_ai.evaluation.result')
455
+ continue;
456
+ const attrs = fromOTLPAttributes(event.attributes);
457
+ results.push({
458
+ timestamp: nanoStrToISO(event.timeUnixNano) ?? '',
459
+ name: event.name,
460
+ attributes: attrs,
461
+ traceId: span.traceId,
462
+ spanId: span.spanId,
463
+ });
464
+ }
465
+ }
466
+ }
467
+ }
468
+ // Return null (not []) when envelope contains no evaluation events,
469
+ // so flattenEvaluationRecord falls through to the passthrough path.
470
+ // This prevents a flat record that coincidentally has a 'resourceSpans'
471
+ // key from being silently swallowed.
472
+ return results.length > 0 ? results : null;
473
+ }
474
+ /** Unwrap-or-passthrough for trace records. OTLP envelopes yield multiple spans; flat records yield one. */
475
+ function flattenSpanRecord(raw) {
476
+ const unwrapped = unwrapOTLPSpans(raw);
477
+ return unwrapped ?? [raw];
478
+ }
479
+ /** Unwrap-or-passthrough for log records */
480
+ function flattenLogRecord(raw) {
481
+ const unwrapped = unwrapOTLPLogs(raw);
482
+ return unwrapped ?? [raw];
483
+ }
484
+ /** Unwrap-or-passthrough for metric records */
485
+ function flattenMetricRecord(raw) {
486
+ const unwrapped = unwrapOTLPMetrics(raw);
487
+ return unwrapped ?? [raw];
488
+ }
489
+ /** Unwrap-or-passthrough for evaluation records */
490
+ function flattenEvaluationRecord(raw) {
491
+ const unwrapped = unwrapOTLPEvaluations(raw);
492
+ return unwrapped ?? [raw];
493
+ }
157
494
  /**
158
495
  * Extract a field from an object using dot notation path.
159
496
  * Returns undefined if the path doesn't exist or the object is not traversable.
@@ -162,7 +499,7 @@ function extractField(obj, path) {
162
499
  const parts = path.split('.');
163
500
  let current = obj;
164
501
  for (const part of parts) {
165
- if (current == null || typeof current !== 'object')
502
+ if (current === null || typeof current !== 'object')
166
503
  return undefined;
167
504
  current = current[part];
168
505
  }
@@ -207,16 +544,14 @@ function extractValidNumber(value) {
207
544
  return undefined;
208
545
  return Number.isFinite(value) ? value : undefined;
209
546
  }
210
- /** Valid evaluator types per our schema */
211
- const VALID_EVALUATOR_TYPES = ['llm', 'human', 'rule', 'classifier'];
212
547
  /**
213
- * Extract and validate evaluatorType
548
+ * Extract and validate evaluatorType using schema-based normalization (NARROW-11).
214
549
  */
215
550
  function extractValidEvaluatorType(value) {
216
551
  if (typeof value !== 'string')
217
552
  return undefined;
218
- const trimmed = value.trim().toLowerCase();
219
- return VALID_EVALUATOR_TYPES.includes(trimmed) ? trimmed : undefined;
553
+ const result = rawEvaluatorTypeSchema.safeParse(value);
554
+ return result.success ? result.data : undefined;
220
555
  }
221
556
  /**
222
557
  * Convert flat evaluation to normalized EvaluationResult
@@ -257,7 +592,7 @@ function extractStepScores(value) {
257
592
  typeof obj.score === 'number' &&
258
593
  Number.isFinite(obj.score));
259
594
  })
260
- .slice(0, 1000); // Respect MAX_STEP_SCORES limit
595
+ .slice(0, MAX_STEP_SCORES); // Respect MAX_STEP_SCORES limit
261
596
  }
262
597
  /**
263
598
  * Safely extract ToolVerification array from raw attribute value.
@@ -296,7 +631,7 @@ function extractToolVerifications(value) {
296
631
  typeof obj.score === 'number' &&
297
632
  Number.isFinite(obj.score));
298
633
  })
299
- .slice(0, 500); // Respect MAX_TOOL_VERIFICATIONS limit
634
+ .slice(0, MAX_TOOL_VERIFICATIONS);
300
635
  }
301
636
  function normalizeEvaluation(raw) {
302
637
  const attrs = raw.attributes;
@@ -317,7 +652,7 @@ function normalizeEvaluation(raw) {
317
652
  // Evaluator fields (custom extension)
318
653
  evaluator: extractValidString(attrs?.[GENAI_EVALUATION_ATTRIBUTES.EVALUATOR]),
319
654
  evaluatorType: extractValidEvaluatorType(attrs?.[GENAI_EVALUATION_ATTRIBUTES.EVALUATOR_TYPE]),
320
- responseId: extractValidString(attrs?.['gen_ai.response.id']),
655
+ responseId: extractValidString(attrs?.[GENAI_RESPONSE_ATTRIBUTES.ID]),
321
656
  traceId: raw.traceId,
322
657
  spanId: raw.spanId,
323
658
  sessionId: extractValidString(attrs?.['session.id']),
@@ -329,18 +664,6 @@ function normalizeEvaluation(raw) {
329
664
  trajectoryLength: extractValidNumber(attrs?.[AGENT_JUDGE_ATTRIBUTES.TRAJECTORY_LENGTH]),
330
665
  };
331
666
  }
332
- /**
333
- * OTel-compliant severity number mapping
334
- * https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-severitynumber
335
- */
336
- const SEVERITY_MAP = {
337
- TRACE: 1,
338
- DEBUG: 5,
339
- INFO: 9,
340
- WARN: 13,
341
- ERROR: 17,
342
- FATAL: 21,
343
- };
344
667
  /**
345
668
  * Convert flat span to normalized TraceSpan
346
669
  */
@@ -349,18 +672,18 @@ function normalizeSpan(raw) {
349
672
  return null;
350
673
  // Convert [seconds, nanoseconds] to nanoseconds
351
674
  const startTimeUnixNano = raw.startTime
352
- ? raw.startTime[0] * 1_000_000_000 + raw.startTime[1]
675
+ ? raw.startTime[0] * NANOSECONDS_PER_SECOND + raw.startTime[1]
353
676
  : 0;
354
677
  const endTimeUnixNano = raw.endTime
355
- ? raw.endTime[0] * 1_000_000_000 + raw.endTime[1]
678
+ ? raw.endTime[0] * NANOSECONDS_PER_SECOND + raw.endTime[1]
356
679
  : undefined;
357
680
  // Calculate duration in ms
358
681
  let durationMs;
359
682
  if (raw.duration) {
360
- durationMs = (raw.duration[0] * 1000) + (raw.duration[1] / 1_000_000);
683
+ durationMs = (raw.duration[0] * TIME_MS.SECOND) + (raw.duration[1] / ONE_MILLION);
361
684
  }
362
685
  else if (endTimeUnixNano) {
363
- durationMs = (endTimeUnixNano - startTimeUnixNano) / 1_000_000;
686
+ durationMs = (endTimeUnixNano - startTimeUnixNano) / ONE_MILLION;
364
687
  }
365
688
  // Add service name to attributes if present in resource
366
689
  const attributes = { ...raw.attributes };
@@ -412,14 +735,15 @@ function normalizeLog(raw, extractFields) {
412
735
  // Handle timestamp: either ISO string or [seconds, nanoseconds] array
413
736
  let timestamp;
414
737
  if (Array.isArray(raw.timestamp)) {
415
- const ms = raw.timestamp[0] * 1000 + Math.floor(raw.timestamp[1] / 1_000_000);
738
+ const ms = raw.timestamp[0] * TIME_MS.SECOND + Math.floor(raw.timestamp[1] / ONE_MILLION);
416
739
  timestamp = new Date(ms).toISOString();
417
740
  }
418
741
  else {
419
742
  timestamp = raw.timestamp;
420
743
  }
421
- const severity = raw.severityText || raw.severity || 'INFO';
422
- const severityNumber = SEVERITY_MAP[severity.toUpperCase()];
744
+ const rawSeverity = raw.severityText || raw.severity || 'INFO';
745
+ const severity = normalizeOtelLogSeverity(rawSeverity) ?? rawSeverity;
746
+ const severityNumber = getOtelLogSeverityNumber(severity);
423
747
  const body = raw.body || '';
424
748
  // Extract fields from JSON body if requested
425
749
  let extractedFields;
@@ -456,11 +780,11 @@ function normalizeAggregationTemporality(value) {
456
780
  }
457
781
  // Handle numeric values (OTel spec)
458
782
  switch (value) {
459
- case 1:
783
+ case AGGREGATION_TEMPORALITY.DELTA:
460
784
  return 'DELTA';
461
- case 2:
785
+ case AGGREGATION_TEMPORALITY.CUMULATIVE:
462
786
  return 'CUMULATIVE';
463
- case 0:
787
+ case AGGREGATION_TEMPORALITY.UNSPECIFIED:
464
788
  default:
465
789
  return 'UNSPECIFIED';
466
790
  }
@@ -474,7 +798,7 @@ function normalizeExemplarTimestamp(ts, metricTimestamp) {
474
798
  if (typeof ts === 'string')
475
799
  return ts;
476
800
  // Convert [seconds, nanoseconds] to ISO string
477
- const ms = ts[0] * 1000 + Math.floor(ts[1] / 1_000_000);
801
+ const ms = ts[0] * TIME_MS.SECOND + Math.floor(ts[1] / ONE_MILLION);
478
802
  return new Date(ms).toISOString();
479
803
  }
480
804
  /**
@@ -522,10 +846,12 @@ function normalizeMetric(raw) {
522
846
  };
523
847
  }
524
848
  /**
525
- * Get files within date range
849
+ * Get files within date range.
850
+ * allowedBases constrains which directories listFiles may access (CR-H2).
851
+ * Callers should pass the telemetryDir as a base so test-provided directories are allowed.
526
852
  */
527
- function getFilesInRange(dir, pattern, startDate, endDate) {
528
- const files = listFiles(dir, pattern);
853
+ function getFilesInRange(dir, pattern, startDate, endDate, allowedBases) {
854
+ const files = listFiles(dir, pattern, allowedBases);
529
855
  if (!startDate && !endDate) {
530
856
  // Default to today only
531
857
  const today = getDateString();
@@ -545,17 +871,32 @@ function getFilesInRange(dir, pattern, startDate, endDate) {
545
871
  return true;
546
872
  });
547
873
  }
874
+ function encodeCursor(payload) {
875
+ return Buffer.from(JSON.stringify(payload)).toString('base64url');
876
+ }
877
+ function decodeCursor(cursor) {
878
+ try {
879
+ return JSON.parse(Buffer.from(cursor, 'base64url').toString());
880
+ }
881
+ catch {
882
+ return null;
883
+ }
884
+ }
548
885
  export class LocalJsonlBackend {
549
886
  name = 'local-jsonl';
550
887
  telemetryDir;
551
- traceCache = new QueryCache(100, 60000, 'traces');
552
- logCache = new QueryCache(100, 60000, 'logs');
553
- metricCache = new QueryCache(100, 60000, 'metrics');
554
- llmEventCache = new QueryCache(100, 60000, 'llmEvents');
555
- evaluationCache = new QueryCache(100, 60000, 'evaluations');
888
+ /** Security: directories listFiles is allowed to access (CR-H2) */
889
+ allowedBases;
890
+ traceCache = new QueryCache(DEFAULT_CACHE_SIZE, CACHE_TTL_MS, 'traces');
891
+ logCache = new QueryCache(DEFAULT_CACHE_SIZE, CACHE_TTL_MS, 'logs');
892
+ metricCache = new QueryCache(DEFAULT_CACHE_SIZE, CACHE_TTL_MS, 'metrics');
893
+ llmEventCache = new QueryCache(DEFAULT_CACHE_SIZE, CACHE_TTL_MS, 'llmEvents');
894
+ evaluationCache = new QueryCache(DEFAULT_CACHE_SIZE, CACHE_TTL_MS, 'evaluations');
556
895
  useIndexes;
557
896
  circuitBreaker;
558
897
  parseStatsTracker;
898
+ /** Count of trace lines that expanded to multiple spans (OTLP envelopes), across both indexed and full-scan paths */
899
+ otlpTraceExpansions = 0;
559
900
  /** Histograms for tracking query latency per type */
560
901
  queryHistograms = {
561
902
  traces: new Histogram(),
@@ -565,10 +906,12 @@ export class LocalJsonlBackend {
565
906
  evaluations: new Histogram(),
566
907
  };
567
908
  constructor(telemetryDir, useIndexes = true) {
568
- this.telemetryDir = telemetryDir || TELEMETRY_DIR;
909
+ this.telemetryDir = telemetryDir || HOOKS_TELEMETRY_DIR;
569
910
  this.useIndexes = useIndexes;
570
911
  this.circuitBreaker = new CircuitBreaker({ name: 'local-file-io' });
571
912
  this.parseStatsTracker = new ParseStatsTracker();
913
+ // Allow telemetryDir itself so custom dirs (including test temp dirs) are permitted (CR-H2)
914
+ this.allowedBases = [homedir(), process.cwd(), this.telemetryDir];
572
915
  }
573
916
  /**
574
917
  * Get circuit breaker state (for health check and testing)
@@ -609,13 +952,17 @@ export class LocalJsonlBackend {
609
952
  * Returns aggregate stats including success rate and worst files.
610
953
  */
611
954
  getParseStats() {
612
- return this.parseStatsTracker.getAggregateStats();
955
+ return {
956
+ ...this.parseStatsTracker.getAggregateStats(),
957
+ otlpTraceExpansions: this.otlpTraceExpansions,
958
+ };
613
959
  }
614
960
  /**
615
961
  * Reset parse statistics (useful for testing)
616
962
  */
617
963
  resetParseStats() {
618
964
  this.parseStatsTracker.reset();
965
+ this.otlpTraceExpansions = 0;
619
966
  }
620
967
  /**
621
968
  * Get query latency statistics per query type
@@ -658,7 +1005,7 @@ export class LocalJsonlBackend {
658
1005
  return withSpan('obs_toolkit.query.traces', () => ({
659
1006
  'obs_toolkit.query.type': 'traces',
660
1007
  'obs_toolkit.query.backend': 'local',
661
- 'obs_toolkit.query.limit': options.limit ?? 100,
1008
+ 'obs_toolkit.query.limit': options.limit ?? DEFAULT_QUERY_RESULT_LIMIT,
662
1009
  'obs_toolkit.query.start_date': options.startDate,
663
1010
  'obs_toolkit.query.end_date': options.endDate,
664
1011
  }), async (span) => {
@@ -668,7 +1015,7 @@ export class LocalJsonlBackend {
668
1015
  recordQueryDuration('traces', durationMs, 'local');
669
1016
  this.queryHistograms.traces.observe(durationMs);
670
1017
  if (durationMs > SLOW_QUERY_THRESHOLD_MS) {
671
- console.warn(`[obs-toolkit] Slow query: queryTraces took ${durationMs.toFixed(1)}ms`);
1018
+ queryLog.warn(`Slow query: queryTraces took ${durationMs.toFixed(1)}ms`, { durationMs });
672
1019
  }
673
1020
  };
674
1021
  // Check circuit breaker - fail fast if open
@@ -691,9 +1038,9 @@ export class LocalJsonlBackend {
691
1038
  }
692
1039
  return cached;
693
1040
  }
694
- const files = getFilesInRange(this.telemetryDir, /traces-\d{4}-\d{2}-\d{2}\.jsonl(\.gz)?$/, options.startDate, options.endDate);
1041
+ const files = getFilesInRange(this.telemetryDir, /traces-\d{4}-\d{2}-\d{2}\.jsonl(\.gz)?$/, options.startDate, options.endDate, this.allowedBases);
695
1042
  const results = [];
696
- const limit = options.limit || 100;
1043
+ const limit = options.limit || DEFAULT_QUERY_RESULT_LIMIT;
697
1044
  const offset = options.offset || 0;
698
1045
  // Use cached regex to avoid recompilation for frequently-used patterns
699
1046
  const spanNameRegex = options.spanNameRegex
@@ -747,6 +1094,16 @@ export class LocalJsonlBackend {
747
1094
  return false;
748
1095
  if (options.agentName && s.attributes?.['gen_ai.agent.name'] !== options.agentName)
749
1096
  return false;
1097
+ if (options.agentDescription) {
1098
+ const desc = s.attributes?.['gen_ai.agent.description'];
1099
+ if (typeof desc !== 'string' || !desc.toLowerCase().includes(options.agentDescription.toLowerCase()))
1100
+ return false;
1101
+ }
1102
+ if (options.agentVersion) {
1103
+ const ver = s.attributes?.['gen_ai.agent.version'];
1104
+ if (typeof ver !== 'string' || !ver.toLowerCase().includes(options.agentVersion.toLowerCase()))
1105
+ return false;
1106
+ }
750
1107
  if (options.toolName && s.attributes?.['gen_ai.tool.name'] !== options.toolName)
751
1108
  return false;
752
1109
  if (options.toolCallId && s.attributes?.['gen_ai.tool.call.id'] !== options.toolCallId)
@@ -755,6 +1112,11 @@ export class LocalJsonlBackend {
755
1112
  return false;
756
1113
  if (options.operationName && s.attributes?.['gen_ai.operation.name'] !== options.operationName)
757
1114
  return false;
1115
+ if (options.outputType) {
1116
+ const ot = s.attributes?.['gen_ai.output.type'];
1117
+ if (typeof ot !== 'string' || ot.toLowerCase() !== options.outputType.toLowerCase())
1118
+ return false;
1119
+ }
758
1120
  return true;
759
1121
  };
760
1122
  try {
@@ -763,52 +1125,65 @@ export class LocalJsonlBackend {
763
1125
  const matchingLines = this.tryUseIndex(file, 'traces', indexOptions);
764
1126
  if (matchingLines !== null) {
765
1127
  // Use indexed query - read only matching lines
1128
+ // Note: index was built against flat records. For OTLP envelope lines,
1129
+ // multi-span envelopes may have only one traceId indexed per line.
1130
+ // The full-scan fallback path handles these correctly.
766
1131
  const rawRecords = await readLinesByNumber(file, matchingLines);
767
- for (const raw of rawRecords) {
768
- const traceSpan = normalizeSpan(raw);
769
- if (!traceSpan)
770
- continue;
771
- if (!applyFilters(traceSpan))
772
- continue;
773
- results.push(traceSpan);
774
- if (hasReachedLimit(results.length, offset, limit)) {
775
- const paginated = paginateResults(results, offset, limit);
776
- this.traceCache.set(cacheKey, paginated);
777
- this.circuitBreaker.recordSuccess();
778
- logTiming();
779
- if (span)
780
- span.setAttribute('obs_toolkit.query.result_count', paginated.length);
781
- return paginated;
1132
+ for (const rawLine of rawRecords) {
1133
+ const expanded = flattenSpanRecord(rawLine);
1134
+ if (expanded.length > 1)
1135
+ this.otlpTraceExpansions++;
1136
+ for (const raw of expanded) {
1137
+ const traceSpan = normalizeSpan(raw);
1138
+ if (!traceSpan)
1139
+ continue;
1140
+ if (!applyFilters(traceSpan))
1141
+ continue;
1142
+ results.push(traceSpan);
1143
+ if (hasReachedLimit(results.length, offset, limit)) {
1144
+ const paginated = paginateResults(results, offset, limit);
1145
+ this.traceCache.set(cacheKey, paginated);
1146
+ this.circuitBreaker.recordSuccess();
1147
+ logTiming();
1148
+ if (span)
1149
+ span.setAttribute('obs_toolkit.query.result_count', paginated.length);
1150
+ return paginated;
1151
+ }
782
1152
  }
783
1153
  }
784
1154
  }
785
1155
  else {
786
1156
  // Fall back to full file scan
787
- for await (const raw of streamJsonl(file, { statsTracker: this.parseStatsTracker })) {
788
- const traceSpan = normalizeSpan(raw);
789
- if (!traceSpan)
790
- continue;
791
- // Apply indexable filters (since no index was used)
792
- if (options.traceId && traceSpan.traceId !== options.traceId)
793
- continue;
794
- if (options.spanName && !traceSpan.name.includes(options.spanName))
795
- continue;
796
- if (options.serviceName) {
797
- const svc = traceSpan.attributes?.['service.name'];
798
- if (svc !== options.serviceName)
1157
+ for await (const rawLine of streamJsonl(file, { statsTracker: this.parseStatsTracker })) {
1158
+ const expanded = flattenSpanRecord(rawLine);
1159
+ if (expanded.length > 1)
1160
+ this.otlpTraceExpansions++;
1161
+ for (const raw of expanded) {
1162
+ const traceSpan = normalizeSpan(raw);
1163
+ if (!traceSpan)
799
1164
  continue;
800
- }
801
- if (!applyFilters(traceSpan))
802
- continue;
803
- results.push(traceSpan);
804
- if (hasReachedLimit(results.length, offset, limit)) {
805
- const paginated = paginateResults(results, offset, limit);
806
- this.traceCache.set(cacheKey, paginated);
807
- this.circuitBreaker.recordSuccess();
808
- logTiming();
809
- if (span)
810
- span.setAttribute('obs_toolkit.query.result_count', paginated.length);
811
- return paginated;
1165
+ // Apply indexable filters (since no index was used)
1166
+ if (options.traceId && traceSpan.traceId !== options.traceId)
1167
+ continue;
1168
+ if (options.spanName && !traceSpan.name.includes(options.spanName))
1169
+ continue;
1170
+ if (options.serviceName) {
1171
+ const svc = traceSpan.attributes?.['service.name'];
1172
+ if (svc !== options.serviceName)
1173
+ continue;
1174
+ }
1175
+ if (!applyFilters(traceSpan))
1176
+ continue;
1177
+ results.push(traceSpan);
1178
+ if (hasReachedLimit(results.length, offset, limit)) {
1179
+ const paginated = paginateResults(results, offset, limit);
1180
+ this.traceCache.set(cacheKey, paginated);
1181
+ this.circuitBreaker.recordSuccess();
1182
+ logTiming();
1183
+ if (span)
1184
+ span.setAttribute('obs_toolkit.query.result_count', paginated.length);
1185
+ return paginated;
1186
+ }
812
1187
  }
813
1188
  }
814
1189
  }
@@ -833,7 +1208,7 @@ export class LocalJsonlBackend {
833
1208
  return withSpan('obs_toolkit.query.logs', () => ({
834
1209
  'obs_toolkit.query.type': 'logs',
835
1210
  'obs_toolkit.query.backend': 'local',
836
- 'obs_toolkit.query.limit': options.limit ?? 100,
1211
+ 'obs_toolkit.query.limit': options.limit ?? DEFAULT_QUERY_RESULT_LIMIT,
837
1212
  'obs_toolkit.query.start_date': options.startDate,
838
1213
  'obs_toolkit.query.end_date': options.endDate,
839
1214
  }), async (span) => {
@@ -843,7 +1218,7 @@ export class LocalJsonlBackend {
843
1218
  recordQueryDuration('logs', durationMs, 'local');
844
1219
  this.queryHistograms.logs.observe(durationMs);
845
1220
  if (durationMs > SLOW_QUERY_THRESHOLD_MS) {
846
- console.warn(`[obs-toolkit] Slow query: queryLogs took ${durationMs.toFixed(1)}ms`);
1221
+ queryLog.warn(`Slow query: queryLogs took ${durationMs.toFixed(1)}ms`, { durationMs });
847
1222
  }
848
1223
  };
849
1224
  // Check circuit breaker - fail fast if open
@@ -866,9 +1241,9 @@ export class LocalJsonlBackend {
866
1241
  }
867
1242
  return cached;
868
1243
  }
869
- const files = getFilesInRange(this.telemetryDir, /logs-\d{4}-\d{2}-\d{2}\.jsonl(\.gz)?$/, options.startDate, options.endDate);
1244
+ const files = getFilesInRange(this.telemetryDir, /logs-\d{4}-\d{2}-\d{2}\.jsonl(\.gz)?$/, options.startDate, options.endDate, this.allowedBases);
870
1245
  const results = [];
871
- const limit = options.limit || 100;
1246
+ const limit = options.limit || DEFAULT_QUERY_RESULT_LIMIT;
872
1247
  const offset = options.offset || 0;
873
1248
  // Build index query options for indexable filters
874
1249
  const indexOptions = {
@@ -924,46 +1299,50 @@ export class LocalJsonlBackend {
924
1299
  if (matchingLines !== null) {
925
1300
  // Use indexed query - read only matching lines
926
1301
  const rawRecords = await readLinesByNumber(file, matchingLines);
927
- for (const raw of rawRecords) {
928
- const logRecord = normalizeLog(raw, options.extractFields);
929
- if (!logRecord)
930
- continue;
931
- if (!applyFilters(logRecord))
932
- continue;
933
- results.push(logRecord);
934
- if (hasReachedLimit(results.length, offset, limit)) {
935
- const paginated = paginateResults(results, offset, limit);
936
- this.logCache.set(cacheKey, paginated);
937
- this.circuitBreaker.recordSuccess();
938
- logTiming();
939
- if (span)
940
- span.setAttribute('obs_toolkit.query.result_count', paginated.length);
941
- return paginated;
1302
+ for (const rawLine of rawRecords) {
1303
+ for (const raw of flattenLogRecord(rawLine)) {
1304
+ const logRecord = normalizeLog(raw, options.extractFields);
1305
+ if (!logRecord)
1306
+ continue;
1307
+ if (!applyFilters(logRecord))
1308
+ continue;
1309
+ results.push(logRecord);
1310
+ if (hasReachedLimit(results.length, offset, limit)) {
1311
+ const paginated = paginateResults(results, offset, limit);
1312
+ this.logCache.set(cacheKey, paginated);
1313
+ this.circuitBreaker.recordSuccess();
1314
+ logTiming();
1315
+ if (span)
1316
+ span.setAttribute('obs_toolkit.query.result_count', paginated.length);
1317
+ return paginated;
1318
+ }
942
1319
  }
943
1320
  }
944
1321
  }
945
1322
  else {
946
1323
  // Fall back to full file scan
947
- for await (const raw of streamJsonl(file, { statsTracker: this.parseStatsTracker })) {
948
- const logRecord = normalizeLog(raw, options.extractFields);
949
- if (!logRecord)
950
- continue;
951
- // Apply indexable filters (since no index was used)
952
- if (options.severity && logRecord.severity.toUpperCase() !== options.severity.toUpperCase())
953
- continue;
954
- if (options.traceId && logRecord.traceId !== options.traceId)
955
- continue;
956
- if (!applyFilters(logRecord))
957
- continue;
958
- results.push(logRecord);
959
- if (hasReachedLimit(results.length, offset, limit)) {
960
- const paginated = paginateResults(results, offset, limit);
961
- this.logCache.set(cacheKey, paginated);
962
- this.circuitBreaker.recordSuccess();
963
- logTiming();
964
- if (span)
965
- span.setAttribute('obs_toolkit.query.result_count', paginated.length);
966
- return paginated;
1324
+ for await (const rawLine of streamJsonl(file, { statsTracker: this.parseStatsTracker })) {
1325
+ for (const raw of flattenLogRecord(rawLine)) {
1326
+ const logRecord = normalizeLog(raw, options.extractFields);
1327
+ if (!logRecord)
1328
+ continue;
1329
+ // Apply indexable filters (since no index was used)
1330
+ if (options.severity && logRecord.severity !== options.severity)
1331
+ continue;
1332
+ if (options.traceId && logRecord.traceId !== options.traceId)
1333
+ continue;
1334
+ if (!applyFilters(logRecord))
1335
+ continue;
1336
+ results.push(logRecord);
1337
+ if (hasReachedLimit(results.length, offset, limit)) {
1338
+ const paginated = paginateResults(results, offset, limit);
1339
+ this.logCache.set(cacheKey, paginated);
1340
+ this.circuitBreaker.recordSuccess();
1341
+ logTiming();
1342
+ if (span)
1343
+ span.setAttribute('obs_toolkit.query.result_count', paginated.length);
1344
+ return paginated;
1345
+ }
967
1346
  }
968
1347
  }
969
1348
  }
@@ -988,7 +1367,7 @@ export class LocalJsonlBackend {
988
1367
  return withSpan('obs_toolkit.query.metrics', () => ({
989
1368
  'obs_toolkit.query.type': 'metrics',
990
1369
  'obs_toolkit.query.backend': 'local',
991
- 'obs_toolkit.query.limit': options.limit ?? 100,
1370
+ 'obs_toolkit.query.limit': options.limit ?? DEFAULT_QUERY_RESULT_LIMIT,
992
1371
  'obs_toolkit.query.start_date': options.startDate,
993
1372
  'obs_toolkit.query.end_date': options.endDate,
994
1373
  }), async (span) => {
@@ -998,7 +1377,7 @@ export class LocalJsonlBackend {
998
1377
  recordQueryDuration('metrics', durationMs, 'local');
999
1378
  this.queryHistograms.metrics.observe(durationMs);
1000
1379
  if (durationMs > SLOW_QUERY_THRESHOLD_MS) {
1001
- console.warn(`[obs-toolkit] Slow query: queryMetrics took ${durationMs.toFixed(1)}ms`);
1380
+ queryLog.warn(`Slow query: queryMetrics took ${durationMs.toFixed(1)}ms`, { durationMs });
1002
1381
  }
1003
1382
  };
1004
1383
  // Check circuit breaker - fail fast if open
@@ -1021,9 +1400,9 @@ export class LocalJsonlBackend {
1021
1400
  }
1022
1401
  return cached;
1023
1402
  }
1024
- const files = getFilesInRange(this.telemetryDir, /metrics-\d{4}-\d{2}-\d{2}\.jsonl(\.gz)?$/, options.startDate, options.endDate);
1403
+ const files = getFilesInRange(this.telemetryDir, /metrics-\d{4}-\d{2}-\d{2}\.jsonl(\.gz)?$/, options.startDate, options.endDate, this.allowedBases);
1025
1404
  const results = [];
1026
- const limit = options.limit || 100;
1405
+ const limit = options.limit || DEFAULT_QUERY_RESULT_LIMIT;
1027
1406
  const offset = options.offset || 0;
1028
1407
  // Build index query options for indexable filters
1029
1408
  const indexOptions = {
@@ -1036,28 +1415,32 @@ export class LocalJsonlBackend {
1036
1415
  if (matchingLines !== null) {
1037
1416
  // Use indexed query - read only matching lines
1038
1417
  const rawRecords = await readLinesByNumber(file, matchingLines);
1039
- for (const raw of rawRecords) {
1040
- const point = normalizeMetric(raw);
1041
- if (!point)
1042
- continue;
1043
- results.push(point);
1044
- if (hasReachedLimit(results.length, offset, limit)) {
1045
- break outer;
1418
+ for (const rawLine of rawRecords) {
1419
+ for (const raw of flattenMetricRecord(rawLine)) {
1420
+ const point = normalizeMetric(raw);
1421
+ if (!point)
1422
+ continue;
1423
+ results.push(point);
1424
+ if (hasReachedLimit(results.length, offset, limit)) {
1425
+ break outer;
1426
+ }
1046
1427
  }
1047
1428
  }
1048
1429
  }
1049
1430
  else {
1050
1431
  // Fall back to full file scan
1051
- for await (const raw of streamJsonl(file, { statsTracker: this.parseStatsTracker })) {
1052
- const point = normalizeMetric(raw);
1053
- if (!point)
1054
- continue;
1055
- // Apply filters (since no index was used)
1056
- if (options.metricName && !point.name.includes(options.metricName))
1057
- continue;
1058
- results.push(point);
1059
- if (hasReachedLimit(results.length, offset, limit)) {
1060
- break outer;
1432
+ for await (const rawLine of streamJsonl(file, { statsTracker: this.parseStatsTracker })) {
1433
+ for (const raw of flattenMetricRecord(rawLine)) {
1434
+ const point = normalizeMetric(raw);
1435
+ if (!point)
1436
+ continue;
1437
+ // Apply filters (since no index was used)
1438
+ if (options.metricName && !point.name.includes(options.metricName))
1439
+ continue;
1440
+ results.push(point);
1441
+ if (hasReachedLimit(results.length, offset, limit)) {
1442
+ break outer;
1443
+ }
1061
1444
  }
1062
1445
  }
1063
1446
  }
@@ -1132,13 +1515,13 @@ export class LocalJsonlBackend {
1132
1515
  value = values.length;
1133
1516
  break;
1134
1517
  case 'p50':
1135
- value = this.calculatePercentile(values, 50);
1518
+ value = this.calculatePercentile(values, PERCENTILE.P50);
1136
1519
  break;
1137
1520
  case 'p95':
1138
- value = this.calculatePercentile(values, 95);
1521
+ value = this.calculatePercentile(values, PERCENTILE.P95);
1139
1522
  break;
1140
1523
  case 'p99':
1141
- value = this.calculatePercentile(values, 99);
1524
+ value = this.calculatePercentile(values, PERCENTILE.P99);
1142
1525
  break;
1143
1526
  case 'rate':
1144
1527
  value = this.calculateRate(group);
@@ -1168,7 +1551,7 @@ export class LocalJsonlBackend {
1168
1551
  if (values.length === 0)
1169
1552
  return 0;
1170
1553
  const sorted = [...values].sort((a, b) => a - b);
1171
- const index = Math.ceil((percentile / 100) * sorted.length) - 1;
1554
+ const index = Math.ceil((percentile / PERCENT_MULTIPLIER) * sorted.length) - 1;
1172
1555
  return sorted[Math.max(0, index)];
1173
1556
  }
1174
1557
  /**
@@ -1177,7 +1560,8 @@ export class LocalJsonlBackend {
1177
1560
  * Edge cases: single value returns 0, same timestamp returns 0
1178
1561
  */
1179
1562
  calculateRate(group) {
1180
- if (group.length < 2)
1563
+ const MIN_POINTS_FOR_RATE = 2;
1564
+ if (group.length < MIN_POINTS_FOR_RATE)
1181
1565
  return 0;
1182
1566
  // Sort by timestamp
1183
1567
  const sorted = [...group].sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
@@ -1189,7 +1573,7 @@ export class LocalJsonlBackend {
1189
1573
  // Avoid division by zero when timestamps are the same
1190
1574
  if (durationMs === 0)
1191
1575
  return 0;
1192
- const durationSeconds = durationMs / 1000;
1576
+ const durationSeconds = durationMs / TIME_MS.SECOND;
1193
1577
  return (lastPoint.value - firstPoint.value) / durationSeconds;
1194
1578
  }
1195
1579
  async queryLLMEvents(options) {
@@ -1197,7 +1581,7 @@ export class LocalJsonlBackend {
1197
1581
  return withSpan('obs_toolkit.query.llm_events', () => ({
1198
1582
  'obs_toolkit.query.type': 'llm_events',
1199
1583
  'obs_toolkit.query.backend': 'local',
1200
- 'obs_toolkit.query.limit': options.limit ?? 100,
1584
+ 'obs_toolkit.query.limit': options.limit ?? DEFAULT_QUERY_RESULT_LIMIT,
1201
1585
  'obs_toolkit.query.start_date': options.startDate,
1202
1586
  'obs_toolkit.query.end_date': options.endDate,
1203
1587
  }), async (span) => {
@@ -1207,7 +1591,7 @@ export class LocalJsonlBackend {
1207
1591
  recordQueryDuration('llm_events', durationMs, 'local');
1208
1592
  this.queryHistograms.llmEvents.observe(durationMs);
1209
1593
  if (durationMs > SLOW_QUERY_THRESHOLD_MS) {
1210
- console.warn(`[obs-toolkit] Slow query: queryLLMEvents took ${durationMs.toFixed(1)}ms`);
1594
+ queryLog.warn(`Slow query: queryLLMEvents took ${durationMs.toFixed(1)}ms`, { durationMs });
1211
1595
  }
1212
1596
  };
1213
1597
  // Check circuit breaker - fail fast if open
@@ -1230,9 +1614,9 @@ export class LocalJsonlBackend {
1230
1614
  }
1231
1615
  return cached;
1232
1616
  }
1233
- const files = getFilesInRange(this.telemetryDir, /llm-events-\d{4}-\d{2}-\d{2}\.jsonl(\.gz)?$/, options.startDate, options.endDate);
1617
+ const files = getFilesInRange(this.telemetryDir, /llm-events-\d{4}-\d{2}-\d{2}\.jsonl(\.gz)?$/, options.startDate, options.endDate, this.allowedBases);
1234
1618
  const results = [];
1235
- const limit = options.limit || 100;
1619
+ const limit = options.limit || DEFAULT_QUERY_RESULT_LIMIT;
1236
1620
  const offset = options.offset || 0;
1237
1621
  // Build index query options - eventName maps to spanName in index
1238
1622
  const indexOptions = {
@@ -1346,7 +1730,7 @@ export class LocalJsonlBackend {
1346
1730
  return withSpan('obs_toolkit.query.evaluations', () => ({
1347
1731
  'obs_toolkit.query.type': 'evaluations',
1348
1732
  'obs_toolkit.query.backend': 'local',
1349
- 'obs_toolkit.query.limit': options.limit ?? 100,
1733
+ 'obs_toolkit.query.limit': options.limit ?? DEFAULT_QUERY_RESULT_LIMIT,
1350
1734
  'obs_toolkit.query.start_date': options.startDate,
1351
1735
  'obs_toolkit.query.end_date': options.endDate,
1352
1736
  }), async (span) => {
@@ -1356,7 +1740,7 @@ export class LocalJsonlBackend {
1356
1740
  recordQueryDuration('evaluations', durationMs, 'local');
1357
1741
  this.queryHistograms.evaluations.observe(durationMs);
1358
1742
  if (durationMs > SLOW_QUERY_THRESHOLD_MS) {
1359
- console.warn(`[obs-toolkit] Slow query: queryEvaluations took ${durationMs.toFixed(1)}ms`);
1743
+ queryLog.warn(`Slow query: queryEvaluations took ${durationMs.toFixed(1)}ms`, { durationMs });
1360
1744
  }
1361
1745
  };
1362
1746
  // Check circuit breaker - fail fast if open
@@ -1379,9 +1763,9 @@ export class LocalJsonlBackend {
1379
1763
  }
1380
1764
  return cached;
1381
1765
  }
1382
- const files = getFilesInRange(this.telemetryDir, /evaluations-\d{4}-\d{2}-\d{2}\.jsonl(\.gz)?$/, options.startDate, options.endDate);
1766
+ const files = getFilesInRange(this.telemetryDir, /evaluations-\d{4}-\d{2}-\d{2}\.jsonl(\.gz)?$/, options.startDate, options.endDate, this.allowedBases);
1383
1767
  const results = [];
1384
- const limit = options.limit || 100;
1768
+ const limit = options.limit || DEFAULT_QUERY_RESULT_LIMIT;
1385
1769
  const offset = options.offset || 0;
1386
1770
  // Build index query options for indexable filters
1387
1771
  const indexOptions = {
@@ -1391,8 +1775,18 @@ export class LocalJsonlBackend {
1391
1775
  responseId: options.responseId,
1392
1776
  evaluator: options.evaluator,
1393
1777
  };
1778
+ // Pre-load dataset trace IDs when filtering by datasetId
1779
+ let datasetTraceIds;
1780
+ if (options.datasetId) {
1781
+ const allTraces = await this.readDatasetTraces();
1782
+ datasetTraceIds = new Set(allTraces.filter(t => t.datasetId === options.datasetId).map(t => t.traceId));
1783
+ }
1394
1784
  // Helper to apply non-indexable filters to an evaluation
1395
1785
  const applyFilters = (evaluation) => {
1786
+ // Dataset membership filter
1787
+ if (datasetTraceIds && (!evaluation.traceId || !datasetTraceIds.has(evaluation.traceId))) {
1788
+ return false;
1789
+ }
1396
1790
  // Score range filters - only apply when evaluation HAS a scoreValue (P1-1 fix)
1397
1791
  // Evaluations with only scoreLabel (qualitative) should pass through
1398
1792
  if (options.scoreMin !== undefined && evaluation.scoreValue !== undefined) {
@@ -1427,52 +1821,56 @@ export class LocalJsonlBackend {
1427
1821
  if (matchingLines !== null) {
1428
1822
  // Use indexed query - read only matching lines
1429
1823
  const rawRecords = await readLinesByNumber(file, matchingLines);
1430
- for (const raw of rawRecords) {
1431
- const evaluation = normalizeEvaluation(raw);
1432
- if (!evaluation)
1433
- continue;
1434
- if (!applyFilters(evaluation))
1435
- continue;
1436
- results.push(evaluation);
1437
- if (hasReachedLimit(results.length, offset, limit)) {
1438
- const paginated = paginateResults(results, offset, limit);
1439
- this.evaluationCache.set(cacheKey, paginated);
1440
- this.circuitBreaker.recordSuccess();
1441
- logTiming();
1442
- if (span)
1443
- span.setAttribute('obs_toolkit.query.result_count', paginated.length);
1444
- return paginated;
1824
+ for (const rawLine of rawRecords) {
1825
+ for (const raw of flattenEvaluationRecord(rawLine)) {
1826
+ const evaluation = normalizeEvaluation(raw);
1827
+ if (!evaluation)
1828
+ continue;
1829
+ if (!applyFilters(evaluation))
1830
+ continue;
1831
+ results.push(evaluation);
1832
+ if (hasReachedLimit(results.length, offset, limit)) {
1833
+ const paginated = paginateResults(results, offset, limit);
1834
+ this.evaluationCache.set(cacheKey, paginated);
1835
+ this.circuitBreaker.recordSuccess();
1836
+ logTiming();
1837
+ if (span)
1838
+ span.setAttribute('obs_toolkit.query.result_count', paginated.length);
1839
+ return paginated;
1840
+ }
1445
1841
  }
1446
1842
  }
1447
1843
  }
1448
1844
  else {
1449
1845
  // Fall back to full file scan
1450
- for await (const raw of streamJsonl(file, { statsTracker: this.parseStatsTracker })) {
1451
- const evaluation = normalizeEvaluation(raw);
1452
- if (!evaluation)
1453
- continue;
1454
- // Apply indexable filters (since no index was used)
1455
- if (options.traceId && evaluation.traceId !== options.traceId)
1456
- continue;
1457
- if (options.evaluationName && !evaluation.evaluationName.includes(options.evaluationName))
1458
- continue;
1459
- if (options.scoreLabel && evaluation.scoreLabel !== options.scoreLabel)
1460
- continue;
1461
- if (options.responseId && evaluation.responseId !== options.responseId)
1462
- continue;
1463
- if (options.evaluator && evaluation.evaluator !== options.evaluator)
1464
- continue;
1465
- if (!applyFilters(evaluation))
1466
- continue;
1467
- results.push(evaluation);
1468
- if (hasReachedLimit(results.length, offset, limit)) {
1469
- const paginated = paginateResults(results, offset, limit);
1470
- this.evaluationCache.set(cacheKey, paginated);
1471
- this.circuitBreaker.recordSuccess();
1472
- logTiming();
1473
- if (span)
1474
- span.setAttribute('obs_toolkit.query.result_count', paginated.length);
1475
- return paginated;
1846
+ for await (const rawLine of streamJsonl(file, { statsTracker: this.parseStatsTracker })) {
1847
+ for (const raw of flattenEvaluationRecord(rawLine)) {
1848
+ const evaluation = normalizeEvaluation(raw);
1849
+ if (!evaluation)
1850
+ continue;
1851
+ // Apply indexable filters (since no index was used)
1852
+ if (options.traceId && evaluation.traceId !== options.traceId)
1853
+ continue;
1854
+ if (options.evaluationName && !evaluation.evaluationName.includes(options.evaluationName))
1855
+ continue;
1856
+ if (options.scoreLabel && evaluation.scoreLabel !== options.scoreLabel)
1857
+ continue;
1858
+ if (options.responseId && evaluation.responseId !== options.responseId)
1859
+ continue;
1860
+ if (options.evaluator && evaluation.evaluator !== options.evaluator)
1861
+ continue;
1862
+ if (!applyFilters(evaluation))
1863
+ continue;
1864
+ results.push(evaluation);
1865
+ if (hasReachedLimit(results.length, offset, limit)) {
1866
+ const paginated = paginateResults(results, offset, limit);
1867
+ this.evaluationCache.set(cacheKey, paginated);
1868
+ this.circuitBreaker.recordSuccess();
1869
+ logTiming();
1870
+ if (span)
1871
+ span.setAttribute('obs_toolkit.query.result_count', paginated.length);
1872
+ return paginated;
1873
+ }
1476
1874
  }
1477
1875
  }
1478
1876
  }
@@ -1492,6 +1890,350 @@ export class LocalJsonlBackend {
1492
1890
  }
1493
1891
  });
1494
1892
  }
1893
+ // --- Dataset Management ---
1894
+ get datasetsFile() { return join(this.telemetryDir, 'datasets.jsonl'); }
1895
+ get datasetTracesFile() { return join(this.telemetryDir, 'dataset-traces.jsonl'); }
1896
+ get datasetRunsFile() { return join(this.telemetryDir, 'dataset-runs.jsonl'); }
1897
+ /** Promise-chain mutex — serializes dataset mutations to prevent race conditions */
1898
+ _datasetMutex = Promise.resolve();
1899
+ _withDatasetLock(fn) {
1900
+ const prev = this._datasetMutex;
1901
+ let resolve;
1902
+ this._datasetMutex = new Promise(r => { resolve = r; });
1903
+ return prev.then(fn).finally(() => resolve());
1904
+ }
1905
+ async readDatasets() {
1906
+ try {
1907
+ const content = await readFile(this.datasetsFile, 'utf-8');
1908
+ const results = [];
1909
+ for (const line of content.trim().split('\n').filter(Boolean)) {
1910
+ const parsed = JSON.parse(line);
1911
+ const result = datasetRecordSchema.safeParse(parsed);
1912
+ if (result.success) {
1913
+ results.push(result.data);
1914
+ }
1915
+ }
1916
+ return results;
1917
+ }
1918
+ catch {
1919
+ return [];
1920
+ }
1921
+ }
1922
+ async readDatasetTraces() {
1923
+ try {
1924
+ const content = await readFile(this.datasetTracesFile, 'utf-8');
1925
+ const results = [];
1926
+ for (const line of content.trim().split('\n').filter(Boolean)) {
1927
+ const parsed = JSON.parse(line);
1928
+ const result = datasetTraceRecordSchema.safeParse(parsed);
1929
+ if (result.success) {
1930
+ results.push(result.data);
1931
+ }
1932
+ }
1933
+ return results;
1934
+ }
1935
+ catch {
1936
+ return [];
1937
+ }
1938
+ }
1939
+ async appendDataset(record) {
1940
+ await mkdir(this.telemetryDir, { recursive: true });
1941
+ await appendFile(this.datasetsFile, JSON.stringify(record) + '\n');
1942
+ }
1943
+ async appendDatasetTraces(records) {
1944
+ if (records.length === 0)
1945
+ return;
1946
+ await mkdir(this.telemetryDir, { recursive: true });
1947
+ const lines = records.map(r => JSON.stringify(r)).join('\n') + '\n';
1948
+ await appendFile(this.datasetTracesFile, lines);
1949
+ }
1950
+ /** Atomic rewrite: write to temp file then rename (POSIX atomic on same volume) */
1951
+ async atomicWriteFile(filePath, content) {
1952
+ await mkdir(this.telemetryDir, { recursive: true });
1953
+ const tmp = `${filePath}.${Date.now()}.tmp`;
1954
+ await writeFile(tmp, content);
1955
+ await rename(tmp, filePath);
1956
+ }
1957
+ async rewriteDatasetTraces(records) {
1958
+ const lines = records.map(r => JSON.stringify(r)).join('\n') + (records.length ? '\n' : '');
1959
+ await this.atomicWriteFile(this.datasetTracesFile, lines);
1960
+ }
1961
+ async readDatasetRuns() {
1962
+ try {
1963
+ const content = await readFile(this.datasetRunsFile, 'utf-8');
1964
+ const results = [];
1965
+ for (const line of content.trim().split('\n').filter(Boolean)) {
1966
+ const parsed = JSON.parse(line);
1967
+ const result = datasetRunRecordSchema.safeParse(parsed);
1968
+ if (result.success) {
1969
+ results.push(result.data);
1970
+ }
1971
+ }
1972
+ return results;
1973
+ }
1974
+ catch {
1975
+ return [];
1976
+ }
1977
+ }
1978
+ async appendDatasetRun(record) {
1979
+ await mkdir(this.telemetryDir, { recursive: true });
1980
+ await appendFile(this.datasetRunsFile, JSON.stringify(record) + '\n');
1981
+ }
1982
+ latestVersion(allVersions, datasetId) {
1983
+ return allVersions
1984
+ .filter(d => d.id === datasetId)
1985
+ .sort((a, b) => (b.version ?? 0) - (a.version ?? 0))[0];
1986
+ }
1987
+ async manageDatasets(options) {
1988
+ const MUTATING = new Set(['create', 'delete', 'add_traces', 'remove_traces', 'promote']);
1989
+ if (MUTATING.has(options.action)) {
1990
+ return this._withDatasetLock(() => this._manageDatasetsInner(options));
1991
+ }
1992
+ return this._manageDatasetsInner(options);
1993
+ }
1994
+ async _manageDatasetsInner(options) {
1995
+ const now = new Date().toISOString();
1996
+ switch (options.action) {
1997
+ case 'create': {
1998
+ const id = randomUUID();
1999
+ const traceIds = [...new Set(options.traceIds ?? [])];
2000
+ const record = {
2001
+ id,
2002
+ name: options.name,
2003
+ description: options.description ?? null,
2004
+ createdAt: now,
2005
+ frozen: options.frozen ?? 0,
2006
+ traceCount: traceIds.length,
2007
+ evaluationNames: options.evaluationNames ?? [],
2008
+ dateRangeStart: null,
2009
+ dateRangeEnd: null,
2010
+ selectionCriteria: options.selectionCriteria ?? null,
2011
+ version: 1,
2012
+ parentVersion: null,
2013
+ versionCreatedAt: now,
2014
+ versionReason: 'created',
2015
+ fieldMapping: options.fieldMapping,
2016
+ traceSnapshot: traceIds,
2017
+ };
2018
+ await this.appendDataset(record);
2019
+ const traceRecords = traceIds.map(traceId => ({ datasetId: id, traceId, addedAt: now }));
2020
+ await this.appendDatasetTraces(traceRecords);
2021
+ return { action: 'create', dataset: record };
2022
+ }
2023
+ case 'list': {
2024
+ const all = await this.readDatasets();
2025
+ const byId = new Map();
2026
+ for (const d of all) {
2027
+ const existing = byId.get(d.id);
2028
+ if (!existing || (d.version ?? 0) > (existing.version ?? 0)) {
2029
+ byId.set(d.id, d);
2030
+ }
2031
+ }
2032
+ let datasets = [...byId.values()];
2033
+ if (options.filterFrozen !== undefined) {
2034
+ datasets = datasets.filter(d => d.frozen === options.filterFrozen);
2035
+ }
2036
+ // Sort by createdAt descending, then id for stable ordering
2037
+ datasets.sort((a, b) => b.createdAt.localeCompare(a.createdAt) || a.id.localeCompare(b.id));
2038
+ // Apply cursor
2039
+ if (options.cursor) {
2040
+ const decoded = decodeCursor(options.cursor);
2041
+ if (decoded?.createdAt && decoded.id) {
2042
+ const cursorAt = decoded.createdAt;
2043
+ const cursorId = decoded.id;
2044
+ const idx = datasets.findIndex(d => d.createdAt < cursorAt ||
2045
+ (d.createdAt === cursorAt && d.id > cursorId));
2046
+ datasets = idx >= 0 ? datasets.slice(idx) : [];
2047
+ }
2048
+ }
2049
+ const limit = options.limit ?? DEFAULT_QUERY_RESULT_LIMIT;
2050
+ const hasMore = datasets.length > limit;
2051
+ const page = datasets.slice(0, limit);
2052
+ const last = page[page.length - 1];
2053
+ return {
2054
+ action: 'list',
2055
+ datasets: page,
2056
+ count: page.length,
2057
+ hasMore,
2058
+ ...(hasMore && last && { nextCursor: encodeCursor({ createdAt: last.createdAt, id: last.id }) }),
2059
+ };
2060
+ }
2061
+ case 'get': {
2062
+ const all = await this.readDatasets();
2063
+ const dataset = this.latestVersion(all, options.datasetId);
2064
+ if (!dataset)
2065
+ throw new Error(`Dataset not found: ${options.datasetId}`);
2066
+ const allTraces = await this.readDatasetTraces();
2067
+ const traces = allTraces.filter(t => t.datasetId === options.datasetId);
2068
+ const truncated = traces.length > DATASET_TRACE_TRUNCATION_LIMIT;
2069
+ return {
2070
+ action: 'get',
2071
+ dataset,
2072
+ traces: truncated ? traces.slice(0, DATASET_TRACE_TRUNCATION_LIMIT) : traces,
2073
+ traceCount: traces.length,
2074
+ truncated,
2075
+ };
2076
+ }
2077
+ case 'delete': {
2078
+ const all = await this.readDatasets();
2079
+ const remaining = all.filter(d => d.id !== options.datasetId);
2080
+ const deleted = remaining.length < all.length;
2081
+ const lines = remaining.map(r => JSON.stringify(r)).join('\n') + (remaining.length ? '\n' : '');
2082
+ await this.atomicWriteFile(this.datasetsFile, lines);
2083
+ const allTraces = await this.readDatasetTraces();
2084
+ const remainingTraces = allTraces.filter(t => t.datasetId !== options.datasetId);
2085
+ await this.rewriteDatasetTraces(remainingTraces);
2086
+ return { action: 'delete', deleted, id: options.datasetId };
2087
+ }
2088
+ case 'add_traces': {
2089
+ const all = await this.readDatasets();
2090
+ const current = this.latestVersion(all, options.datasetId);
2091
+ if (!current)
2092
+ throw new Error(`Dataset not found: ${options.datasetId}`);
2093
+ if (current.frozen === 1)
2094
+ throw new Error('Cannot modify a frozen dataset');
2095
+ const existingTraces = (await this.readDatasetTraces())
2096
+ .filter(t => t.datasetId === options.datasetId);
2097
+ const existingIds = new Set(existingTraces.map(t => t.traceId));
2098
+ const newTraceIds = options.traceIds.filter(id => !existingIds.has(id));
2099
+ const allTraceIds = [...existingIds, ...newTraceIds];
2100
+ const newVersion = {
2101
+ ...current,
2102
+ version: (current.version ?? 1) + 1,
2103
+ parentVersion: current.version ?? 1,
2104
+ versionCreatedAt: now,
2105
+ versionReason: 'traces_added',
2106
+ traceCount: allTraceIds.length,
2107
+ traceSnapshot: allTraceIds,
2108
+ };
2109
+ await this.appendDataset(newVersion);
2110
+ const traceRecords = newTraceIds.map(traceId => ({ datasetId: options.datasetId, traceId, addedAt: now }));
2111
+ await this.appendDatasetTraces(traceRecords);
2112
+ return { action: 'add_traces', dataset: newVersion, tracesAdded: newTraceIds.length };
2113
+ }
2114
+ case 'remove_traces': {
2115
+ const all = await this.readDatasets();
2116
+ const current = this.latestVersion(all, options.datasetId);
2117
+ if (!current)
2118
+ throw new Error(`Dataset not found: ${options.datasetId}`);
2119
+ if (current.frozen === 1)
2120
+ throw new Error('Cannot modify a frozen dataset');
2121
+ const allTraces = await this.readDatasetTraces();
2122
+ const removeSet = new Set(options.traceIds);
2123
+ const before = allTraces.filter(t => t.datasetId === options.datasetId).length;
2124
+ const remaining = allTraces.filter(t => !(t.datasetId === options.datasetId && removeSet.has(t.traceId)));
2125
+ const after = remaining.filter(t => t.datasetId === options.datasetId).length;
2126
+ const removed = before - after;
2127
+ const remainingTraceIds = remaining
2128
+ .filter(t => t.datasetId === options.datasetId)
2129
+ .map(t => t.traceId);
2130
+ const newVersion = {
2131
+ ...current,
2132
+ version: (current.version ?? 1) + 1,
2133
+ parentVersion: current.version ?? 1,
2134
+ versionCreatedAt: now,
2135
+ versionReason: 'traces_removed',
2136
+ traceCount: after,
2137
+ traceSnapshot: remainingTraceIds,
2138
+ };
2139
+ await this.appendDataset(newVersion);
2140
+ await this.rewriteDatasetTraces(remaining);
2141
+ return { action: 'remove_traces', dataset: newVersion, tracesRemoved: removed };
2142
+ }
2143
+ case 'get_version': {
2144
+ const all = await this.readDatasets();
2145
+ const version = all.find(d => d.id === options.datasetId && d.version === options.version);
2146
+ if (!version)
2147
+ throw new Error(`Version ${options.version} not found for dataset ${options.datasetId}`);
2148
+ // Use traceSnapshot if available (populated since L8), otherwise fall back to current traces
2149
+ if (version.traceSnapshot) {
2150
+ const snapshotSet = new Set(version.traceSnapshot);
2151
+ const allTraces = await this.readDatasetTraces();
2152
+ const traces = allTraces.filter(t => t.datasetId === options.datasetId && snapshotSet.has(t.traceId));
2153
+ return { action: 'get_version', dataset: version, traces };
2154
+ }
2155
+ const allTraces = await this.readDatasetTraces();
2156
+ const traces = allTraces.filter(t => t.datasetId === options.datasetId);
2157
+ return { action: 'get_version', dataset: version, traces };
2158
+ }
2159
+ case 'list_versions': {
2160
+ const all = await this.readDatasets();
2161
+ let versions = all
2162
+ .filter(d => d.id === options.datasetId)
2163
+ .sort((a, b) => (b.version ?? 0) - (a.version ?? 0));
2164
+ // Apply cursor (version number, descending)
2165
+ if (options.cursor) {
2166
+ const decoded = decodeCursor(options.cursor);
2167
+ const cursorVersion = decoded?.version;
2168
+ if (cursorVersion != null) {
2169
+ versions = versions.filter(d => (d.version ?? 0) < cursorVersion);
2170
+ }
2171
+ }
2172
+ const limit = options.limit ?? DEFAULT_QUERY_RESULT_LIMIT;
2173
+ const hasMore = versions.length > limit;
2174
+ const page = versions.slice(0, limit);
2175
+ const last = page[page.length - 1];
2176
+ return {
2177
+ action: 'list_versions',
2178
+ versions: page,
2179
+ count: page.length,
2180
+ hasMore,
2181
+ ...(hasMore && last?.version != null && { nextCursor: encodeCursor({ version: last.version }) }),
2182
+ };
2183
+ }
2184
+ case 'promote': {
2185
+ const id = randomUUID();
2186
+ const traceIds = [...new Set(options.traceIds)];
2187
+ const record = {
2188
+ id,
2189
+ name: options.name,
2190
+ description: options.description ?? null,
2191
+ createdAt: now,
2192
+ frozen: options.frozen ?? 1,
2193
+ traceCount: traceIds.length,
2194
+ evaluationNames: options.evaluationNames ?? [],
2195
+ dateRangeStart: null,
2196
+ dateRangeEnd: null,
2197
+ selectionCriteria: null,
2198
+ version: 1,
2199
+ parentVersion: null,
2200
+ versionCreatedAt: now,
2201
+ versionReason: 'created',
2202
+ traceSnapshot: traceIds,
2203
+ };
2204
+ await this.appendDataset(record);
2205
+ const traceRecords = traceIds.map(traceId => ({ datasetId: id, traceId, addedAt: now }));
2206
+ await this.appendDatasetTraces(traceRecords);
2207
+ return { action: 'promote', dataset: record };
2208
+ }
2209
+ case 'list_runs': {
2210
+ const allRuns = await this.readDatasetRuns();
2211
+ let runs = allRuns
2212
+ .filter(r => r.datasetId === options.datasetId)
2213
+ .sort((a, b) => b.runAt.localeCompare(a.runAt));
2214
+ if (options.cursor) {
2215
+ const decoded = decodeCursor(options.cursor);
2216
+ if (decoded?.createdAt != null) {
2217
+ const cursorAt = decoded.createdAt;
2218
+ runs = runs.filter(r => r.runAt < cursorAt);
2219
+ }
2220
+ }
2221
+ const limit = options.limit ?? DEFAULT_QUERY_RESULT_LIMIT;
2222
+ const hasMore = runs.length > limit;
2223
+ const page = runs.slice(0, limit);
2224
+ const last = page[page.length - 1];
2225
+ return {
2226
+ action: 'list_runs',
2227
+ runs: page,
2228
+ count: page.length,
2229
+ hasMore,
2230
+ ...(hasMore && last && { nextCursor: encodeCursor({ createdAt: last.runAt }) }),
2231
+ };
2232
+ }
2233
+ default:
2234
+ throw new Error(`Unknown dataset action: ${options.action}`);
2235
+ }
2236
+ }
1495
2237
  async healthCheck() {
1496
2238
  // Check circuit breaker state
1497
2239
  if (this.circuitBreaker.getState() === 'open') {
@@ -1562,7 +2304,7 @@ export class MultiDirectoryBackend {
1562
2304
  return this.directories;
1563
2305
  }
1564
2306
  async queryTraces(options) {
1565
- const limit = options.limit || 100;
2307
+ const limit = options.limit || DEFAULT_QUERY_RESULT_LIMIT;
1566
2308
  // Query all backends in parallel
1567
2309
  const allBackendResults = await Promise.all(this.backends.map(b => b.queryTraces({ ...options, limit })));
1568
2310
  // Merge results using bounded insertion for efficient top-K selection
@@ -1575,7 +2317,7 @@ export class MultiDirectoryBackend {
1575
2317
  return topResults;
1576
2318
  }
1577
2319
  async queryLogs(options) {
1578
- const limit = options.limit || 100;
2320
+ const limit = options.limit || DEFAULT_QUERY_RESULT_LIMIT;
1579
2321
  // Query all backends in parallel
1580
2322
  const allBackendResults = await Promise.all(this.backends.map(b => b.queryLogs({ ...options, limit })));
1581
2323
  // Merge results using bounded insertion for efficient top-K selection
@@ -1588,7 +2330,7 @@ export class MultiDirectoryBackend {
1588
2330
  return topResults;
1589
2331
  }
1590
2332
  async queryMetrics(options) {
1591
- const limit = options.limit || 100;
2333
+ const limit = options.limit || DEFAULT_QUERY_RESULT_LIMIT;
1592
2334
  // Query all backends in parallel
1593
2335
  const allBackendResults = await Promise.all(this.backends.map(b => b.queryMetrics({ ...options, limit })));
1594
2336
  // Flatten and limit results
@@ -1596,7 +2338,7 @@ export class MultiDirectoryBackend {
1596
2338
  return allResults.slice(0, limit);
1597
2339
  }
1598
2340
  async queryLLMEvents(options) {
1599
- const limit = options.limit || 100;
2341
+ const limit = options.limit || DEFAULT_QUERY_RESULT_LIMIT;
1600
2342
  // Query all backends in parallel
1601
2343
  const allBackendResults = await Promise.all(this.backends.map(b => b.queryLLMEvents({ ...options, limit })));
1602
2344
  // Merge results using bounded insertion for efficient top-K selection
@@ -1609,7 +2351,7 @@ export class MultiDirectoryBackend {
1609
2351
  return topResults;
1610
2352
  }
1611
2353
  async queryEvaluations(options) {
1612
- const limit = options.limit || 100;
2354
+ const limit = options.limit || DEFAULT_QUERY_RESULT_LIMIT;
1613
2355
  // Query all backends in parallel
1614
2356
  const allBackendResults = await Promise.all(this.backends.map(b => b.queryEvaluations({ ...options, limit })));
1615
2357
  // Merge results using bounded insertion for efficient top-K selection
@@ -1793,5 +2535,110 @@ export class MultiDirectoryBackend {
1793
2535
  const metrics = await this.queryMetrics(options);
1794
2536
  return convertToOTLPMetrics(metrics);
1795
2537
  }
2538
+ async manageDatasets(options) {
2539
+ if (this.backends.length === 0)
2540
+ throw new Error('No telemetry directories available');
2541
+ const READ_ACTIONS = new Set(['list', 'get', 'get_version', 'list_versions', 'list_runs']);
2542
+ // Write actions delegate to first backend
2543
+ if (!READ_ACTIONS.has(options.action)) {
2544
+ return this.backends[0].manageDatasets(options);
2545
+ }
2546
+ // Single backend — no merge needed
2547
+ if (this.backends.length === 1) {
2548
+ return this.backends[0].manageDatasets(options);
2549
+ }
2550
+ // Fan out read actions across all backends and merge
2551
+ switch (options.action) {
2552
+ case 'list': {
2553
+ const results = await Promise.all(this.backends.map(b => b.manageDatasets(options).catch(() => null)));
2554
+ const byId = new Map();
2555
+ for (const r of results) {
2556
+ if (!r || r.action !== 'list')
2557
+ continue;
2558
+ for (const d of r.datasets) {
2559
+ const existing = byId.get(d.id);
2560
+ if (!existing || (d.version ?? 0) > (existing.version ?? 0)) {
2561
+ byId.set(d.id, d);
2562
+ }
2563
+ }
2564
+ }
2565
+ const datasets = [...byId.values()];
2566
+ const limit = options.limit ?? DEFAULT_QUERY_RESULT_LIMIT;
2567
+ return {
2568
+ action: 'list',
2569
+ datasets: datasets.slice(0, limit),
2570
+ count: datasets.length,
2571
+ hasMore: datasets.length > limit,
2572
+ };
2573
+ }
2574
+ case 'get': {
2575
+ let best = null;
2576
+ for (const b of this.backends) {
2577
+ try {
2578
+ const r = await b.manageDatasets(options);
2579
+ if (r.action === 'get') {
2580
+ if (!best || best.action !== 'get' ||
2581
+ (r.dataset.version ?? 0) > (best.dataset.version ?? 0)) {
2582
+ best = r;
2583
+ }
2584
+ }
2585
+ }
2586
+ catch { /* not found in this backend */ }
2587
+ }
2588
+ if (!best)
2589
+ throw new Error(`Dataset not found: ${options.datasetId}`);
2590
+ return best;
2591
+ }
2592
+ case 'get_version': {
2593
+ for (const b of this.backends) {
2594
+ try {
2595
+ return await b.manageDatasets(options);
2596
+ }
2597
+ catch { /* not in this backend */ }
2598
+ }
2599
+ throw new Error(`Version ${options.version} not found for dataset ${options.datasetId}`);
2600
+ }
2601
+ case 'list_versions': {
2602
+ const results = await Promise.all(this.backends.map(b => b.manageDatasets(options).catch(() => null)));
2603
+ const byVersion = new Map();
2604
+ for (const r of results) {
2605
+ if (!r || r.action !== 'list_versions')
2606
+ continue;
2607
+ for (const v of r.versions) {
2608
+ if (!byVersion.has(v.version ?? 0)) {
2609
+ byVersion.set(v.version ?? 0, v);
2610
+ }
2611
+ }
2612
+ }
2613
+ const versions = [...byVersion.values()].sort((a, b) => (b.version ?? 0) - (a.version ?? 0));
2614
+ const limit = options.limit ?? DEFAULT_QUERY_RESULT_LIMIT;
2615
+ return {
2616
+ action: 'list_versions',
2617
+ versions: versions.slice(0, limit),
2618
+ count: versions.length,
2619
+ hasMore: versions.length > limit,
2620
+ };
2621
+ }
2622
+ case 'list_runs': {
2623
+ const results = await Promise.all(this.backends.map(b => b.manageDatasets(options).catch(() => null)));
2624
+ const allRuns = [];
2625
+ for (const r of results) {
2626
+ if (!r || r.action !== 'list_runs')
2627
+ continue;
2628
+ allRuns.push(...r.runs);
2629
+ }
2630
+ allRuns.sort((a, b) => b.runAt.localeCompare(a.runAt));
2631
+ const limit = options.limit ?? DEFAULT_QUERY_RESULT_LIMIT;
2632
+ return {
2633
+ action: 'list_runs',
2634
+ runs: allRuns.slice(0, limit),
2635
+ count: allRuns.length,
2636
+ hasMore: allRuns.length > limit,
2637
+ };
2638
+ }
2639
+ default:
2640
+ return this.backends[0].manageDatasets(options);
2641
+ }
2642
+ }
1796
2643
  }
1797
2644
  //# sourceMappingURL=local-jsonl.js.map