@opensearch-project/agent-health 0.4.0 → 0.6.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 (551) hide show
  1. package/README.md +36 -5
  2. package/cli/dist/index.js +8292 -2938
  3. package/deployment/cloudformation/agent-health-observability.yaml +223 -32
  4. package/dist/assets/index-BfxtxmKc.css +1 -0
  5. package/dist/assets/index-CrjAfDHu.js +243 -0
  6. package/dist/index.html +2 -2
  7. package/docs/ARCHITECTURE.md +450 -0
  8. package/docs/BACKEND_JOB_QUEUE.md +405 -0
  9. package/docs/CLAUDE_CODE_TELEMETRY.md +283 -0
  10. package/docs/CLI.md +474 -0
  11. package/docs/CODING_AGENT_ANALYTICS.md +298 -0
  12. package/docs/CONFIGURATION.md +388 -0
  13. package/docs/CONNECTORS.md +536 -0
  14. package/docs/INSTRUMENT_WITH_OTEL.md +397 -0
  15. package/docs/ML-COMMONS-SETUP.md +289 -0
  16. package/docs/NPX_PACKAGING.md +195 -0
  17. package/docs/PERFORMANCE-MONITORING.md +200 -0
  18. package/docs/PERFORMANCE.md +390 -0
  19. package/docs/PI_PROFILING.md +169 -0
  20. package/docs/PLAN-non-agui-agent-support.md +525 -0
  21. package/docs/SDK.md +626 -0
  22. package/docs/SKILLS.md +264 -0
  23. package/docs/STORAGE_INDEX_FIELD_LIMITS.md +216 -0
  24. package/docs/blogs/2026-02-28-opensearch-agent-health.md +200 -0
  25. package/docs/blogs/getting-started-blog.md +608 -0
  26. package/docs/diagrams/Agent-health.excalidraw +5656 -0
  27. package/docs/diagrams/architecture.png +0 -0
  28. package/docs/plans/field-redesign.md +468 -0
  29. package/docs/rfcs/001-coding-agent-analytics.md +374 -0
  30. package/docs/rfcs/002-enterprise-leaderboard.md +267 -0
  31. package/docs/rfcs/003-remote-aggregation.md +146 -0
  32. package/docs/rfcs/004-test-sdk-v2.md +599 -0
  33. package/docs/skills/AGENT_HEALTH.md +652 -0
  34. package/docs/skills/AGENT_PROFILE.md +191 -0
  35. package/docs/skills/add-connector/SKILL.md +68 -0
  36. package/docs/skills/agent-health-profile/SKILL.md +40 -0
  37. package/docs/skills/config-auth/SKILL.md +194 -0
  38. package/docs/skills/config-auth/evals/evals.json +35 -0
  39. package/docs/skills/create-pr/SKILL.md +73 -0
  40. package/docs/skills/instrument-otel/SKILL.md +84 -0
  41. package/docs/skills/write-test/SKILL.md +124 -0
  42. package/docs/ui prd.md +376 -0
  43. package/examples/README.md +53 -0
  44. package/examples/config/agent-health.config.example.ts +155 -0
  45. package/examples/connectors/echo-connector.ts +131 -0
  46. package/examples/eval-files/demo.eval.js +128 -0
  47. package/examples/eval-files/ops-rca-classification.eval.js +71 -0
  48. package/examples/eval-files/ops-rca-evaluator.json +15 -0
  49. package/examples/eval-files/sdk-demo.eval.js +72 -0
  50. package/examples/eval-files/sdk-describe-demo.eval.js +50 -0
  51. package/examples/eval-files/sdk-hooks-demo.eval.js +99 -0
  52. package/examples/pi-profiling/README.md +77 -0
  53. package/examples/pi-profiling/agent-health-profile.ts +417 -0
  54. package/lib/dist/lib/agentUtils.d.ts +29 -0
  55. package/lib/dist/lib/agentUtils.d.ts.map +1 -0
  56. package/lib/dist/lib/agentUtils.js +43 -0
  57. package/lib/dist/lib/agentUtils.js.map +1 -0
  58. package/lib/dist/lib/bedrockCompat.d.ts +27 -0
  59. package/lib/dist/lib/bedrockCompat.d.ts.map +1 -0
  60. package/lib/dist/lib/bedrockCompat.js +83 -0
  61. package/lib/dist/lib/bedrockCompat.js.map +1 -0
  62. package/lib/dist/lib/benchmarkExport.d.ts +14 -0
  63. package/lib/dist/lib/benchmarkExport.d.ts.map +1 -0
  64. package/lib/dist/lib/benchmarkExport.js +41 -0
  65. package/lib/dist/lib/benchmarkExport.js.map +1 -0
  66. package/lib/dist/lib/benchmarkImage.d.ts +52 -0
  67. package/lib/dist/lib/benchmarkImage.d.ts.map +1 -0
  68. package/lib/dist/lib/benchmarkImage.js +113 -0
  69. package/lib/dist/lib/benchmarkImage.js.map +1 -0
  70. package/lib/dist/lib/benchmarkVersionUtils.d.ts +50 -0
  71. package/lib/dist/lib/benchmarkVersionUtils.d.ts.map +1 -0
  72. package/lib/dist/lib/benchmarkVersionUtils.js +89 -0
  73. package/lib/dist/lib/benchmarkVersionUtils.js.map +1 -0
  74. package/lib/dist/lib/chunkedFetch.d.ts +18 -0
  75. package/lib/dist/lib/chunkedFetch.d.ts.map +1 -0
  76. package/lib/dist/lib/chunkedFetch.js +40 -0
  77. package/lib/dist/lib/chunkedFetch.js.map +1 -0
  78. package/lib/dist/lib/comparisonInsights.d.ts +104 -0
  79. package/lib/dist/lib/comparisonInsights.d.ts.map +1 -0
  80. package/lib/dist/lib/comparisonInsights.js +212 -0
  81. package/lib/dist/lib/comparisonInsights.js.map +1 -0
  82. package/lib/dist/lib/config/defineConfig.d.ts +27 -0
  83. package/lib/dist/lib/config/defineConfig.d.ts.map +1 -0
  84. package/lib/dist/lib/config/defineConfig.js +28 -0
  85. package/lib/dist/lib/config/defineConfig.js.map +1 -0
  86. package/lib/dist/lib/config/index.d.ts +9 -0
  87. package/lib/dist/lib/config/index.d.ts.map +1 -0
  88. package/lib/dist/lib/config/index.js +8 -0
  89. package/lib/dist/lib/config/index.js.map +1 -0
  90. package/lib/dist/lib/config/loader.d.ts +39 -0
  91. package/lib/dist/lib/config/loader.d.ts.map +1 -0
  92. package/lib/dist/lib/config/loader.js +263 -0
  93. package/lib/dist/lib/config/loader.js.map +1 -0
  94. package/lib/dist/lib/config/statePaths.d.ts +61 -0
  95. package/lib/dist/lib/config/statePaths.d.ts.map +1 -0
  96. package/lib/dist/lib/config/statePaths.js +188 -0
  97. package/lib/dist/lib/config/statePaths.js.map +1 -0
  98. package/lib/dist/lib/config/types.d.ts +245 -0
  99. package/lib/dist/lib/config/types.d.ts.map +1 -0
  100. package/lib/dist/lib/config/types.js +6 -0
  101. package/lib/dist/lib/config/types.js.map +1 -0
  102. package/lib/dist/lib/config.d.ts +39 -0
  103. package/lib/dist/lib/config.d.ts.map +1 -0
  104. package/lib/dist/lib/config.js +118 -0
  105. package/lib/dist/lib/config.js.map +1 -0
  106. package/lib/dist/lib/constants.d.ts +81 -0
  107. package/lib/dist/lib/constants.d.ts.map +1 -0
  108. package/lib/dist/lib/constants.js +374 -0
  109. package/lib/dist/lib/constants.js.map +1 -0
  110. package/lib/dist/lib/contextFormat.d.ts +26 -0
  111. package/lib/dist/lib/contextFormat.d.ts.map +1 -0
  112. package/lib/dist/lib/contextFormat.js +28 -0
  113. package/lib/dist/lib/contextFormat.js.map +1 -0
  114. package/lib/dist/lib/contextUtilization.d.ts +23 -0
  115. package/lib/dist/lib/contextUtilization.d.ts.map +1 -0
  116. package/lib/dist/lib/contextUtilization.js +72 -0
  117. package/lib/dist/lib/contextUtilization.js.map +1 -0
  118. package/lib/dist/lib/dashboardMetrics.d.ts +87 -0
  119. package/lib/dist/lib/dashboardMetrics.d.ts.map +1 -0
  120. package/lib/dist/lib/dashboardMetrics.js +242 -0
  121. package/lib/dist/lib/dashboardMetrics.js.map +1 -0
  122. package/lib/dist/lib/dataSourceConfig.d.ts +108 -0
  123. package/lib/dist/lib/dataSourceConfig.d.ts.map +1 -0
  124. package/lib/dist/lib/dataSourceConfig.js +166 -0
  125. package/lib/dist/lib/dataSourceConfig.js.map +1 -0
  126. package/lib/dist/lib/debug.d.ts +26 -0
  127. package/lib/dist/lib/debug.d.ts.map +1 -0
  128. package/lib/dist/lib/debug.js +132 -0
  129. package/lib/dist/lib/debug.js.map +1 -0
  130. package/lib/dist/lib/diagnostics.d.ts +28 -0
  131. package/lib/dist/lib/diagnostics.d.ts.map +1 -0
  132. package/lib/dist/lib/diagnostics.js +65 -0
  133. package/lib/dist/lib/diagnostics.js.map +1 -0
  134. package/lib/dist/lib/envCompat.d.ts +27 -0
  135. package/lib/dist/lib/envCompat.d.ts.map +1 -0
  136. package/lib/dist/lib/envCompat.js +82 -0
  137. package/lib/dist/lib/envCompat.js.map +1 -0
  138. package/lib/dist/lib/evaluationRerun.d.ts +63 -0
  139. package/lib/dist/lib/evaluationRerun.d.ts.map +1 -0
  140. package/lib/dist/lib/evaluationRerun.js +85 -0
  141. package/lib/dist/lib/evaluationRerun.js.map +1 -0
  142. package/lib/dist/lib/findPackageRoot.d.ts +7 -0
  143. package/lib/dist/lib/findPackageRoot.d.ts.map +1 -0
  144. package/lib/dist/lib/findPackageRoot.js +57 -0
  145. package/lib/dist/lib/findPackageRoot.js.map +1 -0
  146. package/lib/dist/lib/hooks.d.ts +36 -0
  147. package/lib/dist/lib/hooks.d.ts.map +1 -0
  148. package/lib/dist/lib/hooks.js +112 -0
  149. package/lib/dist/lib/hooks.js.map +1 -0
  150. package/lib/dist/lib/index.d.ts +47 -0
  151. package/lib/dist/lib/index.d.ts.map +1 -0
  152. package/lib/dist/lib/index.js +62 -0
  153. package/lib/dist/lib/index.js.map +1 -0
  154. package/lib/dist/lib/labels.d.ts +90 -0
  155. package/lib/dist/lib/labels.d.ts.map +1 -0
  156. package/lib/dist/lib/labels.js +158 -0
  157. package/lib/dist/lib/labels.js.map +1 -0
  158. package/lib/dist/lib/markdown.d.ts +16 -0
  159. package/lib/dist/lib/markdown.d.ts.map +1 -0
  160. package/lib/dist/lib/markdown.js +42 -0
  161. package/lib/dist/lib/markdown.js.map +1 -0
  162. package/lib/dist/lib/matchers/expect.d.ts +3 -0
  163. package/lib/dist/lib/matchers/expect.d.ts.map +1 -0
  164. package/lib/dist/lib/matchers/expect.js +225 -0
  165. package/lib/dist/lib/matchers/expect.js.map +1 -0
  166. package/lib/dist/lib/matchers/index.d.ts +8 -0
  167. package/lib/dist/lib/matchers/index.d.ts.map +1 -0
  168. package/lib/dist/lib/matchers/index.js +9 -0
  169. package/lib/dist/lib/matchers/index.js.map +1 -0
  170. package/lib/dist/lib/matchers/judgeAccessor.d.ts +113 -0
  171. package/lib/dist/lib/matchers/judgeAccessor.d.ts.map +1 -0
  172. package/lib/dist/lib/matchers/judgeAccessor.js +183 -0
  173. package/lib/dist/lib/matchers/judgeAccessor.js.map +1 -0
  174. package/lib/dist/lib/matchers/session.d.ts +39 -0
  175. package/lib/dist/lib/matchers/session.d.ts.map +1 -0
  176. package/lib/dist/lib/matchers/session.js +116 -0
  177. package/lib/dist/lib/matchers/session.js.map +1 -0
  178. package/lib/dist/lib/matchers/traces.d.ts +70 -0
  179. package/lib/dist/lib/matchers/traces.d.ts.map +1 -0
  180. package/lib/dist/lib/matchers/traces.js +236 -0
  181. package/lib/dist/lib/matchers/traces.js.map +1 -0
  182. package/lib/dist/lib/matchers/tracesPricing.d.ts +38 -0
  183. package/lib/dist/lib/matchers/tracesPricing.d.ts.map +1 -0
  184. package/lib/dist/lib/matchers/tracesPricing.js +64 -0
  185. package/lib/dist/lib/matchers/tracesPricing.js.map +1 -0
  186. package/lib/dist/lib/matchers/types.d.ts +75 -0
  187. package/lib/dist/lib/matchers/types.d.ts.map +1 -0
  188. package/lib/dist/lib/matchers/types.js +6 -0
  189. package/lib/dist/lib/matchers/types.js.map +1 -0
  190. package/lib/dist/lib/packagePaths.d.ts +29 -0
  191. package/lib/dist/lib/packagePaths.d.ts.map +1 -0
  192. package/lib/dist/lib/packagePaths.js +63 -0
  193. package/lib/dist/lib/packagePaths.js.map +1 -0
  194. package/lib/dist/lib/performance.d.ts +51 -0
  195. package/lib/dist/lib/performance.d.ts.map +1 -0
  196. package/lib/dist/lib/performance.js +159 -0
  197. package/lib/dist/lib/performance.js.map +1 -0
  198. package/lib/dist/lib/portConfig.d.ts +29 -0
  199. package/lib/dist/lib/portConfig.d.ts.map +1 -0
  200. package/lib/dist/lib/portConfig.js +64 -0
  201. package/lib/dist/lib/portConfig.js.map +1 -0
  202. package/lib/dist/lib/preferences.d.ts +63 -0
  203. package/lib/dist/lib/preferences.d.ts.map +1 -0
  204. package/lib/dist/lib/preferences.js +117 -0
  205. package/lib/dist/lib/preferences.js.map +1 -0
  206. package/lib/dist/lib/resolveAgentModel.d.ts +22 -0
  207. package/lib/dist/lib/resolveAgentModel.d.ts.map +1 -0
  208. package/lib/dist/lib/resolveAgentModel.js +37 -0
  209. package/lib/dist/lib/resolveAgentModel.js.map +1 -0
  210. package/lib/dist/lib/runStats.d.ts +116 -0
  211. package/lib/dist/lib/runStats.d.ts.map +1 -0
  212. package/lib/dist/lib/runStats.js +192 -0
  213. package/lib/dist/lib/runStats.js.map +1 -0
  214. package/lib/dist/lib/telemetry/constants.d.ts +60 -0
  215. package/lib/dist/lib/telemetry/constants.d.ts.map +1 -0
  216. package/lib/dist/lib/telemetry/constants.js +87 -0
  217. package/lib/dist/lib/telemetry/constants.js.map +1 -0
  218. package/lib/dist/lib/telemetry/evalSpans.d.ts +61 -0
  219. package/lib/dist/lib/telemetry/evalSpans.d.ts.map +1 -0
  220. package/lib/dist/lib/telemetry/evalSpans.js +254 -0
  221. package/lib/dist/lib/telemetry/evalSpans.js.map +1 -0
  222. package/lib/dist/lib/telemetry/index.d.ts +11 -0
  223. package/lib/dist/lib/telemetry/index.d.ts.map +1 -0
  224. package/lib/dist/lib/telemetry/index.js +15 -0
  225. package/lib/dist/lib/telemetry/index.js.map +1 -0
  226. package/lib/dist/lib/telemetry/opensearchExporter.d.ts +43 -0
  227. package/lib/dist/lib/telemetry/opensearchExporter.d.ts.map +1 -0
  228. package/lib/dist/lib/telemetry/opensearchExporter.js +217 -0
  229. package/lib/dist/lib/telemetry/opensearchExporter.js.map +1 -0
  230. package/lib/dist/lib/telemetry/provider.d.ts +55 -0
  231. package/lib/dist/lib/telemetry/provider.d.ts.map +1 -0
  232. package/lib/dist/lib/telemetry/provider.js +140 -0
  233. package/lib/dist/lib/telemetry/provider.js.map +1 -0
  234. package/lib/dist/lib/testCaseLabels.d.ts +34 -0
  235. package/lib/dist/lib/testCaseLabels.d.ts.map +1 -0
  236. package/lib/dist/lib/testCaseLabels.js +88 -0
  237. package/lib/dist/lib/testCaseLabels.js.map +1 -0
  238. package/lib/dist/lib/testCaseValidation.d.ts +140 -0
  239. package/lib/dist/lib/testCaseValidation.d.ts.map +1 -0
  240. package/lib/dist/lib/testCaseValidation.js +162 -0
  241. package/lib/dist/lib/testCaseValidation.js.map +1 -0
  242. package/lib/dist/lib/testCases/agentFixture.d.ts +80 -0
  243. package/lib/dist/lib/testCases/agentFixture.d.ts.map +1 -0
  244. package/lib/dist/lib/testCases/agentFixture.js +43 -0
  245. package/lib/dist/lib/testCases/agentFixture.js.map +1 -0
  246. package/lib/dist/lib/testCases/authoringSurface.d.ts +10 -0
  247. package/lib/dist/lib/testCases/authoringSurface.d.ts.map +1 -0
  248. package/lib/dist/lib/testCases/authoringSurface.js +54 -0
  249. package/lib/dist/lib/testCases/authoringSurface.js.map +1 -0
  250. package/lib/dist/lib/testCases/codemod.d.ts +13 -0
  251. package/lib/dist/lib/testCases/codemod.d.ts.map +1 -0
  252. package/lib/dist/lib/testCases/codemod.js +169 -0
  253. package/lib/dist/lib/testCases/codemod.js.map +1 -0
  254. package/lib/dist/lib/testCases/define.d.ts +114 -0
  255. package/lib/dist/lib/testCases/define.d.ts.map +1 -0
  256. package/lib/dist/lib/testCases/define.js +253 -0
  257. package/lib/dist/lib/testCases/define.js.map +1 -0
  258. package/lib/dist/lib/testCases/evaluators.d.ts +80 -0
  259. package/lib/dist/lib/testCases/evaluators.d.ts.map +1 -0
  260. package/lib/dist/lib/testCases/evaluators.js +105 -0
  261. package/lib/dist/lib/testCases/evaluators.js.map +1 -0
  262. package/lib/dist/lib/testCases/index.d.ts +14 -0
  263. package/lib/dist/lib/testCases/index.d.ts.map +1 -0
  264. package/lib/dist/lib/testCases/index.js +12 -0
  265. package/lib/dist/lib/testCases/index.js.map +1 -0
  266. package/lib/dist/lib/testCases/judge.d.ts +165 -0
  267. package/lib/dist/lib/testCases/judge.d.ts.map +1 -0
  268. package/lib/dist/lib/testCases/judge.js +359 -0
  269. package/lib/dist/lib/testCases/judge.js.map +1 -0
  270. package/lib/dist/lib/testCases/loader.d.ts +36 -0
  271. package/lib/dist/lib/testCases/loader.d.ts.map +1 -0
  272. package/lib/dist/lib/testCases/loader.js +179 -0
  273. package/lib/dist/lib/testCases/loader.js.map +1 -0
  274. package/lib/dist/lib/testCases/types.d.ts +242 -0
  275. package/lib/dist/lib/testCases/types.d.ts.map +1 -0
  276. package/lib/dist/lib/testCases/types.js +6 -0
  277. package/lib/dist/lib/testCases/types.js.map +1 -0
  278. package/lib/dist/lib/theme.d.ts +6 -0
  279. package/lib/dist/lib/theme.d.ts.map +1 -0
  280. package/lib/dist/lib/theme.js +36 -0
  281. package/lib/dist/lib/theme.js.map +1 -0
  282. package/lib/dist/lib/uiTelemetry.d.ts +7 -0
  283. package/lib/dist/lib/uiTelemetry.d.ts.map +1 -0
  284. package/lib/dist/lib/uiTelemetry.js +25 -0
  285. package/lib/dist/lib/uiTelemetry.js.map +1 -0
  286. package/lib/dist/lib/utils.d.ts +111 -0
  287. package/lib/dist/lib/utils.d.ts.map +1 -0
  288. package/lib/dist/lib/utils.js +254 -0
  289. package/lib/dist/lib/utils.js.map +1 -0
  290. package/lib/dist/lib/workflow/consolidate.d.ts +12 -0
  291. package/lib/dist/lib/workflow/consolidate.d.ts.map +1 -0
  292. package/lib/dist/lib/workflow/consolidate.js +33 -0
  293. package/lib/dist/lib/workflow/consolidate.js.map +1 -0
  294. package/lib/dist/lib/workflow/index.d.ts +13 -0
  295. package/lib/dist/lib/workflow/index.d.ts.map +1 -0
  296. package/lib/dist/lib/workflow/index.js +12 -0
  297. package/lib/dist/lib/workflow/index.js.map +1 -0
  298. package/lib/dist/lib/workflow/ledger.d.ts +30 -0
  299. package/lib/dist/lib/workflow/ledger.d.ts.map +1 -0
  300. package/lib/dist/lib/workflow/ledger.js +41 -0
  301. package/lib/dist/lib/workflow/ledger.js.map +1 -0
  302. package/lib/dist/lib/workflow/pool.d.ts +13 -0
  303. package/lib/dist/lib/workflow/pool.d.ts.map +1 -0
  304. package/lib/dist/lib/workflow/pool.js +44 -0
  305. package/lib/dist/lib/workflow/pool.js.map +1 -0
  306. package/lib/dist/lib/workflow/source.d.ts +22 -0
  307. package/lib/dist/lib/workflow/source.d.ts.map +1 -0
  308. package/lib/dist/lib/workflow/source.js +29 -0
  309. package/lib/dist/lib/workflow/source.js.map +1 -0
  310. package/lib/dist/lib/workflow/stepB.d.ts +71 -0
  311. package/lib/dist/lib/workflow/stepB.d.ts.map +1 -0
  312. package/lib/dist/lib/workflow/stepB.js +99 -0
  313. package/lib/dist/lib/workflow/stepB.js.map +1 -0
  314. package/lib/dist/lib/workflow/types.d.ts +86 -0
  315. package/lib/dist/lib/workflow/types.d.ts.map +1 -0
  316. package/lib/dist/lib/workflow/types.js +6 -0
  317. package/lib/dist/lib/workflow/types.js.map +1 -0
  318. package/lib/dist/lib/workflow/workflow.d.ts +119 -0
  319. package/lib/dist/lib/workflow/workflow.d.ts.map +1 -0
  320. package/lib/dist/lib/workflow/workflow.js +195 -0
  321. package/lib/dist/lib/workflow/workflow.js.map +1 -0
  322. package/lib/dist/services/agent/aguiConverter.d.ts +50 -0
  323. package/lib/dist/services/agent/aguiConverter.d.ts.map +1 -0
  324. package/lib/dist/services/agent/aguiConverter.js +449 -0
  325. package/lib/dist/services/agent/aguiConverter.js.map +1 -0
  326. package/lib/dist/services/agent/index.d.ts +10 -0
  327. package/lib/dist/services/agent/index.d.ts.map +1 -0
  328. package/lib/dist/services/agent/index.js +12 -0
  329. package/lib/dist/services/agent/index.js.map +1 -0
  330. package/lib/dist/services/agent/payloadBuilder.d.ts +33 -0
  331. package/lib/dist/services/agent/payloadBuilder.d.ts.map +1 -0
  332. package/lib/dist/services/agent/payloadBuilder.js +75 -0
  333. package/lib/dist/services/agent/payloadBuilder.js.map +1 -0
  334. package/lib/dist/services/agent/sseStream.d.ts +43 -0
  335. package/lib/dist/services/agent/sseStream.d.ts.map +1 -0
  336. package/lib/dist/services/agent/sseStream.js +223 -0
  337. package/lib/dist/services/agent/sseStream.js.map +1 -0
  338. package/lib/dist/services/connectors/agui/AGUIStreamingConnector.d.ts +44 -0
  339. package/lib/dist/services/connectors/agui/AGUIStreamingConnector.d.ts.map +1 -0
  340. package/lib/dist/services/connectors/agui/AGUIStreamingConnector.js +95 -0
  341. package/lib/dist/services/connectors/agui/AGUIStreamingConnector.js.map +1 -0
  342. package/lib/dist/services/connectors/base/BaseConnector.d.ts +81 -0
  343. package/lib/dist/services/connectors/base/BaseConnector.d.ts.map +1 -0
  344. package/lib/dist/services/connectors/base/BaseConnector.js +170 -0
  345. package/lib/dist/services/connectors/base/BaseConnector.js.map +1 -0
  346. package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.d.ts +126 -0
  347. package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.d.ts.map +1 -0
  348. package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.js +417 -0
  349. package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.js.map +1 -0
  350. package/lib/dist/services/connectors/index.d.ts +13 -0
  351. package/lib/dist/services/connectors/index.d.ts.map +1 -0
  352. package/lib/dist/services/connectors/index.js +32 -0
  353. package/lib/dist/services/connectors/index.js.map +1 -0
  354. package/lib/dist/services/connectors/kiro/KiroConnector.d.ts +48 -0
  355. package/lib/dist/services/connectors/kiro/KiroConnector.d.ts.map +1 -0
  356. package/lib/dist/services/connectors/kiro/KiroConnector.js +158 -0
  357. package/lib/dist/services/connectors/kiro/KiroConnector.js.map +1 -0
  358. package/lib/dist/services/connectors/langgraph/LangGraphConnector.d.ts +36 -0
  359. package/lib/dist/services/connectors/langgraph/LangGraphConnector.d.ts.map +1 -0
  360. package/lib/dist/services/connectors/langgraph/LangGraphConnector.js +175 -0
  361. package/lib/dist/services/connectors/langgraph/LangGraphConnector.js.map +1 -0
  362. package/lib/dist/services/connectors/mock/MockConnector.d.ts +37 -0
  363. package/lib/dist/services/connectors/mock/MockConnector.d.ts.map +1 -0
  364. package/lib/dist/services/connectors/mock/MockConnector.js +120 -0
  365. package/lib/dist/services/connectors/mock/MockConnector.js.map +1 -0
  366. package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.d.ts +42 -0
  367. package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.d.ts.map +1 -0
  368. package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.js +133 -0
  369. package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.js.map +1 -0
  370. package/lib/dist/services/connectors/pi/PiConnector.d.ts +87 -0
  371. package/lib/dist/services/connectors/pi/PiConnector.d.ts.map +1 -0
  372. package/lib/dist/services/connectors/pi/PiConnector.js +274 -0
  373. package/lib/dist/services/connectors/pi/PiConnector.js.map +1 -0
  374. package/lib/dist/services/connectors/registry.d.ts +57 -0
  375. package/lib/dist/services/connectors/registry.d.ts.map +1 -0
  376. package/lib/dist/services/connectors/registry.js +106 -0
  377. package/lib/dist/services/connectors/registry.js.map +1 -0
  378. package/lib/dist/services/connectors/rest/RESTConnector.d.ts +38 -0
  379. package/lib/dist/services/connectors/rest/RESTConnector.d.ts.map +1 -0
  380. package/lib/dist/services/connectors/rest/RESTConnector.js +117 -0
  381. package/lib/dist/services/connectors/rest/RESTConnector.js.map +1 -0
  382. package/lib/dist/services/connectors/server.d.ts +13 -0
  383. package/lib/dist/services/connectors/server.d.ts.map +1 -0
  384. package/lib/dist/services/connectors/server.js +34 -0
  385. package/lib/dist/services/connectors/server.js.map +1 -0
  386. package/lib/dist/services/connectors/strands/StrandsConnector.d.ts +48 -0
  387. package/lib/dist/services/connectors/strands/StrandsConnector.d.ts.map +1 -0
  388. package/lib/dist/services/connectors/strands/StrandsConnector.js +221 -0
  389. package/lib/dist/services/connectors/strands/StrandsConnector.js.map +1 -0
  390. package/lib/dist/services/connectors/subprocess/SubprocessConnector.d.ts +88 -0
  391. package/lib/dist/services/connectors/subprocess/SubprocessConnector.d.ts.map +1 -0
  392. package/lib/dist/services/connectors/subprocess/SubprocessConnector.js +426 -0
  393. package/lib/dist/services/connectors/subprocess/SubprocessConnector.js.map +1 -0
  394. package/lib/dist/services/connectors/types.d.ts +213 -0
  395. package/lib/dist/services/connectors/types.d.ts.map +1 -0
  396. package/lib/dist/services/connectors/types.js +6 -0
  397. package/lib/dist/services/connectors/types.js.map +1 -0
  398. package/lib/dist/services/evaluation/bedrockJudge.d.ts +71 -0
  399. package/lib/dist/services/evaluation/bedrockJudge.d.ts.map +1 -0
  400. package/lib/dist/services/evaluation/bedrockJudge.js +169 -0
  401. package/lib/dist/services/evaluation/bedrockJudge.js.map +1 -0
  402. package/lib/dist/services/evaluation/evaluatorError.d.ts +56 -0
  403. package/lib/dist/services/evaluation/evaluatorError.d.ts.map +1 -0
  404. package/lib/dist/services/evaluation/evaluatorError.js +56 -0
  405. package/lib/dist/services/evaluation/evaluatorError.js.map +1 -0
  406. package/lib/dist/services/evaluation/index.d.ts +106 -0
  407. package/lib/dist/services/evaluation/index.d.ts.map +1 -0
  408. package/lib/dist/services/evaluation/index.js +684 -0
  409. package/lib/dist/services/evaluation/index.js.map +1 -0
  410. package/lib/dist/services/evaluation/mockTrajectory.d.ts +3 -0
  411. package/lib/dist/services/evaluation/mockTrajectory.d.ts.map +1 -0
  412. package/lib/dist/services/evaluation/mockTrajectory.js +72 -0
  413. package/lib/dist/services/evaluation/mockTrajectory.js.map +1 -0
  414. package/lib/dist/services/opensearch/client.d.ts +26 -0
  415. package/lib/dist/services/opensearch/client.d.ts.map +1 -0
  416. package/lib/dist/services/opensearch/client.js +131 -0
  417. package/lib/dist/services/opensearch/client.js.map +1 -0
  418. package/lib/dist/services/opensearch/index.d.ts +16 -0
  419. package/lib/dist/services/opensearch/index.d.ts.map +1 -0
  420. package/lib/dist/services/opensearch/index.js +25 -0
  421. package/lib/dist/services/opensearch/index.js.map +1 -0
  422. package/lib/dist/services/storage/asyncBenchmarkStorage.d.ts +123 -0
  423. package/lib/dist/services/storage/asyncBenchmarkStorage.d.ts.map +1 -0
  424. package/lib/dist/services/storage/asyncBenchmarkStorage.js +440 -0
  425. package/lib/dist/services/storage/asyncBenchmarkStorage.js.map +1 -0
  426. package/lib/dist/services/storage/asyncRunStorage.d.ts +135 -0
  427. package/lib/dist/services/storage/asyncRunStorage.d.ts.map +1 -0
  428. package/lib/dist/services/storage/asyncRunStorage.js +524 -0
  429. package/lib/dist/services/storage/asyncRunStorage.js.map +1 -0
  430. package/lib/dist/services/storage/asyncTestCaseStorage.d.ts +170 -0
  431. package/lib/dist/services/storage/asyncTestCaseStorage.d.ts.map +1 -0
  432. package/lib/dist/services/storage/asyncTestCaseStorage.js +301 -0
  433. package/lib/dist/services/storage/asyncTestCaseStorage.js.map +1 -0
  434. package/lib/dist/services/storage/index.d.ts +17 -0
  435. package/lib/dist/services/storage/index.d.ts.map +1 -0
  436. package/lib/dist/services/storage/index.js +20 -0
  437. package/lib/dist/services/storage/index.js.map +1 -0
  438. package/lib/dist/services/storage/migration.d.ts +54 -0
  439. package/lib/dist/services/storage/migration.d.ts.map +1 -0
  440. package/lib/dist/services/storage/migration.js +296 -0
  441. package/lib/dist/services/storage/migration.js.map +1 -0
  442. package/lib/dist/services/storage/opensearchClient.d.ts +947 -0
  443. package/lib/dist/services/storage/opensearchClient.d.ts.map +1 -0
  444. package/lib/dist/services/storage/opensearchClient.js +442 -0
  445. package/lib/dist/services/storage/opensearchClient.js.map +1 -0
  446. package/lib/dist/services/traces/browserRecovery.d.ts +37 -0
  447. package/lib/dist/services/traces/browserRecovery.d.ts.map +1 -0
  448. package/lib/dist/services/traces/browserRecovery.js +108 -0
  449. package/lib/dist/services/traces/browserRecovery.js.map +1 -0
  450. package/lib/dist/services/traces/categoryStyles.d.ts +21 -0
  451. package/lib/dist/services/traces/categoryStyles.d.ts.map +1 -0
  452. package/lib/dist/services/traces/categoryStyles.js +56 -0
  453. package/lib/dist/services/traces/categoryStyles.js.map +1 -0
  454. package/lib/dist/services/traces/executionOrderTransform.d.ts +35 -0
  455. package/lib/dist/services/traces/executionOrderTransform.d.ts.map +1 -0
  456. package/lib/dist/services/traces/executionOrderTransform.js +313 -0
  457. package/lib/dist/services/traces/executionOrderTransform.js.map +1 -0
  458. package/lib/dist/services/traces/fetchSpansForRun.d.ts +86 -0
  459. package/lib/dist/services/traces/fetchSpansForRun.d.ts.map +1 -0
  460. package/lib/dist/services/traces/fetchSpansForRun.js +69 -0
  461. package/lib/dist/services/traces/fetchSpansForRun.js.map +1 -0
  462. package/lib/dist/services/traces/flowTransform.d.ts +24 -0
  463. package/lib/dist/services/traces/flowTransform.d.ts.map +1 -0
  464. package/lib/dist/services/traces/flowTransform.js +228 -0
  465. package/lib/dist/services/traces/flowTransform.js.map +1 -0
  466. package/lib/dist/services/traces/index.d.ts +121 -0
  467. package/lib/dist/services/traces/index.d.ts.map +1 -0
  468. package/lib/dist/services/traces/index.js +255 -0
  469. package/lib/dist/services/traces/index.js.map +1 -0
  470. package/lib/dist/services/traces/intentTransform.d.ts +20 -0
  471. package/lib/dist/services/traces/intentTransform.d.ts.map +1 -0
  472. package/lib/dist/services/traces/intentTransform.js +131 -0
  473. package/lib/dist/services/traces/intentTransform.js.map +1 -0
  474. package/lib/dist/services/traces/judgeAgentsHints.d.ts +63 -0
  475. package/lib/dist/services/traces/judgeAgentsHints.d.ts.map +1 -0
  476. package/lib/dist/services/traces/judgeAgentsHints.js +89 -0
  477. package/lib/dist/services/traces/judgeAgentsHints.js.map +1 -0
  478. package/lib/dist/services/traces/messageExtraction.d.ts +15 -0
  479. package/lib/dist/services/traces/messageExtraction.d.ts.map +1 -0
  480. package/lib/dist/services/traces/messageExtraction.js +313 -0
  481. package/lib/dist/services/traces/messageExtraction.js.map +1 -0
  482. package/lib/dist/services/traces/spanCategorization.d.ts +63 -0
  483. package/lib/dist/services/traces/spanCategorization.d.ts.map +1 -0
  484. package/lib/dist/services/traces/spanCategorization.js +276 -0
  485. package/lib/dist/services/traces/spanCategorization.js.map +1 -0
  486. package/lib/dist/services/traces/spanPreprocessing.d.ts +37 -0
  487. package/lib/dist/services/traces/spanPreprocessing.d.ts.map +1 -0
  488. package/lib/dist/services/traces/spanPreprocessing.js +102 -0
  489. package/lib/dist/services/traces/spanPreprocessing.js.map +1 -0
  490. package/lib/dist/services/traces/spansToTrajectory.d.ts +36 -0
  491. package/lib/dist/services/traces/spansToTrajectory.d.ts.map +1 -0
  492. package/lib/dist/services/traces/spansToTrajectory.js +425 -0
  493. package/lib/dist/services/traces/spansToTrajectory.js.map +1 -0
  494. package/lib/dist/services/traces/toolSimilarity.d.ts +35 -0
  495. package/lib/dist/services/traces/toolSimilarity.d.ts.map +1 -0
  496. package/lib/dist/services/traces/toolSimilarity.js +203 -0
  497. package/lib/dist/services/traces/toolSimilarity.js.map +1 -0
  498. package/lib/dist/services/traces/traceComparison.d.ts +31 -0
  499. package/lib/dist/services/traces/traceComparison.d.ts.map +1 -0
  500. package/lib/dist/services/traces/traceComparison.js +318 -0
  501. package/lib/dist/services/traces/traceComparison.js.map +1 -0
  502. package/lib/dist/services/traces/traceGrouping.d.ts +19 -0
  503. package/lib/dist/services/traces/traceGrouping.d.ts.map +1 -0
  504. package/lib/dist/services/traces/traceGrouping.js +107 -0
  505. package/lib/dist/services/traces/traceGrouping.js.map +1 -0
  506. package/lib/dist/services/traces/tracePoller.d.ts +108 -0
  507. package/lib/dist/services/traces/tracePoller.d.ts.map +1 -0
  508. package/lib/dist/services/traces/tracePoller.js +475 -0
  509. package/lib/dist/services/traces/tracePoller.js.map +1 -0
  510. package/lib/dist/services/traces/traceStats.d.ts +45 -0
  511. package/lib/dist/services/traces/traceStats.d.ts.map +1 -0
  512. package/lib/dist/services/traces/traceStats.js +114 -0
  513. package/lib/dist/services/traces/traceStats.js.map +1 -0
  514. package/lib/dist/services/traces/traceSummary.d.ts +47 -0
  515. package/lib/dist/services/traces/traceSummary.d.ts.map +1 -0
  516. package/lib/dist/services/traces/traceSummary.js +68 -0
  517. package/lib/dist/services/traces/traceSummary.js.map +1 -0
  518. package/lib/dist/services/traces/utils.d.ts +33 -0
  519. package/lib/dist/services/traces/utils.d.ts.map +1 -0
  520. package/lib/dist/services/traces/utils.js +114 -0
  521. package/lib/dist/services/traces/utils.js.map +1 -0
  522. package/lib/dist/types/agui.d.ts +13 -0
  523. package/lib/dist/types/agui.d.ts.map +1 -0
  524. package/lib/dist/types/agui.js +16 -0
  525. package/lib/dist/types/agui.js.map +1 -0
  526. package/lib/dist/types/index.d.ts +1229 -0
  527. package/lib/dist/types/index.d.ts.map +1 -0
  528. package/lib/dist/types/index.js +12 -0
  529. package/lib/dist/types/index.js.map +1 -0
  530. package/lib/dist/types/skills.d.ts +146 -0
  531. package/lib/dist/types/skills.d.ts.map +1 -0
  532. package/lib/dist/types/skills.js +6 -0
  533. package/lib/dist/types/skills.js.map +1 -0
  534. package/observio-sample-agent/pi-package/README.md +112 -0
  535. package/observio-sample-agent/pi-package/extensions/agent-health.ts +373 -0
  536. package/observio-sample-agent/pi-package/package.json +17 -0
  537. package/observio-sample-agent/pi-package/prompts/agent-health.md +37 -0
  538. package/observio-sample-agent/pi-package/skills/create-pr/SKILL.md +88 -0
  539. package/observio-sample-agent/pi-package/skills/fix-bug/SKILL.md +71 -0
  540. package/observio-sample-agent/pi-package/skills/implement-feature/SKILL.md +156 -0
  541. package/observio-sample-agent/pi-package/skills/instrument-otel/SKILL.md +208 -0
  542. package/observio-sample-agent/pi-package/skills/setup-collector/SKILL.md +146 -0
  543. package/observio-sample-agent/pi-package/skills/write-test/SKILL.md +115 -0
  544. package/package.json +45 -9
  545. package/server/dist/app.js +34031 -18731
  546. package/server/dist/index.js +30737 -15338
  547. package/tsconfig.lib.json +71 -0
  548. package/dist/assets/index-BOIP5L7h.js +0 -246
  549. package/dist/assets/index-CU9YKpAL.css +0 -1
  550. package/lib/dist/config/index.js +0 -452
  551. package/lib/dist/index.js +0 -1725
@@ -0,0 +1,131 @@
1
+ /*
2
+ * Copyright OpenSearch Contributors
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { hasAnyWarnings, getCategoryMeta } from './spanCategorization.js';
6
+ import { isContainerSpan } from './executionOrderTransform.js';
7
+ /**
8
+ * Flatten span tree into execution order, skipping container spans
9
+ * Container span children are promoted to their parent's level
10
+ */
11
+ function flattenInExecutionOrder(spanTree) {
12
+ const result = [];
13
+ const processSpan = (span) => {
14
+ // Safely extract children with default empty array
15
+ const children = (span.children ?? []);
16
+ const sortedChildren = children.length > 0
17
+ ? [...children].sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime())
18
+ : [];
19
+ if (isContainerSpan(span)) {
20
+ // Skip container, process children directly
21
+ for (const child of sortedChildren) {
22
+ processSpan(child);
23
+ }
24
+ }
25
+ else {
26
+ // Include this span, then process children
27
+ result.push(span);
28
+ for (const child of sortedChildren) {
29
+ processSpan(child);
30
+ }
31
+ }
32
+ };
33
+ // Sort root spans by start time
34
+ const sortedRoots = [...spanTree].sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime());
35
+ for (const root of sortedRoots) {
36
+ processSpan(root);
37
+ }
38
+ return result;
39
+ }
40
+ /**
41
+ * Build subtitle for an IntentNode from its spans
42
+ */
43
+ function buildSubtitle(spans) {
44
+ if (spans.length === 1) {
45
+ return spans[0].displayName || spans[0].name;
46
+ }
47
+ // For multiple spans, show first few names
48
+ const names = spans.slice(0, 3).map(s => s.displayName || s.name);
49
+ if (spans.length > 3) {
50
+ return `${names.join(', ')}...`;
51
+ }
52
+ return names.join(', ');
53
+ }
54
+ /**
55
+ * Group consecutive same-category spans into IntentNodes
56
+ */
57
+ function groupConsecutive(spans) {
58
+ if (spans.length === 0)
59
+ return [];
60
+ const nodes = [];
61
+ let currentGroup = [spans[0]];
62
+ let currentCategory = spans[0].category;
63
+ let currentStartIndex = 0; // Track global span index
64
+ for (let i = 1; i < spans.length; i++) {
65
+ const span = spans[i];
66
+ if (span.category === currentCategory) {
67
+ // Same category - add to current group
68
+ currentGroup.push(span);
69
+ }
70
+ else {
71
+ // Different category - close current group, start new one
72
+ nodes.push(createIntentNode(currentGroup, nodes.length, currentStartIndex));
73
+ currentStartIndex += currentGroup.length;
74
+ currentGroup = [span];
75
+ currentCategory = span.category;
76
+ }
77
+ }
78
+ // Don't forget the last group
79
+ if (currentGroup.length > 0) {
80
+ nodes.push(createIntentNode(currentGroup, nodes.length, currentStartIndex));
81
+ }
82
+ return nodes;
83
+ }
84
+ /**
85
+ * Create an IntentNode from a group of consecutive spans
86
+ */
87
+ function createIntentNode(spans, order, startIndex) {
88
+ const category = spans[0].category;
89
+ const meta = getCategoryMeta(category);
90
+ const count = spans.length;
91
+ // Calculate total duration for all spans in this node
92
+ const totalDuration = spans.reduce((sum, span) => sum + (span.duration ?? 0), 0);
93
+ return {
94
+ id: `intent-${category}-${order}`,
95
+ category,
96
+ spans,
97
+ count,
98
+ displayName: count > 1 ? `${meta.label} ×${count}` : meta.label,
99
+ subtitle: buildSubtitle(spans),
100
+ hasWarnings: hasAnyWarnings(spans),
101
+ executionOrder: order,
102
+ startIndex,
103
+ totalDuration,
104
+ };
105
+ }
106
+ /**
107
+ * Transform a categorized span tree into IntentNodes for the Intent view.
108
+ * Groups only consecutive same-category spans, preserving execution order.
109
+ */
110
+ export function spansToIntentNodes(spanTree) {
111
+ // 1. Flatten all spans in execution order (skip container spans)
112
+ const flatSpans = flattenInExecutionOrder(spanTree);
113
+ // 2. Group consecutive same-category spans
114
+ return groupConsecutive(flatSpans);
115
+ }
116
+ /**
117
+ * Get the root/container span for display as header (if exists)
118
+ */
119
+ export function getRootContainerSpan(spanTree) {
120
+ if (spanTree.length === 0)
121
+ return null;
122
+ // Find first container span (usually the agent.run)
123
+ for (const span of spanTree) {
124
+ if (isContainerSpan(span)) {
125
+ return span;
126
+ }
127
+ }
128
+ // Fallback to first span if no container found
129
+ return spanTree[0];
130
+ }
131
+ //# sourceMappingURL=intentTransform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intentTransform.js","sourceRoot":"","sources":["../../../../services/traces/intentTransform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Derive Strategy C correlation hints (`agents` array) for the agent (trace)
3
+ * judge from a persisted run report.
4
+ *
5
+ * Background (#264): the agent (trace) judge's `query_spans` tool reads
6
+ * `/api/traces` to find the spans it should reason over. Without these hints
7
+ * the route only matches spans whose `gen_ai.request.id` equals
8
+ * agent-health's runId (Strategy B) — i.e. agent-health's OWN eval-emitter
9
+ * spans. Subprocess agents like claude-code emit instrumentation under their
10
+ * own session ids, so they're invisible to Strategy B alone.
11
+ *
12
+ * Forwarding `agents: [{serviceName, startedAt, endedAt}]` lets `/api/traces`
13
+ * union Strategy B with Strategy C (service.name + time-window). This is the
14
+ * same correlation the run-detail Traces tab uses (see
15
+ * components/RunDetailsContent.tsx), extracted here so the trace judge tool
16
+ * and the UI converge on one read-side query.
17
+ *
18
+ * The full unification (one shared `buildSpanQuery(report)` for every
19
+ * caller) is tracked in #264 — this helper is the minimum surgery to make
20
+ * the agent (trace) judge functional in the meantime.
21
+ */
22
+ import type { TestCaseRun, ConnectorProtocol } from '../../types/index.js';
23
+ export interface JudgeAgentsHint {
24
+ serviceName: string;
25
+ startedAt: number;
26
+ endedAt: number;
27
+ /**
28
+ * Agent-emitted session id (Strategy D). When present, trace queries
29
+ * correlate precisely on `attributes.session.id` (unioned with the
30
+ * service.name + window fallback). Sourced from `report.sessionId`.
31
+ */
32
+ sessionId?: string;
33
+ }
34
+ /**
35
+ * Resolve the `service.name` an agent emits OTel spans under. Priority:
36
+ * 1. Explicit `agentConfig.traceServiceName` (the per-agent override).
37
+ * 2. Protocol-default from the table above.
38
+ * 3. `<connectorProtocol>-agent` heuristic (last-resort fallback).
39
+ * 4. `<agentKey>-agent` as a final guess when protocol is unknown.
40
+ *
41
+ * Returns `undefined` when none of the above is derivable; the caller
42
+ * should then skip Strategy C and fall back to Strategy B alone.
43
+ */
44
+ export declare function resolveAgentServiceName(args: {
45
+ agentTraceServiceName?: string;
46
+ connectorProtocol?: ConnectorProtocol;
47
+ agentKey?: string;
48
+ }): string | undefined;
49
+ /**
50
+ * Build the `agents: [{...}]` array to forward as `JudgeRequest.agents`.
51
+ *
52
+ * `endedAt` defaults to the report's persisted timestamp; `startedAt`
53
+ * defaults to that minus `performanceMetrics.durationMs` (with slack), or
54
+ * a 30-minute lookback when duration is missing. The trace tool sends
55
+ * these through to `/api/traces` which intersects them with
56
+ * `service.name = serviceName`.
57
+ *
58
+ * Returns an empty array when we can't derive a meaningful service name —
59
+ * the caller can still pass that and the route just falls back to
60
+ * Strategy B (runIds-only) without breaking.
61
+ */
62
+ export declare function buildJudgeAgentsHints(report: Pick<TestCaseRun, 'agentKey' | 'connectorProtocol' | 'timestamp' | 'performanceMetrics' | 'sessionId'>, agentTraceServiceName?: string): JudgeAgentsHint[];
63
+ //# sourceMappingURL=judgeAgentsHints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judgeAgentsHints.d.ts","sourceRoot":"","sources":["../../../../services/traces/judgeAgentsHints.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AA4B9D,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,GAAG,SAAS,CAQrB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,mBAAmB,GAAG,WAAW,GAAG,oBAAoB,GAAG,WAAW,CAAC,EAC9G,qBAAqB,CAAC,EAAE,MAAM,GAC7B,eAAe,EAAE,CAyBnB"}
@@ -0,0 +1,89 @@
1
+ /*
2
+ * Copyright OpenSearch Contributors
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ /**
6
+ * Default `service.name` per connector protocol/key, mirroring `AGENTS.md`'s
7
+ * "Trace correlation conventions" table. Used when the agent config doesn't
8
+ * set an explicit `traceServiceName`. Keyed by `string` rather than
9
+ * `ConnectorProtocol` so user-configured connectors (e.g. `kiro`, which
10
+ * isn't in the upstream union) still resolve to a default.
11
+ */
12
+ const PROTOCOL_TO_SERVICE_NAME = {
13
+ 'claude-code': 'claude-code-agent',
14
+ 'kiro': 'kiro-agent',
15
+ 'pi': 'pi-agent',
16
+ 'agui-streaming': 'observio-sample-agent',
17
+ 'subprocess': 'subprocess-agent',
18
+ };
19
+ /** Time-window slack on each side of the run window to absorb clock skew. */
20
+ const SLACK_MS = 60_000;
21
+ /**
22
+ * Lookback used when `report.performanceMetrics.durationMs` is missing
23
+ * (older runs persisted before that field). Wide enough to cover any
24
+ * realistic run, narrow enough to keep noise on a shared OTel cluster
25
+ * minimal. Mirrors the run-detail Traces tab fallback.
26
+ */
27
+ const FALLBACK_LOOKBACK_MS = 30 * 60_000;
28
+ /**
29
+ * Resolve the `service.name` an agent emits OTel spans under. Priority:
30
+ * 1. Explicit `agentConfig.traceServiceName` (the per-agent override).
31
+ * 2. Protocol-default from the table above.
32
+ * 3. `<connectorProtocol>-agent` heuristic (last-resort fallback).
33
+ * 4. `<agentKey>-agent` as a final guess when protocol is unknown.
34
+ *
35
+ * Returns `undefined` when none of the above is derivable; the caller
36
+ * should then skip Strategy C and fall back to Strategy B alone.
37
+ */
38
+ export function resolveAgentServiceName(args) {
39
+ if (args.agentTraceServiceName)
40
+ return args.agentTraceServiceName;
41
+ if (args.connectorProtocol && PROTOCOL_TO_SERVICE_NAME[args.connectorProtocol]) {
42
+ return PROTOCOL_TO_SERVICE_NAME[args.connectorProtocol];
43
+ }
44
+ if (args.connectorProtocol)
45
+ return `${args.connectorProtocol}-agent`;
46
+ if (args.agentKey)
47
+ return `${args.agentKey}-agent`;
48
+ return undefined;
49
+ }
50
+ /**
51
+ * Build the `agents: [{...}]` array to forward as `JudgeRequest.agents`.
52
+ *
53
+ * `endedAt` defaults to the report's persisted timestamp; `startedAt`
54
+ * defaults to that minus `performanceMetrics.durationMs` (with slack), or
55
+ * a 30-minute lookback when duration is missing. The trace tool sends
56
+ * these through to `/api/traces` which intersects them with
57
+ * `service.name = serviceName`.
58
+ *
59
+ * Returns an empty array when we can't derive a meaningful service name —
60
+ * the caller can still pass that and the route just falls back to
61
+ * Strategy B (runIds-only) without breaking.
62
+ */
63
+ export function buildJudgeAgentsHints(report, agentTraceServiceName) {
64
+ const serviceName = resolveAgentServiceName({
65
+ agentTraceServiceName,
66
+ connectorProtocol: report.connectorProtocol,
67
+ agentKey: report.agentKey,
68
+ });
69
+ if (!serviceName)
70
+ return [];
71
+ const ts = Date.parse(report.timestamp || '') || Date.now();
72
+ const durationMs = report.performanceMetrics?.durationMs ?? 0;
73
+ const span = durationMs > 0 ? durationMs + SLACK_MS : FALLBACK_LOOKBACK_MS;
74
+ // `report.timestamp` is NOT reliably the run END: trace-mode / subprocess
75
+ // reports (e.g. Claude Code) are persisted at run START, so anchoring the
76
+ // window's `endedAt` on the timestamp and looking only backwards lands the
77
+ // entire window BEFORE the run and misses every span. Anchor SYMMETRICALLY
78
+ // around the timestamp by ±(duration + slack) so the window covers the run
79
+ // whether the timestamp marks its start or its end (empty-by-default is the
80
+ // worse failure mode — see trace-correlation notes). Mirrors the deep-dive's
81
+ // resolveWindow.
82
+ return [{
83
+ serviceName,
84
+ startedAt: ts - span,
85
+ endedAt: ts + span,
86
+ ...(report.sessionId ? { sessionId: report.sessionId } : {}),
87
+ }];
88
+ }
89
+ //# sourceMappingURL=judgeAgentsHints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judgeAgentsHints.js","sourceRoot":"","sources":["../../../../services/traces/judgeAgentsHints.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA0BH;;;;;;GAMG;AACH,MAAM,wBAAwB,GAA2B;IACvD,aAAa,EAAE,mBAAmB;IAClC,MAAM,EAAE,YAAY;IACpB,IAAI,EAAE,UAAU;IAChB,gBAAgB,EAAE,uBAAuB;IACzC,YAAY,EAAE,kBAAkB;CACjC,CAAC;AAEF,6EAA6E;AAC7E,MAAM,QAAQ,GAAG,MAAM,CAAC;AAExB;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,EAAE,GAAG,MAAM,CAAC;AAczC;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAIvC;IACC,IAAI,IAAI,CAAC,qBAAqB;QAAE,OAAO,IAAI,CAAC,qBAAqB,CAAC;IAClE,IAAI,IAAI,CAAC,iBAAiB,IAAI,wBAAwB,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC/E,OAAO,wBAAwB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,IAAI,CAAC,iBAAiB;QAAE,OAAO,GAAG,IAAI,CAAC,iBAAiB,QAAQ,CAAC;IACrE,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,GAAG,IAAI,CAAC,QAAQ,QAAQ,CAAC;IACnD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAA8G,EAC9G,qBAA8B;IAE9B,MAAM,WAAW,GAAG,uBAAuB,CAAC;QAC1C,qBAAqB;QACrB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAC;IACH,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,CAAC;IAE5B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,kBAAkB,EAAE,UAAU,IAAI,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAC3E,0EAA0E;IAC1E,0EAA0E;IAC1E,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,4EAA4E;IAC5E,6EAA6E;IAC7E,iBAAiB;IACjB,OAAO,CAAC;YACN,WAAW;YACX,SAAS,EAAE,EAAE,GAAG,IAAI;YACpB,OAAO,EAAE,EAAE,GAAG,IAAI;YAClB,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7D,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Message Extraction Service
3
+ *
4
+ * Transforms OTel spans into a chronological conversation message list.
5
+ * Supports Claude Code telemetry events and generic OTel GenAI conventions.
6
+ */
7
+ import { Span, ConversationMessage } from '../../types/index.js';
8
+ /**
9
+ * Extract conversation messages from a flat array of spans.
10
+ *
11
+ * Claude Code emits spans with events: user_prompt, api_request, tool_decision, tool_result.
12
+ * Generic agents use OTel GenAI conventions: llm.request/llm.response events and gen_ai.* attributes.
13
+ */
14
+ export declare function extractMessagesFromSpans(spans: Span[], serviceName?: string): ConversationMessage[];
15
+ //# sourceMappingURL=messageExtraction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageExtraction.d.ts","sourceRoot":"","sources":["../../../../services/traces/messageExtraction.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEpD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,IAAI,EAAE,EACb,WAAW,CAAC,EAAE,MAAM,GACnB,mBAAmB,EAAE,CA4BvB"}
@@ -0,0 +1,313 @@
1
+ /*
2
+ * Copyright OpenSearch Contributors
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ /**
6
+ * Extract conversation messages from a flat array of spans.
7
+ *
8
+ * Claude Code emits spans with events: user_prompt, api_request, tool_decision, tool_result.
9
+ * Generic agents use OTel GenAI conventions: llm.request/llm.response events and gen_ai.* attributes.
10
+ */
11
+ export function extractMessagesFromSpans(spans, serviceName) {
12
+ if (!spans || spans.length === 0)
13
+ return [];
14
+ const isClaudeCode = serviceName?.startsWith('claude-code') ||
15
+ spans.some(s => String(s.attributes?.['service.name'] ?? '').startsWith('claude-code')) ||
16
+ spans.some(s => s.name?.startsWith('claude_code.'));
17
+ const sorted = [...spans]
18
+ .filter(s => s.startTime && !isNaN(new Date(s.startTime).getTime()))
19
+ .sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime());
20
+ const messages = [];
21
+ // tool_use_ids that already produced a tool_result message from a `tool`
22
+ // span's own `tool.output` event, so the sibling `tool.execution` span
23
+ // (sorted after the call) doesn't push a duplicate result message.
24
+ const resultEmittedForToolUseId = new Set();
25
+ for (const span of sorted) {
26
+ if (isClaudeCode) {
27
+ extractClaudeCodeMessages(span, messages, resultEmittedForToolUseId);
28
+ }
29
+ else {
30
+ extractGenericMessages(span, messages);
31
+ }
32
+ }
33
+ return messages;
34
+ }
35
+ /**
36
+ * Extract messages from Claude Code span events.
37
+ *
38
+ * Claude Code span hierarchy:
39
+ * interaction (root) → llm_request / tool → tool.execution
40
+ *
41
+ * Event names: user_prompt, api_request, tool_decision, tool_result
42
+ */
43
+ function extractClaudeCodeMessages(span, messages, resultEmittedForToolUseId) {
44
+ const events = span.events || [];
45
+ const attrs = span.attributes || {};
46
+ const spanName = span.name?.toLowerCase() || '';
47
+ // User prompt from interaction span attribute (Claude Code stores it directly)
48
+ if (spanName.includes('interaction') && attrs['user_prompt'] && attrs['user_prompt'] !== '<REDACTED>') {
49
+ messages.push({
50
+ id: `${span.spanId}-user-prompt`,
51
+ timestamp: span.startTime,
52
+ role: 'user',
53
+ content: String(attrs['user_prompt']),
54
+ metadata: { spanId: span.spanId, spanName: span.name },
55
+ });
56
+ }
57
+ // User prompt events on interaction spans (legacy path)
58
+ for (const event of events) {
59
+ if (event.name === 'user_prompt') {
60
+ const content = event.attributes?.['user.prompt'] ||
61
+ event.attributes?.['prompt'] ||
62
+ event.attributes?.['content'] || '';
63
+ if (content && !messages.some(m => m.id === `${span.spanId}-user-prompt`)) {
64
+ messages.push({
65
+ id: `${span.spanId}-user-prompt-ev`,
66
+ timestamp: event.time || span.startTime,
67
+ role: 'user',
68
+ content: content || '[User prompt — content not captured. Set OTEL_LOG_USER_PROMPTS=1]',
69
+ metadata: { spanId: span.spanId, spanName: span.name },
70
+ });
71
+ }
72
+ }
73
+ }
74
+ // Tool decision / tool call spans
75
+ if (spanName.includes('tool') && !spanName.includes('execution') && !spanName.includes('blocked')) {
76
+ const toolName = attrs['tool_name'] || attrs['gen_ai.tool.name'] || attrs['tool.name'] || span.name;
77
+ const toolInput = attrs['tool_input'] || attrs['gen_ai.tool.input'] || attrs['full_command'] || '';
78
+ // Check for tool_decision events
79
+ const toolDecisionEvent = events.find(e => e.name === 'tool_decision');
80
+ const input = toolDecisionEvent?.attributes?.['input'] ||
81
+ toolDecisionEvent?.attributes?.['tool.input'] ||
82
+ toolInput;
83
+ if (toolName) {
84
+ messages.push({
85
+ id: `${span.spanId}-tool-call`,
86
+ timestamp: span.startTime,
87
+ role: 'tool_call',
88
+ content: typeof input === 'object' ? JSON.stringify(input, null, 2) : String(input || ''),
89
+ metadata: {
90
+ spanId: span.spanId,
91
+ spanName: span.name,
92
+ toolName: String(toolName),
93
+ durationMs: span.duration || (new Date(span.endTime).getTime() - new Date(span.startTime).getTime()),
94
+ },
95
+ });
96
+ }
97
+ // tool.output event on the tool span (Claude Code emits output here).
98
+ // Dedup is symmetric with the tool.execution branch below: whichever one
99
+ // is processed first (normally this one, but a sibling tool.execution
100
+ // span could sort first under clock skew) marks the tool_use_id, and the
101
+ // other skips — so a tool call with both result shapes present never
102
+ // produces two tool_result messages regardless of span order.
103
+ const toolOutputEvent = events.find(e => e.name === 'tool.output');
104
+ if (toolOutputEvent) {
105
+ const output = toolOutputEvent.attributes?.['output'] ||
106
+ toolOutputEvent.attributes?.['result'] || '';
107
+ const toolUseId = attrs['tool_use_id'] || attrs['gen_ai.tool.call.id'];
108
+ const alreadyEmitted = toolUseId != null && resultEmittedForToolUseId.has(String(toolUseId));
109
+ if (output && !alreadyEmitted) {
110
+ if (toolUseId)
111
+ resultEmittedForToolUseId.add(String(toolUseId));
112
+ messages.push({
113
+ id: `${span.spanId}-tool-output-ev`,
114
+ timestamp: toolOutputEvent.time || span.endTime,
115
+ role: 'tool_result',
116
+ content: typeof output === 'object' ? JSON.stringify(output, null, 2) : String(output),
117
+ metadata: {
118
+ spanId: span.spanId,
119
+ spanName: span.name,
120
+ toolName: String(toolName),
121
+ },
122
+ });
123
+ }
124
+ }
125
+ }
126
+ // Tool result events (legacy path)
127
+ for (const event of events) {
128
+ if (event.name === 'tool_result') {
129
+ const content = event.attributes?.['result'] ||
130
+ event.attributes?.['output'] ||
131
+ event.attributes?.['tool.output'] || '';
132
+ messages.push({
133
+ id: `${span.spanId}-tool-result-${event.time}`,
134
+ timestamp: event.time || span.endTime,
135
+ role: 'tool_result',
136
+ content: typeof content === 'object' ? JSON.stringify(content, null, 2) : String(content || '[Tool result — content not captured. Set OTEL_LOG_TOOL_CONTENT=1]'),
137
+ metadata: {
138
+ spanId: span.spanId,
139
+ spanName: span.name,
140
+ toolName: String(span.attributes?.['tool_name'] || span.attributes?.['gen_ai.tool.name'] || ''),
141
+ },
142
+ });
143
+ }
144
+ }
145
+ // Tool result from tool.execution span attributes (fallback)
146
+ if (spanName.includes('tool.execution') || spanName.includes('tool_execution')) {
147
+ const execToolUseId = attrs['tool_use_id'] || attrs['gen_ai.tool.call.id'];
148
+ const alreadyEmitted = execToolUseId != null && resultEmittedForToolUseId.has(String(execToolUseId));
149
+ const output = attrs['gen_ai.tool.output'] || attrs['tool.output'] || attrs['output'];
150
+ if (output && !alreadyEmitted && !events.some(e => e.name === 'tool_result')) {
151
+ if (execToolUseId != null)
152
+ resultEmittedForToolUseId.add(String(execToolUseId));
153
+ messages.push({
154
+ id: `${span.spanId}-tool-output`,
155
+ timestamp: span.endTime,
156
+ role: 'tool_result',
157
+ content: typeof output === 'object' ? JSON.stringify(output, null, 2) : String(output),
158
+ metadata: {
159
+ spanId: span.spanId,
160
+ spanName: span.name,
161
+ toolName: String(attrs['tool_name'] || attrs['gen_ai.tool.name'] || ''),
162
+ },
163
+ });
164
+ }
165
+ }
166
+ // LLM response from llm_request spans
167
+ if (spanName.includes('llm') || spanName.includes('api_request')) {
168
+ const model = attrs['model'] || attrs['gen_ai.request.model'] || '';
169
+ const inputTokens = attrs['input_tokens'] || attrs['gen_ai.usage.input_tokens'];
170
+ const outputTokens = attrs['output_tokens'] || attrs['gen_ai.usage.output_tokens'];
171
+ // Look for api_request or llm.response events for the completion
172
+ const responseEvent = events.find(e => e.name === 'llm.response' || e.name === 'api_response');
173
+ const completion = responseEvent?.attributes?.['llm.completion'] ||
174
+ responseEvent?.attributes?.['completion'] ||
175
+ attrs['gen_ai.completion'] || '';
176
+ if (completion) {
177
+ messages.push({
178
+ id: `${span.spanId}-assistant`,
179
+ timestamp: span.endTime,
180
+ role: 'assistant',
181
+ content: String(completion),
182
+ metadata: {
183
+ spanId: span.spanId,
184
+ spanName: span.name,
185
+ model: String(model),
186
+ inputTokens: inputTokens ? Number(inputTokens) : undefined,
187
+ outputTokens: outputTokens ? Number(outputTokens) : undefined,
188
+ durationMs: span.duration || (new Date(span.endTime).getTime() - new Date(span.startTime).getTime()),
189
+ },
190
+ });
191
+ }
192
+ }
193
+ }
194
+ /**
195
+ * Extract messages from generic OTel GenAI spans.
196
+ * Uses standard llm.request/llm.response events and gen_ai.* attributes.
197
+ */
198
+ function extractGenericMessages(span, messages) {
199
+ const events = span.events || [];
200
+ const attrs = span.attributes || {};
201
+ // LLM request event → extract user prompt
202
+ const llmRequest = events.find(e => e.name === 'llm.request');
203
+ if (llmRequest) {
204
+ const prompt = llmRequest.attributes?.['llm.prompt'] ||
205
+ llmRequest.attributes?.['gen_ai.prompt'] ||
206
+ attrs['gen_ai.prompt'];
207
+ if (prompt) {
208
+ messages.push({
209
+ id: `${span.spanId}-prompt`,
210
+ timestamp: span.startTime,
211
+ role: 'user',
212
+ content: typeof prompt === 'object' ? JSON.stringify(prompt, null, 2) : String(prompt),
213
+ metadata: { spanId: span.spanId, spanName: span.name },
214
+ });
215
+ }
216
+ }
217
+ // LLM response event → extract completion
218
+ const llmResponse = events.find(e => e.name === 'llm.response');
219
+ if (llmResponse) {
220
+ const completion = llmResponse.attributes?.['llm.completion'] ||
221
+ attrs['gen_ai.completion'];
222
+ if (completion) {
223
+ messages.push({
224
+ id: `${span.spanId}-completion`,
225
+ timestamp: span.endTime,
226
+ role: 'assistant',
227
+ content: typeof completion === 'object' ? JSON.stringify(completion, null, 2) : String(completion),
228
+ metadata: {
229
+ spanId: span.spanId,
230
+ spanName: span.name,
231
+ model: String(attrs['gen_ai.request.model'] || ''),
232
+ inputTokens: attrs['gen_ai.usage.input_tokens'] ? Number(attrs['gen_ai.usage.input_tokens']) : undefined,
233
+ outputTokens: attrs['gen_ai.usage.output_tokens'] ? Number(attrs['gen_ai.usage.output_tokens']) : undefined,
234
+ durationMs: span.duration || (new Date(span.endTime).getTime() - new Date(span.startTime).getTime()),
235
+ },
236
+ });
237
+ }
238
+ }
239
+ // Tool spans → tool_call + tool_result.
240
+ // OTel GenAI conveys tool arguments/results three ways (issue #319/#320):
241
+ // spec attributes (gen_ai.tool.call.arguments/.result), span events
242
+ // (gen_ai.tool.message / gen_ai.choice — what Strands emits), and the
243
+ // legacy non-spec attribute names kept as vendor-compat fallbacks.
244
+ const toolName = attrs['gen_ai.tool.name'] || attrs['tool.name'];
245
+ if (toolName) {
246
+ const toolMessageEvent = events.find(e => e.name === 'gen_ai.tool.message');
247
+ const toolChoiceEvent = events.find(e => e.name === 'gen_ai.choice');
248
+ const toolInput = attrs['gen_ai.tool.call.arguments'] ||
249
+ toolMessageEvent?.attributes?.['content'] ||
250
+ attrs['gen_ai.tool.input'] || attrs['input'];
251
+ // Emit the tool_call even when arguments weren't captured — the tool WAS
252
+ // invoked, and the judge needs to see that (issue #320 root cause 2).
253
+ messages.push({
254
+ id: `${span.spanId}-tool-call`,
255
+ timestamp: span.startTime,
256
+ role: 'tool_call',
257
+ content: toolInput
258
+ ? (typeof toolInput === 'object' ? JSON.stringify(toolInput, null, 2) : String(toolInput))
259
+ : '',
260
+ metadata: {
261
+ spanId: span.spanId,
262
+ spanName: span.name,
263
+ toolName: String(toolName),
264
+ durationMs: span.duration || (new Date(span.endTime).getTime() - new Date(span.startTime).getTime()),
265
+ },
266
+ });
267
+ const toolOutput = attrs['gen_ai.tool.call.result'] ||
268
+ toolChoiceEvent?.attributes?.['message'] ||
269
+ toolChoiceEvent?.attributes?.['content'] ||
270
+ attrs['gen_ai.tool.output'] || attrs['output'];
271
+ if (toolOutput) {
272
+ messages.push({
273
+ id: `${span.spanId}-tool-result`,
274
+ timestamp: span.endTime,
275
+ role: 'tool_result',
276
+ content: typeof toolOutput === 'object' ? JSON.stringify(toolOutput, null, 2) : String(toolOutput),
277
+ metadata: {
278
+ spanId: span.spanId,
279
+ spanName: span.name,
280
+ toolName: String(toolName),
281
+ },
282
+ });
283
+ }
284
+ }
285
+ // Fallback: attributes-only extraction when no events present
286
+ if (events.length === 0 && !toolName) {
287
+ const prompt = attrs['gen_ai.prompt'] || attrs['test.case.input'];
288
+ const completion = attrs['gen_ai.completion'] || attrs['test.case.output'];
289
+ if (prompt) {
290
+ messages.push({
291
+ id: `${span.spanId}-attr-prompt`,
292
+ timestamp: span.startTime,
293
+ role: 'user',
294
+ content: typeof prompt === 'object' ? JSON.stringify(prompt, null, 2) : String(prompt),
295
+ metadata: { spanId: span.spanId, spanName: span.name },
296
+ });
297
+ }
298
+ if (completion) {
299
+ messages.push({
300
+ id: `${span.spanId}-attr-completion`,
301
+ timestamp: span.endTime,
302
+ role: 'assistant',
303
+ content: typeof completion === 'object' ? JSON.stringify(completion, null, 2) : String(completion),
304
+ metadata: {
305
+ spanId: span.spanId,
306
+ spanName: span.name,
307
+ model: String(attrs['gen_ai.request.model'] || ''),
308
+ },
309
+ });
310
+ }
311
+ }
312
+ }
313
+ //# sourceMappingURL=messageExtraction.js.map