@tangle-network/agent-eval 0.93.0 → 0.95.0

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 (1087) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +44 -30
  3. package/dist/action-policy.d.ts +24 -0
  4. package/dist/action-policy.d.ts.map +1 -0
  5. package/dist/action-policy.test.d.ts +2 -0
  6. package/dist/action-policy.test.d.ts.map +1 -0
  7. package/dist/active-learning.d.ts +41 -0
  8. package/dist/active-learning.d.ts.map +1 -0
  9. package/dist/adapters/http.d.ts +15 -21
  10. package/dist/adapters/http.d.ts.map +1 -0
  11. package/dist/adapters/http.js.map +1 -1
  12. package/dist/adapters/langchain.d.ts +7 -13
  13. package/dist/adapters/langchain.d.ts.map +1 -0
  14. package/dist/adapters/otel.d.ts +13 -24
  15. package/dist/adapters/otel.d.ts.map +1 -0
  16. package/dist/agent-profile-cell.d.ts +101 -0
  17. package/dist/agent-profile-cell.d.ts.map +1 -0
  18. package/dist/agent-profile.d.ts +27 -0
  19. package/dist/agent-profile.d.ts.map +1 -0
  20. package/dist/agent-profile.test.d.ts +2 -0
  21. package/dist/agent-profile.test.d.ts.map +1 -0
  22. package/dist/analyst/adapters.d.ts +62 -0
  23. package/dist/analyst/adapters.d.ts.map +1 -0
  24. package/dist/analyst/analyst.test.d.ts +2 -0
  25. package/dist/analyst/analyst.test.d.ts.map +1 -0
  26. package/dist/analyst/ax-service.d.ts +27 -0
  27. package/dist/analyst/ax-service.d.ts.map +1 -0
  28. package/dist/analyst/behavioral-analyst.d.ts +28 -0
  29. package/dist/analyst/behavioral-analyst.d.ts.map +1 -0
  30. package/dist/analyst/chat-client.d.ts +91 -0
  31. package/dist/analyst/chat-client.d.ts.map +1 -0
  32. package/dist/analyst/default-registry.d.ts +27 -0
  33. package/dist/analyst/default-registry.d.ts.map +1 -0
  34. package/dist/analyst/default-registry.test.d.ts +2 -0
  35. package/dist/analyst/default-registry.test.d.ts.map +1 -0
  36. package/dist/analyst/finding-signature.d.ts +48 -0
  37. package/dist/analyst/finding-signature.d.ts.map +1 -0
  38. package/dist/analyst/finding-subject.d.ts +146 -0
  39. package/dist/analyst/finding-subject.d.ts.map +1 -0
  40. package/dist/analyst/finding-subject.test.d.ts +2 -0
  41. package/dist/analyst/finding-subject.test.d.ts.map +1 -0
  42. package/dist/analyst/findings-store.d.ts +75 -0
  43. package/dist/analyst/findings-store.d.ts.map +1 -0
  44. package/dist/analyst/index.d.ts +28 -256
  45. package/dist/analyst/index.d.ts.map +1 -0
  46. package/dist/analyst/index.js +6 -66
  47. package/dist/analyst/index.js.map +1 -1
  48. package/dist/{kind-factory-5b7xXXOr.d.ts → analyst/kind-factory.d.ts} +11 -63
  49. package/dist/analyst/kind-factory.d.ts.map +1 -0
  50. package/dist/analyst/kinds/failure-mode.d.ts +19 -0
  51. package/dist/analyst/kinds/failure-mode.d.ts.map +1 -0
  52. package/dist/analyst/kinds/improvement.d.ts +23 -0
  53. package/dist/analyst/kinds/improvement.d.ts.map +1 -0
  54. package/dist/analyst/kinds/index.d.ts +22 -0
  55. package/dist/analyst/kinds/index.d.ts.map +1 -0
  56. package/dist/analyst/kinds/kinds.test.d.ts +2 -0
  57. package/dist/analyst/kinds/kinds.test.d.ts.map +1 -0
  58. package/dist/analyst/kinds/knowledge-gap.d.ts +28 -0
  59. package/dist/analyst/kinds/knowledge-gap.d.ts.map +1 -0
  60. package/dist/analyst/kinds/knowledge-poisoning.d.ts +22 -0
  61. package/dist/analyst/kinds/knowledge-poisoning.d.ts.map +1 -0
  62. package/dist/analyst/kinds/skill-usage.d.ts +84 -0
  63. package/dist/analyst/kinds/skill-usage.d.ts.map +1 -0
  64. package/dist/analyst/kinds/skill-usage.test.d.ts +2 -0
  65. package/dist/analyst/kinds/skill-usage.test.d.ts.map +1 -0
  66. package/dist/analyst/parse-tolerant.d.ts +26 -0
  67. package/dist/analyst/parse-tolerant.d.ts.map +1 -0
  68. package/dist/analyst/parse-tolerant.test.d.ts +2 -0
  69. package/dist/analyst/parse-tolerant.test.d.ts.map +1 -0
  70. package/dist/analyst/registry.budget.test.d.ts +2 -0
  71. package/dist/analyst/registry.budget.test.d.ts.map +1 -0
  72. package/dist/{default-registry-zoGHUQEH.d.ts → analyst/registry.d.ts} +8 -37
  73. package/dist/analyst/registry.d.ts.map +1 -0
  74. package/dist/analyst/steer-firewall.d.ts +35 -0
  75. package/dist/analyst/steer-firewall.d.ts.map +1 -0
  76. package/dist/analyst/steer-firewall.test.d.ts +2 -0
  77. package/dist/analyst/steer-firewall.test.d.ts.map +1 -0
  78. package/dist/analyst/structure-findings.d.ts +37 -0
  79. package/dist/analyst/structure-findings.d.ts.map +1 -0
  80. package/dist/analyst/structure-findings.test.d.ts +2 -0
  81. package/dist/analyst/structure-findings.test.d.ts.map +1 -0
  82. package/dist/analyst/tool-groups.d.ts +34 -0
  83. package/dist/analyst/tool-groups.d.ts.map +1 -0
  84. package/dist/{types-2VVIL04s.d.ts → analyst/types.d.ts} +19 -112
  85. package/dist/analyst/types.d.ts.map +1 -0
  86. package/dist/anti-slop.d.ts +59 -0
  87. package/dist/anti-slop.d.ts.map +1 -0
  88. package/dist/artifact-validator.d.ts +74 -0
  89. package/dist/artifact-validator.d.ts.map +1 -0
  90. package/dist/attestation.d.ts +63 -0
  91. package/dist/attestation.d.ts.map +1 -0
  92. package/dist/attestation.test.d.ts +2 -0
  93. package/dist/attestation.test.d.ts.map +1 -0
  94. package/dist/authenticity/index.d.ts +15 -16
  95. package/dist/authenticity/index.d.ts.map +1 -0
  96. package/dist/authenticity/index.test.d.ts +2 -0
  97. package/dist/authenticity/index.test.d.ts.map +1 -0
  98. package/dist/auto-pr.d.ts +120 -0
  99. package/dist/auto-pr.d.ts.map +1 -0
  100. package/dist/{baseline-DE36-Np7.d.ts → baseline.d.ts} +8 -44
  101. package/dist/baseline.d.ts.map +1 -0
  102. package/dist/behavior-dsl.d.ts +73 -0
  103. package/dist/behavior-dsl.d.ts.map +1 -0
  104. package/dist/belief-state/calibration.d.ts +10 -0
  105. package/dist/belief-state/calibration.d.ts.map +1 -0
  106. package/dist/belief-state/calibration.test.d.ts +2 -0
  107. package/dist/belief-state/calibration.test.d.ts.map +1 -0
  108. package/dist/belief-state/code-agent-corpus.d.ts +66 -0
  109. package/dist/belief-state/code-agent-corpus.d.ts.map +1 -0
  110. package/dist/belief-state/code-agent-corpus.test.d.ts +2 -0
  111. package/dist/belief-state/code-agent-corpus.test.d.ts.map +1 -0
  112. package/dist/belief-state/code-agent-evidence.d.ts +22 -0
  113. package/dist/belief-state/code-agent-evidence.d.ts.map +1 -0
  114. package/dist/belief-state/code-agent-evidence.test.d.ts +2 -0
  115. package/dist/belief-state/code-agent-evidence.test.d.ts.map +1 -0
  116. package/dist/belief-state/extract.d.ts +7 -0
  117. package/dist/belief-state/extract.d.ts.map +1 -0
  118. package/dist/belief-state/extract.test.d.ts +2 -0
  119. package/dist/belief-state/extract.test.d.ts.map +1 -0
  120. package/dist/belief-state/index.d.ts +14 -604
  121. package/dist/belief-state/index.d.ts.map +1 -0
  122. package/dist/belief-state/index.js +1 -1
  123. package/dist/belief-state/ope.d.ts +17 -0
  124. package/dist/belief-state/ope.d.ts.map +1 -0
  125. package/dist/belief-state/ope.test.d.ts +2 -0
  126. package/dist/belief-state/ope.test.d.ts.map +1 -0
  127. package/dist/belief-state/phase0-measurement.d.ts +55 -0
  128. package/dist/belief-state/phase0-measurement.d.ts.map +1 -0
  129. package/dist/belief-state/report.d.ts +17 -0
  130. package/dist/belief-state/report.d.ts.map +1 -0
  131. package/dist/belief-state/report.test.d.ts +2 -0
  132. package/dist/belief-state/report.test.d.ts.map +1 -0
  133. package/dist/belief-state/research-evidence.d.ts +23 -0
  134. package/dist/belief-state/research-evidence.d.ts.map +1 -0
  135. package/dist/belief-state/research-evidence.test.d.ts +2 -0
  136. package/dist/belief-state/research-evidence.test.d.ts.map +1 -0
  137. package/dist/belief-state/runtime-benchmark-corpus.d.ts +32 -0
  138. package/dist/belief-state/runtime-benchmark-corpus.d.ts.map +1 -0
  139. package/dist/belief-state/runtime-hooks.d.ts +87 -0
  140. package/dist/belief-state/runtime-hooks.d.ts.map +1 -0
  141. package/dist/belief-state/runtime-hooks.test.d.ts +2 -0
  142. package/dist/belief-state/runtime-hooks.test.d.ts.map +1 -0
  143. package/dist/belief-state/selective.d.ts +15 -0
  144. package/dist/belief-state/selective.d.ts.map +1 -0
  145. package/dist/belief-state/selective.test.d.ts +2 -0
  146. package/dist/belief-state/selective.test.d.ts.map +1 -0
  147. package/dist/belief-state/shadow-probe.d.ts +80 -0
  148. package/dist/belief-state/shadow-probe.d.ts.map +1 -0
  149. package/dist/belief-state/shadow-probe.test.d.ts +2 -0
  150. package/dist/belief-state/shadow-probe.test.d.ts.map +1 -0
  151. package/dist/belief-state/types.d.ts +195 -0
  152. package/dist/belief-state/types.d.ts.map +1 -0
  153. package/dist/belief-state/types.test.d.ts +2 -0
  154. package/dist/belief-state/types.test.d.ts.map +1 -0
  155. package/dist/benchmark.d.ts +14 -0
  156. package/dist/benchmark.d.ts.map +1 -0
  157. package/dist/benchmarks/index.d.ts +23 -4
  158. package/dist/benchmarks/index.d.ts.map +1 -0
  159. package/dist/benchmarks/routing/dataset.d.ts +34 -0
  160. package/dist/benchmarks/routing/dataset.d.ts.map +1 -0
  161. package/dist/benchmarks/routing/index.d.ts +34 -0
  162. package/dist/benchmarks/routing/index.d.ts.map +1 -0
  163. package/dist/benchmarks/types.d.ts +49 -0
  164. package/dist/benchmarks/types.d.ts.map +1 -0
  165. package/dist/bisector.d.ts +81 -0
  166. package/dist/bisector.d.ts.map +1 -0
  167. package/dist/budget-guard.d.ts +31 -0
  168. package/dist/budget-guard.d.ts.map +1 -0
  169. package/dist/builder-eval/builder-session.d.ts +111 -0
  170. package/dist/builder-eval/builder-session.d.ts.map +1 -0
  171. package/dist/builder-eval/correlation.d.ts +32 -0
  172. package/dist/builder-eval/correlation.d.ts.map +1 -0
  173. package/dist/builder-eval/index.d.ts +5 -250
  174. package/dist/builder-eval/index.d.ts.map +1 -0
  175. package/dist/builder-eval/index.js +2 -2
  176. package/dist/builder-eval/project-registry.d.ts +51 -0
  177. package/dist/builder-eval/project-registry.d.ts.map +1 -0
  178. package/dist/builder-eval/three-layer-eval.d.ts +55 -0
  179. package/dist/builder-eval/three-layer-eval.d.ts.map +1 -0
  180. package/dist/campaign/analyst-surface.d.ts +108 -0
  181. package/dist/campaign/analyst-surface.d.ts.map +1 -0
  182. package/dist/campaign/analyst-surface.test.d.ts +2 -0
  183. package/dist/campaign/analyst-surface.test.d.ts.map +1 -0
  184. package/dist/campaign/auto-pr.d.ts +46 -0
  185. package/dist/campaign/auto-pr.d.ts.map +1 -0
  186. package/dist/campaign/distillation/agreement-judge.d.ts +69 -0
  187. package/dist/campaign/distillation/agreement-judge.d.ts.map +1 -0
  188. package/dist/campaign/distillation/cli.d.ts +35 -0
  189. package/dist/campaign/distillation/cli.d.ts.map +1 -0
  190. package/dist/campaign/distillation/distillation.test.d.ts +2 -0
  191. package/dist/campaign/distillation/distillation.test.d.ts.map +1 -0
  192. package/dist/campaign/distillation/gold-scenarios.d.ts +54 -0
  193. package/dist/campaign/distillation/gold-scenarios.d.ts.map +1 -0
  194. package/dist/campaign/distillation/run-distillation.d.ts +119 -0
  195. package/dist/campaign/distillation/run-distillation.d.ts.map +1 -0
  196. package/dist/campaign/gates/compose.d.ts +12 -0
  197. package/dist/campaign/gates/compose.d.ts.map +1 -0
  198. package/dist/campaign/gates/default-production-gate.d.ts +58 -0
  199. package/dist/campaign/gates/default-production-gate.d.ts.map +1 -0
  200. package/dist/campaign/gates/heldout-gate.d.ts +12 -0
  201. package/dist/campaign/gates/heldout-gate.d.ts.map +1 -0
  202. package/dist/campaign/gates/promotion-policy.d.ts +125 -0
  203. package/dist/campaign/gates/promotion-policy.d.ts.map +1 -0
  204. package/dist/campaign/gates/promotion-policy.test.d.ts +2 -0
  205. package/dist/campaign/gates/promotion-policy.test.d.ts.map +1 -0
  206. package/dist/campaign/gates/sequential.d.ts +146 -0
  207. package/dist/campaign/gates/sequential.d.ts.map +1 -0
  208. package/dist/campaign/gates/sequential.test.d.ts +2 -0
  209. package/dist/campaign/gates/sequential.test.d.ts.map +1 -0
  210. package/dist/campaign/gates/statistical-heldout.d.ts +99 -0
  211. package/dist/campaign/gates/statistical-heldout.d.ts.map +1 -0
  212. package/dist/campaign/gates/statistical-heldout.test.d.ts +2 -0
  213. package/dist/campaign/gates/statistical-heldout.test.d.ts.map +1 -0
  214. package/dist/campaign/index.d.ts +38 -1341
  215. package/dist/campaign/index.d.ts.map +1 -0
  216. package/dist/campaign/index.js +1865 -1318
  217. package/dist/campaign/index.js.map +1 -1
  218. package/dist/campaign/labeled-store/fs-adapter.d.ts +59 -0
  219. package/dist/campaign/labeled-store/fs-adapter.d.ts.map +1 -0
  220. package/dist/campaign/presets/compare-proposers.d.ts +146 -0
  221. package/dist/campaign/presets/compare-proposers.d.ts.map +1 -0
  222. package/dist/campaign/presets/playback.d.ts +120 -0
  223. package/dist/campaign/presets/playback.d.ts.map +1 -0
  224. package/dist/campaign/presets/playback.test.d.ts +2 -0
  225. package/dist/campaign/presets/playback.test.d.ts.map +1 -0
  226. package/dist/campaign/presets/run-eval.d.ts +14 -0
  227. package/dist/campaign/presets/run-eval.d.ts.map +1 -0
  228. package/dist/campaign/presets/run-improvement-loop.d.ts +63 -0
  229. package/dist/campaign/presets/run-improvement-loop.d.ts.map +1 -0
  230. package/dist/campaign/presets/run-improvement-loop.test.d.ts +2 -0
  231. package/dist/campaign/presets/run-improvement-loop.test.d.ts.map +1 -0
  232. package/dist/campaign/presets/run-optimization.d.ts +92 -0
  233. package/dist/campaign/presets/run-optimization.d.ts.map +1 -0
  234. package/dist/campaign/presets/run-profile-matrix.d.ts +151 -0
  235. package/dist/campaign/presets/run-profile-matrix.d.ts.map +1 -0
  236. package/dist/campaign/presets/run-skill-opt.d.ts +96 -0
  237. package/dist/campaign/presets/run-skill-opt.d.ts.map +1 -0
  238. package/dist/campaign/proposers/_findings-text.d.ts +22 -0
  239. package/dist/campaign/proposers/_findings-text.d.ts.map +1 -0
  240. package/dist/campaign/proposers/ace.d.ts +33 -0
  241. package/dist/campaign/proposers/ace.d.ts.map +1 -0
  242. package/dist/campaign/proposers/ace.test.d.ts +2 -0
  243. package/dist/campaign/proposers/ace.test.d.ts.map +1 -0
  244. package/dist/campaign/proposers/analysis-edit.d.ts +32 -0
  245. package/dist/campaign/proposers/analysis-edit.d.ts.map +1 -0
  246. package/dist/campaign/proposers/evolutionary.d.ts +20 -0
  247. package/dist/campaign/proposers/evolutionary.d.ts.map +1 -0
  248. package/dist/campaign/proposers/fapo.d.ts +120 -0
  249. package/dist/campaign/proposers/fapo.d.ts.map +1 -0
  250. package/dist/campaign/proposers/gepa.d.ts +86 -0
  251. package/dist/campaign/proposers/gepa.d.ts.map +1 -0
  252. package/dist/campaign/proposers/halo.d.ts +44 -0
  253. package/dist/campaign/proposers/halo.d.ts.map +1 -0
  254. package/dist/campaign/proposers/halo.test.d.ts +2 -0
  255. package/dist/campaign/proposers/halo.test.d.ts.map +1 -0
  256. package/dist/campaign/proposers/memory.d.ts +47 -0
  257. package/dist/campaign/proposers/memory.d.ts.map +1 -0
  258. package/dist/campaign/proposers/memory.test.d.ts +2 -0
  259. package/dist/campaign/proposers/memory.test.d.ts.map +1 -0
  260. package/dist/campaign/proposers/skill-opt.d.ts +88 -0
  261. package/dist/campaign/proposers/skill-opt.d.ts.map +1 -0
  262. package/dist/campaign/proposers/trace-analyst.d.ts +48 -0
  263. package/dist/campaign/proposers/trace-analyst.d.ts.map +1 -0
  264. package/dist/campaign/proposers/trace-analyst.test.d.ts +2 -0
  265. package/dist/campaign/proposers/trace-analyst.test.d.ts.map +1 -0
  266. package/dist/campaign/provenance.d.ts +185 -0
  267. package/dist/campaign/provenance.d.ts.map +1 -0
  268. package/dist/campaign/run-campaign.d.ts +90 -0
  269. package/dist/campaign/run-campaign.d.ts.map +1 -0
  270. package/dist/campaign/score-utils.d.ts +26 -0
  271. package/dist/campaign/score-utils.d.ts.map +1 -0
  272. package/dist/campaign/skill-patch.d.ts +62 -0
  273. package/dist/campaign/skill-patch.d.ts.map +1 -0
  274. package/dist/campaign/storage.d.ts +38 -0
  275. package/dist/campaign/storage.d.ts.map +1 -0
  276. package/dist/{types-BU-7W85F.d.ts → campaign/types.d.ts} +98 -99
  277. package/dist/campaign/types.d.ts.map +1 -0
  278. package/dist/campaign/worktree/index.d.ts +53 -0
  279. package/dist/campaign/worktree/index.d.ts.map +1 -0
  280. package/dist/canary.d.ts +101 -0
  281. package/dist/canary.d.ts.map +1 -0
  282. package/dist/causal-attribution.d.ts +45 -0
  283. package/dist/causal-attribution.d.ts.map +1 -0
  284. package/dist/{chunk-TWS7AZEY.js → chunk-2T4EZACH.js} +2 -2
  285. package/dist/chunk-2T4EZACH.js.map +1 -0
  286. package/dist/{chunk-LMZQ2Z4U.js → chunk-56GC6VYO.js} +126 -1
  287. package/dist/chunk-56GC6VYO.js.map +1 -0
  288. package/dist/{chunk-QG2OVF2D.js → chunk-77T4STFI.js} +154 -112
  289. package/dist/chunk-77T4STFI.js.map +1 -0
  290. package/dist/{chunk-ZFIBGEOL.js → chunk-7QTQKIDD.js} +179 -178
  291. package/dist/chunk-7QTQKIDD.js.map +1 -0
  292. package/dist/{chunk-UMMZHCPB.js → chunk-AQ5WQAIV.js} +26 -9
  293. package/dist/chunk-AQ5WQAIV.js.map +1 -0
  294. package/dist/{chunk-CVVHBFGN.js → chunk-CWNP4DV4.js} +53 -5
  295. package/dist/chunk-CWNP4DV4.js.map +1 -0
  296. package/dist/{chunk-QS3RBQPI.js → chunk-D5KBVULY.js} +2 -2
  297. package/dist/chunk-DJWX3GVS.js +81 -0
  298. package/dist/chunk-DJWX3GVS.js.map +1 -0
  299. package/dist/{chunk-S6OZEZQK.js → chunk-HMA63UEO.js} +37 -9
  300. package/dist/{chunk-S6OZEZQK.js.map → chunk-HMA63UEO.js.map} +1 -1
  301. package/dist/{chunk-UHMJT4T7.js → chunk-IZCEK2HR.js} +2 -2
  302. package/dist/{chunk-6SOJM3VR.js → chunk-KKWJD5E6.js} +21 -21
  303. package/dist/chunk-KKWJD5E6.js.map +1 -0
  304. package/dist/{chunk-KWRRMR3J.js → chunk-LO6IOIJ2.js} +10 -10
  305. package/dist/chunk-LO6IOIJ2.js.map +1 -0
  306. package/dist/{chunk-L3JOU6XM.js → chunk-NACM5RS7.js} +3 -3
  307. package/dist/{chunk-E4GH6USR.js → chunk-NZEQVRH5.js} +2 -2
  308. package/dist/chunk-NZEQVRH5.js.map +1 -0
  309. package/dist/{chunk-XY4DDNEG.js → chunk-PSWWQXHF.js} +14 -89
  310. package/dist/chunk-PSWWQXHF.js.map +1 -0
  311. package/dist/{chunk-4FBZZIYD.js → chunk-QTMYW64F.js} +2 -2
  312. package/dist/{chunk-D3V5B42D.js → chunk-S4SYLDFX.js} +7 -4
  313. package/dist/chunk-S4SYLDFX.js.map +1 -0
  314. package/dist/{chunk-47X6LRCE.js → chunk-UFSG7ACU.js} +10 -7
  315. package/dist/chunk-UFSG7ACU.js.map +1 -0
  316. package/dist/{chunk-CY6U5S3X.js → chunk-URWVKRCS.js} +2 -2
  317. package/dist/{chunk-GSH6QNNS.js → chunk-X74V6ESX.js} +102 -79
  318. package/dist/chunk-X74V6ESX.js.map +1 -0
  319. package/dist/{chunk-QAY5UIJO.js → chunk-YBIGNSCZ.js} +178 -59
  320. package/dist/chunk-YBIGNSCZ.js.map +1 -0
  321. package/dist/{chunk-Y47J2LJ3.js → chunk-Z6L6YSU6.js} +5 -5
  322. package/dist/{chunk-T375SUOZ.js → chunk-ZOPLCJSY.js} +86 -31
  323. package/dist/chunk-ZOPLCJSY.js.map +1 -0
  324. package/dist/ci-gate.d.ts +44 -0
  325. package/dist/ci-gate.d.ts.map +1 -0
  326. package/dist/cli.d.ts +2 -0
  327. package/dist/cli.d.ts.map +1 -0
  328. package/dist/cli.js +2 -2
  329. package/dist/client.d.ts +77 -0
  330. package/dist/client.d.ts.map +1 -0
  331. package/dist/client.test.d.ts +2 -0
  332. package/dist/client.test.d.ts.map +1 -0
  333. package/dist/command-runner.d.ts +74 -0
  334. package/dist/command-runner.d.ts.map +1 -0
  335. package/dist/command-runner.test.d.ts +2 -0
  336. package/dist/command-runner.test.d.ts.map +1 -0
  337. package/dist/completion-verifier.d.ts +147 -0
  338. package/dist/completion-verifier.d.ts.map +1 -0
  339. package/dist/completion-verifier.test.d.ts +9 -0
  340. package/dist/completion-verifier.test.d.ts.map +1 -0
  341. package/dist/concurrency.d.ts +23 -0
  342. package/dist/concurrency.d.ts.map +1 -0
  343. package/dist/contamination-guard.d.ts +81 -0
  344. package/dist/contamination-guard.d.ts.map +1 -0
  345. package/dist/{analyze-runs-DwCEkpO_.d.ts → contract/analyze-runs.d.ts} +9 -10
  346. package/dist/contract/analyze-runs.d.ts.map +1 -0
  347. package/dist/contract/define-agent-eval.d.ts +52 -0
  348. package/dist/contract/define-agent-eval.d.ts.map +1 -0
  349. package/dist/contract/diff.d.ts +114 -0
  350. package/dist/contract/diff.d.ts.map +1 -0
  351. package/dist/contract/index.d.ts +106 -640
  352. package/dist/contract/index.d.ts.map +1 -0
  353. package/dist/contract/index.js +131 -21
  354. package/dist/contract/index.js.map +1 -1
  355. package/dist/{insight-report-BBwvOh6x.d.ts → contract/insight-report.d.ts} +16 -19
  356. package/dist/contract/insight-report.d.ts.map +1 -0
  357. package/dist/contract/insight-types-fwd.d.ts +7 -0
  358. package/dist/contract/insight-types-fwd.d.ts.map +1 -0
  359. package/dist/contract/intake/agent-trace.d.ts +97 -0
  360. package/dist/contract/intake/agent-trace.d.ts.map +1 -0
  361. package/dist/{code-agent-session-BO8nCnv3.d.ts → contract/intake/code-agent-session.d.ts} +15 -17
  362. package/dist/contract/intake/code-agent-session.d.ts.map +1 -0
  363. package/dist/contract/intake/feedback-table.d.ts +87 -0
  364. package/dist/contract/intake/feedback-table.d.ts.map +1 -0
  365. package/dist/contract/intake/index.d.ts +22 -0
  366. package/dist/contract/intake/index.d.ts.map +1 -0
  367. package/dist/contract/intake/otel-spans.d.ts +33 -0
  368. package/dist/contract/intake/otel-spans.d.ts.map +1 -0
  369. package/dist/contract/self-improve.d.ts +284 -0
  370. package/dist/contract/self-improve.d.ts.map +1 -0
  371. package/dist/{control-runtime-DuFBYg7A.d.ts → control-runtime.d.ts} +23 -26
  372. package/dist/control-runtime.d.ts.map +1 -0
  373. package/dist/control-runtime.test.d.ts +2 -0
  374. package/dist/control-runtime.test.d.ts.map +1 -0
  375. package/dist/control.d.ts +11 -9
  376. package/dist/control.d.ts.map +1 -0
  377. package/dist/control.js +2 -2
  378. package/dist/convergence.d.ts +29 -0
  379. package/dist/convergence.d.ts.map +1 -0
  380. package/dist/{cost-ledger-DuSqlw5B.d.ts → cost-ledger.d.ts} +10 -11
  381. package/dist/cost-ledger.d.ts.map +1 -0
  382. package/dist/cost-ledger.test.d.ts +2 -0
  383. package/dist/cost-ledger.test.d.ts.map +1 -0
  384. package/dist/cost-report.d.ts +43 -0
  385. package/dist/cost-report.d.ts.map +1 -0
  386. package/dist/cost-report.test.d.ts +2 -0
  387. package/dist/cost-report.test.d.ts.map +1 -0
  388. package/dist/cost-tracker.d.ts +76 -0
  389. package/dist/cost-tracker.d.ts.map +1 -0
  390. package/dist/{counterfactual-Dwibr5IW.d.ts → counterfactual.d.ts} +12 -13
  391. package/dist/counterfactual.d.ts.map +1 -0
  392. package/dist/cross-trace-diff.d.ts +56 -0
  393. package/dist/cross-trace-diff.d.ts.map +1 -0
  394. package/dist/{dataset-BbGkaN2I.d.ts → dataset.d.ts} +11 -14
  395. package/dist/dataset.d.ts.map +1 -0
  396. package/dist/deploy-gate-layer.d.ts +125 -0
  397. package/dist/deploy-gate-layer.d.ts.map +1 -0
  398. package/dist/deploy-gate-layer.test.d.ts +2 -0
  399. package/dist/deploy-gate-layer.test.d.ts.map +1 -0
  400. package/dist/description-length-gate.d.ts +119 -0
  401. package/dist/description-length-gate.d.ts.map +1 -0
  402. package/dist/detectors/edge.test.d.ts +2 -0
  403. package/dist/detectors/edge.test.d.ts.map +1 -0
  404. package/dist/detectors/index.d.ts +81 -0
  405. package/dist/detectors/index.d.ts.map +1 -0
  406. package/dist/detectors/index.test.d.ts +2 -0
  407. package/dist/detectors/index.test.d.ts.map +1 -0
  408. package/dist/diagnose/causal-sweep.d.ts +100 -0
  409. package/dist/diagnose/causal-sweep.d.ts.map +1 -0
  410. package/dist/diagnose/index.d.ts +36 -0
  411. package/dist/diagnose/index.d.ts.map +1 -0
  412. package/dist/diagnose/remediation.d.ts +68 -0
  413. package/dist/diagnose/remediation.d.ts.map +1 -0
  414. package/dist/diagnose/repair.d.ts +77 -0
  415. package/dist/diagnose/repair.d.ts.map +1 -0
  416. package/dist/diagnose.d.ts +1 -251
  417. package/dist/diagnose.js +2 -2
  418. package/dist/discover-personas.d.ts +35 -0
  419. package/dist/discover-personas.d.ts.map +1 -0
  420. package/dist/driver.d.ts +95 -0
  421. package/dist/driver.d.ts.map +1 -0
  422. package/dist/driver.test.d.ts +8 -0
  423. package/dist/driver.test.d.ts.map +1 -0
  424. package/dist/dual-agent-bench.d.ts +81 -0
  425. package/dist/dual-agent-bench.d.ts.map +1 -0
  426. package/dist/error-count-extractor.d.ts +47 -0
  427. package/dist/error-count-extractor.d.ts.map +1 -0
  428. package/dist/error-count-extractor.test.d.ts +2 -0
  429. package/dist/error-count-extractor.test.d.ts.map +1 -0
  430. package/dist/{errors-CzMUYo7b.d.ts → errors.d.ts} +10 -11
  431. package/dist/errors.d.ts.map +1 -0
  432. package/dist/{researcher-DE6Gpnb4.d.ts → eval-campaign.d.ts} +34 -156
  433. package/dist/eval-campaign.d.ts.map +1 -0
  434. package/dist/eval-campaign.test.d.ts +2 -0
  435. package/dist/eval-campaign.test.d.ts.map +1 -0
  436. package/dist/eval-tools.d.ts +55 -0
  437. package/dist/eval-tools.d.ts.map +1 -0
  438. package/dist/eval-trace-store.d.ts +107 -0
  439. package/dist/eval-trace-store.d.ts.map +1 -0
  440. package/dist/eval-trace-store.test.d.ts +2 -0
  441. package/dist/eval-trace-store.test.d.ts.map +1 -0
  442. package/dist/executor.d.ts +38 -0
  443. package/dist/executor.d.ts.map +1 -0
  444. package/dist/executor.test.d.ts +10 -0
  445. package/dist/executor.test.d.ts.map +1 -0
  446. package/dist/experiment-tracker.d.ts +178 -0
  447. package/dist/experiment-tracker.d.ts.map +1 -0
  448. package/dist/experiment-tracker.test.d.ts +2 -0
  449. package/dist/experiment-tracker.test.d.ts.map +1 -0
  450. package/dist/failure-taxonomy.d.ts +38 -0
  451. package/dist/failure-taxonomy.d.ts.map +1 -0
  452. package/dist/{feedback-trajectory-D9OVLrg9.d.ts → feedback-trajectory.d.ts} +36 -38
  453. package/dist/feedback-trajectory.d.ts.map +1 -0
  454. package/dist/feedback-trajectory.test.d.ts +2 -0
  455. package/dist/feedback-trajectory.test.d.ts.map +1 -0
  456. package/dist/flow-layer.d.ts +90 -0
  457. package/dist/flow-layer.d.ts.map +1 -0
  458. package/dist/flow-layer.test.d.ts +2 -0
  459. package/dist/flow-layer.test.d.ts.map +1 -0
  460. package/dist/fuzz/capsule.d.ts +46 -0
  461. package/dist/fuzz/capsule.d.ts.map +1 -0
  462. package/dist/fuzz/cube.d.ts +36 -0
  463. package/dist/fuzz/cube.d.ts.map +1 -0
  464. package/dist/fuzz/explorer-cost.test.d.ts +2 -0
  465. package/dist/fuzz/explorer-cost.test.d.ts.map +1 -0
  466. package/dist/fuzz/explorer.d.ts +64 -0
  467. package/dist/fuzz/explorer.d.ts.map +1 -0
  468. package/dist/fuzz/fuzz-agent.d.ts +16 -0
  469. package/dist/fuzz/fuzz-agent.d.ts.map +1 -0
  470. package/dist/fuzz/fuzz-agent.test.d.ts +2 -0
  471. package/dist/fuzz/fuzz-agent.test.d.ts.map +1 -0
  472. package/dist/fuzz/gates.d.ts +33 -0
  473. package/dist/fuzz/gates.d.ts.map +1 -0
  474. package/dist/fuzz/index.d.ts +26 -0
  475. package/dist/fuzz/index.d.ts.map +1 -0
  476. package/dist/fuzz/policies.d.ts +28 -0
  477. package/dist/fuzz/policies.d.ts.map +1 -0
  478. package/dist/fuzz/tools.d.ts +20 -0
  479. package/dist/fuzz/tools.d.ts.map +1 -0
  480. package/dist/fuzz/types.d.ts +307 -0
  481. package/dist/fuzz/types.d.ts.map +1 -0
  482. package/dist/fuzz.d.ts +1 -547
  483. package/dist/golden-matcher.d.ts +71 -0
  484. package/dist/golden-matcher.d.ts.map +1 -0
  485. package/dist/governance/eu-ai-act.d.ts +37 -0
  486. package/dist/governance/eu-ai-act.d.ts.map +1 -0
  487. package/dist/governance/index.d.ts +5 -135
  488. package/dist/governance/index.d.ts.map +1 -0
  489. package/dist/governance/nist-ai-rmf.d.ts +15 -0
  490. package/dist/governance/nist-ai-rmf.d.ts.map +1 -0
  491. package/dist/governance/soc2.d.ts +12 -0
  492. package/dist/governance/soc2.d.ts.map +1 -0
  493. package/dist/governance/types.d.ts +66 -0
  494. package/dist/governance/types.d.ts.map +1 -0
  495. package/dist/harness-optimizer.d.ts +82 -0
  496. package/dist/harness-optimizer.d.ts.map +1 -0
  497. package/dist/held-out-gate.d.ts +135 -0
  498. package/dist/held-out-gate.d.ts.map +1 -0
  499. package/dist/hosted/client.d.ts +73 -0
  500. package/dist/hosted/client.d.ts.map +1 -0
  501. package/dist/hosted/from-env.test.d.ts +8 -0
  502. package/dist/hosted/from-env.test.d.ts.map +1 -0
  503. package/dist/hosted/index.d.ts +10 -238
  504. package/dist/hosted/index.d.ts.map +1 -0
  505. package/dist/hosted/types.d.ts +159 -0
  506. package/dist/hosted/types.d.ts.map +1 -0
  507. package/dist/index.d.ts +277 -5643
  508. package/dist/index.d.ts.map +1 -0
  509. package/dist/index.js +317 -108
  510. package/dist/index.js.map +1 -1
  511. package/dist/integrity/backend-integrity.d.ts +71 -0
  512. package/dist/integrity/backend-integrity.d.ts.map +1 -0
  513. package/dist/integrity/preflight.d.ts +72 -0
  514. package/dist/integrity/preflight.d.ts.map +1 -0
  515. package/dist/integrity/preflight.test.d.ts +2 -0
  516. package/dist/integrity/preflight.test.d.ts.map +1 -0
  517. package/dist/integrity/single-backend.d.ts +67 -0
  518. package/dist/integrity/single-backend.d.ts.map +1 -0
  519. package/dist/intent-match-judge.d.ts +69 -0
  520. package/dist/intent-match-judge.d.ts.map +1 -0
  521. package/dist/intent-match-judge.test.d.ts +2 -0
  522. package/dist/intent-match-judge.test.d.ts.map +1 -0
  523. package/dist/{judge-calibration-0p2QcWNE.d.ts → judge-calibration.d.ts} +16 -17
  524. package/dist/judge-calibration.d.ts.map +1 -0
  525. package/dist/judge-ensemble.d.ts +66 -0
  526. package/dist/judge-ensemble.d.ts.map +1 -0
  527. package/dist/judge-ensemble.test.d.ts +8 -0
  528. package/dist/judge-ensemble.test.d.ts.map +1 -0
  529. package/dist/judge-families.d.ts +38 -0
  530. package/dist/judge-families.d.ts.map +1 -0
  531. package/dist/judge-panel.d.ts +65 -0
  532. package/dist/judge-panel.d.ts.map +1 -0
  533. package/dist/judge-retry.d.ts +70 -0
  534. package/dist/judge-retry.d.ts.map +1 -0
  535. package/dist/judge-runner.d.ts +36 -0
  536. package/dist/judge-runner.d.ts.map +1 -0
  537. package/dist/judge-runner.test.d.ts +2 -0
  538. package/dist/judge-runner.test.d.ts.map +1 -0
  539. package/dist/judges.d.ts +74 -0
  540. package/dist/judges.d.ts.map +1 -0
  541. package/dist/keyword-coverage-judge.d.ts +89 -0
  542. package/dist/keyword-coverage-judge.d.ts.map +1 -0
  543. package/dist/keyword-coverage-judge.test.d.ts +2 -0
  544. package/dist/keyword-coverage-judge.test.d.ts.map +1 -0
  545. package/dist/knowledge/index.d.ts +3 -103
  546. package/dist/knowledge/index.d.ts.map +1 -0
  547. package/dist/knowledge/readiness.d.ts +26 -0
  548. package/dist/knowledge/readiness.d.ts.map +1 -0
  549. package/dist/knowledge/types.d.ts +75 -0
  550. package/dist/knowledge/types.d.ts.map +1 -0
  551. package/dist/live-proof.d.ts +62 -0
  552. package/dist/live-proof.d.ts.map +1 -0
  553. package/dist/{llm-client-BeEcAokY.d.ts → llm-client.d.ts} +52 -23
  554. package/dist/llm-client.d.ts.map +1 -0
  555. package/dist/llm-client.test.d.ts +2 -0
  556. package/dist/llm-client.test.d.ts.map +1 -0
  557. package/dist/locked-jsonl-appender.d.ts +19 -0
  558. package/dist/locked-jsonl-appender.d.ts.map +1 -0
  559. package/dist/matrix/aggregation.d.ts +16 -0
  560. package/dist/matrix/aggregation.d.ts.map +1 -0
  561. package/dist/matrix/index.d.ts +12 -30
  562. package/dist/matrix/index.d.ts.map +1 -0
  563. package/dist/matrix/runner.d.ts +15 -0
  564. package/dist/matrix/runner.d.ts.map +1 -0
  565. package/dist/{types-mn5Aqk7x.d.ts → matrix/types.d.ts} +11 -15
  566. package/dist/matrix/types.d.ts.map +1 -0
  567. package/dist/meta-eval/calibration.d.ts +47 -0
  568. package/dist/meta-eval/calibration.d.ts.map +1 -0
  569. package/dist/meta-eval/correlation-study.d.ts +53 -0
  570. package/dist/meta-eval/correlation-study.d.ts.map +1 -0
  571. package/dist/meta-eval/index.d.ts +6 -181
  572. package/dist/meta-eval/index.d.ts.map +1 -0
  573. package/dist/meta-eval/index.js +1 -1
  574. package/dist/{outcome-store-rnXLEqSn.d.ts → meta-eval/outcome-store.d.ts} +7 -8
  575. package/dist/meta-eval/outcome-store.d.ts.map +1 -0
  576. package/dist/{rubric-predictive-validity-Cy_W-hWZ.d.ts → meta-eval/rubric-predictive-validity.d.ts} +8 -11
  577. package/dist/meta-eval/rubric-predictive-validity.d.ts.map +1 -0
  578. package/dist/meta-eval/sentinel.d.ts +169 -0
  579. package/dist/meta-eval/sentinel.d.ts.map +1 -0
  580. package/dist/metrics.d.ts +63 -0
  581. package/dist/metrics.d.ts.map +1 -0
  582. package/dist/model-seats.d.ts +71 -0
  583. package/dist/model-seats.d.ts.map +1 -0
  584. package/dist/model-seats.test.d.ts +2 -0
  585. package/dist/model-seats.test.d.ts.map +1 -0
  586. package/dist/muffled-gate-scanner.d.ts +102 -0
  587. package/dist/muffled-gate-scanner.d.ts.map +1 -0
  588. package/dist/{multi-layer-verifier-DUZXrPDA.d.ts → multi-layer-verifier.d.ts} +12 -15
  589. package/dist/multi-layer-verifier.d.ts.map +1 -0
  590. package/dist/multi-layer-verifier.test.d.ts +2 -0
  591. package/dist/multi-layer-verifier.test.d.ts.map +1 -0
  592. package/dist/multi-toolchain-layer.d.ts +80 -0
  593. package/dist/multi-toolchain-layer.d.ts.map +1 -0
  594. package/dist/multi-toolchain-layer.test.d.ts +2 -0
  595. package/dist/multi-toolchain-layer.test.d.ts.map +1 -0
  596. package/dist/multishot/default-tools.d.ts +34 -0
  597. package/dist/multishot/default-tools.d.ts.map +1 -0
  598. package/dist/multishot/index.d.ts +7 -290
  599. package/dist/multishot/index.d.ts.map +1 -0
  600. package/dist/multishot/index.js.map +1 -1
  601. package/dist/multishot/judges.d.ts +32 -0
  602. package/dist/multishot/judges.d.ts.map +1 -0
  603. package/dist/multishot/matrix.d.ts +107 -0
  604. package/dist/multishot/matrix.d.ts.map +1 -0
  605. package/dist/multishot/multishot.d.ts +23 -0
  606. package/dist/multishot/multishot.d.ts.map +1 -0
  607. package/dist/multishot/router.d.ts +37 -0
  608. package/dist/multishot/router.d.ts.map +1 -0
  609. package/dist/multishot/types.d.ts +60 -0
  610. package/dist/multishot/types.d.ts.map +1 -0
  611. package/dist/observability.d.ts +71 -0
  612. package/dist/observability.d.ts.map +1 -0
  613. package/dist/openapi.json +1 -1
  614. package/dist/oracle.d.ts +55 -0
  615. package/dist/oracle.d.ts.map +1 -0
  616. package/dist/orthogonality.d.ts +35 -0
  617. package/dist/orthogonality.d.ts.map +1 -0
  618. package/dist/otel-pipeline.d.ts +31 -0
  619. package/dist/otel-pipeline.d.ts.map +1 -0
  620. package/dist/paraphrase.d.ts +107 -0
  621. package/dist/paraphrase.d.ts.map +1 -0
  622. package/dist/{pareto-E-pembql.d.ts → pareto.d.ts} +9 -10
  623. package/dist/pareto.d.ts.map +1 -0
  624. package/dist/partition-held-out.d.ts +70 -0
  625. package/dist/partition-held-out.d.ts.map +1 -0
  626. package/dist/partition-held-out.test.d.ts +2 -0
  627. package/dist/partition-held-out.test.d.ts.map +1 -0
  628. package/dist/perf/index.d.ts +13 -119
  629. package/dist/perf/index.d.ts.map +1 -0
  630. package/dist/perf/integrity.d.ts +30 -0
  631. package/dist/perf/integrity.d.ts.map +1 -0
  632. package/dist/perf/journey.d.ts +45 -0
  633. package/dist/perf/journey.d.ts.map +1 -0
  634. package/dist/perf/ratchet.d.ts +47 -0
  635. package/dist/perf/ratchet.d.ts.map +1 -0
  636. package/dist/pipelines/budget-breach.d.ts +31 -0
  637. package/dist/pipelines/budget-breach.d.ts.map +1 -0
  638. package/dist/pipelines/budget-breach.test.d.ts +2 -0
  639. package/dist/pipelines/budget-breach.test.d.ts.map +1 -0
  640. package/dist/pipelines/failure-cluster.d.ts +38 -0
  641. package/dist/pipelines/failure-cluster.d.ts.map +1 -0
  642. package/dist/pipelines/failure-cluster.test.d.ts +2 -0
  643. package/dist/pipelines/failure-cluster.test.d.ts.map +1 -0
  644. package/dist/pipelines/first-divergence.d.ts +26 -0
  645. package/dist/pipelines/first-divergence.d.ts.map +1 -0
  646. package/dist/pipelines/first-divergence.test.d.ts +2 -0
  647. package/dist/pipelines/first-divergence.test.d.ts.map +1 -0
  648. package/dist/pipelines/index.d.ts +8 -173
  649. package/dist/pipelines/index.d.ts.map +1 -0
  650. package/dist/pipelines/index.js +40 -15
  651. package/dist/pipelines/index.js.map +1 -1
  652. package/dist/pipelines/judge-agreement.d.ts +26 -0
  653. package/dist/pipelines/judge-agreement.d.ts.map +1 -0
  654. package/dist/pipelines/judge-agreement.test.d.ts +2 -0
  655. package/dist/pipelines/judge-agreement.test.d.ts.map +1 -0
  656. package/dist/pipelines/regression.d.ts +23 -0
  657. package/dist/pipelines/regression.d.ts.map +1 -0
  658. package/dist/pipelines/regression.test.d.ts +2 -0
  659. package/dist/pipelines/regression.test.d.ts.map +1 -0
  660. package/dist/pipelines/stuck-loop.d.ts +32 -0
  661. package/dist/pipelines/stuck-loop.d.ts.map +1 -0
  662. package/dist/pipelines/stuck-loop.test.d.ts +2 -0
  663. package/dist/pipelines/stuck-loop.test.d.ts.map +1 -0
  664. package/dist/pipelines/tool-waste.d.ts +34 -0
  665. package/dist/pipelines/tool-waste.d.ts.map +1 -0
  666. package/dist/pipelines/tool-waste.test.d.ts +2 -0
  667. package/dist/pipelines/tool-waste.test.d.ts.map +1 -0
  668. package/dist/playbook.d.ts +16 -0
  669. package/dist/playbook.d.ts.map +1 -0
  670. package/dist/pr-review-benchmark.d.ts +88 -0
  671. package/dist/pr-review-benchmark.d.ts.map +1 -0
  672. package/dist/pr-review-benchmark.test.d.ts +2 -0
  673. package/dist/pr-review-benchmark.test.d.ts.map +1 -0
  674. package/dist/pre-registration.d.ts +125 -0
  675. package/dist/pre-registration.d.ts.map +1 -0
  676. package/dist/prm/builtin-rubrics.d.ts +33 -0
  677. package/dist/prm/builtin-rubrics.d.ts.map +1 -0
  678. package/dist/prm/index.d.ts +5 -100
  679. package/dist/prm/index.d.ts.map +1 -0
  680. package/dist/prm/index.js +55 -12
  681. package/dist/prm/index.js.map +1 -1
  682. package/dist/prm/inference.d.ts +29 -0
  683. package/dist/prm/inference.d.ts.map +1 -0
  684. package/dist/prm/inference.test.d.ts +2 -0
  685. package/dist/prm/inference.test.d.ts.map +1 -0
  686. package/dist/{rubric-BOfxn4ja.d.ts → prm/rubric.d.ts} +10 -13
  687. package/dist/prm/rubric.d.ts.map +1 -0
  688. package/dist/prm/training-export.d.ts +38 -0
  689. package/dist/prm/training-export.d.ts.map +1 -0
  690. package/dist/produced-state.d.ts +63 -0
  691. package/dist/produced-state.d.ts.map +1 -0
  692. package/dist/produced-state.test.d.ts +8 -0
  693. package/dist/produced-state.test.d.ts.map +1 -0
  694. package/dist/profile/baselines.d.ts +37 -0
  695. package/dist/profile/baselines.d.ts.map +1 -0
  696. package/dist/profile/index.d.ts +105 -0
  697. package/dist/profile/index.d.ts.map +1 -0
  698. package/dist/promotion-gate.d.ts +93 -0
  699. package/dist/promotion-gate.d.ts.map +1 -0
  700. package/dist/prompt-registry.d.ts +41 -0
  701. package/dist/prompt-registry.d.ts.map +1 -0
  702. package/dist/propose-review-control.d.ts +49 -0
  703. package/dist/propose-review-control.d.ts.map +1 -0
  704. package/dist/propose-review-control.test.d.ts +2 -0
  705. package/dist/propose-review-control.test.d.ts.map +1 -0
  706. package/dist/propose-review.d.ts +155 -0
  707. package/dist/propose-review.d.ts.map +1 -0
  708. package/dist/{red-team-BXHil6c8.d.ts → red-team.d.ts} +14 -16
  709. package/dist/red-team.d.ts.map +1 -0
  710. package/dist/reference-replay-steering.d.ts +11 -0
  711. package/dist/reference-replay-steering.d.ts.map +1 -0
  712. package/dist/reference-replay.d.ts +176 -0
  713. package/dist/reference-replay.d.ts.map +1 -0
  714. package/dist/reflective-mutation.d.ts +79 -0
  715. package/dist/reflective-mutation.d.ts.map +1 -0
  716. package/dist/registry.d.ts +31 -0
  717. package/dist/registry.d.ts.map +1 -0
  718. package/dist/release-confidence.d.ts +128 -0
  719. package/dist/release-confidence.d.ts.map +1 -0
  720. package/dist/release-report.d.ts +11 -0
  721. package/dist/release-report.d.ts.map +1 -0
  722. package/dist/replay.d.ts +120 -0
  723. package/dist/replay.d.ts.map +1 -0
  724. package/dist/reporter.d.ts +14 -0
  725. package/dist/reporter.d.ts.map +1 -0
  726. package/dist/reporting.d.ts +15 -15
  727. package/dist/reporting.d.ts.map +1 -0
  728. package/dist/reporting.js +3 -3
  729. package/dist/researcher.d.ts +140 -0
  730. package/dist/researcher.d.ts.map +1 -0
  731. package/dist/reviewer.d.ts +118 -0
  732. package/dist/reviewer.d.ts.map +1 -0
  733. package/dist/reviewer.test.d.ts +2 -0
  734. package/dist/reviewer.test.d.ts.map +1 -0
  735. package/dist/reward-model-export.d.ts +60 -0
  736. package/dist/reward-model-export.d.ts.map +1 -0
  737. package/dist/rl/active-curriculum.d.ts +110 -0
  738. package/dist/rl/active-curriculum.d.ts.map +1 -0
  739. package/dist/rl/adaptation-eval.d.ts +109 -0
  740. package/dist/rl/adaptation-eval.d.ts.map +1 -0
  741. package/dist/{adversarial-DIVcDoI_.d.ts → rl/adversarial.d.ts} +6 -7
  742. package/dist/rl/adversarial.d.ts.map +1 -0
  743. package/dist/rl/compute-curves.d.ts +127 -0
  744. package/dist/rl/compute-curves.d.ts.map +1 -0
  745. package/dist/rl/contamination.d.ts +117 -0
  746. package/dist/rl/contamination.d.ts.map +1 -0
  747. package/dist/rl/corpus.d.ts +55 -0
  748. package/dist/rl/corpus.d.ts.map +1 -0
  749. package/dist/rl/corpus.test.d.ts +2 -0
  750. package/dist/rl/corpus.test.d.ts.map +1 -0
  751. package/dist/rl/dataset.d.ts +102 -0
  752. package/dist/rl/dataset.d.ts.map +1 -0
  753. package/dist/rl/dataset.test.d.ts +2 -0
  754. package/dist/rl/dataset.test.d.ts.map +1 -0
  755. package/dist/rl/exporters.d.ts +141 -0
  756. package/dist/rl/exporters.d.ts.map +1 -0
  757. package/dist/rl/index.d.ts +49 -0
  758. package/dist/rl/index.d.ts.map +1 -0
  759. package/dist/{off-policy-DiwuKKg7.d.ts → rl/off-policy.d.ts} +8 -9
  760. package/dist/rl/off-policy.d.ts.map +1 -0
  761. package/dist/rl/predictive-validity-researcher.d.ts +69 -0
  762. package/dist/rl/predictive-validity-researcher.d.ts.map +1 -0
  763. package/dist/rl/preferences.d.ts +141 -0
  764. package/dist/rl/preferences.d.ts.map +1 -0
  765. package/dist/rl/process-reward.d.ts +122 -0
  766. package/dist/rl/process-reward.d.ts.map +1 -0
  767. package/dist/rl/reward-hacking.d.ts +104 -0
  768. package/dist/rl/reward-hacking.d.ts.map +1 -0
  769. package/dist/rl/rl-campaign.d.ts +85 -0
  770. package/dist/rl/rl-campaign.d.ts.map +1 -0
  771. package/dist/rl/run-record-adapters.d.ts +56 -0
  772. package/dist/rl/run-record-adapters.d.ts.map +1 -0
  773. package/dist/rl/sim-fidelity.d.ts +166 -0
  774. package/dist/rl/sim-fidelity.d.ts.map +1 -0
  775. package/dist/rl/sim-fidelity.test.d.ts +2 -0
  776. package/dist/rl/sim-fidelity.test.d.ts.map +1 -0
  777. package/dist/rl/tournament.d.ts +115 -0
  778. package/dist/rl/tournament.d.ts.map +1 -0
  779. package/dist/rl/verifiable-reward.d.ts +124 -0
  780. package/dist/rl/verifiable-reward.d.ts.map +1 -0
  781. package/dist/rl.d.ts +1 -1192
  782. package/dist/rl.js +615 -615
  783. package/dist/rl.js.map +1 -1
  784. package/dist/{run-campaign-RDGAM5KJ.js → run-campaign-WXY7KI67.js} +3 -3
  785. package/dist/run-critic.d.ts +23 -0
  786. package/dist/run-critic.d.ts.map +1 -0
  787. package/dist/run-evidence.d.ts +32 -0
  788. package/dist/run-evidence.d.ts.map +1 -0
  789. package/dist/{run-record-e7vj1uZQ.d.ts → run-record.d.ts} +16 -122
  790. package/dist/run-record.d.ts.map +1 -0
  791. package/dist/run-record.test.d.ts +2 -0
  792. package/dist/run-record.test.d.ts.map +1 -0
  793. package/dist/run-score.d.ts +31 -0
  794. package/dist/run-score.d.ts.map +1 -0
  795. package/dist/runtime-trajectory.d.ts +47 -0
  796. package/dist/runtime-trajectory.d.ts.map +1 -0
  797. package/dist/{test-graded-scenario-BdVaPyHT.d.ts → sandbox-harness.d.ts} +34 -60
  798. package/dist/sandbox-harness.d.ts.map +1 -0
  799. package/dist/sandbox-harness.test.d.ts +2 -0
  800. package/dist/sandbox-harness.test.d.ts.map +1 -0
  801. package/dist/sandbox-pool.d.ts +74 -0
  802. package/dist/sandbox-pool.d.ts.map +1 -0
  803. package/dist/sandbox-pool.test.d.ts +2 -0
  804. package/dist/sandbox-pool.test.d.ts.map +1 -0
  805. package/dist/scorecard.d.ts +133 -0
  806. package/dist/scorecard.d.ts.map +1 -0
  807. package/dist/scorecard.test.d.ts +2 -0
  808. package/dist/scorecard.test.d.ts.map +1 -0
  809. package/dist/self-play.d.ts +69 -0
  810. package/dist/self-play.d.ts.map +1 -0
  811. package/dist/semantic-concept-judge.d.ts +135 -0
  812. package/dist/semantic-concept-judge.d.ts.map +1 -0
  813. package/dist/semantic-concept-judge.test.d.ts +2 -0
  814. package/dist/semantic-concept-judge.test.d.ts.map +1 -0
  815. package/dist/{sequential-5iSVfzl2.d.ts → sequential.d.ts} +9 -10
  816. package/dist/sequential.d.ts.map +1 -0
  817. package/dist/{series-convergence-D5OWMBg6.d.ts → series-convergence.d.ts} +4 -5
  818. package/dist/series-convergence.d.ts.map +1 -0
  819. package/dist/slo.d.ts +48 -0
  820. package/dist/slo.d.ts.map +1 -0
  821. package/dist/state-continuity.d.ts +47 -0
  822. package/dist/state-continuity.d.ts.map +1 -0
  823. package/dist/{statistics-C7PozGrZ.d.ts → statistics.d.ts} +152 -39
  824. package/dist/statistics.d.ts.map +1 -0
  825. package/dist/statistics.test.d.ts +2 -0
  826. package/dist/statistics.test.d.ts.map +1 -0
  827. package/dist/steering-optimizer.d.ts +58 -0
  828. package/dist/steering-optimizer.d.ts.map +1 -0
  829. package/dist/steering.d.ts +24 -0
  830. package/dist/steering.d.ts.map +1 -0
  831. package/dist/storyboard/code-edit.d.ts +64 -0
  832. package/dist/storyboard/code-edit.d.ts.map +1 -0
  833. package/dist/storyboard/code-edit.test.d.ts +2 -0
  834. package/dist/storyboard/code-edit.test.d.ts.map +1 -0
  835. package/dist/storyboard/index.d.ts +16 -81
  836. package/dist/storyboard/index.d.ts.map +1 -0
  837. package/dist/storyboard/index.test.d.ts +2 -0
  838. package/dist/storyboard/index.test.d.ts.map +1 -0
  839. package/dist/{summary-report-DGmUucwQ.d.ts → summary-report.d.ts} +23 -160
  840. package/dist/summary-report.d.ts.map +1 -0
  841. package/dist/telemetry/client.d.ts +35 -0
  842. package/dist/telemetry/client.d.ts.map +1 -0
  843. package/dist/telemetry/index.d.ts +17 -35
  844. package/dist/telemetry/index.d.ts.map +1 -0
  845. package/dist/telemetry/schema.d.ts +61 -0
  846. package/dist/telemetry/schema.d.ts.map +1 -0
  847. package/dist/telemetry/sink-fetch.d.ts +39 -0
  848. package/dist/telemetry/sink-fetch.d.ts.map +1 -0
  849. package/dist/telemetry/{file.d.ts → sink-file.d.ts} +5 -7
  850. package/dist/telemetry/sink-file.d.ts.map +1 -0
  851. package/dist/test-graded-scenario.d.ts +42 -0
  852. package/dist/test-graded-scenario.d.ts.map +1 -0
  853. package/dist/testing.d.ts +5 -0
  854. package/dist/testing.d.ts.map +1 -0
  855. package/dist/testing.js +8 -0
  856. package/dist/testing.js.map +1 -0
  857. package/dist/tool-use-metrics.d.ts +35 -0
  858. package/dist/tool-use-metrics.d.ts.map +1 -0
  859. package/dist/trace/capture-fetch.d.ts +48 -0
  860. package/dist/trace/capture-fetch.d.ts.map +1 -0
  861. package/dist/trace/capture-fetch.test.d.ts +2 -0
  862. package/dist/trace/capture-fetch.test.d.ts.map +1 -0
  863. package/dist/{emitter-DEZwY14K.d.ts → trace/emitter.d.ts} +9 -12
  864. package/dist/trace/emitter.d.ts.map +1 -0
  865. package/dist/trace/extract-usage.d.ts +46 -0
  866. package/dist/trace/extract-usage.d.ts.map +1 -0
  867. package/dist/trace/extract-usage.test.d.ts +2 -0
  868. package/dist/trace/extract-usage.test.d.ts.map +1 -0
  869. package/dist/trace/index.d.ts +15 -0
  870. package/dist/trace/index.d.ts.map +1 -0
  871. package/dist/{integrity-VJ9A7aST.d.ts → trace/integrity.d.ts} +11 -14
  872. package/dist/trace/integrity.d.ts.map +1 -0
  873. package/dist/trace/otel-bridge.d.ts +29 -0
  874. package/dist/trace/otel-bridge.d.ts.map +1 -0
  875. package/dist/trace/otel-export.d.ts +52 -0
  876. package/dist/trace/otel-export.d.ts.map +1 -0
  877. package/dist/trace/otel.d.ts +57 -0
  878. package/dist/trace/otel.d.ts.map +1 -0
  879. package/dist/trace/otlp-attributes.d.ts +17 -0
  880. package/dist/trace/otlp-attributes.d.ts.map +1 -0
  881. package/dist/trace/query.d.ts +29 -0
  882. package/dist/trace/query.d.ts.map +1 -0
  883. package/dist/trace/query.test.d.ts +2 -0
  884. package/dist/trace/query.test.d.ts.map +1 -0
  885. package/dist/{raw-provider-sink-C46HDghv.d.ts → trace/raw-provider-sink.d.ts} +13 -14
  886. package/dist/trace/raw-provider-sink.d.ts.map +1 -0
  887. package/dist/{redact-B40YG2M_.d.ts → trace/redact.d.ts} +7 -8
  888. package/dist/trace/redact.d.ts.map +1 -0
  889. package/dist/{schema-m0gsnbt3.d.ts → trace/schema.d.ts} +29 -30
  890. package/dist/trace/schema.d.ts.map +1 -0
  891. package/dist/trace/store-to-otlp.d.ts +72 -0
  892. package/dist/trace/store-to-otlp.d.ts.map +1 -0
  893. package/dist/trace/store-to-otlp.test.d.ts +2 -0
  894. package/dist/trace/store-to-otlp.test.d.ts.map +1 -0
  895. package/dist/{store-CKUAgsJz.d.ts → trace/store.d.ts} +37 -13
  896. package/dist/trace/store.d.ts.map +1 -0
  897. package/dist/trace/store.test.d.ts +2 -0
  898. package/dist/trace/store.test.d.ts.map +1 -0
  899. package/dist/{analyst-C8HHvfJp.d.ts → trace-analyst/analyst.d.ts} +12 -14
  900. package/dist/trace-analyst/analyst.d.ts.map +1 -0
  901. package/dist/trace-analyst/analyst.test.d.ts +2 -0
  902. package/dist/trace-analyst/analyst.test.d.ts.map +1 -0
  903. package/dist/trace-analyst/behavioral-metrics.d.ts +40 -0
  904. package/dist/trace-analyst/behavioral-metrics.d.ts.map +1 -0
  905. package/dist/trace-analyst/behavioral-metrics.test.d.ts +2 -0
  906. package/dist/trace-analyst/behavioral-metrics.test.d.ts.map +1 -0
  907. package/dist/trace-analyst/hook.d.ts +55 -0
  908. package/dist/trace-analyst/hook.d.ts.map +1 -0
  909. package/dist/trace-analyst/index.d.ts +18 -0
  910. package/dist/trace-analyst/index.d.ts.map +1 -0
  911. package/dist/trace-analyst/insights.d.ts +71 -0
  912. package/dist/trace-analyst/insights.d.ts.map +1 -0
  913. package/dist/trace-analyst/insights.test.d.ts +2 -0
  914. package/dist/trace-analyst/insights.test.d.ts.map +1 -0
  915. package/dist/trace-analyst/otlp-flatten.d.ts +42 -0
  916. package/dist/trace-analyst/otlp-flatten.d.ts.map +1 -0
  917. package/dist/trace-analyst/otlp-span.d.ts +85 -0
  918. package/dist/trace-analyst/otlp-span.d.ts.map +1 -0
  919. package/dist/trace-analyst/otlp-span.test.d.ts +2 -0
  920. package/dist/trace-analyst/otlp-span.test.d.ts.map +1 -0
  921. package/dist/trace-analyst/otlp-to-run-records.d.ts +115 -0
  922. package/dist/trace-analyst/otlp-to-run-records.d.ts.map +1 -0
  923. package/dist/trace-analyst/otlp-to-run-records.test.d.ts +2 -0
  924. package/dist/trace-analyst/otlp-to-run-records.test.d.ts.map +1 -0
  925. package/dist/trace-analyst/otlp-to-run-records.timestamps.test.d.ts +2 -0
  926. package/dist/trace-analyst/otlp-to-run-records.timestamps.test.d.ts.map +1 -0
  927. package/dist/trace-analyst/prompts.d.ts +6 -0
  928. package/dist/trace-analyst/prompts.d.ts.map +1 -0
  929. package/dist/trace-analyst/store-otlp.d.ts +126 -0
  930. package/dist/trace-analyst/store-otlp.d.ts.map +1 -0
  931. package/dist/trace-analyst/store-otlp.test.d.ts +8 -0
  932. package/dist/trace-analyst/store-otlp.test.d.ts.map +1 -0
  933. package/dist/trace-analyst/store-otlp.timestamps.test.d.ts +2 -0
  934. package/dist/trace-analyst/store-otlp.timestamps.test.d.ts.map +1 -0
  935. package/dist/trace-analyst/store.d.ts +63 -0
  936. package/dist/trace-analyst/store.d.ts.map +1 -0
  937. package/dist/trace-analyst/tools.d.ts +44 -0
  938. package/dist/trace-analyst/tools.d.ts.map +1 -0
  939. package/dist/trace-analyst/tools.test.d.ts +10 -0
  940. package/dist/trace-analyst/tools.test.d.ts.map +1 -0
  941. package/dist/{store-C1YxJDEK.d.ts → trace-analyst/types.d.ts} +18 -74
  942. package/dist/trace-analyst/types.d.ts.map +1 -0
  943. package/dist/trace-contracts.d.ts +180 -0
  944. package/dist/trace-contracts.d.ts.map +1 -0
  945. package/dist/traced-analyst.d.ts +26 -0
  946. package/dist/traced-analyst.d.ts.map +1 -0
  947. package/dist/traced-judges.d.ts +27 -0
  948. package/dist/traced-judges.d.ts.map +1 -0
  949. package/dist/traces.d.ts +4 -947
  950. package/dist/traces.d.ts.map +1 -0
  951. package/dist/traces.js +42 -12
  952. package/dist/{trajectory-GEdXJCL5.d.ts → trajectory.d.ts} +8 -9
  953. package/dist/trajectory.d.ts.map +1 -0
  954. package/dist/{types-Croy5h7V.d.ts → types.d.ts} +33 -33
  955. package/dist/types.d.ts.map +1 -0
  956. package/dist/ui-finding.d.ts +104 -0
  957. package/dist/ui-finding.d.ts.map +1 -0
  958. package/dist/verdict-cache.d.ts +78 -0
  959. package/dist/verdict-cache.d.ts.map +1 -0
  960. package/dist/verdict-cache.test.d.ts +2 -0
  961. package/dist/verdict-cache.test.d.ts.map +1 -0
  962. package/dist/{verdict-C9MlYujm.d.ts → verdict.d.ts} +2 -3
  963. package/dist/verdict.d.ts.map +1 -0
  964. package/dist/visual-diff.d.ts +32 -0
  965. package/dist/visual-diff.d.ts.map +1 -0
  966. package/dist/wire/handlers.d.ts +54 -0
  967. package/dist/wire/handlers.d.ts.map +1 -0
  968. package/dist/wire/index.d.ts +13 -570
  969. package/dist/wire/index.d.ts.map +1 -0
  970. package/dist/wire/index.js +2 -2
  971. package/dist/wire/openapi.d.ts +3 -0
  972. package/dist/wire/openapi.d.ts.map +1 -0
  973. package/dist/wire/rpc.d.ts +21 -0
  974. package/dist/wire/rpc.d.ts.map +1 -0
  975. package/dist/wire/rubrics.d.ts +34 -0
  976. package/dist/wire/rubrics.d.ts.map +1 -0
  977. package/dist/wire/schemas.d.ts +410 -0
  978. package/dist/wire/schemas.d.ts.map +1 -0
  979. package/dist/wire/server.d.ts +60 -0
  980. package/dist/wire/server.d.ts.map +1 -0
  981. package/dist/workflow/event-schema.d.ts +5 -0
  982. package/dist/workflow/event-schema.d.ts.map +1 -0
  983. package/dist/workflow/feedback-pack.d.ts +99 -0
  984. package/dist/workflow/feedback-pack.d.ts.map +1 -0
  985. package/dist/workflow/index.d.ts +22 -495
  986. package/dist/workflow/index.d.ts.map +1 -0
  987. package/dist/workflow/index.js +2 -2
  988. package/dist/workflow/intelligence-export.d.ts +62 -0
  989. package/dist/workflow/intelligence-export.d.ts.map +1 -0
  990. package/dist/workflow/partner-report.d.ts +49 -0
  991. package/dist/workflow/partner-report.d.ts.map +1 -0
  992. package/dist/workflow/phase-graph.d.ts +43 -0
  993. package/dist/workflow/phase-graph.d.ts.map +1 -0
  994. package/dist/workflow/promotion-gate.d.ts +61 -0
  995. package/dist/workflow/promotion-gate.d.ts.map +1 -0
  996. package/dist/workflow/run-record.d.ts +12 -0
  997. package/dist/workflow/run-record.d.ts.map +1 -0
  998. package/dist/workflow/runtime-adapter.d.ts +20 -0
  999. package/dist/workflow/runtime-adapter.d.ts.map +1 -0
  1000. package/dist/workflow/sanitize.d.ts +21 -0
  1001. package/dist/workflow/sanitize.d.ts.map +1 -0
  1002. package/dist/workflow/schema.d.ts +5 -0
  1003. package/dist/workflow/schema.d.ts.map +1 -0
  1004. package/dist/workflow/summary.d.ts +43 -0
  1005. package/dist/workflow/summary.d.ts.map +1 -0
  1006. package/dist/workflow/trace-event-fields.d.ts +6 -0
  1007. package/dist/workflow/trace-event-fields.d.ts.map +1 -0
  1008. package/dist/workflow/trajectory.d.ts +15 -0
  1009. package/dist/workflow/trajectory.d.ts.map +1 -0
  1010. package/dist/workflow/types.d.ts +68 -0
  1011. package/dist/workflow/types.d.ts.map +1 -0
  1012. package/dist/workspace-inspector.d.ts +67 -0
  1013. package/dist/workspace-inspector.d.ts.map +1 -0
  1014. package/dist/wrangler-deploy-runner.test.d.ts +2 -0
  1015. package/dist/wrangler-deploy-runner.test.d.ts.map +1 -0
  1016. package/docs/campaign-proposers.md +170 -0
  1017. package/docs/concepts.md +8 -4
  1018. package/docs/customer-journeys.md +15 -13
  1019. package/docs/design/loop-taxonomy.md +34 -66
  1020. package/docs/distributed-driver.md +14 -14
  1021. package/docs/feature-guide.md +1 -1
  1022. package/docs/hosted-ingest-spec.md +2 -3
  1023. package/docs/multi-shot-optimization.md +8 -8
  1024. package/docs/product-eval-adoption.md +1 -1
  1025. package/docs/self-improvement-map.md +33 -29
  1026. package/package.json +9 -15
  1027. package/dist/calibration-Cpr3WaX3.d.ts +0 -101
  1028. package/dist/chunk-47X6LRCE.js.map +0 -1
  1029. package/dist/chunk-6SOJM3VR.js.map +0 -1
  1030. package/dist/chunk-CVVHBFGN.js.map +0 -1
  1031. package/dist/chunk-D3V5B42D.js.map +0 -1
  1032. package/dist/chunk-E4GH6USR.js.map +0 -1
  1033. package/dist/chunk-GSH6QNNS.js.map +0 -1
  1034. package/dist/chunk-KWRRMR3J.js.map +0 -1
  1035. package/dist/chunk-LMZQ2Z4U.js.map +0 -1
  1036. package/dist/chunk-QAY5UIJO.js.map +0 -1
  1037. package/dist/chunk-QG2OVF2D.js.map +0 -1
  1038. package/dist/chunk-T375SUOZ.js.map +0 -1
  1039. package/dist/chunk-TWS7AZEY.js.map +0 -1
  1040. package/dist/chunk-UMMZHCPB.js.map +0 -1
  1041. package/dist/chunk-XY4DDNEG.js.map +0 -1
  1042. package/dist/chunk-ZFIBGEOL.js.map +0 -1
  1043. package/dist/control-_Qb7skHX.d.ts +0 -259
  1044. package/dist/corpus-BoR-041R.d.ts +0 -560
  1045. package/dist/failure-cluster-CL7IVgkJ.d.ts +0 -76
  1046. package/dist/harness-optimizer-EnEnQPsr.d.ts +0 -106
  1047. package/dist/index-Bx3gZ8xl.d.ts +0 -159
  1048. package/dist/pre-registration-mAnCugl9.d.ts +0 -523
  1049. package/dist/provenance-LnqRT0sS.d.ts +0 -441
  1050. package/dist/query-CqTxMwDw.d.ts +0 -31
  1051. package/dist/release-report-euXIV_Sk.d.ts +0 -233
  1052. package/dist/run-critic-BAIjX99r.d.ts +0 -56
  1053. package/dist/run-improvement-loop-5z_l5zDz.d.ts +0 -427
  1054. package/dist/runtime-trajectory-BDgfGZSr.d.ts +0 -49
  1055. package/dist/semantic-concept-judge-Dn8Z6KEG.d.ts +0 -624
  1056. package/dist/sink-fetch-B1Yg4Til.d.ts +0 -101
  1057. package/docs/design/external-agent-wedge.md +0 -89
  1058. package/docs/design/phase-d-rfc.md +0 -125
  1059. package/docs/design/phase4-consumer-migration.md +0 -70
  1060. package/docs/design/primitives-integration-spec.md +0 -393
  1061. package/docs/design/product-self-improvement-loop.md +0 -146
  1062. package/docs/design/self-improvement-engine.md +0 -140
  1063. package/docs/design/self-improvement-protocol.md +0 -223
  1064. package/docs/design/self-improvement-roadmap.md +0 -106
  1065. package/docs/design/substrate-gaps.md +0 -118
  1066. package/docs/phase-b-pairing-kit.md +0 -188
  1067. package/docs/phase-b-runbook.md +0 -176
  1068. package/docs/pilot/README.md +0 -62
  1069. package/docs/pilot/customer-checklist.md +0 -90
  1070. package/docs/pilot/integration-foreign-stack.md +0 -296
  1071. package/docs/pilot/integration-tangle-stack.md +0 -248
  1072. package/docs/pilot/one-pager.md +0 -161
  1073. package/docs/pilot/sample-insight-report.json +0 -172
  1074. package/docs/quickstart-external.md +0 -229
  1075. package/docs/research/belief-state-agent-eval-roadmap.md +0 -593
  1076. package/docs/research/research-roadmap.md +0 -205
  1077. package/docs/specs/driver-honest-spec.md +0 -251
  1078. package/docs/specs/hermes-self-improvement-audit.md +0 -93
  1079. package/docs/specs/profile-versioning.md +0 -291
  1080. package/docs/three-package-architecture.md +0 -168
  1081. /package/dist/{chunk-QS3RBQPI.js.map → chunk-D5KBVULY.js.map} +0 -0
  1082. /package/dist/{chunk-UHMJT4T7.js.map → chunk-IZCEK2HR.js.map} +0 -0
  1083. /package/dist/{chunk-L3JOU6XM.js.map → chunk-NACM5RS7.js.map} +0 -0
  1084. /package/dist/{chunk-4FBZZIYD.js.map → chunk-QTMYW64F.js.map} +0 -0
  1085. /package/dist/{chunk-CY6U5S3X.js.map → chunk-URWVKRCS.js.map} +0 -0
  1086. /package/dist/{chunk-Y47J2LJ3.js.map → chunk-Z6L6YSU6.js.map} +0 -0
  1087. /package/dist/{run-campaign-RDGAM5KJ.js.map → run-campaign-WXY7KI67.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/trace-analyst/otlp-span.ts","../src/trace-analyst/types.ts","../src/trace-analyst/store-otlp.ts","../src/trace-analyst/store.ts","../src/trace-analyst/tools.ts"],"sourcesContent":["/**\n * Canonical OTLP-flat-line readers shared by every consumer of the\n * OTLP-JSONL wire shape (one OTLP span per line; the form\n * `flattenOtlpExportToNdjson` produces and the form AppWorld / HALO\n * emit via their OpenInference OTLP exporter).\n *\n * `OtlpFileTraceStore` indexes spans with these; `otlpToRunRecords`\n * aggregates spans into `RunRecord`s with the same readers. One parser,\n * one vocabulary — a divergence between the analyst's view of a trace and\n * the RunRecord projected from it is a class of bug this consolidation\n * removes by construction.\n *\n * Vocabulary. The readers understand BOTH dialects that appear in the\n * wild:\n * - the substrate's own `llm.*` / `tool.*` / `span.kind` attributes\n * (`flattenSpanAttributes` in `trace/otel.ts`), and\n * - the OpenInference / inference-export attributes AppWorld / HALO\n * emit (`openinference.span.kind`, `inference.observation_kind`,\n * `inference.llm.input_tokens`, `llm.token_count.prompt`, …).\n *\n * Pure, no I/O.\n */\n\nimport type { TraceAnalystSpanKind, TraceAnalystSpanStatus } from './types'\n\n/**\n * The structural fields a flat OTLP-JSONL line projects to. `attributes`\n * is the merged resource+span attribute map (span overrides resource);\n * the named fields are the pivots every reader of a trace needs without\n * paying the full attribute materialisation.\n */\nexport interface ProjectedOtlpSpan {\n trace_id: string\n span_id: string\n parent_span_id: string | null\n name: string\n kind: TraceAnalystSpanKind\n start_time: string\n end_time: string\n duration_ms: number\n status: TraceAnalystSpanStatus\n status_message: string | undefined\n service_name: string | null\n agent_name: string | null\n model_name: string | null\n tool_name: string | null\n /** Merged resource + span attributes, span winning on overlap. */\n attributes: Record<string, unknown>\n}\n\n/**\n * Project one parsed OTLP-JSONL object to `ProjectedOtlpSpan`, or `null`\n * when the line is missing the mandatory `trace_id` + `span_id`.\n */\nexport function projectOtlpFlatLine(raw: Record<string, unknown>): ProjectedOtlpSpan | null {\n const trace_id = stringField(raw, 'trace_id') ?? stringField(raw, 'traceId')\n const span_id = stringField(raw, 'span_id') ?? stringField(raw, 'spanId')\n if (!trace_id || !span_id) return null\n\n const parent_id = stringField(raw, 'parent_span_id') ?? stringField(raw, 'parentSpanId') ?? null\n const name = stringField(raw, 'name') ?? 'unknown'\n const start_time = stringField(raw, 'start_time') ?? stringField(raw, 'startTime') ?? ''\n const end_time = stringField(raw, 'end_time') ?? stringField(raw, 'endTime') ?? start_time\n\n const status = readOtlpStatus(raw)\n const attributes = extractOtlpAttributes(raw)\n\n const service_name =\n asString(attributes['service.name']) ??\n asString(attributes['resource.attributes.service.name']) ??\n null\n const agent_name =\n asString(attributes['agent.name']) ??\n asString(attributes['inference.agent.name']) ??\n asString(attributes['inference.agent_name']) ??\n null\n const model_name =\n asString(attributes['llm.model_name']) ??\n asString(attributes['inference.llm.model_name']) ??\n asString(attributes['llm.model']) ??\n null\n const tool_name =\n asString(attributes['tool.name']) ?? asString(attributes['inference.tool.name']) ?? null\n\n const kind = inferOtlpKind(attributes)\n\n let duration_ms = 0\n if (start_time && end_time) {\n const a = Date.parse(start_time)\n const b = Date.parse(end_time)\n if (!Number.isNaN(a) && !Number.isNaN(b)) duration_ms = Math.max(0, b - a)\n }\n\n return {\n trace_id,\n span_id,\n parent_span_id: parent_id && parent_id.length > 0 ? parent_id : null,\n name,\n kind,\n start_time,\n end_time,\n duration_ms,\n status: status.code,\n status_message: status.message,\n service_name,\n agent_name,\n model_name,\n tool_name,\n attributes,\n }\n}\n\nexport function readOtlpStatus(raw: Record<string, unknown>): {\n code: TraceAnalystSpanStatus\n message: string | undefined\n} {\n const status = raw.status\n if (status && typeof status === 'object' && !Array.isArray(status)) {\n const codeRaw = (status as Record<string, unknown>).code\n const code: TraceAnalystSpanStatus =\n codeRaw === 'STATUS_CODE_OK' || codeRaw === 'OK'\n ? 'OK'\n : codeRaw === 'STATUS_CODE_ERROR' || codeRaw === 'ERROR'\n ? 'ERROR'\n : 'UNSET'\n const messageRaw = (status as Record<string, unknown>).message\n const message = typeof messageRaw === 'string' && messageRaw.length > 0 ? messageRaw : undefined\n return { code, message }\n }\n return { code: 'UNSET', message: undefined }\n}\n\nexport function inferOtlpKind(attrs: Record<string, unknown>): TraceAnalystSpanKind {\n const opik =\n asString(attrs['openinference.span.kind']) ?? asString(attrs['inference.observation_kind'])\n if (opik) {\n const upper = opik.toUpperCase()\n if (\n upper === 'AGENT' ||\n upper === 'LLM' ||\n upper === 'TOOL' ||\n upper === 'CHAIN' ||\n upper === 'GUARDRAIL' ||\n upper === 'SPAN'\n ) {\n return upper as TraceAnalystSpanKind\n }\n }\n return 'UNKNOWN'\n}\n\n/**\n * Flatten OTLP `attributes` + `resource.attributes` into a single\n * dotted-key map. Span attributes override resource attributes when keys\n * overlap. Nested objects/arrays are preserved as-is.\n */\nexport function extractOtlpAttributes(raw: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n const resource = raw.resource\n if (resource && typeof resource === 'object' && !Array.isArray(resource)) {\n const ra = (resource as Record<string, unknown>).attributes\n if (ra && typeof ra === 'object' && !Array.isArray(ra)) {\n for (const [k, v] of Object.entries(ra as Record<string, unknown>)) {\n out[k] = v\n }\n }\n }\n const spanAttrs = raw.attributes\n if (spanAttrs && typeof spanAttrs === 'object' && !Array.isArray(spanAttrs)) {\n for (const [k, v] of Object.entries(spanAttrs as Record<string, unknown>)) {\n out[k] = v\n }\n }\n return out\n}\n\nexport function stringField(raw: Record<string, unknown>, key: string): string | undefined {\n const v = raw[key]\n return typeof v === 'string' ? v : undefined\n}\n\nexport function asString(v: unknown): string | null {\n return typeof v === 'string' && v.length > 0 ? v : null\n}\n\n/** Read a numeric attribute, tolerating numeric strings; `null` if absent/NaN. */\nexport function asNumber(v: unknown): number | null {\n if (typeof v === 'number') return Number.isFinite(v) ? v : null\n if (typeof v === 'string' && v.length > 0) {\n const n = Number(v)\n return Number.isFinite(n) ? n : null\n }\n return null\n}\n\n/** First finite numeric value across a list of candidate attribute keys. */\nexport function firstNumberAttr(\n attrs: Record<string, unknown>,\n keys: readonly string[],\n): number | null {\n for (const k of keys) {\n const n = asNumber(attrs[k])\n if (n !== null) return n\n }\n return null\n}\n\n/** First non-empty string value across a list of candidate attribute keys. */\nexport function firstStringAttr(\n attrs: Record<string, unknown>,\n keys: readonly string[],\n): string | null {\n for (const k of keys) {\n const s = asString(attrs[k])\n if (s !== null) return s\n }\n return null\n}\n","/**\n * Shared types for the trace-analyst module.\n *\n * Wire format. The store interface speaks `OtlpSpanLike` rows — one JSONL\n * line per span, OTLP-shaped. We do NOT depend on a specific tracing\n * vendor at the type level. Adapter\n * layers map upstream shapes onto this interface.\n *\n * Design constraint. Every read operation that can return arbitrary\n * payload must carry a byte budget so the agent's tool result stays\n * bounded regardless of input trace size. Oversized responses\n * substitute a deterministic summary instead of bytes — see\n * `ViewTraceOversized`.\n */\n\n/** OTLP span kind (subset we actually use). */\nexport type TraceAnalystSpanKind =\n | 'AGENT'\n | 'LLM'\n | 'TOOL'\n | 'CHAIN'\n | 'GUARDRAIL'\n | 'SPAN'\n | 'UNKNOWN'\n\nexport type TraceAnalystSpanStatus = 'OK' | 'ERROR' | 'UNSET'\n\n/** Subset of OTLP span fields the analyst exposes to the agent. The\n * store's job is to project upstream's full span shape down to this\n * view — the analyst never sees vendor extensions directly. */\nexport interface TraceAnalystSpan {\n trace_id: string\n span_id: string\n parent_span_id: string | null\n name: string\n kind: TraceAnalystSpanKind\n start_time: string\n end_time: string\n duration_ms: number\n status: TraceAnalystSpanStatus\n status_message?: string\n service_name: string | null\n agent_name: string | null\n model_name: string | null\n tool_name: string | null\n /** Raw JSON-serialisable attribute map. May contain large strings;\n * callers must respect the per-attribute byte cap. */\n attributes: Record<string, unknown>\n}\n\nexport interface TraceAnalystTraceSummary {\n trace_id: string\n service_name: string | null\n agent_name: string | null\n span_count: number\n has_errors: boolean\n start_time: string\n end_time: string\n duration_ms: number\n raw_jsonl_bytes: number\n models: string[]\n tools: string[]\n}\n\nexport interface TraceAnalystFilters {\n /** Restrict to traces that contain at least one error span. */\n has_errors?: boolean\n /** Match if any span's `service.name` is in this list. */\n service_names?: string[]\n /** Match if any span's `agent.name` is in this list. */\n agent_names?: string[]\n /** Match if any LLM span's `llm.model_name` is in this list. */\n model_names?: string[]\n /** Match if any tool span's `tool.name` is in this list. */\n tool_names?: string[]\n /** ISO-8601 lower bound on the trace's earliest start time. */\n start_time_after?: string\n /** ISO-8601 upper bound on the trace's earliest start time. */\n start_time_before?: string\n /** Single regex applied to raw JSONL bytes for the trace. Opt-in;\n * expensive on large datasets. Use the indexed filters above first. */\n regex_pattern?: string\n}\n\n/** One distinct error signature across the dataset — the deterministic unit of\n * failure coverage. Signatures normalize volatile tokens (digits, hex/uuids,\n * paths, durations) out of the span `status_message` so semantically identical\n * failures collapse into one cluster. An analyst that accounts for every\n * cluster has, by construction, covered every distinct failure mode. */\nexport interface ErrorCluster {\n /** Normalized status_message — the cluster key. */\n signature: string\n /** A verbatim, un-normalized exemplar message (for exact-string citation). */\n status_message_sample: string\n /** The span name that most often carries this signature, if any. */\n span_name: string | null\n /** The tool that most often carries this signature, if any. */\n tool_name: string | null\n trace_count: number\n span_count: number\n /** trace_count / total error traces in the matched set (0..1). */\n prevalence: number\n /** Real trace ids carrying this signature (capped), passable to view/search. */\n exemplar_trace_ids: string[]\n /** Real span ids carrying this signature (capped). */\n exemplar_span_ids: string[]\n}\n\nexport interface DatasetOverview {\n total_traces: number\n raw_jsonl_bytes: number\n services: string[]\n agents: string[]\n models: string[]\n tool_names: string[]\n /** Up to 20 real trace ids the agent may pass to view/search tools. */\n sample_trace_ids: string[]\n errors: { trace_count: number; span_count: number }\n /** The COMPLETE deterministic error-signature population, sorted by\n * trace_count desc. This is the failure-coverage checklist: an analysis is\n * complete only when every cluster here is accounted for. Empty when the\n * matched set has no error spans. */\n error_clusters: ErrorCluster[]\n time_range: { earliest: string; latest: string } | null\n}\n\nexport interface QueryTracesPage {\n traces: TraceAnalystTraceSummary[]\n total: number\n has_more: boolean\n}\n\n/** Full-trace view. When the response would exceed the per-call byte\n * budget, `oversized` is populated INSTEAD of `spans` so the agent\n * knows to switch to `searchTrace` / `viewSpans`. */\nexport interface ViewTraceResult {\n trace_id: string\n spans?: TraceAnalystSpan[]\n oversized?: ViewTraceOversized\n}\n\nexport interface ViewTraceOversized {\n span_count: number\n /** Names with their counts, sorted desc. Capped at 20 entries. */\n top_span_names: Array<[string, number]>\n /** Largest single span body (bytes after attribute-cap projection). */\n span_response_bytes_max: number\n error_span_count: number\n}\n\nexport interface ViewSpansResult {\n trace_id: string\n spans: TraceAnalystSpan[]\n /** Number of requested span ids that were not found in the trace. */\n missing_span_ids: string[]\n /** Number of attribute fields truncated to fit the per-attribute cap. */\n truncated_attribute_count: number\n}\n\nexport interface SpanMatchRecord {\n trace_id: string\n span_id: string\n span_name: string\n span_kind: TraceAnalystSpanKind\n /** JSON pointer-style path to the matched value, e.g.\n * `attributes.\"llm.input_messages\"[2].content`. */\n attribute_path: string\n matched_text: string\n context_before: string\n context_after: string\n match_offset: number\n}\n\nexport interface SearchTraceResult {\n trace_id: string\n hits: SpanMatchRecord[]\n total_matches: number\n has_more: boolean\n}\n\nexport interface SearchSpanResult {\n trace_id: string\n span_id: string\n hits: SpanMatchRecord[]\n total_matches: number\n has_more: boolean\n}\n\n/** Tunable byte budgets for bounded RLM tool output. */\nexport interface TraceAnalystByteBudgets {\n /** Max bytes any single tool response may emit. Hard ceiling enforced\n * by the store; oversized → summary. Default 150_000. */\n perCallByteCeiling: number\n /** Per-attribute string truncation cap on `viewTrace` (discovery scan).\n * Default 4096. */\n perAttributeViewBudget: number\n /** Per-attribute string truncation cap on `viewSpans` (surgical reads).\n * Default 16384. */\n perAttributeSpanBudget: number\n /** Per-attribute cap on a single match record's `matched_text` and\n * context window. Default 1024. */\n perMatchTextBudget: number\n}\n\nexport const DEFAULT_TRACE_ANALYST_BUDGETS: TraceAnalystByteBudgets = {\n perCallByteCeiling: 150_000,\n perAttributeViewBudget: 4_096,\n perAttributeSpanBudget: 16_384,\n perMatchTextBudget: 1_024,\n}\n\n/** Marker substituted in place of truncated string payloads. Callers\n * parsing tool output can detect it deterministically. */\nexport const TRACE_ANALYST_TRUNCATION_MARKER_PREFIX = '[trace-analyst truncated:'\n","/**\n * `OtlpFileTraceStore` — read-only OTLP-JSONL trace store for the\n * trace-analyst.\n *\n * Wire shape. Each line of the input file is one OTLP-shaped span. The\n * store understands flattened OTLP JSONL plus the OpenInference vocab.\n * We project upstream's full\n * span shape down to `TraceAnalystSpan` lazily — full materialisation\n * only happens for the spans the agent actually requests.\n *\n * Indexing. On first read the store builds an in-memory index keyed\n * by `trace_id` carrying:\n * - byte offsets + lengths for each span line (for surgical reads\n * without re-parsing the whole file)\n * - a `TraceAnalystTraceSummary` rollup\n * - sets of services / agents / models / tools / has_errors\n * - byte size of the trace's JSONL slab\n *\n * Memory bound. The index keeps span metadata only — names, kinds,\n * offsets, status. Attribute payloads stay on disk until requested.\n * For a 50MB JSONL with 50k spans, the index is ~5MB.\n *\n * Concurrency. The store builds the index once on first read and\n * caches it. Subsequent reads reuse the index. The file is opened on\n * each read; we never hold a long-lived FD.\n */\n\nimport { readFile, stat } from 'node:fs/promises'\nimport { NotFoundError } from '../errors'\nimport { extractOtlpAttributes, projectOtlpFlatLine } from './otlp-span'\nimport { compileSearchRegex, type TraceAnalysisStore, truncateForBudget } from './store'\nimport {\n type DatasetOverview,\n DEFAULT_TRACE_ANALYST_BUDGETS,\n type ErrorCluster,\n type QueryTracesPage,\n type SearchSpanResult,\n type SearchTraceResult,\n type SpanMatchRecord,\n type TraceAnalystFilters,\n type TraceAnalystSpan,\n type TraceAnalystSpanKind,\n type TraceAnalystSpanStatus,\n type TraceAnalystTraceSummary,\n type ViewSpansResult,\n type ViewTraceOversized,\n type ViewTraceResult,\n} from './types'\n\ninterface SpanIndexEntry {\n span_id: string\n parent_span_id: string | null\n name: string\n kind: TraceAnalystSpanKind\n start_time: string\n end_time: string\n duration_ms: number\n status: TraceAnalystSpanStatus\n status_message: string | undefined\n service_name: string | null\n agent_name: string | null\n model_name: string | null\n tool_name: string | null\n /** Byte offset in the raw JSONL file to the start of this span's line. */\n line_byte_offset: number\n /** Length of this line in bytes (excluding the trailing newline). */\n line_byte_length: number\n}\n\ninterface TraceIndexEntry {\n trace_id: string\n service_name: string | null\n agent_name: string | null\n span_count: number\n has_errors: boolean\n start_time: string\n end_time: string\n duration_ms: number\n raw_jsonl_bytes: number\n models: Set<string>\n tools: Set<string>\n spans: SpanIndexEntry[]\n /** Sorted by line offset for stable iteration. */\n}\n\ninterface DatasetIndex {\n byTrace: Map<string, TraceIndexEntry>\n totalRawBytes: number\n // Pre-computed sorted trace_ids for sample/query stability.\n sortedTraceIds: string[]\n}\n\nexport interface OtlpFileTraceStoreOptions {\n /** Path to the OTLP-JSONL file. */\n path: string\n /** Override the discovery (`viewTrace`) per-attribute byte cap. */\n perAttributeViewBudget?: number\n /** Override the surgical (`viewSpans`) per-attribute byte cap. */\n perAttributeSpanBudget?: number\n /** Override the per-call ceiling that triggers oversized summaries. */\n perCallByteCeiling?: number\n /** Override the per-match text budget. */\n perMatchTextBudget?: number\n}\n\nexport class OtlpFileTraceStore implements TraceAnalysisStore {\n private readonly path: string\n private readonly perAttributeViewBudget: number\n private readonly perAttributeSpanBudget: number\n private readonly perCallByteCeiling: number\n private readonly perMatchTextBudget: number\n private indexPromise?: Promise<DatasetIndex>\n /** Cached UTF-8 buffer of the file. We pin it once because every\n * read needs slice access and re-reading on each call balloons the\n * syscall count. */\n private bufferPromise?: Promise<Buffer>\n\n constructor(opts: OtlpFileTraceStoreOptions) {\n this.path = opts.path\n this.perAttributeViewBudget =\n opts.perAttributeViewBudget ?? DEFAULT_TRACE_ANALYST_BUDGETS.perAttributeViewBudget\n this.perAttributeSpanBudget =\n opts.perAttributeSpanBudget ?? DEFAULT_TRACE_ANALYST_BUDGETS.perAttributeSpanBudget\n this.perCallByteCeiling =\n opts.perCallByteCeiling ?? DEFAULT_TRACE_ANALYST_BUDGETS.perCallByteCeiling\n this.perMatchTextBudget =\n opts.perMatchTextBudget ?? DEFAULT_TRACE_ANALYST_BUDGETS.perMatchTextBudget\n }\n\n // ─── Public API ────────────────────────────────────────────────────\n\n async getOverview(filters?: TraceAnalystFilters): Promise<DatasetOverview> {\n const idx = await this.index()\n const matched = await this.matchedTraces(idx, filters)\n\n const services = new Set<string>()\n const agents = new Set<string>()\n const models = new Set<string>()\n const tools = new Set<string>()\n let rawBytes = 0\n let earliest: string | null = null\n let latest: string | null = null\n let errorTraceCount = 0\n let errorSpanCount = 0\n const clusters = new Map<string, ErrorClusterAccumulator>()\n\n for (const t of matched) {\n if (t.service_name) services.add(t.service_name)\n if (t.agent_name) agents.add(t.agent_name)\n for (const m of t.models) models.add(m)\n for (const tn of t.tools) tools.add(tn)\n rawBytes += t.raw_jsonl_bytes\n if (!earliest || t.start_time < earliest) earliest = t.start_time\n if (!latest || t.end_time > latest) latest = t.end_time\n if (t.has_errors) {\n errorTraceCount += 1\n for (const s of t.spans) {\n if (s.status !== 'ERROR') continue\n errorSpanCount += 1\n accumulateErrorCluster(clusters, t.trace_id, s)\n }\n }\n }\n\n const sample_trace_ids = matched.slice(0, 20).map((t) => t.trace_id)\n return {\n total_traces: matched.length,\n raw_jsonl_bytes: rawBytes,\n services: [...services].sort(),\n agents: [...agents].sort(),\n models: [...models].sort(),\n tool_names: [...tools].sort(),\n sample_trace_ids,\n errors: { trace_count: errorTraceCount, span_count: errorSpanCount },\n error_clusters: finalizeErrorClusters(clusters, errorTraceCount),\n time_range: earliest && latest ? { earliest, latest } : null,\n }\n }\n\n async queryTraces(opts: {\n filters?: TraceAnalystFilters\n limit: number\n offset?: number\n }): Promise<QueryTracesPage> {\n if (!Number.isInteger(opts.limit) || opts.limit < 1 || opts.limit > 200) {\n throw new RangeError(`queryTraces.limit must be 1..200, got ${opts.limit}`)\n }\n const offset = opts.offset ?? 0\n if (!Number.isInteger(offset) || offset < 0) {\n throw new RangeError(`queryTraces.offset must be >=0, got ${offset}`)\n }\n\n const idx = await this.index()\n const matched = await this.matchedTraces(idx, opts.filters)\n const slice = matched.slice(offset, offset + opts.limit)\n return {\n traces: slice.map((t) => this.toSummary(t)),\n total: matched.length,\n has_more: offset + slice.length < matched.length,\n }\n }\n\n async countTraces(filters?: TraceAnalystFilters): Promise<number> {\n const idx = await this.index()\n const matched = await this.matchedTraces(idx, filters)\n return matched.length\n }\n\n async viewTrace(opts: {\n trace_id: string\n per_attribute_byte_cap?: number\n }): Promise<ViewTraceResult> {\n const idx = await this.index()\n const trace = idx.byTrace.get(opts.trace_id)\n if (!trace) {\n throw new TraceNotFoundError(opts.trace_id)\n }\n const cap = opts.per_attribute_byte_cap ?? this.perAttributeViewBudget\n\n // Probe size first — if the materialised payload would exceed\n // the per-call ceiling we return an oversized summary rather than\n // blowing the agent's context.\n const buf = await this.buffer()\n const spans: TraceAnalystSpan[] = []\n let runningBytes = 0\n let span_response_bytes_max = 0\n for (const s of trace.spans) {\n const projected = await this.projectSpan(buf, trace.trace_id, s, cap)\n const bytes = Buffer.byteLength(JSON.stringify(projected), 'utf8')\n span_response_bytes_max = Math.max(span_response_bytes_max, bytes)\n runningBytes += bytes\n if (runningBytes > this.perCallByteCeiling) {\n return {\n trace_id: trace.trace_id,\n oversized: this.buildOversizedSummary(trace, span_response_bytes_max),\n }\n }\n spans.push(projected)\n }\n return { trace_id: trace.trace_id, spans }\n }\n\n async viewSpans(opts: {\n trace_id: string\n span_ids: readonly string[]\n per_attribute_byte_cap?: number\n }): Promise<ViewSpansResult> {\n const idx = await this.index()\n const trace = idx.byTrace.get(opts.trace_id)\n if (!trace) throw new TraceNotFoundError(opts.trace_id)\n if (opts.span_ids.length === 0) {\n return {\n trace_id: trace.trace_id,\n spans: [],\n missing_span_ids: [],\n truncated_attribute_count: 0,\n }\n }\n if (opts.span_ids.length > 100) {\n throw new RangeError(`viewSpans.span_ids cap is 100, got ${opts.span_ids.length}`)\n }\n const cap = opts.per_attribute_byte_cap ?? this.perAttributeSpanBudget\n\n const wantSet = new Set(opts.span_ids)\n const found = trace.spans.filter((s) => wantSet.has(s.span_id))\n const missing = opts.span_ids.filter((id) => !found.some((f) => f.span_id === id))\n\n const buf = await this.buffer()\n const spans: TraceAnalystSpan[] = []\n let truncated = 0\n let runningBytes = 0\n for (const s of found) {\n const before = truncationCounter(this)\n const projected = await this.projectSpan(buf, trace.trace_id, s, cap)\n truncated += before.delta()\n const bytes = Buffer.byteLength(JSON.stringify(projected), 'utf8')\n runningBytes += bytes\n if (runningBytes > this.perCallByteCeiling) {\n // Stop adding further spans rather than truncate mid-list.\n // Callers can refetch the rest with a smaller `span_ids`.\n break\n }\n spans.push(projected)\n }\n return {\n trace_id: trace.trace_id,\n spans,\n missing_span_ids: missing,\n truncated_attribute_count: truncated,\n }\n }\n\n async searchTrace(opts: {\n trace_id: string\n regex_pattern: string\n max_matches?: number\n }): Promise<SearchTraceResult> {\n const max_matches = opts.max_matches ?? 50\n if (!Number.isInteger(max_matches) || max_matches < 1 || max_matches > 500) {\n throw new RangeError(`searchTrace.max_matches must be 1..500, got ${max_matches}`)\n }\n const idx = await this.index()\n const trace = idx.byTrace.get(opts.trace_id)\n if (!trace) throw new TraceNotFoundError(opts.trace_id)\n const re = compileSearchRegex(opts.regex_pattern)\n\n const buf = await this.buffer()\n const hits: SpanMatchRecord[] = []\n let total = 0\n let capped = false\n for (const s of trace.spans) {\n const remaining = max_matches - hits.length\n const localHits = await this.scanSpanForMatches(\n buf,\n trace.trace_id,\n s,\n re,\n this.perMatchTextBudget,\n remaining,\n )\n total += localHits.total\n for (const h of localHits.records) {\n if (hits.length >= max_matches) break\n hits.push(h)\n }\n if (hits.length >= max_matches) {\n capped = true\n total = Math.max(total, hits.length + 1)\n break\n }\n }\n return {\n trace_id: trace.trace_id,\n hits,\n total_matches: total,\n has_more: capped || total > hits.length,\n }\n }\n\n async searchSpan(opts: {\n trace_id: string\n span_id: string\n regex_pattern: string\n max_matches?: number\n }): Promise<SearchSpanResult> {\n const max_matches = opts.max_matches ?? 50\n if (!Number.isInteger(max_matches) || max_matches < 1 || max_matches > 500) {\n throw new RangeError(`searchSpan.max_matches must be 1..500, got ${max_matches}`)\n }\n const idx = await this.index()\n const trace = idx.byTrace.get(opts.trace_id)\n if (!trace) throw new TraceNotFoundError(opts.trace_id)\n const span = trace.spans.find((s) => s.span_id === opts.span_id)\n if (!span) {\n throw new SpanNotFoundError(opts.trace_id, opts.span_id)\n }\n const re = compileSearchRegex(opts.regex_pattern)\n const buf = await this.buffer()\n const localHits = await this.scanSpanForMatches(\n buf,\n trace.trace_id,\n span,\n re,\n this.perMatchTextBudget,\n max_matches,\n )\n return {\n trace_id: trace.trace_id,\n span_id: span.span_id,\n hits: localHits.records,\n total_matches: localHits.total,\n has_more: localHits.total > localHits.records.length,\n }\n }\n\n // ─── Index building ────────────────────────────────────────────────\n\n /** Force the index to materialise. Useful to amortise startup cost\n * before the first agent call. */\n async ensureIndexed(): Promise<void> {\n await this.index()\n }\n\n private async buffer(): Promise<Buffer> {\n if (!this.bufferPromise) {\n this.bufferPromise = readFile(this.path)\n }\n return this.bufferPromise\n }\n\n private async index(): Promise<DatasetIndex> {\n if (!this.indexPromise) {\n this.indexPromise = this.buildIndex()\n }\n return this.indexPromise\n }\n\n private async buildIndex(): Promise<DatasetIndex> {\n let buf: Buffer\n try {\n buf = await this.buffer()\n } catch (err) {\n const stats = await stat(this.path).catch(() => null)\n if (!stats) {\n throw new TraceFileMissingError(this.path)\n }\n throw err\n }\n\n const byTrace = new Map<string, TraceIndexEntry>()\n let cursor = 0\n while (cursor < buf.length) {\n const newlineIndex = buf.indexOf(0x0a, cursor) // \\n\n const lineEnd = newlineIndex === -1 ? buf.length : newlineIndex\n const lineLength = lineEnd - cursor\n if (lineLength === 0) {\n cursor = lineEnd + 1\n continue\n }\n const lineSlice = buf.subarray(cursor, lineEnd).toString('utf8')\n const lineOffset = cursor\n cursor = lineEnd + 1\n\n let parsed: unknown\n try {\n parsed = JSON.parse(lineSlice)\n } catch {\n // Skip malformed lines silently. The agent shouldn't see them\n // but we don't want one bad line to nuke an entire dataset.\n continue\n }\n if (!parsed || typeof parsed !== 'object') continue\n const span = projectOtlpFlatLine(parsed as Record<string, unknown>)\n if (!span) continue\n\n let entry = byTrace.get(span.trace_id)\n if (!entry) {\n entry = {\n trace_id: span.trace_id,\n service_name: span.service_name,\n agent_name: span.agent_name,\n span_count: 0,\n has_errors: false,\n start_time: span.start_time,\n end_time: span.end_time,\n duration_ms: 0,\n raw_jsonl_bytes: 0,\n models: new Set(),\n tools: new Set(),\n spans: [],\n }\n byTrace.set(span.trace_id, entry)\n } else {\n // Pin the trace's service/agent to the first AGENT span we\n // Prefer the first agent/service fields that appear in the trace.\n if (!entry.service_name && span.service_name) entry.service_name = span.service_name\n if (!entry.agent_name && span.agent_name) entry.agent_name = span.agent_name\n }\n\n const indexEntry: SpanIndexEntry = {\n span_id: span.span_id,\n parent_span_id: span.parent_span_id,\n name: span.name,\n kind: span.kind,\n start_time: span.start_time,\n end_time: span.end_time,\n duration_ms: span.duration_ms,\n status: span.status,\n status_message: span.status_message,\n service_name: span.service_name,\n agent_name: span.agent_name,\n model_name: span.model_name,\n tool_name: span.tool_name,\n line_byte_offset: lineOffset,\n line_byte_length: lineLength,\n }\n entry.spans.push(indexEntry)\n entry.span_count += 1\n entry.raw_jsonl_bytes += lineLength + 1 // +1 newline byte\n if (span.status === 'ERROR') entry.has_errors = true\n if (span.start_time < entry.start_time) entry.start_time = span.start_time\n if (span.end_time > entry.end_time) entry.end_time = span.end_time\n if (span.model_name) entry.models.add(span.model_name)\n if (span.tool_name) entry.tools.add(span.tool_name)\n }\n\n // Compute trace duration once, sort spans by start time for\n // stable iteration.\n let totalRawBytes = 0\n for (const t of byTrace.values()) {\n totalRawBytes += t.raw_jsonl_bytes\n t.spans.sort(\n (a, b) =>\n a.start_time.localeCompare(b.start_time) || a.line_byte_offset - b.line_byte_offset,\n )\n t.duration_ms = Math.max(0, new Date(t.end_time).getTime() - new Date(t.start_time).getTime())\n }\n const sortedTraceIds = [...byTrace.keys()].sort()\n\n return { byTrace, totalRawBytes, sortedTraceIds }\n }\n\n // ─── Filter pipeline ───────────────────────────────────────────────\n\n private async matchedTraces(\n idx: DatasetIndex,\n filters: TraceAnalystFilters | undefined,\n ): Promise<TraceIndexEntry[]> {\n const traces = idx.sortedTraceIds.map((id) => idx.byTrace.get(id)).filter(isPresent)\n if (!filters) return traces\n\n const indexedFiltered = traces.filter((t) => {\n if (filters.has_errors !== undefined && t.has_errors !== filters.has_errors) return false\n if (filters.service_names && filters.service_names.length > 0) {\n if (!t.service_name || !filters.service_names.includes(t.service_name)) return false\n }\n if (filters.agent_names && filters.agent_names.length > 0) {\n if (!t.agent_name || !filters.agent_names.includes(t.agent_name)) return false\n }\n if (filters.model_names && filters.model_names.length > 0) {\n if (![...t.models].some((m) => filters.model_names!.includes(m))) return false\n }\n if (filters.tool_names && filters.tool_names.length > 0) {\n if (![...t.tools].some((tn) => filters.tool_names!.includes(tn))) return false\n }\n if (filters.start_time_after && t.start_time < filters.start_time_after) return false\n if (filters.start_time_before && t.start_time > filters.start_time_before) return false\n return true\n })\n\n if (!filters.regex_pattern) return indexedFiltered\n\n // Opt-in raw-bytes scan — only over the already-narrowed set.\n const re = compileSearchRegex(filters.regex_pattern)\n const buf = await this.buffer()\n const out: TraceIndexEntry[] = []\n for (const t of indexedFiltered) {\n let matched = false\n for (const s of t.spans) {\n const slice = buf.subarray(s.line_byte_offset, s.line_byte_offset + s.line_byte_length)\n // Buffer.toString allocates; tolerate it because regex_pattern\n // is opt-in. Future optimisation: byte-level fast-path for\n // ASCII-only patterns.\n if (re.test(slice.toString('utf8'))) {\n matched = true\n break\n }\n }\n if (matched) out.push(t)\n }\n return out\n }\n\n private toSummary(t: TraceIndexEntry): TraceAnalystTraceSummary {\n return {\n trace_id: t.trace_id,\n service_name: t.service_name,\n agent_name: t.agent_name,\n span_count: t.span_count,\n has_errors: t.has_errors,\n start_time: t.start_time,\n end_time: t.end_time,\n duration_ms: t.duration_ms,\n raw_jsonl_bytes: t.raw_jsonl_bytes,\n models: [...t.models].sort(),\n tools: [...t.tools].sort(),\n }\n }\n\n // ─── Span projection (lazy attribute reads) ────────────────────────\n\n private async projectSpan(\n buf: Buffer,\n trace_id: string,\n s: SpanIndexEntry,\n perAttrCap: number,\n ): Promise<TraceAnalystSpan> {\n const slice = buf\n .subarray(s.line_byte_offset, s.line_byte_offset + s.line_byte_length)\n .toString('utf8')\n let raw: Record<string, unknown> = {}\n try {\n const parsed = JSON.parse(slice)\n if (parsed && typeof parsed === 'object') raw = parsed as Record<string, unknown>\n } catch {\n // Should not happen — index pre-validated.\n }\n const attrs = extractOtlpAttributes(raw)\n const projected: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(attrs)) {\n if (typeof v === 'string') {\n const trunc = truncateForBudget(v, perAttrCap)\n if (trunc !== v) trackTruncation(this)\n projected[k] = trunc\n } else if (Array.isArray(v) || (v && typeof v === 'object')) {\n const json = JSON.stringify(v)\n const trunc = truncateForBudget(json, perAttrCap)\n if (trunc !== json) {\n trackTruncation(this)\n projected[k] = trunc\n } else {\n projected[k] = v\n }\n } else {\n projected[k] = v\n }\n }\n return {\n trace_id,\n span_id: s.span_id,\n parent_span_id: s.parent_span_id,\n name: s.name,\n kind: s.kind,\n start_time: s.start_time,\n end_time: s.end_time,\n duration_ms: s.duration_ms,\n status: s.status,\n status_message: s.status_message,\n service_name: s.service_name,\n agent_name: s.agent_name,\n model_name: s.model_name,\n tool_name: s.tool_name,\n attributes: projected,\n }\n }\n\n private buildOversizedSummary(\n t: TraceIndexEntry,\n span_response_bytes_max: number,\n ): ViewTraceOversized {\n const counts = new Map<string, number>()\n let errorCount = 0\n for (const s of t.spans) {\n counts.set(s.name, (counts.get(s.name) ?? 0) + 1)\n if (s.status === 'ERROR') errorCount += 1\n }\n const top = [...counts.entries()].sort((a, b) => b[1] - a[1]).slice(0, 20)\n return {\n span_count: t.span_count,\n top_span_names: top,\n span_response_bytes_max,\n error_span_count: errorCount,\n }\n }\n\n private async scanSpanForMatches(\n buf: Buffer,\n trace_id: string,\n s: SpanIndexEntry,\n re: RegExp,\n textBudget: number,\n recordCap: number,\n ): Promise<{ records: SpanMatchRecord[]; total: number; hasMore: boolean }> {\n // We scan against the original raw JSONL slice for each span and\n // record byte positions; the matched_text + context window is\n // truncated to `textBudget` bytes per record so total tool output\n // stays bounded even if hits cluster.\n const slice = buf\n .subarray(s.line_byte_offset, s.line_byte_offset + s.line_byte_length)\n .toString('utf8')\n const records: SpanMatchRecord[] = []\n const globalRe = new RegExp(re.source, re.flags.includes('g') ? re.flags : `${re.flags}g`)\n let total = 0\n let hasMore = false\n let m: RegExpExecArray | null = globalRe.exec(slice)\n while (m !== null) {\n total += 1\n if (m.index === globalRe.lastIndex) globalRe.lastIndex += 1 // zero-width guard\n if (records.length >= recordCap) {\n hasMore = true\n break\n }\n const before = slice.slice(Math.max(0, m.index - textBudget / 2), m.index)\n const after = slice.slice(\n m.index + m[0].length,\n m.index + m[0].length + Math.floor(textBudget / 2),\n )\n records.push({\n trace_id,\n span_id: s.span_id,\n span_name: s.name,\n span_kind: s.kind,\n attribute_path: bestAttributePathForOffset(slice, m.index) ?? 'span.raw',\n matched_text: truncateForBudget(m[0], textBudget),\n context_before: truncateForBudget(before, textBudget),\n context_after: truncateForBudget(after, textBudget),\n match_offset: m.index,\n })\n m = globalRe.exec(slice)\n }\n return { records, total, hasMore }\n }\n}\n\n// ─── Errors ──────────────────────────────────────────────────────────\n\nexport class TraceFileMissingError extends NotFoundError {\n constructor(path: string) {\n super(`trace file not found: ${path}`)\n }\n}\nexport class TraceNotFoundError extends NotFoundError {\n readonly trace_id: string\n constructor(trace_id: string) {\n super(`trace not found: ${trace_id}`)\n this.trace_id = trace_id\n }\n}\nexport class SpanNotFoundError extends NotFoundError {\n readonly trace_id: string\n readonly span_id: string\n constructor(trace_id: string, span_id: string) {\n super(`span ${span_id} not found in trace ${trace_id}`)\n this.trace_id = trace_id\n this.span_id = span_id\n }\n}\n\n// ─── OTLP shape readers ──────────────────────────────────────────────\n//\n// The per-line projection lives in `./otlp-span` so the index here and\n// `otlpToRunRecords` read the same vocabulary off the same parser.\n\nfunction isPresent<T>(v: T | undefined): v is T {\n return v !== undefined\n}\n\n// Truncation counter — module-private, lets viewSpans report the\n// number of attribute fields it had to truncate without threading\n// a counter through every call.\nconst truncationCounters = new WeakMap<OtlpFileTraceStore, { value: number }>()\n\nfunction trackTruncation(store: OtlpFileTraceStore): void {\n let c = truncationCounters.get(store)\n if (!c) {\n c = { value: 0 }\n truncationCounters.set(store, c)\n }\n c.value += 1\n}\n\nfunction truncationCounter(store: OtlpFileTraceStore): { delta(): number } {\n const before = truncationCounters.get(store)?.value ?? 0\n return {\n delta() {\n const after = truncationCounters.get(store)?.value ?? 0\n return after - before\n },\n }\n}\n\n/**\n * Best-effort: locate the JSON path for the substring at `offset` in\n * a single span's JSONL slice. We walk the parsed JSON structurally\n * and return the dotted path when we find a string field whose\n * serialised form contains `offset`. Returns `null` if the offset\n * doesn't fall inside a recognisable string field.\n */\nfunction bestAttributePathForOffset(slice: string, offset: number): string | null {\n // The slice contains '\"key\":\"value...\"' — find the nearest '\"'\n // wrapping `offset` and walk back to a key. This is heuristic but\n // bounded by the span line length, not the whole file.\n let i = offset\n while (i > 0 && slice[i] !== '\"') i -= 1\n if (i <= 0) return null\n // Scan backwards for the preceding '\"': pattern is \"key\":\"value\"\n let j = i - 1\n while (j > 0 && slice[j] !== ':') j -= 1\n if (j <= 0) return null\n // Find the key: walk back from `:` to the matching closing '\"' then to opening '\"'.\n let k = j - 1\n while (k > 0 && slice[k] !== '\"') k -= 1\n let l = k - 1\n while (l > 0 && slice[l] !== '\"') l -= 1\n if (l <= 0) return null\n return slice.slice(l + 1, k)\n}\n\n// ─── Error-cluster extraction ────────────────────────────────────────\n//\n// Deterministic failure-coverage population. The error-span loop in\n// getOverview already visits every ERROR span; bucketing them by a\n// normalized status_message signature turns \"N error spans\" into \"K\n// distinct failure modes\" — the checklist an analyst must close. No LLM.\n\nconst ERROR_CLUSTER_MAX = 50\nconst ERROR_CLUSTER_EXEMPLARS = 5\nconst SIGNATURE_MAX_CHARS = 160\n\ninterface ErrorClusterAccumulator {\n signature: string\n sample: string\n traceIds: Set<string>\n spanIds: string[]\n spanCount: number\n spanNames: Map<string, number>\n toolNames: Map<string, number>\n}\n\n/** Collapse volatile tokens so semantically identical failures share a key:\n * hex/uuid ids → <id>, numbers → #, quoted/abs paths → <path>, durations →\n * <dur>, whitespace collapsed. Empty/absent messages fall back to the span\n * name so a no-message error still forms a real cluster. */\nfunction normalizeErrorSignature(message: string | undefined, spanName: string): string {\n const raw = (message ?? '').trim()\n const base = raw.length > 0 ? raw : `(${spanName || 'error'} — no message)`\n const norm = base\n .replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi, '<id>')\n .replace(/\\b[0-9a-f]{12,}\\b/gi, '<id>')\n .replace(/(?:\\/[\\w.\\-@]+){2,}/g, '<path>')\n .replace(/\\b\\d+(?:\\.\\d+)?(ms|s|m|h|kb|mb|gb)?\\b/gi, (_m, u) => (u ? `#${u}` : '#'))\n .replace(/\\s+/g, ' ')\n .trim()\n return norm.length > SIGNATURE_MAX_CHARS ? `${norm.slice(0, SIGNATURE_MAX_CHARS)}…` : norm\n}\n\nfunction bump(map: Map<string, number>, key: string | null): void {\n if (!key) return\n map.set(key, (map.get(key) ?? 0) + 1)\n}\n\nfunction topKey(map: Map<string, number>): string | null {\n let best: string | null = null\n let bestN = 0\n for (const [k, n] of map)\n if (n > bestN) {\n best = k\n bestN = n\n }\n return best\n}\n\nfunction accumulateErrorCluster(\n clusters: Map<string, ErrorClusterAccumulator>,\n traceId: string,\n span: SpanIndexEntry,\n): void {\n const signature = normalizeErrorSignature(span.status_message, span.name)\n let acc = clusters.get(signature)\n if (!acc) {\n acc = {\n signature,\n sample: (span.status_message ?? span.name ?? '').slice(0, 500),\n traceIds: new Set(),\n spanIds: [],\n spanCount: 0,\n spanNames: new Map(),\n toolNames: new Map(),\n }\n clusters.set(signature, acc)\n }\n acc.traceIds.add(traceId)\n acc.spanCount += 1\n if (acc.spanIds.length < ERROR_CLUSTER_EXEMPLARS && !acc.spanIds.includes(span.span_id)) {\n acc.spanIds.push(span.span_id)\n }\n bump(acc.spanNames, span.name)\n bump(acc.toolNames, span.tool_name)\n}\n\nfunction finalizeErrorClusters(\n clusters: Map<string, ErrorClusterAccumulator>,\n errorTraceCount: number,\n): ErrorCluster[] {\n const out = [...clusters.values()].map(\n (acc): ErrorCluster => ({\n signature: acc.signature,\n status_message_sample: acc.sample,\n span_name: topKey(acc.spanNames),\n tool_name: topKey(acc.toolNames),\n trace_count: acc.traceIds.size,\n span_count: acc.spanCount,\n prevalence: errorTraceCount > 0 ? acc.traceIds.size / errorTraceCount : 0,\n exemplar_trace_ids: [...acc.traceIds].slice(0, ERROR_CLUSTER_EXEMPLARS),\n exemplar_span_ids: acc.spanIds.slice(0, ERROR_CLUSTER_EXEMPLARS),\n }),\n )\n out.sort((a, b) => b.trace_count - a.trace_count || b.span_count - a.span_count)\n return out.slice(0, ERROR_CLUSTER_MAX)\n}\n","/**\n * `TraceAnalysisStore` — read-side interface the trace-analyst calls\n * through. Six operations, all bounded:\n *\n * - `getOverview(filters?)` — dataset rollup + sample trace ids.\n * - `queryTraces(filters?, limit, offset)` — paginated summaries.\n * - `countTraces(filters?)` — cheap count without materialisation.\n * - `viewTrace(trace_id, perAttrCap)` — full span list, oversized → summary.\n * - `viewSpans(trace_id, span_ids, perAttrCap)` — surgical span fetch.\n * - `searchTrace(trace_id, regex, max_matches)` — bounded regex hits.\n * - `searchSpan(trace_id, span_id, regex, max_matches)` — single-span search.\n *\n * Multiple implementations ship in the core (`OtlpFileTraceStore`).\n * Downstream callers can supply their own — e.g. a DuckDB-backed\n * adapter or an in-memory adapter for tests — by implementing this\n * interface.\n *\n * Filters compose with AND semantics. Empty/undefined fields impose\n * no constraint. `regex_pattern` is the only opt-in raw-bytes scan —\n * implementations may skip it via `count`/`overview` when not set.\n */\n\nimport type {\n DatasetOverview,\n QueryTracesPage,\n SearchSpanResult,\n SearchTraceResult,\n TraceAnalystFilters,\n ViewSpansResult,\n ViewTraceResult,\n} from './types'\n\nexport interface TraceAnalysisStore {\n getOverview(filters?: TraceAnalystFilters): Promise<DatasetOverview>\n\n queryTraces(opts: {\n filters?: TraceAnalystFilters\n limit: number\n offset?: number\n }): Promise<QueryTracesPage>\n\n countTraces(filters?: TraceAnalystFilters): Promise<number>\n\n viewTrace(opts: {\n trace_id: string\n /** Override per-attribute byte cap. Defaults to discovery budget. */\n per_attribute_byte_cap?: number\n }): Promise<ViewTraceResult>\n\n viewSpans(opts: {\n trace_id: string\n span_ids: readonly string[]\n /** Override per-attribute byte cap. Defaults to surgical budget. */\n per_attribute_byte_cap?: number\n }): Promise<ViewSpansResult>\n\n searchTrace(opts: {\n trace_id: string\n regex_pattern: string\n /** Hard cap on matches returned. Default 50. */\n max_matches?: number\n }): Promise<SearchTraceResult>\n\n searchSpan(opts: {\n trace_id: string\n span_id: string\n regex_pattern: string\n max_matches?: number\n }): Promise<SearchSpanResult>\n}\n\n/** Compile a regex with the same anchoring + flags semantics across\n * implementations. Throws on invalid pattern — callers should surface\n * that to the agent so it can refine instead of looping. */\nexport function compileSearchRegex(pattern: string): RegExp {\n let source = pattern\n let flags = 'm'\n if (source.startsWith('(?i)')) {\n source = source.slice(4)\n flags += 'i'\n }\n return new RegExp(source, flags)\n}\n\n/** Truncate string payload deterministically for tool responses.\n * Marker is parseable so downstream consumers can detect truncation\n * and decide whether to fetch surgically. */\nexport function truncateForBudget(value: string, byteCap: number): string {\n // We measure UTF-8 byte length conservatively via Buffer.byteLength;\n // for predictability the truncation point is in CHARS, never inside\n // a code point.\n const original = Buffer.byteLength(value, 'utf8')\n if (original <= byteCap) return value\n\n // Step back from the cap until we're at a valid char boundary.\n // Slice by char count proportional to byte ratio, then re-measure.\n const ratio = byteCap / original\n let cut = Math.max(0, Math.floor(value.length * ratio))\n while (cut > 0 && Buffer.byteLength(value.slice(0, cut), 'utf8') > byteCap) {\n cut -= 1\n }\n return `${value.slice(0, cut)}\\n[trace-analyst truncated: original ${original} bytes]`\n}\n","/**\n * Trace-analyst tool surface — six namespaced AxFunctions the analyst\n * agent calls from generated JS code via `traces.<name>(...)`.\n *\n * Discovery → narrow → deep-read protocol. Tool names + ordering\n * support RLM discovery:\n *\n * 1. `getDatasetOverview` (cheap) — first call, sizes the dataset\n * 2. `queryTraces` — paginated summaries with `raw_jsonl_bytes`\n * 3. `countTraces` — cheap pre-flight before regex\n * 4. `viewTrace` — full span list, oversized → summary\n * 5. `viewSpans` — surgical 16KB-cap reads\n * 6. `searchTrace` / `searchSpan` — bounded regex hits\n *\n * Failure mode. Tool handlers throw on bad input (invalid trace ids,\n * out-of-range pagination, malformed regex). Ax converts thrown errors\n * into actor-visible `[ERROR]` strings so the analyst can adjust on\n * the next turn instead of looping.\n */\n\nimport type { AxFunction } from '@ax-llm/ax'\nimport { f, fn } from '@ax-llm/ax'\n\nimport type { TraceAnalysisStore } from './store'\nimport type { TraceAnalystFilters } from './types'\n\nconst NAMESPACE = 'traces'\n\ninterface BuildTraceAnalystToolsOpts {\n store: TraceAnalysisStore\n /** Override the default sample-trace-id slot count (20). Mostly for tests. */\n sampleTraceLimit?: number\n}\n\nconst filtersField = f\n .json('Filter set. ALL fields are AND-composed. Leave empty to scan everything.')\n .optional()\n\n/**\n * Build the trace-analyst function set. Pass the result into\n * `agent(...).functions.local`.\n */\nexport function buildTraceAnalystTools(opts: BuildTraceAnalystToolsOpts): AxFunction[] {\n const { store } = opts\n\n const getDatasetOverview = fn('getDatasetOverview')\n .description(\n 'Dataset rollup: total traces, raw_jsonl_bytes, services, agents, ' +\n 'models, tools, and sample_trace_ids (real ids passable to ' +\n 'view/search). Always call this FIRST without a regex_pattern.',\n )\n .namespace(NAMESPACE)\n .arg('filters', filtersField)\n .returns(f.json('DatasetOverview'))\n .handler(async ({ filters }) => store.getOverview(parseFilters(filters)))\n .build()\n\n const queryTraces = fn('queryTraces')\n .description(\n 'Paginated trace summaries. Each summary carries raw_jsonl_bytes — ' +\n 'use it to size traces BEFORE calling viewTrace. Narrow with indexed ' +\n 'filters before adding regex_pattern.',\n )\n .namespace(NAMESPACE)\n .arg('filters', filtersField)\n .arg('limit', f.number('Page size, 1..200'))\n .arg('offset', f.number('Page offset; default 0').optional())\n .returns(f.json('QueryTracesPage'))\n .handler(async ({ filters, limit, offset }) =>\n store.queryTraces({\n filters: parseFilters(filters),\n limit: assertPageLimit(limit),\n offset: assertOffset(offset),\n }),\n )\n .build()\n\n const countTraces = fn('countTraces')\n .description(\n 'Count traces matching `filters`. Use as a cheap pre-flight ' +\n 'before opting into a regex_pattern scan.',\n )\n .namespace(NAMESPACE)\n .arg('filters', filtersField)\n .returns(f.number('count'))\n .handler(async ({ filters }) => store.countTraces(parseFilters(filters)))\n .build()\n\n const viewTrace = fn('viewTrace')\n .description(\n 'Return ALL spans for a single trace, with each attribute capped at ' +\n '~4KB. If the response would exceed the per-call ceiling the result ' +\n 'carries `oversized` instead of `spans` — DO NOT retry with the same ' +\n 'trace_id; switch to searchTrace / viewSpans.',\n )\n .namespace(NAMESPACE)\n .arg('trace_id', f.string('Real trace id from a prior overview/query'))\n .returns(f.json('ViewTraceResult'))\n .handler(async ({ trace_id }) =>\n store.viewTrace({ trace_id: assertString(trace_id, 'trace_id') }),\n )\n .build()\n\n const viewSpans = fn('viewSpans')\n .description(\n 'Surgical read of specific spans within a trace, with each ' +\n 'attribute capped at ~16KB (4× the discovery cap). Use after ' +\n 'searchTrace narrows to specific span_ids.',\n )\n .namespace(NAMESPACE)\n .arg('trace_id', f.string('Real trace id'))\n .arg('span_ids', f.string('Span ids to fetch').array())\n .returns(f.json('ViewSpansResult'))\n .handler(async ({ trace_id, span_ids }) =>\n store.viewSpans({\n trace_id: assertString(trace_id, 'trace_id'),\n span_ids: assertStringArray(span_ids, 'span_ids'),\n }),\n )\n .build()\n\n const searchTrace = fn('searchTrace')\n .description(\n 'Regex search across all spans of one trace. Returns ' +\n '`{trace_id, hits: SpanMatchRecord[], total_matches, has_more}`. ' +\n '**Iterate `result.hits`, NOT `result.matches`** — the field is ' +\n '`hits`. Each hit has `{span_id, span_name, span_kind, ' +\n 'attribute_path, matched_text, context_before, context_after, ' +\n 'match_offset}`. Bounded regardless of trace size by max_matches ' +\n '(1..500, default 50). If has_more=true, REFINE the regex rather ' +\n 'than blindly raising max_matches.',\n )\n .namespace(NAMESPACE)\n .arg('trace_id', f.string('Real trace id'))\n .arg('regex_pattern', f.string('JS-compatible regex, multiline'))\n .arg('max_matches', f.number('Max records returned, 1..500; default 50').optional())\n .returns(f.json('SearchTraceResult'))\n .handler(async ({ trace_id, regex_pattern, max_matches }) =>\n store.searchTrace({\n trace_id: assertString(trace_id, 'trace_id'),\n regex_pattern: assertRegex(regex_pattern),\n max_matches: assertMaxMatches(max_matches),\n }),\n )\n .build()\n\n const searchSpan = fn('searchSpan')\n .description(\n 'Regex search inside a single span. Use when viewSpans returned ' +\n 'a 16KB-truncated payload and you need to narrow further. ' +\n 'Returns `{trace_id, span_id, hits: SpanMatchRecord[], ' +\n 'total_matches, has_more}` — iterate `result.hits`, NOT ' +\n '`result.matches`.',\n )\n .namespace(NAMESPACE)\n .arg('trace_id', f.string('Real trace id'))\n .arg('span_id', f.string('Real span id within trace'))\n .arg('regex_pattern', f.string('JS-compatible regex, multiline'))\n .arg('max_matches', f.number('Max records, 1..500; default 50').optional())\n .returns(f.json('SearchSpanResult'))\n .handler(async ({ trace_id, span_id, regex_pattern, max_matches }) =>\n store.searchSpan({\n trace_id: assertString(trace_id, 'trace_id'),\n span_id: assertString(span_id, 'span_id'),\n regex_pattern: assertRegex(regex_pattern),\n max_matches: assertMaxMatches(max_matches),\n }),\n )\n .build()\n\n return [\n getDatasetOverview,\n queryTraces,\n countTraces,\n viewTrace,\n viewSpans,\n searchTrace,\n searchSpan,\n ]\n}\n\n/**\n * Convenience: same shape as `buildTraceAnalystTools` but returns the\n * grouped form expected when registering trace tools alongside other\n * agent function modules. */\nexport function traceAnalystFunctionGroup(opts: BuildTraceAnalystToolsOpts): {\n namespace: string\n title: string\n selectionCriteria: string\n description: string\n functions: AxFunction[]\n} {\n return {\n namespace: NAMESPACE,\n title: 'Trace Analysis',\n selectionCriteria: 'Use for any inspection of OTLP-shaped trace data.',\n description:\n 'Discovery → narrow → deep-read tools over a JSONL trace dataset. ' +\n 'Always call getDatasetOverview first.',\n functions: buildTraceAnalystTools(opts),\n }\n}\n\n// ─── Argument validation ─────────────────────────────────────────────\n\nfunction parseFilters(input: unknown): TraceAnalystFilters | undefined {\n if (input == null) return undefined\n if (typeof input !== 'object' || Array.isArray(input)) {\n throw new TypeError(`filters must be an object, got ${typeof input}`)\n }\n const f = input as Record<string, unknown>\n const out: TraceAnalystFilters = {}\n if (typeof f.has_errors === 'boolean') out.has_errors = f.has_errors\n out.service_names = stringArrayOrUndefined(f.service_names, 'service_names')\n out.agent_names = stringArrayOrUndefined(f.agent_names, 'agent_names')\n out.model_names = stringArrayOrUndefined(f.model_names, 'model_names')\n out.tool_names = stringArrayOrUndefined(f.tool_names, 'tool_names')\n if (typeof f.start_time_after === 'string') out.start_time_after = f.start_time_after\n if (typeof f.start_time_before === 'string') out.start_time_before = f.start_time_before\n if (typeof f.regex_pattern === 'string') {\n if (f.regex_pattern.length === 0) {\n throw new TypeError('filters.regex_pattern cannot be empty')\n }\n out.regex_pattern = f.regex_pattern\n }\n return out\n}\n\nfunction stringArrayOrUndefined(v: unknown, label: string): string[] | undefined {\n if (v === undefined || v === null) return undefined\n if (!Array.isArray(v)) throw new TypeError(`${label} must be an array of strings`)\n if (v.some((x) => typeof x !== 'string')) {\n throw new TypeError(`${label} entries must be strings`)\n }\n return v as string[]\n}\n\nfunction assertPageLimit(limit: unknown): number {\n if (typeof limit !== 'number' || !Number.isInteger(limit) || limit < 1 || limit > 200) {\n throw new RangeError(`limit must be an integer 1..200`)\n }\n return limit\n}\nfunction assertOffset(offset: unknown): number | undefined {\n if (offset === undefined) return undefined\n if (typeof offset !== 'number' || !Number.isInteger(offset) || offset < 0) {\n throw new RangeError(`offset must be a non-negative integer`)\n }\n return offset\n}\nfunction assertRegex(pattern: unknown): string {\n if (typeof pattern !== 'string' || pattern.length === 0) {\n throw new TypeError(`regex_pattern must be a non-empty string`)\n }\n // Compile-and-discard to fail fast — store will recompile, but we\n // want a deterministic error from the agent's side rather than\n // a downstream exception.\n // eslint-disable-next-line no-new\n new RegExp(pattern, 'm')\n return pattern\n}\nfunction assertMaxMatches(n: unknown): number | undefined {\n if (n === undefined) return undefined\n if (typeof n !== 'number' || !Number.isInteger(n) || n < 1 || n > 500) {\n throw new RangeError(`max_matches must be an integer 1..500`)\n }\n return n\n}\n\nfunction assertString(v: unknown, label: string): string {\n if (typeof v !== 'string' || v.length === 0) {\n throw new TypeError(`${label} must be a non-empty string`)\n }\n return v\n}\n\nfunction assertStringArray(v: unknown, label: string): string[] {\n if (!Array.isArray(v)) throw new TypeError(`${label} must be an array of strings`)\n if (v.some((x) => typeof x !== 'string')) {\n throw new TypeError(`${label} entries must be strings`)\n }\n return v as string[]\n}\n"],"mappings":"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","names":["f","f"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/trace-analyst/hook.ts","../src/trace-analyst/insights.ts","../src/trace-analyst/otlp-flatten.ts","../src/trace-analyst/otlp-to-run-records.ts","../src/trace/store.ts","../src/trace/extract-usage.ts","../src/trace/capture-fetch.ts","../src/trace/otel.ts","../src/trace/otel-bridge.ts","../src/trace/otel-export.ts","../src/trace/store-to-otlp.ts","../src/replay.ts"],"sourcesContent":["/**\n * Trace-analyst auto-execution hook.\n *\n * Wires `analyzeTraces` into a `TraceEmitter`'s `onRunComplete` so a\n * direct matrix run produces an analysis artifact without an out-of-band\n * step. Designed for the case where the consumer reports \"the analyst\n * never ran\" — the cause is almost always orchestration, not the analyst.\n *\n * Usage:\n *\n * const emitter = new TraceEmitter(store, {\n * onRunComplete: [traceAnalystOnRunComplete({ analyze: opts, save })],\n * })\n *\n * Hooks are best-effort by default — they never crash the underlying run.\n * The caller decides whether to gate the run on the analysis result via\n * the `gateOn` callback.\n */\n\nimport type { RunCompleteHook, RunCompleteHookContext } from '../trace/emitter'\nimport { type AnalyzeTracesOptions, type AnalyzeTracesResult, analyzeTraces } from './analyst'\n\nexport interface TraceAnalystHookOptions {\n /**\n * Options forwarded to `analyzeTraces`. The hook supplies the question\n * if you don't pass one — defaulting to a launch-grade prompt that asks\n * for failure modes, surprising findings, and a recommendation.\n */\n analyze: Omit<AnalyzeTracesOptions, 'source'> & { source?: AnalyzeTracesOptions['source'] }\n /**\n * Override the question. The default is intentionally generic:\n * \"Summarise what happened in this run, surface any failure modes,\n * surprising findings, or evidence the verdict is wrong.\"\n */\n question?: string\n /**\n * Persist the result. The hook calls this with the analysis output and\n * the run context. Common implementations write to a TraceAnalysisStore\n * or append to a per-run JSONL.\n */\n save?: (result: AnalyzeTracesResult, ctx: RunCompleteHookContext) => Promise<void>\n /**\n * Predicate gating execution per run. Default: every completed run.\n * Use to skip aborted runs, debug runs, or runs without LLM activity.\n */\n shouldRun?: (ctx: RunCompleteHookContext) => boolean\n /**\n * Optional gate: if set and returns false, the hook records the failure\n * as a log event on the run instead of staying quiet. The caller can\n * then trigger downstream alerts off `analyst_gate_failed` log events.\n */\n gateOn?: (result: AnalyzeTracesResult, ctx: RunCompleteHookContext) => boolean\n}\n\nconst DEFAULT_QUESTION =\n \"Summarise what happened in this run. Surface any failure modes, surprising findings, or evidence that the run's verdict is wrong.\"\n\nexport function traceAnalystOnRunComplete(opts: TraceAnalystHookOptions): RunCompleteHook {\n return async (ctx: RunCompleteHookContext) => {\n if (opts.shouldRun && !opts.shouldRun(ctx)) return\n const source = opts.analyze.source\n if (source === undefined) {\n // The analyst needs a source. If the caller didn't supply one we don't\n // run — but we do leave a breadcrumb so the absence is visible.\n await ctx.store.appendEvent({\n eventId: `analyst-skip-${ctx.runId}`,\n runId: ctx.runId,\n kind: 'log',\n timestamp: Date.now(),\n payload: { source: 'trace_analyst_hook', reason: 'no source configured' },\n })\n return\n }\n const result = await analyzeTraces({ question: opts.question ?? DEFAULT_QUESTION }, {\n ...opts.analyze,\n source,\n } as AnalyzeTracesOptions)\n if (opts.save) await opts.save(result, ctx)\n if (opts.gateOn && !opts.gateOn(result, ctx)) {\n await ctx.store.appendEvent({\n eventId: `analyst-gate-${ctx.runId}`,\n runId: ctx.runId,\n kind: 'log',\n timestamp: Date.now(),\n payload: {\n source: 'trace_analyst_hook',\n reason: 'analyst_gate_failed',\n findings: result.findings,\n },\n })\n }\n }\n}\n","export interface TraceInsightTask {\n id: string\n name: string\n prompt?: string\n difficulty?: string\n tags?: string[]\n outcome?: string\n score?: number\n gaps?: string[]\n}\n\nexport interface TraceInsightSuite {\n name: string\n collectionId?: string\n tasks: TraceInsightTask[]\n}\n\nexport interface TraceInsightFinding {\n kind: string\n severity?: string\n taskIds: string[]\n evidence?: string\n proposedFixClass?: string\n}\n\nexport interface TraceInsightQuestion {\n id: string\n question: string\n why: string\n}\n\nexport interface TraceInsightPanelRole {\n id: string\n name: string\n responsibility: string\n}\n\nexport interface TraceInsightPromptInput {\n suite: TraceInsightSuite\n findings?: TraceInsightFinding[]\n agent?: Record<string, unknown>\n totals?: Record<string, unknown>\n maxRepresentativeTraces?: number\n}\n\nexport interface TraceInsightContext {\n suite: TraceInsightSuite\n scope: string\n keywords: string[]\n questions: TraceInsightQuestion[]\n panel: TraceInsightPanelRole[]\n findings: TraceInsightFinding[]\n agent: Record<string, unknown> | null\n totals: Record<string, unknown> | null\n}\n\nexport interface TraceInsightQualityGate {\n id: string\n label: string\n passed: boolean\n severity: 'critical' | 'high' | 'medium' | 'low'\n detail: string\n}\n\nexport interface TraceInsightReadiness {\n score: number\n grade: 'external-ready' | 'internal-review' | 'raw-analysis'\n gates: TraceInsightQualityGate[]\n}\n\nconst DOMAIN_STOP_WORDS = new Set([\n 'and',\n 'advanced',\n 'app',\n 'build',\n 'create',\n 'easy',\n 'expert',\n 'extreme',\n 'for',\n 'from',\n 'hard',\n 'implementation',\n 'integrate',\n 'medium',\n 'project',\n 'task',\n 'the',\n 'this',\n 'with',\n 'workflow',\n])\n\nexport function tokenizeDomainWords(value: string): string[] {\n return [...value.matchAll(/[A-Za-z][A-Za-z0-9.+#-]{2,}/g)]\n .map((match) => match[0].toLowerCase())\n .filter((word) => !DOMAIN_STOP_WORDS.has(word))\n}\n\nexport function inferDomainKeywords(suite: TraceInsightSuite): string[] {\n const suiteWords = new Set(tokenizeDomainWords(`${suite.name} ${suite.collectionId ?? ''}`))\n const source = [\n suite.name,\n suite.collectionId ?? '',\n ...suite.tasks.flatMap((task) => [\n task.id,\n task.name,\n task.prompt ?? '',\n task.difficulty ?? '',\n ...(task.tags ?? []),\n ...(task.gaps ?? []),\n ]),\n ].join(' ')\n const counts = new Map<string, number>()\n for (const word of tokenizeDomainWords(source)) counts.set(word, (counts.get(word) ?? 0) + 1)\n return [...counts.entries()]\n .filter(([word, count]) => count >= 2 || suiteWords.has(word))\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .map(([word]) => word)\n .slice(0, 18)\n}\n\nexport function domainEvidencePattern(keywords: string[]): RegExp {\n const escaped = keywords\n .filter((keyword) => keyword.length >= 3)\n .map((keyword) => keyword.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n return escaped.length > 0\n ? new RegExp(`(?<![A-Za-z0-9])(?:${escaped.join('|')})(?![A-Za-z0-9])`, 'i')\n : /(?<![A-Za-z0-9])(?:sdk|api|css|dns|xml|provider|client|service|integration|webhook|transaction|auth|oauth|graphql|rest)(?![A-Za-z0-9])/i\n}\n\nexport function describeTraceInsightScope(suite: TraceInsightSuite): string {\n const taskLabel =\n suite.tasks.length === 1\n ? '1 implementation task'\n : `${suite.tasks.length} implementation tasks`\n const tags = new Map<string, number>()\n for (const task of suite.tasks) {\n for (const tag of task.tags ?? []) tags.set(tag, (tags.get(tag) ?? 0) + 1)\n }\n const topTags = [...tags.entries()]\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, 8)\n .map(([tag]) => tag)\n if (topTags.length > 0) return `${taskLabel} across ${topTags.join(', ')}.`\n const difficulties = [\n ...new Set(\n suite.tasks.map((task) => task.difficulty).filter((value): value is string => Boolean(value)),\n ),\n ].join(', ')\n return `${taskLabel} across ${difficulties || 'the selected benchmark scope'}.`\n}\n\nexport function planTraceInsightQuestions(input: TraceInsightPromptInput): TraceInsightQuestion[] {\n const hasFailures = input.suite.tasks.some((task) => task.outcome && task.outcome !== 'satisfied')\n const hasMultipleShots = input.suite.tasks.some((task) =>\n (task.gaps ?? []).some((gap) => /shot|review|retry|continue/i.test(gap)),\n )\n const questions: TraceInsightQuestion[] = [\n {\n id: 'execution-path',\n question: 'What did the worker actually do before the first meaningful implementation edit?',\n why: 'Separates grounded execution from polished but shallow output.',\n },\n {\n id: 'research-grounding',\n question:\n 'Did the worker inspect docs, source, examples, or package references before committing to an implementation path?',\n why: 'Identifies whether failures came from weak retrieval, weak examples, or premature coding.',\n },\n {\n id: 'domain-proof',\n question:\n 'Which tasks produced executable domain proof versus UI copy, placeholders, or inferred behavior?',\n why: 'Keeps product-quality claims tied to concrete evidence.',\n },\n {\n id: 'root-cause',\n question:\n 'For each major failure cluster, is the likely root cause prompt/scaffold, docs/examples, SDK/API ergonomics, evaluator, runtime, or model behavior?',\n why: 'Turns trace observations into actionable ownership.',\n },\n {\n id: 'evidence-quality',\n question:\n 'Which external-facing claims are directly supported by trace ids, span ids, verifier findings, reviewer notes, or generated code?',\n why: 'Prevents unsupported customer-report conclusions.',\n },\n ]\n if (hasMultipleShots) {\n questions.push({\n id: 'reviewer-lift',\n question: 'Where did reviewer feedback improve score, stall, or regress across shots?',\n why: 'Shows whether the driver loop is learning or merely repeating work.',\n })\n }\n if (hasFailures) {\n questions.push({\n id: 'optimization-targets',\n question:\n 'Which prompt, evaluator, scaffold, or workflow changes should feed the next GEPA/autoresearch optimization run?',\n why: 'Connects benchmark evidence to the optimization loop.',\n })\n }\n return questions\n}\n\nexport function buildTraceInsightContext(input: TraceInsightPromptInput): TraceInsightContext {\n return {\n suite: input.suite,\n scope: describeTraceInsightScope(input.suite),\n keywords: inferDomainKeywords(input.suite),\n questions: planTraceInsightQuestions(input),\n panel: defaultTraceInsightPanel(),\n findings: input.findings ?? [],\n agent: input.agent ?? null,\n totals: input.totals ?? null,\n }\n}\n\nexport function scoreTraceInsightReadiness(context: TraceInsightContext): TraceInsightReadiness {\n const failedTasks = context.suite.tasks.filter(\n (task) => task.outcome && task.outcome !== 'satisfied',\n )\n const findingTaskIds = new Set(context.findings.flatMap((finding) => finding.taskIds))\n const failedTasksWithFindings = failedTasks.filter((task) => findingTaskIds.has(task.id))\n const tasksWithGaps = context.suite.tasks.filter((task) => (task.gaps ?? []).length > 0)\n const gates: TraceInsightQualityGate[] = [\n {\n id: 'domain-context',\n label: 'Domain context inferred',\n passed: context.keywords.length > 0,\n severity: 'high',\n detail:\n context.keywords.length > 0\n ? `${context.keywords.length} domain terms inferred: ${context.keywords.slice(0, 8).join(', ')}`\n : 'No domain terms were inferred from suite, tasks, prompts, tags, or gaps.',\n },\n {\n id: 'panel-coverage',\n label: 'Analyst panel planned',\n passed: context.panel.length >= 4 && context.questions.length >= 5,\n severity: 'high',\n detail: `${context.panel.length} panel roles and ${context.questions.length} investigation questions planned.`,\n },\n {\n id: 'failure-coverage',\n label: 'Failures mapped to findings',\n passed:\n failedTasks.length === 0 || failedTasksWithFindings.length / failedTasks.length >= 0.5,\n severity: 'critical',\n detail:\n failedTasks.length === 0\n ? 'No failed tasks in suite.'\n : `${failedTasksWithFindings.length}/${failedTasks.length} failed tasks appear in finding clusters.`,\n },\n {\n id: 'gap-evidence',\n label: 'Task gaps captured',\n passed: failedTasks.length === 0 || tasksWithGaps.length / failedTasks.length >= 0.5,\n severity: 'medium',\n detail: `${tasksWithGaps.length} tasks include explicit evaluator or analyst gaps.`,\n },\n ]\n const penalty = gates.reduce((sum, gate) => {\n if (gate.passed) return sum\n if (gate.severity === 'critical') return sum + 35\n if (gate.severity === 'high') return sum + 20\n if (gate.severity === 'medium') return sum + 10\n return sum + 5\n }, 0)\n const score = Math.max(0, Math.min(1, 1 - penalty / 100))\n return {\n score,\n grade: score >= 0.9 ? 'external-ready' : score >= 0.7 ? 'internal-review' : 'raw-analysis',\n gates,\n }\n}\n\nexport function defaultTraceInsightPanel(): TraceInsightPanelRole[] {\n return [\n {\n id: 'trace-forensics',\n name: 'Trace Forensics',\n responsibility:\n 'Reconstruct what the worker did in order, including research, edits, reviewer interventions, verifier feedback, and stop reason.',\n },\n {\n id: 'root-cause',\n name: 'Root Cause',\n responsibility:\n 'Map failures to prompt/scaffold, docs/examples, SDK/API/product ergonomics, evaluator, runtime, or model behavior.',\n },\n {\n id: 'optimization',\n name: 'Optimization',\n responsibility:\n 'Identify prompt, reviewer, evaluator, scaffold, and GEPA/autoresearch changes that should be tested next.',\n },\n {\n id: 'external-evidence',\n name: 'External Evidence',\n responsibility:\n 'Separate customer-safe claims from internal harness findings and reject conclusions without task, trace, span, code, reviewer, or verifier evidence.',\n },\n ]\n}\n\nexport function buildTraceInsightPrompt(input: TraceInsightPromptInput): string {\n const context = buildTraceInsightContext(input)\n const maxRepresentativeTraces = input.maxRepresentativeTraces ?? 6\n return `Analyze this benchmark run and produce evidence-backed trace intelligence.\n\nAudience:\n- internal AI/product leadership\n- possible customer-facing report for ${input.suite.name}\n\nInvestigation plan:\n${context.questions.map((item, index) => `${index + 1}. ${item.question} (${item.why})`).join('\\n')}\n\nAnalyst panel:\n${context.panel.map((role) => `- ${role.name}: ${role.responsibility}`).join('\\n')}\n\nIf the task branches are independent, use subagents for the panel roles above and aggregate their findings. Do not run a panel role unless its answer will change the final report.\n\nRequired output:\n1. Executive verdict: what this run proves and does not prove.\n2. The investigation questions you answered and the evidence used.\n3. Failure taxonomy: agent prompting, evaluator/harness, docs/examples, SDK/API/product integration, infra.\n4. Evidence-backed examples with trace ids/task ids and concrete verifier findings.\n5. Highest-ROI fixes for the benchmark harness, prompt/GEPA optimization, and customer-facing product/docs surface.\n6. What is safe for an external report versus what must stay internal.\n7. One rerun plan that would validate lift after optimization.\n\nBudget:\n- Inspect the dataset overview, the failure summary, and at most ${maxRepresentativeTraces} representative traces.\n- Prefer traces named in the failure summary over broad exploration.\n- Do not do exhaustive trace sweeps.\n- Return the final report as soon as the taxonomy and examples are supported.\n\nRun summary:\n${JSON.stringify(\n {\n suite: input.suite.name,\n scope: context.scope,\n inferredKeywords: context.keywords,\n agent: context.agent,\n totals: context.totals,\n findings: context.findings.map((finding) => ({\n kind: finding.kind,\n severity: finding.severity,\n taskCount: finding.taskIds.length,\n proposedFixClass: finding.proposedFixClass,\n })),\n failures: input.suite.tasks\n .filter((task) => task.outcome && task.outcome !== 'satisfied')\n .map((task) => ({\n task: task.id,\n difficulty: task.difficulty,\n outcome: task.outcome,\n score: task.score,\n gaps: task.gaps ?? [],\n })),\n },\n null,\n 2,\n)}\n\nUse the trace tools. Do not invent facts. Cite task ids. Separate customer-facing claims from internal harness/model findings.`\n}\n","/**\n * `flattenOtlpExportToNdjson` — flatten an `OtlpExport` (the shape\n * `exportRunAsOtlp` produces) into the per-line JSON the analyst's\n * `OtlpFileTraceStore` index reads. Replaces three per-consumer OTLP\n * flatteners with one canonical projection.\n *\n * Pure function, no I/O — the caller does `.map(JSON.stringify).join('\\n')`\n * and writes the file (consumers want control over rotation + naming).\n */\n\nimport type { OtlpExport, OtlpSpan } from '../trace/otel'\n\nexport interface OtlpFlatLine {\n trace_id: string\n span_id: string\n parent_span_id: string | null\n name: string\n kind: string\n start_time: string\n end_time: string\n status: {\n code: 'STATUS_CODE_OK' | 'STATUS_CODE_ERROR' | 'STATUS_CODE_UNSET'\n message?: string\n }\n resource: { attributes: Record<string, string | number | boolean> }\n attributes: Record<string, string | number | boolean>\n events?: Array<{ name: string; timeUnixNano?: string; attributes?: Record<string, unknown> }>\n}\n\nexport interface FlattenOtlpOptions {\n /** `'openinference'` (default) mirrors per-span attributes into the\n * OpenInference vocabulary the analyst's `inferKind` reads\n * (`llm.model`→`llm.model_name`, `tool.name`→`inference.tool.name`,\n * `span.kind`→`openinference.span.kind` uppercased). `'none'` passes\n * attributes through untouched. */\n attributeVocabulary?: 'openinference' | 'none'\n /** Override the numeric-kind → otlp-string mapping. */\n kindMap?: Partial<Record<number, string>>\n}\n\nconst DEFAULT_KIND_MAP: Record<number, string> = {\n 0: 'SPAN_KIND_UNSPECIFIED',\n 1: 'SPAN_KIND_INTERNAL',\n 2: 'SPAN_KIND_SERVER',\n 3: 'SPAN_KIND_CLIENT',\n 4: 'SPAN_KIND_PRODUCER',\n 5: 'SPAN_KIND_CONSUMER',\n}\n\nconst STATUS_MAP: Record<number, OtlpFlatLine['status']['code']> = {\n 0: 'STATUS_CODE_UNSET',\n 1: 'STATUS_CODE_OK',\n 2: 'STATUS_CODE_ERROR',\n}\n\n/** Unwrap an OTLP attribute-value union to a scalar. */\nfunction attrValue(v: OtlpSpan['attributes'][number]['value']): string | number | boolean {\n if (v.stringValue !== undefined) return v.stringValue\n if (v.intValue !== undefined) return Number(v.intValue)\n if (v.doubleValue !== undefined) return v.doubleValue\n if (v.boolValue !== undefined) return v.boolValue\n return ''\n}\n\nfunction attrsToRecord(attrs: OtlpSpan['attributes']): Record<string, string | number | boolean> {\n const out: Record<string, string | number | boolean> = {}\n for (const a of attrs) out[a.key] = attrValue(a.value)\n return out\n}\n\nfunction nanoToIso(nano: string): string {\n const ms = Number(nano) / 1_000_000\n return Number.isFinite(ms) ? new Date(ms).toISOString() : new Date(0).toISOString()\n}\n\n/** Mirror selected attributes into the OpenInference vocabulary in place. */\nfunction applyOpenInference(attrs: Record<string, string | number | boolean>): void {\n if ('llm.model' in attrs && !('llm.model_name' in attrs)) {\n attrs['llm.model_name'] = attrs['llm.model']!\n }\n if ('tool.name' in attrs && !('inference.tool.name' in attrs)) {\n attrs['inference.tool.name'] = attrs['tool.name']!\n }\n if ('span.kind' in attrs && !('openinference.span.kind' in attrs)) {\n attrs['openinference.span.kind'] = String(attrs['span.kind']).toUpperCase()\n }\n}\n\nexport function flattenOtlpExportToNdjson(\n otlpExport: OtlpExport,\n opts: FlattenOtlpOptions = {},\n): OtlpFlatLine[] {\n const vocab = opts.attributeVocabulary ?? 'openinference'\n const kindMap = { ...DEFAULT_KIND_MAP, ...opts.kindMap }\n const lines: OtlpFlatLine[] = []\n\n for (const rs of otlpExport.resourceSpans ?? []) {\n const resource = { attributes: attrsToRecord(rs.resource?.attributes ?? []) }\n for (const scope of rs.scopeSpans ?? []) {\n for (const span of scope.spans ?? []) {\n const attributes = attrsToRecord(span.attributes ?? [])\n if (vocab === 'openinference') applyOpenInference(attributes)\n const line: OtlpFlatLine = {\n trace_id: span.traceId,\n span_id: span.spanId,\n parent_span_id: span.parentSpanId ?? null,\n name: span.name,\n kind: kindMap[span.kind] ?? 'SPAN_KIND_UNSPECIFIED',\n start_time: nanoToIso(span.startTimeUnixNano),\n end_time: nanoToIso(span.endTimeUnixNano),\n status: {\n code: STATUS_MAP[span.status?.code ?? 0] ?? 'STATUS_CODE_UNSET',\n ...(span.status?.message ? { message: span.status.message } : {}),\n },\n resource,\n attributes,\n }\n if (span.events && span.events.length > 0) {\n line.events = span.events.map((e) => ({\n name: e.name,\n timeUnixNano: e.timeUnixNano,\n ...(e.attributes ? { attributes: attrsToRecord(e.attributes) } : {}),\n }))\n }\n lines.push(line)\n }\n }\n }\n\n return lines\n}\n","/**\n * `otlpToRunRecords` — fold an OTLP traces.jsonl (one OTLP span per line;\n * the form AppWorld / HALO emit via their OpenInference OTLP exporter, the\n * same shape `flattenOtlpExportToNdjson` produces) into validated\n * `RunRecord[]` — one record per `trace_id` (one trace == one task).\n *\n * This is the offline ingestion primitive the AppWorld driver bench and the\n * hosted Intelligence product both stand on: traces in, paper-grade rows\n * out, ready for `compareDrivers` / `analyzeRuns` / the promotion gate.\n *\n * Aggregation per trace:\n * - tokenUsage: sum LLM-span `input` / `output` (+ `cached` when present)\n * across every LLM span in the trace.\n * - costUsd: sum per-span LLM cost when present; else priced via\n * `opts.priceUsdPerToken` from the aggregated tokens; else 0 with a\n * loud `raw.cost_unpriced = 1` marker so a missing price is visible, not\n * a silent zero folded into a gate.\n * - failureMode: the first `STATUS_CODE_ERROR` span's normalized status\n * message (carries the real failure signature, not a generic class).\n * - model: the dominant LLM model in the trace (snapshot-padded to satisfy\n * `validateRunRecord` when the trace's model is a bare alias).\n * - outcome score: `opts.scoreForTrace` (AppWorld `world.evaluate()` →\n * TGC/SGC) when supplied; else 1 when the trace had no error span, 0\n * when it did — a defensible default the caller can override.\n * - prompt / completion: carried into `raw` as token-count signals and,\n * when the first/last LLM span exposes `input.value` / `output.value`,\n * the verbatim text is preserved on the optional `promptText` /\n * `completionText` of the returned `OtlpTraceRunRecord`.\n *\n * Fail-loud: an OTLP file with zero valid spans throws. A trace with no\n * spans is impossible (a trace exists only because a span referenced it).\n * `validateRunRecord` runs on every row — a malformed projection throws\n * rather than silently producing a half-record.\n */\n\nimport {\n type RunRecord,\n type RunSplitTag,\n type RunTokenUsage,\n validateRunRecord,\n} from '../run-record'\nimport {\n firstNumberAttr,\n firstStringAttr,\n type ProjectedOtlpSpan,\n projectOtlpFlatLine,\n} from './otlp-span'\n\n/** Candidate attribute keys for LLM input (prompt) tokens, both dialects. */\nconst INPUT_TOKEN_KEYS = [\n 'llm.input_tokens',\n 'inference.llm.input_tokens',\n 'llm.token_count.prompt',\n 'gen_ai.usage.input_tokens',\n 'gen_ai.usage.prompt_tokens',\n] as const\n/** Candidate attribute keys for LLM output (completion) tokens. */\nconst OUTPUT_TOKEN_KEYS = [\n 'llm.output_tokens',\n 'inference.llm.output_tokens',\n 'llm.token_count.completion',\n 'gen_ai.usage.output_tokens',\n 'gen_ai.usage.completion_tokens',\n] as const\n/** Candidate attribute keys for cached/prompt-cache tokens. */\nconst CACHED_TOKEN_KEYS = [\n 'llm.cached_tokens',\n 'inference.llm.cached_tokens',\n 'llm.token_count.prompt_cache_hit',\n 'gen_ai.usage.cached_tokens',\n] as const\n/** Candidate attribute keys for per-span LLM cost in USD. */\nconst COST_KEYS = [\n 'llm.cost_usd',\n 'inference.llm.cost.total',\n 'llm.cost.total',\n 'gen_ai.usage.cost',\n] as const\n/** Candidate attribute keys for the model identifier. */\nconst MODEL_KEYS = [\n 'llm.model_name',\n 'inference.llm.model_name',\n 'llm.model',\n 'gen_ai.request.model',\n 'gen_ai.response.model',\n] as const\n\nexport interface OtlpToRunRecordsOptions {\n /** Logical experiment grouping for every produced record. */\n experimentId: string\n /** Candidate (variant) id — the surface these traces exercised. The\n * bench passes the driver label here so `compareDrivers` can pair rows. */\n candidateId: string\n /** Split assignment for every produced record. Default `'holdout'` —\n * ingested traces are evidence, not the optimizer's training pool. */\n splitTag?: RunSplitTag\n /** Git SHA the traces were produced from. Default `'unknown'`. */\n commitSha?: string\n /** sha256 of the effective prompt surface. Default `'unknown'`. */\n promptHash?: string\n /** sha256 of the effective config. Default `'unknown'`. */\n configHash?: string\n /** RNG seed recorded on every row. Default 0. */\n seed?: number\n /**\n * Fallback model snapshot when the trace exposes no LLM model attribute\n * OR exposes a bare alias `validateRunRecord` would reject. The trace's\n * own model wins when it already carries a snapshot. Default\n * `'unknown@otlp'` (opaque-snapshot form the validator accepts).\n */\n fallbackModel?: string\n /**\n * USD per total token (input+output) used to price a trace when no\n * per-span cost attribute is present. When unset, an unpriced trace\n * records `costUsd: 0` AND `raw.cost_unpriced = 1` — the zero is flagged,\n * never silent.\n */\n priceUsdPerToken?: number\n /**\n * Score for a trace's outcome (AppWorld `world.evaluate()` → TGC/SGC, or\n * any [0,1] task-success signal). Keyed by `trace_id`; falls through to\n * the error-derived default (1 = no error span, 0 = had one) when the map\n * has no entry or the function returns undefined.\n */\n scoreForTrace?: (traceId: string, span: TraceAggregate) => number | undefined\n /**\n * Per-record judge metadata when an external judge produced the score.\n * Keyed by `trace_id`.\n */\n judgeMetadataForTrace?: (traceId: string) => RunRecord['judgeMetadata'] | undefined\n}\n\n/** A `RunRecord` plus the verbatim prompt/completion text when the trace's\n * LLM spans exposed it. The text is NOT on the validated `RunRecord`\n * (`outcome.raw` is numeric-only) but consumers ingesting full traces want\n * it — so it rides alongside. */\nexport interface OtlpTraceRunRecord {\n record: RunRecord\n /** Verbatim first-LLM-span `input.value`, when present. */\n promptText?: string\n /** Verbatim last-LLM-span `output.value`, when present. */\n completionText?: string\n}\n\n/** Per-trace rollup the score callback can inspect. */\nexport interface TraceAggregate {\n traceId: string\n spanCount: number\n llmSpanCount: number\n toolSpanCount: number\n agentSpanCount: number\n errorSpanCount: number\n tokenUsage: RunTokenUsage\n /** First error span's normalized status message, if any. */\n firstErrorMessage?: string\n model: string\n startTime: string\n endTime: string\n wallMs: number\n}\n\n/**\n * Parse + aggregate an OTLP traces.jsonl string into validated\n * `RunRecord[]` (one per trace). Use {@link otlpToTraceRunRecords} when you\n * also want the verbatim prompt/completion text alongside each record.\n */\nexport function otlpToRunRecords(otlpJsonl: string, opts: OtlpToRunRecordsOptions): RunRecord[] {\n return otlpToTraceRunRecords(otlpJsonl, opts).map((r) => r.record)\n}\n\n/** As {@link otlpToRunRecords} but returns the prompt/completion text too. */\nexport function otlpToTraceRunRecords(\n otlpJsonl: string,\n opts: OtlpToRunRecordsOptions,\n): OtlpTraceRunRecord[] {\n const splitTag = opts.splitTag ?? 'holdout'\n const commitSha = opts.commitSha ?? 'unknown'\n const promptHash = opts.promptHash ?? 'unknown'\n const configHash = opts.configHash ?? 'unknown'\n const seed = opts.seed ?? 0\n const fallbackModel = opts.fallbackModel ?? 'unknown@otlp'\n\n const byTrace = groupSpansByTrace(otlpJsonl)\n if (byTrace.size === 0) {\n throw new Error(\n 'otlpToRunRecords: OTLP input produced zero valid spans — every line was empty, malformed, or missing trace_id/span_id',\n )\n }\n\n // Stable trace order (insertion order of first appearance is preserved by\n // Map; sort by trace_id for determinism across producers).\n const traceIds = [...byTrace.keys()].sort()\n const out: OtlpTraceRunRecord[] = []\n\n for (const traceId of traceIds) {\n const spans = byTrace.get(traceId)!\n const agg = aggregateTrace(traceId, spans, fallbackModel)\n\n const score = resolveScore(opts, traceId, agg)\n const { costUsd, costUnpriced } = resolveCost(opts, agg, spans)\n\n const raw: Record<string, number> = {\n span_count: agg.spanCount,\n llm_span_count: agg.llmSpanCount,\n tool_span_count: agg.toolSpanCount,\n agent_span_count: agg.agentSpanCount,\n error_span_count: agg.errorSpanCount,\n prompt_tokens: agg.tokenUsage.input,\n completion_tokens: agg.tokenUsage.output,\n }\n if (agg.tokenUsage.cached !== undefined) raw.cached_tokens = agg.tokenUsage.cached\n if (costUnpriced) raw.cost_unpriced = 1\n\n const outcome =\n splitTag === 'holdout' ? { holdoutScore: score, raw } : { searchScore: score, raw }\n\n const { promptText, completionText } = extractPromptCompletion(spans)\n const judgeMetadata = opts.judgeMetadataForTrace?.(traceId)\n\n const record = validateRunRecord({\n runId: `otlp:${opts.experimentId}:${opts.candidateId}:${traceId}`,\n experimentId: opts.experimentId,\n candidateId: opts.candidateId,\n seed,\n model: ensureSnapshot(agg.model, fallbackModel),\n promptHash,\n configHash,\n commitSha,\n wallMs: agg.wallMs,\n costUsd,\n tokenUsage: agg.tokenUsage,\n ...(judgeMetadata ? { judgeMetadata } : {}),\n outcome,\n ...(agg.firstErrorMessage ? { failureMode: agg.firstErrorMessage } : {}),\n splitTag,\n scenarioId: traceId,\n })\n\n out.push({\n record,\n ...(promptText !== undefined ? { promptText } : {}),\n ...(completionText !== undefined ? { completionText } : {}),\n })\n }\n\n return out\n}\n\n// ── Internals ──────────────────────────────────────────────────────────\n\nfunction groupSpansByTrace(otlpJsonl: string): Map<string, ProjectedOtlpSpan[]> {\n const byTrace = new Map<string, ProjectedOtlpSpan[]>()\n for (const line of otlpJsonl.split('\\n')) {\n const trimmed = line.trim()\n if (trimmed.length === 0) continue\n let parsed: unknown\n try {\n parsed = JSON.parse(trimmed)\n } catch {\n // Tolerate a stray malformed line — mirrors the store's index, which\n // skips unparseable lines rather than nuking a whole dataset. A file\n // that is ENTIRELY malformed still throws (zero valid spans).\n continue\n }\n if (!parsed || typeof parsed !== 'object') continue\n const span = projectOtlpFlatLine(parsed as Record<string, unknown>)\n if (!span) continue\n const arr = byTrace.get(span.trace_id)\n if (arr) arr.push(span)\n else byTrace.set(span.trace_id, [span])\n }\n return byTrace\n}\n\nfunction aggregateTrace(\n traceId: string,\n spans: ProjectedOtlpSpan[],\n fallbackModel: string,\n): TraceAggregate {\n // Span order within a trace is by start time, then a stable tiebreak.\n const ordered = [...spans].sort(\n (a, b) => a.start_time.localeCompare(b.start_time) || a.span_id.localeCompare(b.span_id),\n )\n\n let input = 0\n let output = 0\n let cached = 0\n let sawCached = false\n let llmSpanCount = 0\n let toolSpanCount = 0\n let agentSpanCount = 0\n let errorSpanCount = 0\n let firstErrorMessage: string | undefined\n const modelVotes = new Map<string, number>()\n let earliest = ordered[0]?.start_time ?? ''\n let latest = ordered[0]?.end_time ?? ''\n\n for (const s of ordered) {\n if (s.start_time && (!earliest || s.start_time < earliest)) earliest = s.start_time\n if (s.end_time && s.end_time > latest) latest = s.end_time\n\n if (s.kind === 'LLM') {\n llmSpanCount += 1\n const i = firstNumberAttr(s.attributes, INPUT_TOKEN_KEYS)\n const o = firstNumberAttr(s.attributes, OUTPUT_TOKEN_KEYS)\n const c = firstNumberAttr(s.attributes, CACHED_TOKEN_KEYS)\n if (i !== null) input += i\n if (o !== null) output += o\n if (c !== null) {\n cached += c\n sawCached = true\n }\n const m = firstStringAttr(s.attributes, MODEL_KEYS) ?? s.model_name\n if (m) modelVotes.set(m, (modelVotes.get(m) ?? 0) + 1)\n } else if (s.kind === 'TOOL') {\n toolSpanCount += 1\n } else if (s.kind === 'AGENT') {\n agentSpanCount += 1\n }\n\n if (s.status === 'ERROR') {\n errorSpanCount += 1\n if (firstErrorMessage === undefined) {\n firstErrorMessage = (s.status_message ?? `${s.name} — STATUS_CODE_ERROR`).slice(0, 500)\n }\n }\n }\n\n // Dominant model across LLM spans; falls back to any model attribute on a\n // non-LLM span, then the supplied fallback snapshot.\n const model = topVote(modelVotes) ?? firstModelAttr(ordered) ?? fallbackModel\n\n let wallMs = 0\n if (earliest && latest) {\n const a = Date.parse(earliest)\n const b = Date.parse(latest)\n if (!Number.isNaN(a) && !Number.isNaN(b)) wallMs = Math.max(0, b - a)\n }\n\n const tokenUsage: RunTokenUsage = sawCached ? { input, output, cached } : { input, output }\n\n return {\n traceId,\n spanCount: spans.length,\n llmSpanCount,\n toolSpanCount,\n agentSpanCount,\n errorSpanCount,\n tokenUsage,\n firstErrorMessage,\n model,\n startTime: earliest,\n endTime: latest,\n wallMs,\n }\n}\n\nfunction resolveScore(opts: OtlpToRunRecordsOptions, traceId: string, agg: TraceAggregate): number {\n const supplied = opts.scoreForTrace?.(traceId, agg)\n if (supplied !== undefined) {\n if (!Number.isFinite(supplied)) {\n throw new Error(\n `otlpToRunRecords: scoreForTrace('${traceId}') returned non-finite ${supplied}`,\n )\n }\n return supplied\n }\n // Default: error-derived. A trace with any error span scores 0; otherwise 1.\n return agg.errorSpanCount > 0 ? 0 : 1\n}\n\nfunction resolveCost(\n opts: OtlpToRunRecordsOptions,\n agg: TraceAggregate,\n spans: ProjectedOtlpSpan[],\n): { costUsd: number; costUnpriced: boolean } {\n // Prefer per-span LLM cost attributes summed across the trace.\n let perSpanCost = 0\n let sawCost = false\n for (const s of spans) {\n if (s.kind !== 'LLM') continue\n const c = firstNumberAttr(s.attributes, COST_KEYS)\n if (c !== null) {\n perSpanCost += c\n sawCost = true\n }\n }\n if (sawCost) return { costUsd: perSpanCost, costUnpriced: false }\n\n if (opts.priceUsdPerToken !== undefined) {\n const totalTokens = agg.tokenUsage.input + agg.tokenUsage.output\n return { costUsd: totalTokens * opts.priceUsdPerToken, costUnpriced: false }\n }\n\n // No per-span cost, no price table — record 0 but flag it loudly so a\n // missing price never silently flatters a cost axis.\n return { costUsd: 0, costUnpriced: true }\n}\n\nfunction extractPromptCompletion(spans: ProjectedOtlpSpan[]): {\n promptText?: string\n completionText?: string\n} {\n const llm = spans\n .filter((s) => s.kind === 'LLM')\n .sort((a, b) => a.start_time.localeCompare(b.start_time) || a.span_id.localeCompare(b.span_id))\n if (llm.length === 0) return {}\n const promptText =\n firstStringAttr(llm[0]!.attributes, ['input.value', 'llm.input_messages', 'gen_ai.prompt']) ??\n undefined\n const last = llm[llm.length - 1]!\n const completionText =\n firstStringAttr(last.attributes, [\n 'output.value',\n 'llm.output_messages',\n 'gen_ai.completion',\n ]) ?? undefined\n return {\n ...(promptText !== undefined ? { promptText } : {}),\n ...(completionText !== undefined ? { completionText } : {}),\n }\n}\n\nfunction topVote(votes: Map<string, number>): string | null {\n let best: string | null = null\n let bestN = 0\n for (const [k, n] of votes) {\n // Strict > keeps the higher count; lexicographic tie-break makes the winner\n // independent of Map insertion order (reproducible across producers).\n if (n > bestN || (n === bestN && best !== null && k < best)) {\n best = k\n bestN = n\n }\n }\n return best\n}\n\nfunction firstModelAttr(spans: ProjectedOtlpSpan[]): string | null {\n for (const s of spans) {\n const m = firstStringAttr(s.attributes, MODEL_KEYS) ?? s.model_name\n if (m) return m\n }\n return null\n}\n\n/**\n * `validateRunRecord` rejects bare model aliases (`gpt-4o`) that remap\n * silently. AppWorld/HALO traces frequently carry such bare ids (or a null\n * model). When the model already encodes a snapshot we keep it; otherwise we\n * append the fallback snapshot token so the row is admissible without lying\n * about the model — the bare base name is preserved verbatim before `@`.\n */\nfunction ensureSnapshot(model: string, fallbackModel: string): string {\n if (modelHasSnapshot(model)) return model\n const fallbackTag = fallbackModel.includes('@')\n ? fallbackModel.slice(fallbackModel.indexOf('@'))\n : '@otlp'\n return `${model}${fallbackTag}`\n}\n\nfunction modelHasSnapshot(model: string): boolean {\n if (model.includes('@')) return true\n if (/-\\d{8}$/.test(model)) return true\n if (/-\\d{4}-\\d{2}-\\d{2}$/.test(model)) return true\n if (/:date-/.test(model)) return true\n return false\n}\n","/**\n * TraceStore — persistence + query over the TraceSchema v1 corpus.\n *\n * Two implementations ship in the core:\n * - InMemoryTraceStore: dev + tests, fully in-process\n * - FileSystemTraceStore: NDJSON append-only files per entity, suitable\n * for long-running CI jobs; rolled over at 32MB\n *\n * Downstream adapters (DuckDB, Langfuse, R2 parquet) implement this same\n * interface — the rest of the framework is storage-agnostic.\n */\n\nimport type {\n Artifact,\n BudgetLedgerEntry,\n EventKind,\n Run,\n RunStatus,\n Span,\n SpanKind,\n TraceEvent,\n} from './schema'\n\nexport interface RunFilter {\n scenarioId?: string\n variantId?: string\n status?: RunStatus\n since?: number\n until?: number\n tag?: { key: string; value: string }\n parentRunId?: string\n projectId?: string\n chatId?: string\n layer?: import('./schema').RunLayer\n}\n\nexport interface SpanFilter {\n runId?: string\n parentSpanId?: string\n kind?: SpanKind\n name?: string\n toolName?: string\n judgeId?: string\n since?: number\n until?: number\n}\n\nexport interface EventFilter {\n runId?: string\n spanId?: string\n kind?: EventKind\n since?: number\n until?: number\n}\n\nexport interface TraceStore {\n appendRun(run: Run): Promise<void>\n updateRun(runId: string, patch: Partial<Run>): Promise<void>\n appendSpan(span: Span): Promise<void>\n updateSpan(spanId: string, patch: Partial<Span>): Promise<void>\n appendEvent(event: TraceEvent): Promise<void>\n appendArtifact(artifact: Artifact): Promise<void>\n appendBudgetEntry(entry: BudgetLedgerEntry): Promise<void>\n\n getRun(runId: string): Promise<Run | undefined>\n listRuns(filter?: RunFilter): Promise<Run[]>\n spans(filter?: SpanFilter): Promise<Span[]>\n events(filter?: EventFilter): Promise<TraceEvent[]>\n budget(runId: string): Promise<BudgetLedgerEntry[]>\n artifacts(runId: string): Promise<Artifact[]>\n}\n\n// ── In-memory ────────────────────────────────────────────────────────\n\nexport class InMemoryTraceStore implements TraceStore {\n private runs = new Map<string, Run>()\n private allSpans: Span[] = []\n private allEvents: TraceEvent[] = []\n private allArtifacts: Artifact[] = []\n private allBudget: BudgetLedgerEntry[] = []\n\n async appendRun(run: Run): Promise<void> {\n if (this.runs.has(run.runId)) throw new Error(`run ${run.runId} already exists`)\n this.runs.set(run.runId, { ...run })\n }\n\n async updateRun(runId: string, patch: Partial<Run>): Promise<void> {\n const existing = this.runs.get(runId)\n if (!existing) throw new Error(`run ${runId} not found`)\n this.runs.set(runId, { ...existing, ...patch })\n }\n\n async appendSpan(span: Span): Promise<void> {\n this.allSpans.push({ ...span })\n }\n\n async updateSpan(spanId: string, patch: Partial<Span>): Promise<void> {\n const idx = this.allSpans.findIndex((s) => s.spanId === spanId)\n if (idx < 0) throw new Error(`span ${spanId} not found`)\n this.allSpans[idx] = { ...this.allSpans[idx], ...patch } as Span\n }\n\n async appendEvent(event: TraceEvent): Promise<void> {\n this.allEvents.push({ ...event })\n }\n\n async appendArtifact(artifact: Artifact): Promise<void> {\n this.allArtifacts.push({ ...artifact })\n }\n\n async appendBudgetEntry(entry: BudgetLedgerEntry): Promise<void> {\n this.allBudget.push({ ...entry })\n }\n\n async getRun(runId: string): Promise<Run | undefined> {\n const r = this.runs.get(runId)\n return r ? { ...r } : undefined\n }\n\n async listRuns(filter: RunFilter = {}): Promise<Run[]> {\n return [...this.runs.values()].filter((r) => matchesRun(r, filter))\n }\n\n async spans(filter: SpanFilter = {}): Promise<Span[]> {\n return this.allSpans.filter((s) => matchesSpan(s, filter)).map((s) => ({ ...s }))\n }\n\n async events(filter: EventFilter = {}): Promise<TraceEvent[]> {\n return this.allEvents.filter((e) => matchesEvent(e, filter)).map((e) => ({ ...e }))\n }\n\n async budget(runId: string): Promise<BudgetLedgerEntry[]> {\n return this.allBudget.filter((b) => b.runId === runId).map((b) => ({ ...b }))\n }\n\n async artifacts(runId: string): Promise<Artifact[]> {\n return this.allArtifacts.filter((a) => a.runId === runId).map((a) => ({ ...a }))\n }\n}\n\nfunction matchesRun(r: Run, f: RunFilter): boolean {\n if (f.scenarioId && r.scenarioId !== f.scenarioId) return false\n if (f.variantId && r.variantId !== f.variantId) return false\n if (f.status && r.status !== f.status) return false\n if (f.since !== undefined && r.startedAt < f.since) return false\n if (f.until !== undefined && r.startedAt > f.until) return false\n if (f.tag && r.tags?.[f.tag.key] !== f.tag.value) return false\n if (f.parentRunId && r.parentRunId !== f.parentRunId) return false\n if (f.projectId && r.projectId !== f.projectId) return false\n if (f.chatId && r.chatId !== f.chatId) return false\n if (f.layer && r.layer !== f.layer) return false\n return true\n}\n\nfunction matchesSpan(s: Span, f: SpanFilter): boolean {\n if (f.runId && s.runId !== f.runId) return false\n if (f.parentSpanId && s.parentSpanId !== f.parentSpanId) return false\n if (f.kind && s.kind !== f.kind) return false\n if (f.name && s.name !== f.name) return false\n if (f.toolName && (s.kind !== 'tool' || s.toolName !== f.toolName)) return false\n if (f.judgeId && (s.kind !== 'judge' || s.judgeId !== f.judgeId)) return false\n if (f.since !== undefined && s.startedAt < f.since) return false\n if (f.until !== undefined && s.startedAt > f.until) return false\n return true\n}\n\nfunction matchesEvent(e: TraceEvent, f: EventFilter): boolean {\n if (f.runId && e.runId !== f.runId) return false\n if (f.spanId && e.spanId !== f.spanId) return false\n if (f.kind && e.kind !== f.kind) return false\n if (f.since !== undefined && e.timestamp < f.since) return false\n if (f.until !== undefined && e.timestamp > f.until) return false\n return true\n}\n\n// ── Filesystem (NDJSON append-only, one file per entity) ─────────────\n\nexport interface FileSystemTraceStoreOptions {\n dir: string\n /** Roll over NDJSON files when they exceed this size in bytes. Default 32 MB. */\n maxBytes?: number\n}\n\nexport class FileSystemTraceStore implements TraceStore {\n private dir: string\n private maxBytes: number\n /** Lazy in-memory index for queries — populated on first read. */\n private index?: InMemoryTraceStore\n private loaded = false\n\n constructor(options: FileSystemTraceStoreOptions) {\n this.dir = options.dir\n this.maxBytes = options.maxBytes ?? 32 * 1024 * 1024\n }\n\n private async ensureDir(): Promise<void> {\n const fs = await import('node:fs/promises')\n await fs.mkdir(this.dir, { recursive: true })\n }\n\n private async append(name: string, record: unknown): Promise<void> {\n await this.ensureDir()\n const fs = await import('node:fs/promises')\n const path = await import('node:path')\n const active = path.join(this.dir, `${name}.ndjson`)\n try {\n const stat = await fs.stat(active)\n if (stat.size >= this.maxBytes) {\n const rolled = path.join(this.dir, `${name}.${Date.now()}.ndjson`)\n await fs.rename(active, rolled)\n }\n } catch {\n /* file doesn't exist yet */\n }\n await fs.appendFile(active, `${JSON.stringify(record)}\\n`, 'utf8')\n // Mirror genuinely-new rows into the lazy index. Update rows (marked\n // with `_update: true` by updateRun/updateSpan) are applied by those\n // methods directly via the index's update* APIs — re-inserting them\n // here triggers a duplicate-id error once the first read populates\n // the index.\n if (this.index && !(record as { _update?: boolean })?._update) {\n void this.insertInto(name, record)\n }\n }\n\n private async insertInto(name: string, record: unknown): Promise<void> {\n if (!this.index) return\n switch (name) {\n case 'runs':\n await this.index.appendRun(record as Run)\n break\n case 'spans':\n await this.index.appendSpan(record as Span)\n break\n case 'events':\n await this.index.appendEvent(record as TraceEvent)\n break\n case 'artifacts':\n await this.index.appendArtifact(record as Artifact)\n break\n case 'budget':\n await this.index.appendBudgetEntry(record as BudgetLedgerEntry)\n break\n }\n }\n\n private async load(): Promise<InMemoryTraceStore> {\n if (this.loaded && this.index) return this.index\n const fs = await import('node:fs/promises')\n const path = await import('node:path')\n const store = new InMemoryTraceStore()\n try {\n const entries = await fs.readdir(this.dir)\n for (const file of entries) {\n if (!file.endsWith('.ndjson')) continue\n const full = path.join(this.dir, file)\n const content = await fs.readFile(full, 'utf8')\n const base = file.split('.')[0]\n for (const line of content.split('\\n')) {\n if (!line.trim()) continue\n const record = JSON.parse(line)\n if (base === 'runs') {\n // Allow re-loading without duplicate error\n try {\n await store.appendRun(record)\n } catch {\n await store.updateRun(record.runId, record)\n }\n } else if (base === 'spans') {\n // `updateSpan` appends an `_update: true` patch row instead of\n // rewriting the original span. On reload we must collapse those\n // patches onto the original span — otherwise a fresh\n // FileSystemTraceStore reading the same dir reports duplicate\n // spans (one full, one fragment with no runId/kind/name), which\n // breaks any downstream consumer that re-opens the store\n // cross-process (e.g. the OTLP converter).\n if (record?._update) {\n try {\n await store.updateSpan(record.spanId, record)\n } catch {\n // Patch row arrived before the original — should not happen\n // with locked append order, but fall through to append so we\n // don't lose data.\n await store.appendSpan(record)\n }\n } else {\n await store.appendSpan(record)\n }\n } else if (base === 'events') {\n await store.appendEvent(record)\n } else if (base === 'artifacts') {\n await store.appendArtifact(record)\n } else if (base === 'budget') {\n await store.appendBudgetEntry(record)\n }\n }\n }\n } catch {\n /* empty dir, first run */\n }\n this.index = store\n this.loaded = true\n return store\n }\n\n async appendRun(run: Run): Promise<void> {\n await this.append('runs', run)\n }\n async updateRun(runId: string, patch: Partial<Run>): Promise<void> {\n // NDJSON is append-only; record updates as new rows with the same runId —\n // readers collapse by last-write-wins on load.\n await this.append('runs', { runId, ...patch, _update: true })\n if (this.index) await this.index.updateRun(runId, patch)\n }\n async appendSpan(span: Span): Promise<void> {\n await this.append('spans', span)\n }\n async updateSpan(spanId: string, patch: Partial<Span>): Promise<void> {\n await this.append('spans', { spanId, ...patch, _update: true })\n if (this.index) await this.index.updateSpan(spanId, patch)\n }\n async appendEvent(event: TraceEvent): Promise<void> {\n await this.append('events', event)\n }\n async appendArtifact(artifact: Artifact): Promise<void> {\n await this.append('artifacts', artifact)\n }\n async appendBudgetEntry(entry: BudgetLedgerEntry): Promise<void> {\n await this.append('budget', entry)\n }\n\n async getRun(runId: string): Promise<Run | undefined> {\n return (await this.load()).getRun(runId)\n }\n async listRuns(filter?: RunFilter): Promise<Run[]> {\n return (await this.load()).listRuns(filter)\n }\n async spans(filter?: SpanFilter): Promise<Span[]> {\n return (await this.load()).spans(filter)\n }\n async events(filter?: EventFilter): Promise<TraceEvent[]> {\n return (await this.load()).events(filter)\n }\n async budget(runId: string): Promise<BudgetLedgerEntry[]> {\n return (await this.load()).budget(runId)\n }\n async artifacts(runId: string): Promise<Artifact[]> {\n return (await this.load()).artifacts(runId)\n }\n}\n","/**\n * Token-usage extraction from chat-completions responses and SSE streams.\n *\n * `captureFetchToRawSink` records the raw provider triple but deliberately does\n * not interpret token usage — cost is a per-consumer axis. Three consumers each\n * re-implement the same `usage` parser on top of the captured response (the\n * OpenAI `prompt_tokens`/`completion_tokens` shape, the Anthropic\n * `input_tokens`/`output_tokens` shape, and the camelCase variants), plus an\n * SSE accumulator that sums the per-chunk `usage` deltas. This is the one\n * canonical version.\n *\n * Both functions return `null` (not a silent `{ input: 0, output: 0 }`) when no\n * usage is present, so a caller can tell \"no usage reported\" from \"zero tokens\".\n */\n\nexport interface ExtractedUsage {\n input: number\n output: number\n /** Cached prompt tokens, when the provider reports them. */\n cached?: number\n}\n\nconst INPUT_KEYS = ['prompt_tokens', 'input_tokens', 'promptTokens', 'inputTokens'] as const\nconst OUTPUT_KEYS = [\n 'completion_tokens',\n 'output_tokens',\n 'completionTokens',\n 'outputTokens',\n] as const\nconst CACHED_KEYS = [\n 'cached_tokens',\n 'cache_read_input_tokens',\n 'cachedTokens',\n 'cacheReadInputTokens',\n] as const\n\nfunction nonNegNumber(source: Record<string, unknown>, keys: readonly string[]): number | null {\n for (const key of keys) {\n const value = source[key]\n if (typeof value === 'number' && Number.isFinite(value) && value >= 0) return value\n }\n return null\n}\n\n/**\n * Pull `{ input, output, cached? }` from a parsed chat-completions response\n * body. Accepts a top-level `usage` object (the common case) or a body that IS\n * the usage object. Returns null when neither an input nor an output count is\n * present — callers must inspect for null rather than treat it as zero cost.\n */\nexport function extractUsage(body: unknown): ExtractedUsage | null {\n if (!body || typeof body !== 'object') return null\n const obj = body as Record<string, unknown>\n const usage =\n obj.usage && typeof obj.usage === 'object' ? (obj.usage as Record<string, unknown>) : obj\n const input = nonNegNumber(usage, INPUT_KEYS)\n const output = nonNegNumber(usage, OUTPUT_KEYS)\n if (input === null && output === null) return null\n const cached = nonNegNumber(usage, CACHED_KEYS)\n const result: ExtractedUsage = { input: input ?? 0, output: output ?? 0 }\n if (cached !== null) result.cached = cached\n return result\n}\n\n/**\n * Sum token usage across an SSE response body. Each `data:` line is parsed and\n * fed to `extractUsage`; the per-chunk counts are accumulated. The `[DONE]`\n * sentinel and non-JSON lines are skipped. Returns null when no chunk carried\n * usage — distinguishing a usage-less stream from a genuine zero.\n *\n * Providers report SSE usage in two ways: a single terminal chunk with the full\n * totals, or incremental per-chunk deltas. Summing is correct for the delta\n * case and harmless for the terminal case (one non-null chunk ⇒ the total).\n */\nexport function extractUsageFromSse(text: string): ExtractedUsage | null {\n let input = 0\n let output = 0\n let cached = 0\n let sawCached = false\n let found = false\n for (const line of text.split(/\\r?\\n/)) {\n const trimmed = line.trim()\n if (!trimmed.startsWith('data:')) continue\n const payload = trimmed.slice('data:'.length).trim()\n if (!payload || payload === '[DONE]') continue\n let parsed: unknown\n try {\n parsed = JSON.parse(payload)\n } catch {\n continue\n }\n const usage = extractUsage(parsed)\n if (!usage) continue\n input += usage.input\n output += usage.output\n if (usage.cached !== undefined) {\n cached += usage.cached\n sawCached = true\n }\n found = true\n }\n if (!found) return null\n return sawCached ? { input, output, cached } : { input, output }\n}\n\n/**\n * Extract usage from an HTTP `Response` without consuming the caller's body:\n * clones, reads the text, and tries the JSON parser first, then the SSE\n * accumulator. Best-effort — returns null on any read/parse miss so a usage tee\n * never takes down the underlying call.\n */\nexport async function extractUsageFromResponse(response: Response): Promise<ExtractedUsage | null> {\n let text: string\n try {\n text = await response.clone().text()\n } catch {\n return null\n }\n let json: unknown\n try {\n json = JSON.parse(text)\n } catch {\n json = undefined\n }\n return extractUsage(json) ?? extractUsageFromSse(text)\n}\n","/**\n * `captureFetchToRawSink` — wrap a `fetch` so every request / response / error\n * against a provider is recorded into a `RawProviderSink` as the canonical\n * `RawProviderEvent` triple. The one substrate copy of the fetch-capture\n * pattern four consumers hand-roll (legal ships two copies).\n *\n * The returned value is a plain `typeof fetch` — pass it as the `fetchImpl` to\n * any OpenAI-compatible backend factory. Capture is best-effort by default: a\n * sink write that throws does NOT take down the underlying LLM call (set\n * `failClosed` to change that). Uses the existing `defaultProviderRedactor` +\n * `providerFromBaseUrl` — no new redaction policy.\n */\n\nimport { type ExtractedUsage, extractUsage, extractUsageFromSse } from './extract-usage'\nimport {\n defaultProviderRedactor,\n type ProviderRedactor,\n providerFromBaseUrl,\n type RawProviderDirection,\n type RawProviderEvent,\n type RawProviderSink,\n} from './raw-provider-sink'\n\nexport interface CaptureFetchContext {\n /** Logical run id stamped on every captured event. Required — without it\n * the raw events can't be paired with their parent `Run`. */\n runId: string\n /** Optional logical span id (enables span-level sink filtering). */\n spanId?: string\n /** Resolved base URL (normalised, no trailing slash). Used for the event's\n * `baseUrl` and for endpoint-path extraction. */\n baseUrl: string\n /** Model id the caller intends to invoke. Stamped on every event. */\n model: string\n /** Provider override. When omitted, `providerFromBaseUrl(baseUrl)`. */\n provider?: string\n}\n\nexport interface CaptureFetchOptions {\n /** Override the capture-time redactor. Default `defaultProviderRedactor`. */\n redactor?: ProviderRedactor\n /** Cap on captured response-body bytes; beyond it the body is truncated and\n * `body_truncated` is added to `redactedFields`. Default 2 MiB. */\n responseBodyByteCap?: number\n /** When true, a sink-write failure propagates to the caller. Default false\n * — capture is best-effort so a sink failure never kills the LLM call. */\n failClosed?: boolean\n /**\n * Invoked with the token usage parsed off each successful response (JSON or\n * SSE), keyed by the captured context. Lets a caller fold usage → cost without\n * re-cloning the response themselves. Not called when the response carries no\n * usage. Best-effort: a throw here is swallowed (it never kills the LLM call)\n * unless `failClosed` is set.\n */\n onUsage?: (usage: ExtractedUsage, ctx: CaptureFetchContext) => void\n}\n\nconst DEFAULT_BODY_CAP = 2 * 1024 * 1024\n\nfunction headersToRecord(headers: Headers | undefined): Record<string, string> | undefined {\n if (!headers) return undefined\n const out: Record<string, string> = {}\n headers.forEach((value, key) => {\n out[key.toLowerCase()] = value\n })\n return Object.keys(out).length > 0 ? out : undefined\n}\n\nfunction parseMaybeJson(text: string): unknown {\n if (text.length === 0) return undefined\n try {\n return JSON.parse(text)\n } catch {\n return text\n }\n}\n\n/** Best-effort request-body read across the `fetch` input forms. */\nasync function readRequestBody(\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n): Promise<unknown> {\n if (typeof init?.body === 'string') return parseMaybeJson(init.body)\n if (init?.body != null) return undefined // streams / FormData / Blob — not captured\n if (input instanceof Request) {\n try {\n return parseMaybeJson(await input.clone().text())\n } catch {\n return undefined\n }\n }\n return undefined\n}\n\nfunction endpointFromUrl(url: string, baseUrl: string): string {\n const normalisedBase = baseUrl.replace(/\\/+$/, '')\n if (url.startsWith(normalisedBase)) return url.slice(normalisedBase.length) || '/'\n try {\n return new URL(url).pathname\n } catch {\n return url\n }\n}\n\nexport function captureFetchToRawSink(\n fetch: typeof globalThis.fetch,\n sink: RawProviderSink,\n ctx: CaptureFetchContext,\n opts: CaptureFetchOptions = {},\n): typeof globalThis.fetch {\n const provider = ctx.provider ?? providerFromBaseUrl(ctx.baseUrl)\n const redactor = opts.redactor ?? defaultProviderRedactor\n const bodyCap = opts.responseBodyByteCap ?? DEFAULT_BODY_CAP\n let warned = false\n\n const baseEvent = (direction: RawProviderDirection, endpoint: string): RawProviderEvent => ({\n eventId: crypto.randomUUID(),\n runId: ctx.runId,\n spanId: ctx.spanId,\n provider,\n model: ctx.model,\n endpoint,\n baseUrl: ctx.baseUrl,\n attemptIndex: 0, // retries are re-invocations one layer up; documented in 0.x\n direction,\n timestamp: Date.now(),\n redactedFields: [],\n })\n\n const record = async (event: RawProviderEvent): Promise<void> => {\n try {\n await sink.record(redactor(event))\n } catch (err) {\n if (opts.failClosed) throw err\n if (!warned) {\n warned = true\n console.warn(\n `captureFetchToRawSink: sink.record failed (capture is best-effort) — ${\n err instanceof Error ? err.message : String(err)\n }`,\n )\n }\n }\n }\n\n return async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const url =\n typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url\n const method = (init?.method ?? (input instanceof Request ? input.method : 'GET')).toUpperCase()\n const endpoint = endpointFromUrl(url, ctx.baseUrl)\n\n const reqHeaders = new Headers(\n init?.headers ?? (input instanceof Request ? input.headers : undefined),\n )\n await record({\n ...baseEvent('request', endpoint),\n requestHeaders: { ...headersToRecord(reqHeaders), 'x-http-method': method },\n requestBody: await readRequestBody(input, init),\n })\n\n const start = Date.now()\n let response: Response\n try {\n response = await fetch(input, init)\n } catch (err) {\n await record({\n ...baseEvent('error', endpoint),\n durationMs: Date.now() - start,\n errorMessage: err instanceof Error ? err.message : String(err),\n })\n throw err\n }\n\n // Read the body off a clone so the caller still consumes the original.\n let responseBody: unknown\n let rawText: string | undefined\n const redactedFields: string[] = []\n try {\n rawText = await response.clone().text()\n if (rawText.length > bodyCap) {\n responseBody = rawText.slice(0, bodyCap)\n redactedFields.push('body_truncated')\n } else {\n responseBody = parseMaybeJson(rawText)\n }\n } catch {\n responseBody = undefined\n }\n\n if (opts.onUsage && rawText !== undefined) {\n // Reuse the body already read for capture; no extra clone. JSON first,\n // then SSE accumulation. A throw in the consumer's callback is swallowed\n // (best-effort) unless failClosed is set — the LLM call must not die here.\n try {\n const parsedForUsage = parseMaybeJson(rawText)\n const usage =\n extractUsage(parsedForUsage) ??\n (typeof parsedForUsage === 'string' ? extractUsageFromSse(rawText) : null)\n if (usage) opts.onUsage(usage, ctx)\n } catch (err) {\n if (opts.failClosed) throw err\n }\n }\n\n await record({\n ...baseEvent('response', endpoint),\n durationMs: Date.now() - start,\n statusCode: response.status,\n responseHeaders: headersToRecord(response.headers),\n responseBody,\n redactedFields,\n })\n\n return response\n }\n}\n","/**\n * OpenTelemetry JSON export — maps TraceSchema v1 to OTLP/JSON so\n * traces render natively in Jaeger / Honeycomb / Langfuse / Grafana.\n *\n * Wire format only. We do NOT depend on the @opentelemetry SDK — that\n * would drag in polyfills incompatible with Workers/Edge. Consumers\n * push the JSON to their collector of choice via HTTP.\n *\n * Reference: OTLP 1.3.2 (ResourceSpans / ScopeSpans / Span).\n */\n\nimport type { Run, Span, TraceEvent } from './schema'\nimport type { TraceStore } from './store'\n\nexport const OTEL_AGENT_EVAL_SCOPE = { name: '@tangle-network/agent-eval', version: '0.3.0' }\n\nexport interface OtlpSpan {\n traceId: string\n spanId: string\n parentSpanId?: string\n name: string\n kind: number\n startTimeUnixNano: string\n endTimeUnixNano: string\n attributes: Array<{\n key: string\n value: { stringValue?: string; intValue?: string; doubleValue?: number; boolValue?: boolean }\n }>\n events?: Array<{ timeUnixNano: string; name: string; attributes?: OtlpSpan['attributes'] }>\n status?: { code: number; message?: string }\n}\n\nexport interface OtlpResourceSpans {\n resource: { attributes: OtlpSpan['attributes'] }\n scopeSpans: Array<{ scope: typeof OTEL_AGENT_EVAL_SCOPE; spans: OtlpSpan[] }>\n}\n\nexport interface OtlpExport {\n resourceSpans: OtlpResourceSpans[]\n}\n\n/** Export a single run's spans + events in OTLP/JSON. */\nexport async function exportRunAsOtlp(\n store: TraceStore,\n runId: string,\n resourceAttrs: Record<string, string | number | boolean> = {},\n): Promise<OtlpExport> {\n const run = await store.getRun(runId)\n if (!run) throw new Error(`run ${runId} not found`)\n const spans = await store.spans({ runId })\n const events = await store.events({ runId })\n const eventsBySpan = new Map<string, TraceEvent[]>()\n for (const e of events) {\n if (!e.spanId) continue\n const arr = eventsBySpan.get(e.spanId) ?? []\n arr.push(e)\n eventsBySpan.set(e.spanId, arr)\n }\n const traceId = runToTraceId(run)\n const otlpSpans: OtlpSpan[] = spans.map((s) =>\n spanToOtlp(s, traceId, eventsBySpan.get(s.spanId) ?? []),\n )\n return {\n resourceSpans: [\n {\n resource: {\n attributes: toAttributes({\n 'service.name': 'agent-eval',\n 'run.id': run.runId,\n 'run.scenario_id': run.scenarioId,\n 'run.variant_id': run.variantId ?? '',\n 'run.dataset_version': run.datasetVersion ?? '',\n 'run.code_sha': run.codeSha ?? '',\n 'run.model_fingerprint': run.modelFingerprint ?? '',\n ...resourceAttrs,\n }),\n },\n scopeSpans: [{ scope: OTEL_AGENT_EVAL_SCOPE, spans: otlpSpans }],\n },\n ],\n }\n}\n\nfunction spanToOtlp(span: Span, traceId: string, events: TraceEvent[]): OtlpSpan {\n const endedAt = span.endedAt ?? span.startedAt\n return {\n traceId,\n spanId: padSpanId(span.spanId),\n parentSpanId: span.parentSpanId ? padSpanId(span.parentSpanId) : undefined,\n name: span.name,\n kind: 1, // SPAN_KIND_INTERNAL\n startTimeUnixNano: msToNs(span.startedAt),\n endTimeUnixNano: msToNs(endedAt),\n attributes: toAttributes(flattenSpanAttributes(span)),\n events: events.map((e) => ({\n timeUnixNano: msToNs(e.timestamp),\n name: e.kind,\n attributes: toAttributes(flattenPayload(e.payload)),\n })),\n status: span.status === 'error' ? { code: 2, message: span.error } : { code: 1 },\n }\n}\n\nfunction flattenSpanAttributes(span: Span): Record<string, string | number | boolean> {\n const base: Record<string, string | number | boolean> = {\n 'span.kind': span.kind,\n }\n if (span.kind === 'llm') {\n base['llm.model'] = span.model\n if (span.inputTokens !== undefined) base['llm.input_tokens'] = span.inputTokens\n if (span.outputTokens !== undefined) base['llm.output_tokens'] = span.outputTokens\n if (span.costUsd !== undefined) base['llm.cost_usd'] = span.costUsd\n if (span.finishReason) base['llm.finish_reason'] = span.finishReason\n } else if (span.kind === 'tool') {\n base['tool.name'] = span.toolName\n if (span.latencyMs !== undefined) base['tool.latency_ms'] = span.latencyMs\n } else if (span.kind === 'retrieval') {\n base['retrieval.query'] = span.query\n base['retrieval.hits'] = span.hits.length\n } else if (span.kind === 'judge') {\n base['judge.id'] = span.judgeId\n base['judge.dimension'] = span.dimension\n base['judge.score'] = span.score\n base['judge.target_span_id'] = span.targetSpanId\n } else if (span.kind === 'sandbox') {\n if (span.image) base['sandbox.image'] = span.image\n if (span.exitCode !== undefined) base['sandbox.exit_code'] = span.exitCode\n if (span.testsPassed !== undefined) base['sandbox.tests_passed'] = span.testsPassed\n if (span.testsTotal !== undefined) base['sandbox.tests_total'] = span.testsTotal\n }\n if (span.attributes) {\n for (const [k, v] of Object.entries(span.attributes)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') base[k] = v\n }\n }\n return base\n}\n\nfunction flattenPayload(\n payload: Record<string, unknown>,\n): Record<string, string | number | boolean> {\n const out: Record<string, string | number | boolean> = {}\n for (const [k, v] of Object.entries(payload)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') out[k] = v\n else out[k] = JSON.stringify(v)\n }\n return out\n}\n\nfunction toAttributes(record: Record<string, string | number | boolean>): OtlpSpan['attributes'] {\n return Object.entries(record).map(([key, value]) => ({\n key,\n value:\n typeof value === 'number'\n ? Number.isInteger(value)\n ? { intValue: value.toString() }\n : { doubleValue: value }\n : typeof value === 'boolean'\n ? { boolValue: value }\n : { stringValue: value },\n }))\n}\n\nfunction msToNs(ms: number): string {\n return (BigInt(Math.floor(ms)) * 1_000_000n).toString()\n}\n\nfunction padSpanId(id: string): string {\n // OTLP wants 16-hex spanIds. UUIDs are 32-hex; strip dashes and take first 16.\n const cleaned = id.replace(/-/g, '')\n return cleaned.slice(0, 16).padEnd(16, '0')\n}\n\nfunction runToTraceId(run: Run): string {\n // OTLP wants 32-hex traceIds. Use runId directly when it's 32-hex already,\n // else SHA-ish truncate.\n const cleaned = run.runId.replace(/-/g, '')\n return cleaned.slice(0, 32).padEnd(32, '0')\n}\n","/**\n * OTEL bridge — connects TraceEmitter span lifecycle to the OtelExporter.\n *\n * When an OtelExporter is active, every span that closes through the\n * TraceEmitter is also pushed to the exporter for real-time streaming to\n * the user's OTEL collector.\n *\n * The bridge is opt-in: attach via `otelRunCompleteHook(exporter)` as a\n * RunCompleteHook, or wrap the store with `createOtelTracingStore` for\n * real-time per-span export.\n */\n\nimport type { RunCompleteHook } from './emitter'\nimport type { ExportableSpan, OtelExporter } from './otel-export'\nimport type { LlmSpan, Span } from './schema'\nimport type { TraceStore } from './store'\n\n/**\n * Create a RunCompleteHook that exports all spans from the completed run\n * to the OTEL exporter, then flushes.\n */\nexport function otelRunCompleteHook(exporter: OtelExporter): RunCompleteHook {\n return async (ctx) => {\n const spans = await ctx.store.spans({ runId: ctx.runId })\n for (const span of spans) {\n if (span.endedAt) {\n exporter.exportSpan(storeSpanToExportable(span, ctx.runId))\n }\n }\n await exporter.flush()\n }\n}\n\n/**\n * Create an auto-exporting TraceStore wrapper that intercepts updateSpan\n * calls. When a span gets an endedAt, it's exported immediately. This\n * gives real-time streaming instead of batch-at-end.\n *\n * This is the preferred integration path: wrap the store before\n * constructing the TraceEmitter.\n */\nexport function createOtelTracingStore(\n inner: TraceStore,\n exporter: OtelExporter,\n traceId: string,\n): TraceStore {\n return {\n async appendRun(run) {\n return inner.appendRun(run)\n },\n async updateRun(runId, patch) {\n return inner.updateRun(runId, patch)\n },\n async appendSpan(span) {\n if (span.endedAt) {\n exporter.exportSpan(storeSpanToExportable(span, traceId))\n }\n return inner.appendSpan(span)\n },\n async updateSpan(spanId, patch) {\n await inner.updateSpan(spanId, patch)\n if (patch.endedAt) {\n const spans = await inner.spans({ runId: traceId })\n const found = spans.find((s) => s.spanId === spanId)\n if (found) {\n exporter.exportSpan(storeSpanToExportable(found, traceId))\n }\n }\n },\n async appendEvent(event) {\n return inner.appendEvent(event)\n },\n async appendBudgetEntry(entry) {\n return inner.appendBudgetEntry(entry)\n },\n async appendArtifact(artifact) {\n return inner.appendArtifact(artifact)\n },\n getRun: inner.getRun.bind(inner),\n listRuns: inner.listRuns.bind(inner),\n spans: inner.spans.bind(inner),\n events: inner.events.bind(inner),\n budget: inner.budget.bind(inner),\n artifacts: inner.artifacts.bind(inner),\n }\n}\n\nfunction storeSpanToExportable(span: Span, traceId: string): ExportableSpan {\n const llm = span.kind === 'llm' ? (span as LlmSpan) : undefined\n return {\n traceId,\n spanId: span.spanId,\n parentSpanId: span.parentSpanId,\n name: span.name,\n kind: span.kind,\n startedAt: span.startedAt,\n endedAt: span.endedAt,\n status: span.status,\n error: span.error,\n model: llm?.model,\n inputTokens: llm?.inputTokens,\n outputTokens: llm?.outputTokens,\n costUsd: llm?.costUsd,\n attributes: span.attributes as Record<string, unknown> | undefined,\n }\n}\n","/**\n * OTEL span exporter — streams spans to an OTLP/HTTP collector.\n *\n * Reads OTEL_EXPORTER_OTLP_ENDPOINT + OTEL_EXPORTER_OTLP_HEADERS from env\n * when no explicit config is given. Batches spans and flushes periodically\n * or when the batch fills. No @opentelemetry SDK dependency — minimal\n * OTLP/JSON serializer (~120 LOC) using the existing otel.ts helpers.\n */\n\nimport { OTEL_AGENT_EVAL_SCOPE, type OtlpExport, type OtlpSpan } from './otel'\n\nexport interface OtelExportConfig {\n /** OTLP endpoint. Reads OTEL_EXPORTER_OTLP_ENDPOINT env by default. */\n endpoint?: string\n /** OTLP headers. Reads OTEL_EXPORTER_OTLP_HEADERS env by default. */\n headers?: Record<string, string>\n /** Batch size before flush. Default 64. */\n batchSize?: number\n /** Flush interval ms. Default 5000. */\n flushIntervalMs?: number\n /** Resource attributes stamped on every export. */\n resourceAttributes?: Record<string, string | number | boolean>\n /** Service name. Default 'agent-eval'. */\n serviceName?: string\n}\n\nexport interface OtelExporter {\n /** Called by the TraceEmitter on every span close. */\n exportSpan(span: ExportableSpan): void\n /** Force flush pending spans. */\n flush(): Promise<void>\n /** Shutdown cleanly — flushes remaining spans and stops the timer. */\n shutdown(): Promise<void>\n}\n\nexport interface ExportableSpan {\n traceId: string\n spanId: string\n parentSpanId?: string\n name: string\n kind: string\n startedAt: number\n endedAt?: number\n status?: string\n error?: string\n model?: string\n inputTokens?: number\n outputTokens?: number\n costUsd?: number\n attributes?: Record<string, unknown>\n}\n\n/**\n * Create an OTEL exporter. Returns undefined when no endpoint is configured\n * (neither via config nor env) — callers should check before attaching.\n */\nexport function createOtelExporter(config?: OtelExportConfig): OtelExporter | undefined {\n const resolvedEndpoint =\n config?.endpoint ??\n (typeof process !== 'undefined' ? process.env.OTEL_EXPORTER_OTLP_ENDPOINT : undefined)\n if (!resolvedEndpoint) return undefined\n const endpoint: string = resolvedEndpoint\n\n const headers = config?.headers ?? parseHeadersFromEnv()\n const batchSize = config?.batchSize ?? 64\n const flushIntervalMs = config?.flushIntervalMs ?? 5000\n const serviceName = config?.serviceName ?? 'agent-eval'\n const resourceAttrs = config?.resourceAttributes ?? {}\n\n const pending: OtlpSpan[] = []\n let timer: ReturnType<typeof setInterval> | undefined\n let stopped = false\n\n const exporter: OtelExporter = {\n exportSpan(span: ExportableSpan): void {\n if (stopped) return\n pending.push(toOtlpSpan(span))\n if (pending.length >= batchSize) {\n void doFlush()\n }\n },\n\n async flush(): Promise<void> {\n await doFlush()\n },\n\n async shutdown(): Promise<void> {\n stopped = true\n if (timer !== undefined) {\n clearInterval(timer)\n timer = undefined\n }\n await doFlush()\n },\n }\n\n timer = setInterval(() => {\n if (pending.length > 0) void doFlush()\n }, flushIntervalMs)\n // Unref so the timer doesn't keep the process alive.\n if (typeof timer === 'object' && 'unref' in timer) {\n ;(timer as NodeJS.Timeout).unref()\n }\n\n async function doFlush(): Promise<void> {\n if (pending.length === 0) return\n const batch = pending.splice(0)\n const body: OtlpExport = {\n resourceSpans: [\n {\n resource: {\n attributes: toAttributes({\n 'service.name': serviceName,\n ...resourceAttrs,\n }),\n },\n scopeSpans: [{ scope: OTEL_AGENT_EVAL_SCOPE, spans: batch }],\n },\n ],\n }\n const url = `${endpoint.replace(/\\/+$/, '')}/v1/traces`\n try {\n await fetch(url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...headers,\n },\n body: JSON.stringify(body),\n })\n } catch {\n // Best-effort — telemetry export must not crash the pipeline.\n }\n }\n\n return exporter\n}\n\nfunction parseHeadersFromEnv(): Record<string, string> {\n if (typeof process === 'undefined') return {}\n const raw = process.env.OTEL_EXPORTER_OTLP_HEADERS\n if (!raw) return {}\n const out: Record<string, string> = {}\n for (const pair of raw.split(',')) {\n const eq = pair.indexOf('=')\n if (eq < 0) continue\n const key = pair.slice(0, eq).trim()\n const value = pair.slice(eq + 1).trim()\n if (key) out[key] = value\n }\n return out\n}\n\nfunction toOtlpSpan(span: ExportableSpan): OtlpSpan {\n const endedAt = span.endedAt ?? span.startedAt\n const attrs: Record<string, string | number | boolean> = {\n 'span.kind': span.kind,\n }\n if (span.model) attrs['llm.model'] = span.model\n if (span.inputTokens !== undefined) attrs['llm.input_tokens'] = span.inputTokens\n if (span.outputTokens !== undefined) attrs['llm.output_tokens'] = span.outputTokens\n if (span.costUsd !== undefined) attrs['llm.cost_usd'] = span.costUsd\n if (span.attributes) {\n for (const [k, v] of Object.entries(span.attributes)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') attrs[k] = v\n }\n }\n return {\n traceId: padTraceId(span.traceId),\n spanId: padSpanId(span.spanId),\n parentSpanId: span.parentSpanId ? padSpanId(span.parentSpanId) : undefined,\n name: span.name,\n kind: 1, // SPAN_KIND_INTERNAL\n startTimeUnixNano: msToNs(span.startedAt),\n endTimeUnixNano: msToNs(endedAt),\n attributes: toAttributes(attrs),\n status: span.status === 'error' ? { code: 2, message: span.error } : { code: 1 },\n }\n}\n\nfunction toAttributes(record: Record<string, string | number | boolean>): OtlpSpan['attributes'] {\n return Object.entries(record).map(([key, value]) => ({\n key,\n value:\n typeof value === 'number'\n ? Number.isInteger(value)\n ? { intValue: value.toString() }\n : { doubleValue: value }\n : typeof value === 'boolean'\n ? { boolValue: value }\n : { stringValue: value },\n }))\n}\n\nfunction msToNs(ms: number): string {\n return (BigInt(Math.floor(ms)) * 1_000_000n).toString()\n}\n\nfunction padSpanId(id: string): string {\n const cleaned = id.replace(/-/g, '')\n return cleaned.slice(0, 16).padEnd(16, '0')\n}\n\nfunction padTraceId(id: string): string {\n const cleaned = id.replace(/-/g, '')\n return cleaned.slice(0, 32).padEnd(32, '0')\n}\n","/**\n * Convert agent-eval's internal trace shape (`FileSystemTraceStore` → `Run`,\n * `Span`, `TraceEvent`) into the OTLP-flat JSONL the trace analyst\n * (`analyzeTraces` + `OtlpFileTraceStore`) reads.\n *\n * Eval harnesses shard a `FileSystemTraceStore` per cell (persona / variant)\n * under a run directory. The analyst consumes a single OTLP-NDJSON file keyed\n * on `trace_id` + `span_id` with `start_time`/`end_time` in ISO-8601 and\n * resource + `attributes` rolled up per-span. This module walks every shard,\n * projects each `Span` (plus events pinned to it) into the flat OTLP shape,\n * and emits one NDJSON file.\n *\n * Generic OTLP/OpenInference fields are always emitted (`service.name`,\n * `agent.name`, `run.id`/`run.status`, `openinference.span.kind`,\n * `llm.model_name`, …). Domain attributes (`legal.*`, `tax.*`, …) are injected\n * per-run via {@link TraceStoreToOtlpOptions.resourceAttributes} /\n * {@link TraceStoreToOtlpOptions.runAttributes} so consumers don't re-roll the\n * walker.\n */\n\nimport { readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport type { Run, Span, TraceEvent } from './schema'\n\n/** Marker `FileSystemTraceStore` stamps on partial-update NDJSON rows. */\ninterface MaybeUpdate {\n _update?: boolean\n}\n\ninterface OtlpFlatSpan {\n trace_id: string\n span_id: string\n parent_span_id: string\n name: string\n kind: string\n start_time: string\n end_time: string\n status: { code: 'STATUS_CODE_OK' | 'STATUS_CODE_ERROR'; message: string }\n resource: { attributes: Record<string, unknown> }\n attributes: Record<string, unknown>\n}\n\nexport interface TracesToOtlpResult {\n /** Total spans emitted across every cell. */\n spanCount: number\n /** Total run-anchor spans (one per Run) appended for analyst visibility. */\n runCount: number\n /** Cells whose shards parsed cleanly. */\n cellCount: number\n /** Cells that errored mid-conversion — surfaced so a partial conversion\n * isn't silently masked. */\n cellErrorCount: number\n}\n\n/**\n * A trace source the analyst should ingest. Two layouts are supported:\n *\n * - `celled` (default): the root holds one cell subdirectory per\n * persona/variant, each a `FileSystemTraceStore` (`runs.ndjson`,\n * `spans.ndjson`, `events.ndjson`).\n * - `flat`: the root is itself a single `FileSystemTraceStore` (e.g. a\n * production-ingestion sidecar that appends one ndjson set directly under\n * the chosen directory).\n */\nexport interface TraceStoreSource {\n /** Absolute path to the trace store root. */\n root: string\n /** Layout — `celled` (default) or `flat`. */\n layout?: 'celled' | 'flat'\n /** OTLP `service.name` for this source. Overrides the options default. */\n serviceName?: string\n}\n\n/** Domain hooks. The walker is generic; consumers inject the namespaced\n * attributes that ride along on every run + span for analyst discovery. */\nexport interface TraceStoreToOtlpOptions {\n /** Default OTLP `service.name` when a source doesn't set its own.\n * Default `agent-eval`. */\n serviceName?: string\n /** Extra resource attributes per run, e.g.\n * `(run) => ({ 'legal.persona_id': run.tags?.personaId ?? '' })`. */\n resourceAttributes?: (run: Run) => Record<string, unknown>\n /** Extra attributes on the per-run anchor span, e.g. domain outcome fields. */\n runAttributes?: (run: Run) => Record<string, unknown>\n}\n\n/**\n * Read every per-cell shard under each source root and write a flat OTLP-JSONL\n * view of the corpus to `outPath`. Each cell directory is a\n * `FileSystemTraceStore` — NDJSON append-only with size-based rotation;\n * `updateRun`/`updateSpan` append `{ id, ...patch, _update: true }` rows\n * rather than rewriting, so readers must merge those patches in (done here).\n *\n * A `string` source is treated as a celled root.\n */\nexport function convertTraceStoresToOtlp(\n source: string | TraceStoreSource | readonly TraceStoreSource[],\n outPath: string,\n opts: TraceStoreToOtlpOptions = {},\n): TracesToOtlpResult {\n const sources: TraceStoreSource[] = Array.isArray(source)\n ? [...source]\n : typeof source === 'string'\n ? [{ root: source, layout: 'celled' }]\n : [source as TraceStoreSource]\n\n const defaultServiceName = opts.serviceName ?? 'agent-eval'\n const resourceAttributes = opts.resourceAttributes ?? (() => ({}))\n const runAttributes = opts.runAttributes ?? (() => ({}))\n\n const lines: string[] = []\n let spanCount = 0\n let runCount = 0\n let cellCount = 0\n let cellErrorCount = 0\n\n for (const src of sources) {\n const serviceName = src.serviceName ?? defaultServiceName\n const cellDirs: Array<{ label: string; dir: string }> =\n src.layout === 'flat'\n ? [{ label: '<root>', dir: src.root }]\n : listCells(src.root).map((name) => ({ label: name, dir: join(src.root, name) }))\n\n for (const cell of cellDirs) {\n try {\n const result = projectCell({\n cellDir: cell.dir,\n serviceName,\n resourceAttributes,\n runAttributes,\n })\n for (const line of result.lines) lines.push(line)\n spanCount += result.spanCount\n runCount += result.runCount\n cellCount += 1\n } catch (err) {\n console.warn(\n `[traces-to-otlp] cell ${cell.label} (${cell.dir}) skipped: ${err instanceof Error ? err.message : String(err)}`,\n )\n cellErrorCount += 1\n }\n }\n }\n\n writeFileSync(outPath, lines.join('\\n') + (lines.length > 0 ? '\\n' : ''))\n return { spanCount, runCount, cellCount, cellErrorCount }\n}\n\ninterface ProjectCellResult {\n lines: string[]\n runCount: number\n spanCount: number\n}\n\nfunction projectCell(args: {\n cellDir: string\n serviceName: string\n resourceAttributes: (run: Run) => Record<string, unknown>\n runAttributes: (run: Run) => Record<string, unknown>\n}): ProjectCellResult {\n const { cellDir, serviceName, resourceAttributes, runAttributes } = args\n const lines: string[] = []\n let runCount = 0\n let spanCount = 0\n\n const runs = readMergedShards<Run & MaybeUpdate>(cellDir, 'runs', 'runId')\n const spans = readMergedShards<Span & MaybeUpdate>(cellDir, 'spans', 'spanId')\n const events = readShards<TraceEvent>(cellDir, 'events')\n\n const runByRunId = new Map<string, Run>()\n for (const r of runs) runByRunId.set(r.runId, r)\n const spanBySpanId = new Map<string, Span>()\n for (const s of spans) spanBySpanId.set(s.spanId, s)\n const eventsBySpanId = new Map<string, TraceEvent[]>()\n\n // An HTTP-backed trace store can only POST `TraceEvent`s through the wire;\n // run/span lifecycle is projected into `state_mutation` events with\n // `payload.entity ∈ { run, run.update, span, span.update }`. Fold those back\n // so the analyst sees a complete Run + Span tree.\n for (const e of events) {\n if (e.kind === 'state_mutation' && e.payload && typeof e.payload === 'object') {\n const entity = (e.payload as Record<string, unknown>).entity\n if (entity === 'run') {\n const run = (e.payload as { run?: Run }).run\n if (run?.runId) runByRunId.set(run.runId, run)\n continue\n }\n if (entity === 'run.update') {\n const patch = (e.payload as { patch?: Partial<Run> }).patch\n if (patch && e.runId) {\n const prior = runByRunId.get(e.runId)\n if (prior) runByRunId.set(e.runId, { ...prior, ...patch })\n }\n continue\n }\n if (entity === 'span') {\n const span = (e.payload as { span?: Span }).span\n if (span?.spanId) spanBySpanId.set(span.spanId, span)\n continue\n }\n if (entity === 'span.update') {\n const spanId = (e.payload as { spanId?: string }).spanId\n const patch = (e.payload as { patch?: Partial<Span> }).patch\n if (spanId && patch) {\n const prior = spanBySpanId.get(spanId)\n if (prior) spanBySpanId.set(spanId, { ...prior, ...patch } as Span)\n }\n continue\n }\n }\n if (!e.spanId) continue\n const arr = eventsBySpanId.get(e.spanId) ?? []\n arr.push(e)\n eventsBySpanId.set(e.spanId, arr)\n }\n\n for (const run of runByRunId.values()) {\n const traceId = padTraceId(run.runId)\n const agentName = run.variantId ?? run.scenarioId\n const sharedResource = {\n attributes: {\n 'service.name': serviceName,\n 'agent.name': agentName,\n 'run.id': run.runId,\n 'run.status': run.status,\n ...resourceAttributes(run),\n },\n }\n\n const runSpanId = padSpanId(`run-${run.runId}`)\n const runStart = msToIso(run.startedAt)\n const runEnd = msToIso(run.endedAt ?? run.startedAt)\n const runStatus =\n run.outcome?.failureClass && run.outcome.failureClass !== 'success'\n ? 'STATUS_CODE_ERROR'\n : 'STATUS_CODE_OK'\n const runAttrs: Record<string, unknown> = {\n 'openinference.span.kind': 'AGENT',\n 'agent.name': agentName,\n 'agent.workflow.name': serviceName,\n ...runAttributes(run),\n }\n lines.push(\n JSON.stringify(\n toLine({\n traceId,\n spanId: runSpanId,\n parentSpanId: '',\n name: `run.${agentName}`,\n kind: 'SPAN_KIND_INTERNAL',\n startTime: runStart,\n endTime: runEnd,\n statusCode: runStatus,\n statusMessage: run.outcome?.notes ?? '',\n resource: sharedResource,\n attributes: runAttrs,\n }),\n ),\n )\n runCount += 1\n\n for (const span of spanBySpanId.values()) {\n if (span.runId !== run.runId) continue\n const spanAttrs = spanToAttributes(span, eventsBySpanId.get(span.spanId) ?? [])\n const statusCode = span.status === 'error' ? 'STATUS_CODE_ERROR' : 'STATUS_CODE_OK'\n lines.push(\n JSON.stringify(\n toLine({\n traceId,\n spanId: padSpanId(span.spanId),\n parentSpanId: span.parentSpanId ? padSpanId(span.parentSpanId) : runSpanId,\n name: span.name,\n kind: spanKindToOtlpKind(span.kind),\n startTime: msToIso(span.startedAt),\n endTime: msToIso(span.endedAt ?? span.startedAt),\n statusCode,\n statusMessage: span.error ?? '',\n resource: sharedResource,\n attributes: spanAttrs,\n }),\n ),\n )\n spanCount += 1\n }\n }\n\n return { lines, runCount, spanCount }\n}\n\nfunction listCells(root: string): string[] {\n try {\n return readdirSync(root, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n .sort()\n } catch {\n return []\n }\n}\n\n/**\n * Read every NDJSON shard for `name` under `cellDir`, ordered by mtime so\n * rotated files apply before the active one. Yields raw rows including any\n * `_update: true` patches.\n */\nfunction readShards<T>(cellDir: string, name: string): T[] {\n let entries: string[]\n try {\n entries = readdirSync(cellDir)\n } catch {\n return []\n }\n const shards = entries\n .filter((f) => (f === `${name}.ndjson` || f.startsWith(`${name}.`)) && f.endsWith('.ndjson'))\n .map((f) => ({ file: f, path: join(cellDir, f) }))\n .map((s) => {\n let mtime = 0\n try {\n mtime = statSync(s.path).mtimeMs\n } catch {\n /* skip stat errors */\n }\n return { ...s, mtime }\n })\n .sort((a, b) => a.mtime - b.mtime || a.file.localeCompare(b.file))\n\n const rows: T[] = []\n for (const shard of shards) {\n let text: string\n try {\n text = readFileSync(shard.path, 'utf-8')\n } catch {\n continue\n }\n for (const line of text.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed) continue\n try {\n rows.push(JSON.parse(trimmed) as T)\n } catch {\n /* skip partial line */\n }\n }\n }\n return rows\n}\n\n/**\n * Read NDJSON shards and merge `{ ...patch, _update: true }` rows into the\n * prior record keyed on `idKey` — mirrors the in-memory merge\n * `FileSystemTraceStore` keeps but doesn't replay on cross-process load.\n */\nfunction readMergedShards<T extends { _update?: boolean }>(\n cellDir: string,\n name: string,\n idKey: keyof T,\n): T[] {\n const rows = readShards<T>(cellDir, name)\n const byId = new Map<string, T>()\n for (const row of rows) {\n const id = row[idKey] as unknown as string\n if (!id) continue\n const prior = byId.get(id)\n if (prior && row._update) {\n byId.set(id, { ...prior, ...row, _update: undefined } as T)\n } else {\n byId.set(id, row)\n }\n }\n return [...byId.values()]\n}\n\nfunction spanToAttributes(span: Span, events: TraceEvent[]): Record<string, unknown> {\n const attrs: Record<string, unknown> = {\n 'openinference.span.kind': spanKindToOpenInferenceKind(span.kind),\n }\n if (span.kind === 'llm') {\n attrs['llm.model_name'] = span.model\n if (span.inputTokens !== undefined) attrs['llm.token_count.prompt'] = span.inputTokens\n if (span.outputTokens !== undefined) attrs['llm.token_count.completion'] = span.outputTokens\n if (span.costUsd !== undefined) attrs['llm.cost_usd'] = span.costUsd\n if (span.finishReason) attrs['llm.finish_reason'] = span.finishReason\n if (Array.isArray(span.messages)) {\n attrs['llm.input_messages'] = JSON.stringify(span.messages.slice(-6))\n }\n if (typeof span.output === 'string') {\n attrs['llm.output_messages'] = JSON.stringify([{ role: 'assistant', content: span.output }])\n }\n } else if (span.kind === 'tool') {\n attrs['tool.name'] = span.toolName\n if (span.latencyMs !== undefined) attrs['tool.latency_ms'] = span.latencyMs\n attrs['input.value'] = safeStringify(span.args)\n if (span.result !== undefined) attrs['output.value'] = safeStringify(span.result)\n } else if (span.kind === 'judge') {\n attrs['judge.id'] = span.judgeId\n attrs['judge.dimension'] = span.dimension\n attrs['judge.score'] = span.score\n attrs['judge.target_span_id'] = span.targetSpanId\n }\n if (span.attributes) {\n for (const [k, v] of Object.entries(span.attributes)) {\n attrs[`agent_eval.${k}`] = v\n }\n }\n if (events.length > 0) {\n attrs['agent_eval.event_count'] = events.length\n attrs['agent_eval.event_kinds'] = JSON.stringify(events.map((e) => e.kind))\n }\n return attrs\n}\n\nfunction spanKindToOtlpKind(kind: Span['kind']): string {\n switch (kind) {\n case 'llm':\n return 'SPAN_KIND_CLIENT'\n case 'retrieval':\n return 'SPAN_KIND_CLIENT'\n default:\n return 'SPAN_KIND_INTERNAL'\n }\n}\n\nfunction spanKindToOpenInferenceKind(kind: Span['kind']): string {\n switch (kind) {\n case 'llm':\n return 'LLM'\n case 'tool':\n return 'TOOL'\n case 'retrieval':\n return 'CHAIN'\n case 'judge':\n return 'GUARDRAIL'\n case 'sandbox':\n return 'CHAIN'\n case 'agent':\n return 'AGENT'\n default:\n return 'SPAN'\n }\n}\n\ninterface ToLineArgs {\n traceId: string\n spanId: string\n parentSpanId: string\n name: string\n kind: string\n startTime: string\n endTime: string\n statusCode: 'STATUS_CODE_OK' | 'STATUS_CODE_ERROR'\n statusMessage: string\n resource: { attributes: Record<string, unknown> }\n attributes: Record<string, unknown>\n}\n\nfunction toLine(args: ToLineArgs): OtlpFlatSpan {\n return {\n trace_id: args.traceId,\n span_id: args.spanId,\n parent_span_id: args.parentSpanId,\n name: args.name,\n kind: args.kind,\n start_time: args.startTime,\n end_time: args.endTime,\n status: { code: args.statusCode, message: args.statusMessage },\n resource: args.resource,\n attributes: args.attributes,\n }\n}\n\nfunction msToIso(ms: number): string {\n if (!Number.isFinite(ms) || ms <= 0) return new Date(0).toISOString()\n return new Date(ms).toISOString()\n}\n\n/** OTLP wants 16-hex span ids; eval traces use UUID-ish strings. Hex-strip +\n * take 16, else deterministic FNV fold. */\nfunction padSpanId(id: string): string {\n const cleaned = id.replace(/[^a-f0-9]/gi, '').toLowerCase()\n if (cleaned.length >= 16) return cleaned.slice(0, 16)\n return foldTo16Hex(id)\n}\n\n/** OTLP wants 32-hex trace ids; fold deterministically when too short. */\nfunction padTraceId(id: string): string {\n const cleaned = id.replace(/[^a-f0-9]/gi, '').toLowerCase()\n if (cleaned.length >= 32) return cleaned.slice(0, 32)\n return foldTo32Hex(id)\n}\n\nfunction foldTo16Hex(s: string): string {\n let h1 = 0x811c9dc5\n for (const ch of s) {\n h1 ^= ch.charCodeAt(0)\n h1 = Math.imul(h1, 0x01000193) >>> 0\n }\n const part = h1.toString(16).padStart(8, '0')\n return (part + part).slice(0, 16)\n}\n\nfunction foldTo32Hex(s: string): string {\n return foldTo16Hex(s) + foldTo16Hex(`${s}::trace`).slice(0, 16)\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return typeof value === 'string' ? value : JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n","/**\n * Replay-from-raw-events — turn every captured campaign run into a\n * re-runnable artifact.\n *\n * `RawProviderSink` captures every provider HTTP envelope; `runEvalCampaign`\n * makes that capture the default. Together they make every past run a\n * complete fingerprint of what happened on the wire — enough to replay\n * the run without burning new LLM cost.\n *\n * Three use cases this primitive enables:\n *\n * 1. **Post-hoc judging** — apply a new judge / rubric / scoring callback\n * to last week's runs without re-calling any LLM. The cost of trying\n * a new rubric drops from \"another full sweep\" to a CPU-bound replay.\n * 2. **Determinism audits** — replay the same campaign and verify the\n * raw responses match byte-for-byte. Any drift is a non-determinism\n * bug (in the harness, the prompt builder, the sandbox, …).\n * 3. **Free judge calibration** — run two judges on identical responses\n * and measure inter-judge agreement without doubling LLM spend.\n *\n * The interface is deliberately fetch-shaped. Inject `createReplayFetch`\n * into `LlmClientOptions.fetch` and every `callLlm` transparently reads\n * from the cache instead of calling the network. No new code path through\n * the LLM client is needed; the cache hit is invisible to the runner.\n */\n\nimport { ReplayError } from './errors'\nimport { canonicalize, hashJson } from './pre-registration'\nimport type { RawProviderEvent, RawProviderSink } from './trace/raw-provider-sink'\n\nexport class ReplayCacheMissError extends ReplayError {\n constructor(\n public readonly url: string,\n public readonly requestKey: string,\n message?: string,\n ) {\n super(message ?? `replay cache miss for ${url} (key=${requestKey})`)\n }\n}\n\nexport interface ReplayCacheEntry {\n request: RawProviderEvent\n response: RawProviderEvent\n}\n\nexport interface ReplayCacheStats {\n total: number\n byProvider: Record<string, number>\n byModel: Record<string, number>\n /** Spans for which we have a request but no response (run aborted mid-call). */\n orphanRequests: number\n}\n\n/**\n * In-memory deterministic cache of (request → response) keyed on a stable\n * hash of the request body. Built from a `RawProviderSink` containing\n * paired `request` and `response` events from a previous run.\n *\n * The cache is the source of truth for replay; `createReplayFetch` is a\n * thin wrapper that reads from it.\n */\nexport class ReplayCache {\n private byKey = new Map<string, ReplayCacheEntry>()\n private orphans = 0\n private byProvider: Record<string, number> = {}\n private byModel: Record<string, number> = {}\n\n /**\n * Build a cache from a sink's events. The sink must implement `list()`.\n * Filter by `runId` / `spanId` to scope to a specific replay.\n */\n static async fromSink(\n sink: RawProviderSink,\n filter: { runId?: string; spanId?: string } = {},\n ): Promise<ReplayCache> {\n if (!sink.list) {\n throw new ReplayError('ReplayCache.fromSink: sink must implement list() to be replayable.')\n }\n const events = await sink.list(filter)\n return ReplayCache.fromEvents(events)\n }\n\n /** Build a cache from an in-memory event list. */\n static async fromEvents(events: RawProviderEvent[]): Promise<ReplayCache> {\n const cache = new ReplayCache()\n // Group by (runId, spanId, attemptIndex) so request/response/error pairs are matched.\n // A cell can have many spans; each retry attempt within a span is a separate group.\n type GroupKey = string\n const groups = new Map<GroupKey, { req?: RawProviderEvent; res?: RawProviderEvent }>()\n for (const e of events) {\n const k = `${e.runId ?? ''}::${e.spanId ?? ''}::${e.attemptIndex}`\n const g = groups.get(k) ?? {}\n if (e.direction === 'request') g.req = e\n else g.res = e\n groups.set(k, g)\n }\n for (const g of groups.values()) {\n if (!g.req) continue\n if (!g.res) {\n cache.orphans += 1\n continue\n }\n const key = await requestKey(g.req)\n cache.byKey.set(key, { request: g.req, response: g.res })\n cache.byProvider[g.req.provider] = (cache.byProvider[g.req.provider] ?? 0) + 1\n cache.byModel[g.req.model] = (cache.byModel[g.req.model] ?? 0) + 1\n }\n return cache\n }\n\n /** Number of cacheable (request, response) pairs in the cache. */\n size(): number {\n return this.byKey.size\n }\n\n stats(): ReplayCacheStats {\n return {\n total: this.byKey.size,\n byProvider: { ...this.byProvider },\n byModel: { ...this.byModel },\n orphanRequests: this.orphans,\n }\n }\n\n /** Iterate every cached `(request, response)` pair in insertion order. */\n *entries(): IterableIterator<ReplayCacheEntry> {\n for (const entry of this.byKey.values()) yield entry\n }\n\n /**\n * Look up a cached response by hashing the (model, messages, temperature,\n * maxTokens, response_format) shape. Returns `undefined` on miss; the\n * caller decides whether to throw, fall back to the network, or skip.\n */\n async lookup(requestBody: unknown): Promise<ReplayCacheEntry | undefined> {\n const key = await keyFromBody(requestBody)\n return this.byKey.get(key)\n }\n}\n\nexport interface ReplayFetchOptions {\n /**\n * Behaviour on cache miss. Default `'throw'`. `'fallback'` calls the\n * `fallbackFetch` (typically `globalThis.fetch`) so a partial replay can\n * still complete; `'fail-closed'` returns a synthetic 599 response so the\n * call site sees a non-retriable failure.\n */\n onMiss?: 'throw' | 'fallback' | 'fail-closed'\n fallbackFetch?: typeof fetch\n /** Optional callback fired once per replayed call (for telemetry / counters). */\n onHit?: (info: { url: string; provider: string; model: string }) => void\n /** Optional callback fired on cache miss before the `onMiss` policy applies. */\n onMissNotify?: (info: { url: string; requestBody: unknown }) => void\n}\n\n/**\n * Build a `fetch`-shaped function that serves cached responses out of a\n * `ReplayCache` for any URL ending in `/chat/completions`. Pass through\n * `LlmClientOptions.fetch` and `callLlm` becomes free.\n *\n * Non-`/chat/completions` URLs are passed straight to the fallback fetch\n * (default: `globalThis.fetch`). This matters because non-LLM HTTP work\n * (judge HTTP servers, sandbox callbacks) sometimes flows through the same\n * `fetch` and shouldn't be intercepted.\n */\nexport function createReplayFetch(cache: ReplayCache, opts: ReplayFetchOptions = {}): typeof fetch {\n const onMiss = opts.onMiss ?? 'throw'\n const fallback = opts.fallbackFetch ?? globalThis.fetch?.bind(globalThis)\n\n return (async (input: RequestInfo | URL, init?: RequestInit) => {\n const url =\n typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url\n if (!/\\/chat\\/completions(?:[?#].*)?$/.test(url)) {\n if (!fallback)\n throw new ReplayError(\n `replay fetch: non-completions URL ${url} but no fallbackFetch configured`,\n )\n return fallback(input as RequestInfo, init)\n }\n let bodyParsed: unknown\n if (init?.body && typeof init.body === 'string') {\n try {\n bodyParsed = JSON.parse(init.body)\n } catch {\n /* raw body, not JSON */\n }\n }\n const hit = bodyParsed === undefined ? undefined : await cache.lookup(bodyParsed)\n if (hit) {\n opts.onHit?.({ url, provider: hit.request.provider, model: hit.request.model })\n const status = hit.response.statusCode ?? 200\n const headers = new Headers(\n Object.entries(hit.response.responseHeaders ?? { 'Content-Type': 'application/json' }),\n )\n const bodyText =\n typeof hit.response.responseBody === 'string'\n ? hit.response.responseBody\n : JSON.stringify(hit.response.responseBody ?? {})\n return new Response(bodyText, { status, headers })\n }\n opts.onMissNotify?.({ url, requestBody: bodyParsed })\n if (onMiss === 'throw') {\n const key = bodyParsed === undefined ? '<unparseable>' : await keyFromBody(bodyParsed)\n throw new ReplayCacheMissError(url, key)\n }\n if (onMiss === 'fail-closed') {\n return new Response(JSON.stringify({ error: 'replay_cache_miss' }), { status: 599 })\n }\n if (!fallback)\n throw new ReplayError('replay fetch: onMiss=fallback but no fallbackFetch configured')\n return fallback(input as RequestInfo, init)\n }) as typeof fetch\n}\n\n/**\n * Convenience iterator over `(request, response)` pairs in a sink — for\n * post-hoc scoring that doesn't need a `fetch` shim. The judge or scorer\n * runs purely in-process over cached LLM outputs.\n */\nexport async function* iterateRawCalls(\n sink: RawProviderSink,\n filter: { runId?: string; spanId?: string } = {},\n): AsyncGenerator<ReplayCacheEntry> {\n if (!sink.list) {\n throw new ReplayError('iterateRawCalls: sink must implement list().')\n }\n const events = await sink.list(filter)\n const cache = await ReplayCache.fromEvents(events)\n for (const entry of cache.entries()) yield entry\n}\n\n// ── Hashing ──────────────────────────────────────────────────────────────\n\n/**\n * Canonical request key.\n *\n * `model + messages + temperature + max_tokens|max_completion_tokens +\n * response_format` are the dimensions that affect the response shape.\n * Other fields (timestamp headers, provider-specific metadata) are\n * intentionally excluded so a request hashes the same across re-runs.\n */\nasync function requestKey(event: RawProviderEvent): Promise<string> {\n return keyFromBody(event.requestBody)\n}\n\nasync function keyFromBody(body: unknown): Promise<string> {\n if (body == null || typeof body !== 'object') return hashJson({ raw: String(body) })\n const b = body as Record<string, unknown>\n const reduced = canonicalize({\n model: b.model ?? null,\n messages: b.messages ?? null,\n temperature: b.temperature ?? null,\n max_tokens: b.max_tokens ?? null,\n max_completion_tokens: b.max_completion_tokens ?? null,\n response_format: b.response_format ?? null,\n })\n return hashJson(reduced)\n}\n"],"mappings":"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","names":["fetch","toAttributes","padSpanId","msToNs","padTraceId","padSpanId","requestKey"]}