@opensearch-project/agent-health 0.3.0 → 0.5.2

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 (518) hide show
  1. package/README.md +77 -6
  2. package/cli/dist/index.js +10072 -4502
  3. package/deployment/cloudformation/agent-health-observability.yaml +762 -0
  4. package/dist/assets/index-CCQRDlO0.js +243 -0
  5. package/dist/assets/index-CNHQVbcj.css +1 -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 +431 -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 +390 -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 +577 -0
  22. package/docs/SKILLS.md +264 -0
  23. package/docs/blogs/2026-02-28-opensearch-agent-health.md +200 -0
  24. package/docs/blogs/getting-started-blog.md +608 -0
  25. package/docs/diagrams/Agent-health.excalidraw +5656 -0
  26. package/docs/diagrams/architecture.png +0 -0
  27. package/docs/plans/field-redesign.md +468 -0
  28. package/docs/rfcs/001-coding-agent-analytics.md +374 -0
  29. package/docs/rfcs/002-enterprise-leaderboard.md +267 -0
  30. package/docs/rfcs/003-remote-aggregation.md +146 -0
  31. package/docs/rfcs/004-test-sdk-v2.md +599 -0
  32. package/docs/skills/AGENT_HEALTH.md +598 -0
  33. package/docs/skills/AGENT_PROFILE.md +191 -0
  34. package/docs/skills/add-connector/SKILL.md +68 -0
  35. package/docs/skills/agent-health-profile/SKILL.md +40 -0
  36. package/docs/skills/config-auth/SKILL.md +194 -0
  37. package/docs/skills/config-auth/evals/evals.json +35 -0
  38. package/docs/skills/create-pr/SKILL.md +73 -0
  39. package/docs/skills/instrument-otel/SKILL.md +84 -0
  40. package/docs/skills/write-test/SKILL.md +124 -0
  41. package/docs/ui prd.md +376 -0
  42. package/examples/README.md +53 -0
  43. package/examples/config/agent-health.config.example.ts +155 -0
  44. package/examples/connectors/echo-connector.ts +131 -0
  45. package/examples/eval-files/demo.eval.js +128 -0
  46. package/examples/eval-files/sdk-hooks-demo.eval.js +99 -0
  47. package/examples/pi-profiling/README.md +77 -0
  48. package/examples/pi-profiling/agent-health-profile.ts +417 -0
  49. package/lib/dist/lib/agentUtils.d.ts +29 -0
  50. package/lib/dist/lib/agentUtils.d.ts.map +1 -0
  51. package/lib/dist/lib/agentUtils.js +43 -0
  52. package/lib/dist/lib/agentUtils.js.map +1 -0
  53. package/lib/dist/lib/benchmarkExport.d.ts +14 -0
  54. package/lib/dist/lib/benchmarkExport.d.ts.map +1 -0
  55. package/lib/dist/lib/benchmarkExport.js +41 -0
  56. package/lib/dist/lib/benchmarkExport.js.map +1 -0
  57. package/lib/dist/lib/benchmarkVersionUtils.d.ts +37 -0
  58. package/lib/dist/lib/benchmarkVersionUtils.d.ts.map +1 -0
  59. package/lib/dist/lib/benchmarkVersionUtils.js +68 -0
  60. package/lib/dist/lib/benchmarkVersionUtils.js.map +1 -0
  61. package/lib/dist/lib/config/defineConfig.d.ts +27 -0
  62. package/lib/dist/lib/config/defineConfig.d.ts.map +1 -0
  63. package/lib/dist/lib/config/defineConfig.js +28 -0
  64. package/lib/dist/lib/config/defineConfig.js.map +1 -0
  65. package/lib/dist/lib/config/index.d.ts +9 -0
  66. package/lib/dist/lib/config/index.d.ts.map +1 -0
  67. package/lib/dist/lib/config/index.js +8 -0
  68. package/lib/dist/lib/config/index.js.map +1 -0
  69. package/lib/dist/lib/config/loader.d.ts +39 -0
  70. package/lib/dist/lib/config/loader.d.ts.map +1 -0
  71. package/lib/dist/lib/config/loader.js +258 -0
  72. package/lib/dist/lib/config/loader.js.map +1 -0
  73. package/lib/dist/lib/config/statePaths.d.ts +61 -0
  74. package/lib/dist/lib/config/statePaths.d.ts.map +1 -0
  75. package/lib/dist/lib/config/statePaths.js +188 -0
  76. package/lib/dist/lib/config/statePaths.js.map +1 -0
  77. package/lib/dist/lib/config/types.d.ts +231 -0
  78. package/lib/dist/lib/config/types.d.ts.map +1 -0
  79. package/lib/dist/lib/config/types.js +6 -0
  80. package/lib/dist/lib/config/types.js.map +1 -0
  81. package/lib/dist/lib/config.d.ts +39 -0
  82. package/lib/dist/lib/config.d.ts.map +1 -0
  83. package/lib/dist/lib/config.js +118 -0
  84. package/lib/dist/lib/config.js.map +1 -0
  85. package/lib/dist/lib/constants.d.ts +70 -0
  86. package/lib/dist/lib/constants.d.ts.map +1 -0
  87. package/lib/dist/lib/constants.js +365 -0
  88. package/lib/dist/lib/constants.js.map +1 -0
  89. package/lib/dist/lib/contextUtilization.d.ts +23 -0
  90. package/lib/dist/lib/contextUtilization.d.ts.map +1 -0
  91. package/lib/dist/lib/contextUtilization.js +72 -0
  92. package/lib/dist/lib/contextUtilization.js.map +1 -0
  93. package/lib/dist/lib/dashboardMetrics.d.ts +87 -0
  94. package/lib/dist/lib/dashboardMetrics.d.ts.map +1 -0
  95. package/lib/dist/lib/dashboardMetrics.js +242 -0
  96. package/lib/dist/lib/dashboardMetrics.js.map +1 -0
  97. package/lib/dist/lib/dataSourceConfig.d.ts +108 -0
  98. package/lib/dist/lib/dataSourceConfig.d.ts.map +1 -0
  99. package/lib/dist/lib/dataSourceConfig.js +166 -0
  100. package/lib/dist/lib/dataSourceConfig.js.map +1 -0
  101. package/lib/dist/lib/debug.d.ts +26 -0
  102. package/lib/dist/lib/debug.d.ts.map +1 -0
  103. package/lib/dist/lib/debug.js +132 -0
  104. package/lib/dist/lib/debug.js.map +1 -0
  105. package/lib/dist/lib/diagnostics.d.ts +28 -0
  106. package/lib/dist/lib/diagnostics.d.ts.map +1 -0
  107. package/lib/dist/lib/diagnostics.js +65 -0
  108. package/lib/dist/lib/diagnostics.js.map +1 -0
  109. package/lib/dist/lib/envCompat.d.ts +27 -0
  110. package/lib/dist/lib/envCompat.d.ts.map +1 -0
  111. package/lib/dist/lib/envCompat.js +73 -0
  112. package/lib/dist/lib/envCompat.js.map +1 -0
  113. package/lib/dist/lib/findPackageRoot.d.ts +7 -0
  114. package/lib/dist/lib/findPackageRoot.d.ts.map +1 -0
  115. package/lib/dist/lib/findPackageRoot.js +57 -0
  116. package/lib/dist/lib/findPackageRoot.js.map +1 -0
  117. package/lib/dist/lib/hooks.d.ts +36 -0
  118. package/lib/dist/lib/hooks.d.ts.map +1 -0
  119. package/lib/dist/lib/hooks.js +112 -0
  120. package/lib/dist/lib/hooks.js.map +1 -0
  121. package/lib/dist/lib/index.d.ts +47 -0
  122. package/lib/dist/lib/index.d.ts.map +1 -0
  123. package/lib/dist/lib/index.js +62 -0
  124. package/lib/dist/lib/index.js.map +1 -0
  125. package/lib/dist/lib/labels.d.ts +90 -0
  126. package/lib/dist/lib/labels.d.ts.map +1 -0
  127. package/lib/dist/lib/labels.js +158 -0
  128. package/lib/dist/lib/labels.js.map +1 -0
  129. package/lib/dist/lib/markdown.d.ts +16 -0
  130. package/lib/dist/lib/markdown.d.ts.map +1 -0
  131. package/lib/dist/lib/markdown.js +42 -0
  132. package/lib/dist/lib/markdown.js.map +1 -0
  133. package/lib/dist/lib/matchers/expect.d.ts +3 -0
  134. package/lib/dist/lib/matchers/expect.d.ts.map +1 -0
  135. package/lib/dist/lib/matchers/expect.js +225 -0
  136. package/lib/dist/lib/matchers/expect.js.map +1 -0
  137. package/lib/dist/lib/matchers/index.d.ts +8 -0
  138. package/lib/dist/lib/matchers/index.d.ts.map +1 -0
  139. package/lib/dist/lib/matchers/index.js +9 -0
  140. package/lib/dist/lib/matchers/index.js.map +1 -0
  141. package/lib/dist/lib/matchers/judgeAccessor.d.ts +113 -0
  142. package/lib/dist/lib/matchers/judgeAccessor.d.ts.map +1 -0
  143. package/lib/dist/lib/matchers/judgeAccessor.js +183 -0
  144. package/lib/dist/lib/matchers/judgeAccessor.js.map +1 -0
  145. package/lib/dist/lib/matchers/session.d.ts +39 -0
  146. package/lib/dist/lib/matchers/session.d.ts.map +1 -0
  147. package/lib/dist/lib/matchers/session.js +116 -0
  148. package/lib/dist/lib/matchers/session.js.map +1 -0
  149. package/lib/dist/lib/matchers/traces.d.ts +55 -0
  150. package/lib/dist/lib/matchers/traces.d.ts.map +1 -0
  151. package/lib/dist/lib/matchers/traces.js +116 -0
  152. package/lib/dist/lib/matchers/traces.js.map +1 -0
  153. package/lib/dist/lib/matchers/types.d.ts +75 -0
  154. package/lib/dist/lib/matchers/types.d.ts.map +1 -0
  155. package/lib/dist/lib/matchers/types.js +6 -0
  156. package/lib/dist/lib/matchers/types.js.map +1 -0
  157. package/lib/dist/lib/packagePaths.d.ts +29 -0
  158. package/lib/dist/lib/packagePaths.d.ts.map +1 -0
  159. package/lib/dist/lib/packagePaths.js +63 -0
  160. package/lib/dist/lib/packagePaths.js.map +1 -0
  161. package/lib/dist/lib/performance.d.ts +51 -0
  162. package/lib/dist/lib/performance.d.ts.map +1 -0
  163. package/lib/dist/lib/performance.js +159 -0
  164. package/lib/dist/lib/performance.js.map +1 -0
  165. package/lib/dist/lib/portConfig.d.ts +29 -0
  166. package/lib/dist/lib/portConfig.d.ts.map +1 -0
  167. package/lib/dist/lib/portConfig.js +64 -0
  168. package/lib/dist/lib/portConfig.js.map +1 -0
  169. package/lib/dist/lib/preferences.d.ts +63 -0
  170. package/lib/dist/lib/preferences.d.ts.map +1 -0
  171. package/lib/dist/lib/preferences.js +117 -0
  172. package/lib/dist/lib/preferences.js.map +1 -0
  173. package/lib/dist/lib/resolveAgentModel.d.ts +22 -0
  174. package/lib/dist/lib/resolveAgentModel.d.ts.map +1 -0
  175. package/lib/dist/lib/resolveAgentModel.js +37 -0
  176. package/lib/dist/lib/resolveAgentModel.js.map +1 -0
  177. package/lib/dist/lib/runStats.d.ts +92 -0
  178. package/lib/dist/lib/runStats.d.ts.map +1 -0
  179. package/lib/dist/lib/runStats.js +160 -0
  180. package/lib/dist/lib/runStats.js.map +1 -0
  181. package/lib/dist/lib/telemetry/constants.d.ts +60 -0
  182. package/lib/dist/lib/telemetry/constants.d.ts.map +1 -0
  183. package/lib/dist/lib/telemetry/constants.js +87 -0
  184. package/lib/dist/lib/telemetry/constants.js.map +1 -0
  185. package/lib/dist/lib/telemetry/evalSpans.d.ts +61 -0
  186. package/lib/dist/lib/telemetry/evalSpans.d.ts.map +1 -0
  187. package/lib/dist/lib/telemetry/evalSpans.js +254 -0
  188. package/lib/dist/lib/telemetry/evalSpans.js.map +1 -0
  189. package/lib/dist/lib/telemetry/index.d.ts +11 -0
  190. package/lib/dist/lib/telemetry/index.d.ts.map +1 -0
  191. package/lib/dist/lib/telemetry/index.js +15 -0
  192. package/lib/dist/lib/telemetry/index.js.map +1 -0
  193. package/lib/dist/lib/telemetry/opensearchExporter.d.ts +43 -0
  194. package/lib/dist/lib/telemetry/opensearchExporter.d.ts.map +1 -0
  195. package/lib/dist/lib/telemetry/opensearchExporter.js +217 -0
  196. package/lib/dist/lib/telemetry/opensearchExporter.js.map +1 -0
  197. package/lib/dist/lib/telemetry/provider.d.ts +55 -0
  198. package/lib/dist/lib/telemetry/provider.d.ts.map +1 -0
  199. package/lib/dist/lib/telemetry/provider.js +140 -0
  200. package/lib/dist/lib/telemetry/provider.js.map +1 -0
  201. package/lib/dist/lib/testCaseLabels.d.ts +34 -0
  202. package/lib/dist/lib/testCaseLabels.d.ts.map +1 -0
  203. package/lib/dist/lib/testCaseLabels.js +88 -0
  204. package/lib/dist/lib/testCaseLabels.js.map +1 -0
  205. package/lib/dist/lib/testCaseValidation.d.ts +140 -0
  206. package/lib/dist/lib/testCaseValidation.d.ts.map +1 -0
  207. package/lib/dist/lib/testCaseValidation.js +162 -0
  208. package/lib/dist/lib/testCaseValidation.js.map +1 -0
  209. package/lib/dist/lib/testCases/agentFixture.d.ts +80 -0
  210. package/lib/dist/lib/testCases/agentFixture.d.ts.map +1 -0
  211. package/lib/dist/lib/testCases/agentFixture.js +43 -0
  212. package/lib/dist/lib/testCases/agentFixture.js.map +1 -0
  213. package/lib/dist/lib/testCases/authoringSurface.d.ts +10 -0
  214. package/lib/dist/lib/testCases/authoringSurface.d.ts.map +1 -0
  215. package/lib/dist/lib/testCases/authoringSurface.js +54 -0
  216. package/lib/dist/lib/testCases/authoringSurface.js.map +1 -0
  217. package/lib/dist/lib/testCases/codemod.d.ts +13 -0
  218. package/lib/dist/lib/testCases/codemod.d.ts.map +1 -0
  219. package/lib/dist/lib/testCases/codemod.js +169 -0
  220. package/lib/dist/lib/testCases/codemod.js.map +1 -0
  221. package/lib/dist/lib/testCases/define.d.ts +114 -0
  222. package/lib/dist/lib/testCases/define.d.ts.map +1 -0
  223. package/lib/dist/lib/testCases/define.js +253 -0
  224. package/lib/dist/lib/testCases/define.js.map +1 -0
  225. package/lib/dist/lib/testCases/evaluators.d.ts +80 -0
  226. package/lib/dist/lib/testCases/evaluators.d.ts.map +1 -0
  227. package/lib/dist/lib/testCases/evaluators.js +105 -0
  228. package/lib/dist/lib/testCases/evaluators.js.map +1 -0
  229. package/lib/dist/lib/testCases/index.d.ts +14 -0
  230. package/lib/dist/lib/testCases/index.d.ts.map +1 -0
  231. package/lib/dist/lib/testCases/index.js +12 -0
  232. package/lib/dist/lib/testCases/index.js.map +1 -0
  233. package/lib/dist/lib/testCases/judge.d.ts +165 -0
  234. package/lib/dist/lib/testCases/judge.d.ts.map +1 -0
  235. package/lib/dist/lib/testCases/judge.js +359 -0
  236. package/lib/dist/lib/testCases/judge.js.map +1 -0
  237. package/lib/dist/lib/testCases/loader.d.ts +26 -0
  238. package/lib/dist/lib/testCases/loader.d.ts.map +1 -0
  239. package/lib/dist/lib/testCases/loader.js +149 -0
  240. package/lib/dist/lib/testCases/loader.js.map +1 -0
  241. package/lib/dist/lib/testCases/types.d.ts +242 -0
  242. package/lib/dist/lib/testCases/types.d.ts.map +1 -0
  243. package/lib/dist/lib/testCases/types.js +6 -0
  244. package/lib/dist/lib/testCases/types.js.map +1 -0
  245. package/lib/dist/lib/theme.d.ts +6 -0
  246. package/lib/dist/lib/theme.d.ts.map +1 -0
  247. package/lib/dist/lib/theme.js +36 -0
  248. package/lib/dist/lib/theme.js.map +1 -0
  249. package/lib/dist/lib/uiTelemetry.d.ts +7 -0
  250. package/lib/dist/lib/uiTelemetry.d.ts.map +1 -0
  251. package/lib/dist/lib/uiTelemetry.js +25 -0
  252. package/lib/dist/lib/uiTelemetry.js.map +1 -0
  253. package/lib/dist/lib/utils.d.ts +96 -0
  254. package/lib/dist/lib/utils.d.ts.map +1 -0
  255. package/lib/dist/lib/utils.js +232 -0
  256. package/lib/dist/lib/utils.js.map +1 -0
  257. package/lib/dist/lib/workflow/consolidate.d.ts +12 -0
  258. package/lib/dist/lib/workflow/consolidate.d.ts.map +1 -0
  259. package/lib/dist/lib/workflow/consolidate.js +33 -0
  260. package/lib/dist/lib/workflow/consolidate.js.map +1 -0
  261. package/lib/dist/lib/workflow/index.d.ts +13 -0
  262. package/lib/dist/lib/workflow/index.d.ts.map +1 -0
  263. package/lib/dist/lib/workflow/index.js +12 -0
  264. package/lib/dist/lib/workflow/index.js.map +1 -0
  265. package/lib/dist/lib/workflow/ledger.d.ts +30 -0
  266. package/lib/dist/lib/workflow/ledger.d.ts.map +1 -0
  267. package/lib/dist/lib/workflow/ledger.js +41 -0
  268. package/lib/dist/lib/workflow/ledger.js.map +1 -0
  269. package/lib/dist/lib/workflow/pool.d.ts +13 -0
  270. package/lib/dist/lib/workflow/pool.d.ts.map +1 -0
  271. package/lib/dist/lib/workflow/pool.js +44 -0
  272. package/lib/dist/lib/workflow/pool.js.map +1 -0
  273. package/lib/dist/lib/workflow/source.d.ts +22 -0
  274. package/lib/dist/lib/workflow/source.d.ts.map +1 -0
  275. package/lib/dist/lib/workflow/source.js +29 -0
  276. package/lib/dist/lib/workflow/source.js.map +1 -0
  277. package/lib/dist/lib/workflow/stepB.d.ts +71 -0
  278. package/lib/dist/lib/workflow/stepB.d.ts.map +1 -0
  279. package/lib/dist/lib/workflow/stepB.js +99 -0
  280. package/lib/dist/lib/workflow/stepB.js.map +1 -0
  281. package/lib/dist/lib/workflow/types.d.ts +86 -0
  282. package/lib/dist/lib/workflow/types.d.ts.map +1 -0
  283. package/lib/dist/lib/workflow/types.js +6 -0
  284. package/lib/dist/lib/workflow/types.js.map +1 -0
  285. package/lib/dist/lib/workflow/workflow.d.ts +119 -0
  286. package/lib/dist/lib/workflow/workflow.d.ts.map +1 -0
  287. package/lib/dist/lib/workflow/workflow.js +195 -0
  288. package/lib/dist/lib/workflow/workflow.js.map +1 -0
  289. package/lib/dist/services/agent/aguiConverter.d.ts +50 -0
  290. package/lib/dist/services/agent/aguiConverter.d.ts.map +1 -0
  291. package/lib/dist/services/agent/aguiConverter.js +449 -0
  292. package/lib/dist/services/agent/aguiConverter.js.map +1 -0
  293. package/lib/dist/services/agent/index.d.ts +10 -0
  294. package/lib/dist/services/agent/index.d.ts.map +1 -0
  295. package/lib/dist/services/agent/index.js +12 -0
  296. package/lib/dist/services/agent/index.js.map +1 -0
  297. package/lib/dist/services/agent/payloadBuilder.d.ts +33 -0
  298. package/lib/dist/services/agent/payloadBuilder.d.ts.map +1 -0
  299. package/lib/dist/services/agent/payloadBuilder.js +75 -0
  300. package/lib/dist/services/agent/payloadBuilder.js.map +1 -0
  301. package/lib/dist/services/agent/sseStream.d.ts +43 -0
  302. package/lib/dist/services/agent/sseStream.d.ts.map +1 -0
  303. package/lib/dist/services/agent/sseStream.js +223 -0
  304. package/lib/dist/services/agent/sseStream.js.map +1 -0
  305. package/lib/dist/services/connectors/agui/AGUIStreamingConnector.d.ts +44 -0
  306. package/lib/dist/services/connectors/agui/AGUIStreamingConnector.d.ts.map +1 -0
  307. package/lib/dist/services/connectors/agui/AGUIStreamingConnector.js +95 -0
  308. package/lib/dist/services/connectors/agui/AGUIStreamingConnector.js.map +1 -0
  309. package/lib/dist/services/connectors/base/BaseConnector.d.ts +81 -0
  310. package/lib/dist/services/connectors/base/BaseConnector.d.ts.map +1 -0
  311. package/lib/dist/services/connectors/base/BaseConnector.js +170 -0
  312. package/lib/dist/services/connectors/base/BaseConnector.js.map +1 -0
  313. package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.d.ts +116 -0
  314. package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.d.ts.map +1 -0
  315. package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.js +403 -0
  316. package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.js.map +1 -0
  317. package/lib/dist/services/connectors/index.d.ts +13 -0
  318. package/lib/dist/services/connectors/index.d.ts.map +1 -0
  319. package/lib/dist/services/connectors/index.js +32 -0
  320. package/lib/dist/services/connectors/index.js.map +1 -0
  321. package/lib/dist/services/connectors/kiro/KiroConnector.d.ts +48 -0
  322. package/lib/dist/services/connectors/kiro/KiroConnector.d.ts.map +1 -0
  323. package/lib/dist/services/connectors/kiro/KiroConnector.js +158 -0
  324. package/lib/dist/services/connectors/kiro/KiroConnector.js.map +1 -0
  325. package/lib/dist/services/connectors/langgraph/LangGraphConnector.d.ts +36 -0
  326. package/lib/dist/services/connectors/langgraph/LangGraphConnector.d.ts.map +1 -0
  327. package/lib/dist/services/connectors/langgraph/LangGraphConnector.js +175 -0
  328. package/lib/dist/services/connectors/langgraph/LangGraphConnector.js.map +1 -0
  329. package/lib/dist/services/connectors/mock/MockConnector.d.ts +37 -0
  330. package/lib/dist/services/connectors/mock/MockConnector.d.ts.map +1 -0
  331. package/lib/dist/services/connectors/mock/MockConnector.js +120 -0
  332. package/lib/dist/services/connectors/mock/MockConnector.js.map +1 -0
  333. package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.d.ts +42 -0
  334. package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.d.ts.map +1 -0
  335. package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.js +133 -0
  336. package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.js.map +1 -0
  337. package/lib/dist/services/connectors/pi/PiConnector.d.ts +87 -0
  338. package/lib/dist/services/connectors/pi/PiConnector.d.ts.map +1 -0
  339. package/lib/dist/services/connectors/pi/PiConnector.js +274 -0
  340. package/lib/dist/services/connectors/pi/PiConnector.js.map +1 -0
  341. package/lib/dist/services/connectors/registry.d.ts +57 -0
  342. package/lib/dist/services/connectors/registry.d.ts.map +1 -0
  343. package/lib/dist/services/connectors/registry.js +106 -0
  344. package/lib/dist/services/connectors/registry.js.map +1 -0
  345. package/lib/dist/services/connectors/rest/RESTConnector.d.ts +38 -0
  346. package/lib/dist/services/connectors/rest/RESTConnector.d.ts.map +1 -0
  347. package/lib/dist/services/connectors/rest/RESTConnector.js +117 -0
  348. package/lib/dist/services/connectors/rest/RESTConnector.js.map +1 -0
  349. package/lib/dist/services/connectors/server.d.ts +13 -0
  350. package/lib/dist/services/connectors/server.d.ts.map +1 -0
  351. package/lib/dist/services/connectors/server.js +34 -0
  352. package/lib/dist/services/connectors/server.js.map +1 -0
  353. package/lib/dist/services/connectors/strands/StrandsConnector.d.ts +48 -0
  354. package/lib/dist/services/connectors/strands/StrandsConnector.d.ts.map +1 -0
  355. package/lib/dist/services/connectors/strands/StrandsConnector.js +221 -0
  356. package/lib/dist/services/connectors/strands/StrandsConnector.js.map +1 -0
  357. package/lib/dist/services/connectors/subprocess/SubprocessConnector.d.ts +88 -0
  358. package/lib/dist/services/connectors/subprocess/SubprocessConnector.d.ts.map +1 -0
  359. package/lib/dist/services/connectors/subprocess/SubprocessConnector.js +418 -0
  360. package/lib/dist/services/connectors/subprocess/SubprocessConnector.js.map +1 -0
  361. package/lib/dist/services/connectors/types.d.ts +213 -0
  362. package/lib/dist/services/connectors/types.d.ts.map +1 -0
  363. package/lib/dist/services/connectors/types.js +6 -0
  364. package/lib/dist/services/connectors/types.js.map +1 -0
  365. package/lib/dist/services/evaluation/bedrockJudge.d.ts +64 -0
  366. package/lib/dist/services/evaluation/bedrockJudge.d.ts.map +1 -0
  367. package/lib/dist/services/evaluation/bedrockJudge.js +167 -0
  368. package/lib/dist/services/evaluation/bedrockJudge.js.map +1 -0
  369. package/lib/dist/services/evaluation/evaluatorError.d.ts +56 -0
  370. package/lib/dist/services/evaluation/evaluatorError.d.ts.map +1 -0
  371. package/lib/dist/services/evaluation/evaluatorError.js +56 -0
  372. package/lib/dist/services/evaluation/evaluatorError.js.map +1 -0
  373. package/lib/dist/services/evaluation/index.d.ts +106 -0
  374. package/lib/dist/services/evaluation/index.d.ts.map +1 -0
  375. package/lib/dist/services/evaluation/index.js +684 -0
  376. package/lib/dist/services/evaluation/index.js.map +1 -0
  377. package/lib/dist/services/evaluation/mockTrajectory.d.ts +3 -0
  378. package/lib/dist/services/evaluation/mockTrajectory.d.ts.map +1 -0
  379. package/lib/dist/services/evaluation/mockTrajectory.js +72 -0
  380. package/lib/dist/services/evaluation/mockTrajectory.js.map +1 -0
  381. package/lib/dist/services/opensearch/client.d.ts +26 -0
  382. package/lib/dist/services/opensearch/client.d.ts.map +1 -0
  383. package/lib/dist/services/opensearch/client.js +131 -0
  384. package/lib/dist/services/opensearch/client.js.map +1 -0
  385. package/lib/dist/services/opensearch/index.d.ts +16 -0
  386. package/lib/dist/services/opensearch/index.d.ts.map +1 -0
  387. package/lib/dist/services/opensearch/index.js +25 -0
  388. package/lib/dist/services/opensearch/index.js.map +1 -0
  389. package/lib/dist/services/storage/asyncBenchmarkStorage.d.ts +123 -0
  390. package/lib/dist/services/storage/asyncBenchmarkStorage.d.ts.map +1 -0
  391. package/lib/dist/services/storage/asyncBenchmarkStorage.js +429 -0
  392. package/lib/dist/services/storage/asyncBenchmarkStorage.js.map +1 -0
  393. package/lib/dist/services/storage/asyncRunStorage.d.ts +127 -0
  394. package/lib/dist/services/storage/asyncRunStorage.d.ts.map +1 -0
  395. package/lib/dist/services/storage/asyncRunStorage.js +448 -0
  396. package/lib/dist/services/storage/asyncRunStorage.js.map +1 -0
  397. package/lib/dist/services/storage/asyncTestCaseStorage.d.ts +156 -0
  398. package/lib/dist/services/storage/asyncTestCaseStorage.d.ts.map +1 -0
  399. package/lib/dist/services/storage/asyncTestCaseStorage.js +285 -0
  400. package/lib/dist/services/storage/asyncTestCaseStorage.js.map +1 -0
  401. package/lib/dist/services/storage/index.d.ts +17 -0
  402. package/lib/dist/services/storage/index.d.ts.map +1 -0
  403. package/lib/dist/services/storage/index.js +20 -0
  404. package/lib/dist/services/storage/index.js.map +1 -0
  405. package/lib/dist/services/storage/migration.d.ts +54 -0
  406. package/lib/dist/services/storage/migration.d.ts.map +1 -0
  407. package/lib/dist/services/storage/migration.js +296 -0
  408. package/lib/dist/services/storage/migration.js.map +1 -0
  409. package/lib/dist/services/storage/opensearchClient.d.ts +924 -0
  410. package/lib/dist/services/storage/opensearchClient.d.ts.map +1 -0
  411. package/lib/dist/services/storage/opensearchClient.js +435 -0
  412. package/lib/dist/services/storage/opensearchClient.js.map +1 -0
  413. package/lib/dist/services/traces/browserRecovery.d.ts +26 -0
  414. package/lib/dist/services/traces/browserRecovery.d.ts.map +1 -0
  415. package/lib/dist/services/traces/browserRecovery.js +81 -0
  416. package/lib/dist/services/traces/browserRecovery.js.map +1 -0
  417. package/lib/dist/services/traces/categoryStyles.d.ts +21 -0
  418. package/lib/dist/services/traces/categoryStyles.d.ts.map +1 -0
  419. package/lib/dist/services/traces/categoryStyles.js +56 -0
  420. package/lib/dist/services/traces/categoryStyles.js.map +1 -0
  421. package/lib/dist/services/traces/executionOrderTransform.d.ts +35 -0
  422. package/lib/dist/services/traces/executionOrderTransform.d.ts.map +1 -0
  423. package/lib/dist/services/traces/executionOrderTransform.js +313 -0
  424. package/lib/dist/services/traces/executionOrderTransform.js.map +1 -0
  425. package/lib/dist/services/traces/fetchSpansForRun.d.ts +86 -0
  426. package/lib/dist/services/traces/fetchSpansForRun.d.ts.map +1 -0
  427. package/lib/dist/services/traces/fetchSpansForRun.js +69 -0
  428. package/lib/dist/services/traces/fetchSpansForRun.js.map +1 -0
  429. package/lib/dist/services/traces/flowTransform.d.ts +24 -0
  430. package/lib/dist/services/traces/flowTransform.d.ts.map +1 -0
  431. package/lib/dist/services/traces/flowTransform.js +228 -0
  432. package/lib/dist/services/traces/flowTransform.js.map +1 -0
  433. package/lib/dist/services/traces/index.d.ts +121 -0
  434. package/lib/dist/services/traces/index.d.ts.map +1 -0
  435. package/lib/dist/services/traces/index.js +255 -0
  436. package/lib/dist/services/traces/index.js.map +1 -0
  437. package/lib/dist/services/traces/intentTransform.d.ts +20 -0
  438. package/lib/dist/services/traces/intentTransform.d.ts.map +1 -0
  439. package/lib/dist/services/traces/intentTransform.js +131 -0
  440. package/lib/dist/services/traces/intentTransform.js.map +1 -0
  441. package/lib/dist/services/traces/judgeAgentsHints.d.ts +63 -0
  442. package/lib/dist/services/traces/judgeAgentsHints.d.ts.map +1 -0
  443. package/lib/dist/services/traces/judgeAgentsHints.js +89 -0
  444. package/lib/dist/services/traces/judgeAgentsHints.js.map +1 -0
  445. package/lib/dist/services/traces/messageExtraction.d.ts +15 -0
  446. package/lib/dist/services/traces/messageExtraction.d.ts.map +1 -0
  447. package/lib/dist/services/traces/messageExtraction.js +251 -0
  448. package/lib/dist/services/traces/messageExtraction.js.map +1 -0
  449. package/lib/dist/services/traces/spanCategorization.d.ts +63 -0
  450. package/lib/dist/services/traces/spanCategorization.d.ts.map +1 -0
  451. package/lib/dist/services/traces/spanCategorization.js +276 -0
  452. package/lib/dist/services/traces/spanCategorization.js.map +1 -0
  453. package/lib/dist/services/traces/spanPreprocessing.d.ts +37 -0
  454. package/lib/dist/services/traces/spanPreprocessing.d.ts.map +1 -0
  455. package/lib/dist/services/traces/spanPreprocessing.js +102 -0
  456. package/lib/dist/services/traces/spanPreprocessing.js.map +1 -0
  457. package/lib/dist/services/traces/spansToTrajectory.d.ts +36 -0
  458. package/lib/dist/services/traces/spansToTrajectory.d.ts.map +1 -0
  459. package/lib/dist/services/traces/spansToTrajectory.js +387 -0
  460. package/lib/dist/services/traces/spansToTrajectory.js.map +1 -0
  461. package/lib/dist/services/traces/toolSimilarity.d.ts +35 -0
  462. package/lib/dist/services/traces/toolSimilarity.d.ts.map +1 -0
  463. package/lib/dist/services/traces/toolSimilarity.js +203 -0
  464. package/lib/dist/services/traces/toolSimilarity.js.map +1 -0
  465. package/lib/dist/services/traces/traceComparison.d.ts +31 -0
  466. package/lib/dist/services/traces/traceComparison.d.ts.map +1 -0
  467. package/lib/dist/services/traces/traceComparison.js +318 -0
  468. package/lib/dist/services/traces/traceComparison.js.map +1 -0
  469. package/lib/dist/services/traces/traceGrouping.d.ts +19 -0
  470. package/lib/dist/services/traces/traceGrouping.d.ts.map +1 -0
  471. package/lib/dist/services/traces/traceGrouping.js +107 -0
  472. package/lib/dist/services/traces/traceGrouping.js.map +1 -0
  473. package/lib/dist/services/traces/tracePoller.d.ts +84 -0
  474. package/lib/dist/services/traces/tracePoller.d.ts.map +1 -0
  475. package/lib/dist/services/traces/tracePoller.js +309 -0
  476. package/lib/dist/services/traces/tracePoller.js.map +1 -0
  477. package/lib/dist/services/traces/traceStats.d.ts +45 -0
  478. package/lib/dist/services/traces/traceStats.d.ts.map +1 -0
  479. package/lib/dist/services/traces/traceStats.js +114 -0
  480. package/lib/dist/services/traces/traceStats.js.map +1 -0
  481. package/lib/dist/services/traces/traceSummary.d.ts +47 -0
  482. package/lib/dist/services/traces/traceSummary.d.ts.map +1 -0
  483. package/lib/dist/services/traces/traceSummary.js +68 -0
  484. package/lib/dist/services/traces/traceSummary.js.map +1 -0
  485. package/lib/dist/services/traces/utils.d.ts +33 -0
  486. package/lib/dist/services/traces/utils.d.ts.map +1 -0
  487. package/lib/dist/services/traces/utils.js +114 -0
  488. package/lib/dist/services/traces/utils.js.map +1 -0
  489. package/lib/dist/types/agui.d.ts +13 -0
  490. package/lib/dist/types/agui.d.ts.map +1 -0
  491. package/lib/dist/types/agui.js +16 -0
  492. package/lib/dist/types/agui.js.map +1 -0
  493. package/lib/dist/types/index.d.ts +1175 -0
  494. package/lib/dist/types/index.d.ts.map +1 -0
  495. package/lib/dist/types/index.js +12 -0
  496. package/lib/dist/types/index.js.map +1 -0
  497. package/lib/dist/types/skills.d.ts +146 -0
  498. package/lib/dist/types/skills.d.ts.map +1 -0
  499. package/lib/dist/types/skills.js +6 -0
  500. package/lib/dist/types/skills.js.map +1 -0
  501. package/observio-sample-agent/pi-package/README.md +112 -0
  502. package/observio-sample-agent/pi-package/extensions/agent-health.ts +373 -0
  503. package/observio-sample-agent/pi-package/package.json +17 -0
  504. package/observio-sample-agent/pi-package/prompts/agent-health.md +37 -0
  505. package/observio-sample-agent/pi-package/skills/create-pr/SKILL.md +88 -0
  506. package/observio-sample-agent/pi-package/skills/fix-bug/SKILL.md +71 -0
  507. package/observio-sample-agent/pi-package/skills/implement-feature/SKILL.md +156 -0
  508. package/observio-sample-agent/pi-package/skills/instrument-otel/SKILL.md +208 -0
  509. package/observio-sample-agent/pi-package/skills/setup-collector/SKILL.md +146 -0
  510. package/observio-sample-agent/pi-package/skills/write-test/SKILL.md +115 -0
  511. package/package.json +64 -13
  512. package/server/dist/app.js +32651 -17637
  513. package/server/dist/index.js +29875 -14638
  514. package/tsconfig.lib.json +71 -0
  515. package/dist/assets/index-EvPLSTAS.js +0 -267
  516. package/dist/assets/index-RXasQKUs.css +0 -1
  517. package/lib/dist/config/index.js +0 -404
  518. package/lib/dist/index.js +0 -1665
@@ -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,CAuBvB"}
@@ -0,0 +1,251 @@
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 === 'claude-code' ||
15
+ spans.some(s => s.attributes?.['service.name'] === 'claude-code');
16
+ const sorted = [...spans]
17
+ .filter(s => s.startTime && !isNaN(new Date(s.startTime).getTime()))
18
+ .sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime());
19
+ const messages = [];
20
+ for (const span of sorted) {
21
+ if (isClaudeCode) {
22
+ extractClaudeCodeMessages(span, messages);
23
+ }
24
+ else {
25
+ extractGenericMessages(span, messages);
26
+ }
27
+ }
28
+ return messages;
29
+ }
30
+ /**
31
+ * Extract messages from Claude Code span events.
32
+ *
33
+ * Claude Code span hierarchy:
34
+ * interaction (root) → llm_request / tool → tool.execution
35
+ *
36
+ * Event names: user_prompt, api_request, tool_decision, tool_result
37
+ */
38
+ function extractClaudeCodeMessages(span, messages) {
39
+ const events = span.events || [];
40
+ const attrs = span.attributes || {};
41
+ const spanName = span.name?.toLowerCase() || '';
42
+ // User prompt events on interaction spans
43
+ for (const event of events) {
44
+ if (event.name === 'user_prompt') {
45
+ const content = event.attributes?.['user.prompt'] ||
46
+ event.attributes?.['prompt'] ||
47
+ event.attributes?.['content'] || '';
48
+ messages.push({
49
+ id: `${span.spanId}-user-prompt`,
50
+ timestamp: event.time || span.startTime,
51
+ role: 'user',
52
+ content: content || '[User prompt — content not captured. Set OTEL_LOG_USER_PROMPTS=1]',
53
+ metadata: { spanId: span.spanId, spanName: span.name },
54
+ });
55
+ }
56
+ }
57
+ // Tool decision / tool call spans
58
+ if (spanName.includes('tool') && !spanName.includes('execution')) {
59
+ const toolName = attrs['tool_name'] || attrs['gen_ai.tool.name'] || attrs['tool.name'] || span.name;
60
+ const toolInput = attrs['tool_input'] || attrs['gen_ai.tool.input'] || '';
61
+ // Check for tool_decision events
62
+ const toolDecisionEvent = events.find(e => e.name === 'tool_decision');
63
+ const input = toolDecisionEvent?.attributes?.['input'] ||
64
+ toolDecisionEvent?.attributes?.['tool.input'] ||
65
+ toolInput;
66
+ if (toolName) {
67
+ messages.push({
68
+ id: `${span.spanId}-tool-call`,
69
+ timestamp: span.startTime,
70
+ role: 'tool_call',
71
+ content: typeof input === 'object' ? JSON.stringify(input, null, 2) : String(input || ''),
72
+ metadata: {
73
+ spanId: span.spanId,
74
+ spanName: span.name,
75
+ toolName: String(toolName),
76
+ durationMs: span.duration || (new Date(span.endTime).getTime() - new Date(span.startTime).getTime()),
77
+ },
78
+ });
79
+ }
80
+ }
81
+ // Tool result events
82
+ for (const event of events) {
83
+ if (event.name === 'tool_result') {
84
+ const content = event.attributes?.['result'] ||
85
+ event.attributes?.['output'] ||
86
+ event.attributes?.['tool.output'] || '';
87
+ messages.push({
88
+ id: `${span.spanId}-tool-result-${event.time}`,
89
+ timestamp: event.time || span.endTime,
90
+ role: 'tool_result',
91
+ content: typeof content === 'object' ? JSON.stringify(content, null, 2) : String(content || '[Tool result — content not captured. Set OTEL_LOG_TOOL_CONTENT=1]'),
92
+ metadata: {
93
+ spanId: span.spanId,
94
+ spanName: span.name,
95
+ toolName: String(span.attributes?.['tool_name'] || span.attributes?.['gen_ai.tool.name'] || ''),
96
+ },
97
+ });
98
+ }
99
+ }
100
+ // Tool result from tool.execution span attributes (fallback)
101
+ if (spanName.includes('tool.execution') || spanName.includes('tool_execution')) {
102
+ const output = attrs['gen_ai.tool.output'] || attrs['tool.output'] || attrs['output'];
103
+ if (output && !events.some(e => e.name === 'tool_result')) {
104
+ messages.push({
105
+ id: `${span.spanId}-tool-output`,
106
+ timestamp: span.endTime,
107
+ role: 'tool_result',
108
+ content: typeof output === 'object' ? JSON.stringify(output, null, 2) : String(output),
109
+ metadata: {
110
+ spanId: span.spanId,
111
+ spanName: span.name,
112
+ toolName: String(attrs['tool_name'] || attrs['gen_ai.tool.name'] || ''),
113
+ },
114
+ });
115
+ }
116
+ }
117
+ // LLM response from llm_request spans
118
+ if (spanName.includes('llm') || spanName.includes('api_request')) {
119
+ const model = attrs['model'] || attrs['gen_ai.request.model'] || '';
120
+ const inputTokens = attrs['input_tokens'] || attrs['gen_ai.usage.input_tokens'];
121
+ const outputTokens = attrs['output_tokens'] || attrs['gen_ai.usage.output_tokens'];
122
+ // Look for api_request or llm.response events for the completion
123
+ const responseEvent = events.find(e => e.name === 'llm.response' || e.name === 'api_response');
124
+ const completion = responseEvent?.attributes?.['llm.completion'] ||
125
+ responseEvent?.attributes?.['completion'] ||
126
+ attrs['gen_ai.completion'] || '';
127
+ if (completion) {
128
+ messages.push({
129
+ id: `${span.spanId}-assistant`,
130
+ timestamp: span.endTime,
131
+ role: 'assistant',
132
+ content: String(completion),
133
+ metadata: {
134
+ spanId: span.spanId,
135
+ spanName: span.name,
136
+ model: String(model),
137
+ inputTokens: inputTokens ? Number(inputTokens) : undefined,
138
+ outputTokens: outputTokens ? Number(outputTokens) : undefined,
139
+ durationMs: span.duration || (new Date(span.endTime).getTime() - new Date(span.startTime).getTime()),
140
+ },
141
+ });
142
+ }
143
+ }
144
+ }
145
+ /**
146
+ * Extract messages from generic OTel GenAI spans.
147
+ * Uses standard llm.request/llm.response events and gen_ai.* attributes.
148
+ */
149
+ function extractGenericMessages(span, messages) {
150
+ const events = span.events || [];
151
+ const attrs = span.attributes || {};
152
+ // LLM request event → extract user prompt
153
+ const llmRequest = events.find(e => e.name === 'llm.request');
154
+ if (llmRequest) {
155
+ const prompt = llmRequest.attributes?.['llm.prompt'] ||
156
+ llmRequest.attributes?.['gen_ai.prompt'] ||
157
+ attrs['gen_ai.prompt'];
158
+ if (prompt) {
159
+ messages.push({
160
+ id: `${span.spanId}-prompt`,
161
+ timestamp: span.startTime,
162
+ role: 'user',
163
+ content: typeof prompt === 'object' ? JSON.stringify(prompt, null, 2) : String(prompt),
164
+ metadata: { spanId: span.spanId, spanName: span.name },
165
+ });
166
+ }
167
+ }
168
+ // LLM response event → extract completion
169
+ const llmResponse = events.find(e => e.name === 'llm.response');
170
+ if (llmResponse) {
171
+ const completion = llmResponse.attributes?.['llm.completion'] ||
172
+ attrs['gen_ai.completion'];
173
+ if (completion) {
174
+ messages.push({
175
+ id: `${span.spanId}-completion`,
176
+ timestamp: span.endTime,
177
+ role: 'assistant',
178
+ content: typeof completion === 'object' ? JSON.stringify(completion, null, 2) : String(completion),
179
+ metadata: {
180
+ spanId: span.spanId,
181
+ spanName: span.name,
182
+ model: String(attrs['gen_ai.request.model'] || ''),
183
+ inputTokens: attrs['gen_ai.usage.input_tokens'] ? Number(attrs['gen_ai.usage.input_tokens']) : undefined,
184
+ outputTokens: attrs['gen_ai.usage.output_tokens'] ? Number(attrs['gen_ai.usage.output_tokens']) : undefined,
185
+ durationMs: span.duration || (new Date(span.endTime).getTime() - new Date(span.startTime).getTime()),
186
+ },
187
+ });
188
+ }
189
+ }
190
+ // Tool spans → tool_call + tool_result
191
+ const toolName = attrs['gen_ai.tool.name'] || attrs['tool.name'];
192
+ if (toolName) {
193
+ const toolInput = attrs['gen_ai.tool.input'] || attrs['input'];
194
+ if (toolInput) {
195
+ messages.push({
196
+ id: `${span.spanId}-tool-call`,
197
+ timestamp: span.startTime,
198
+ role: 'tool_call',
199
+ content: typeof toolInput === 'object' ? JSON.stringify(toolInput, null, 2) : String(toolInput),
200
+ metadata: {
201
+ spanId: span.spanId,
202
+ spanName: span.name,
203
+ toolName: String(toolName),
204
+ durationMs: span.duration || (new Date(span.endTime).getTime() - new Date(span.startTime).getTime()),
205
+ },
206
+ });
207
+ }
208
+ const toolOutput = attrs['gen_ai.tool.output'] || attrs['output'];
209
+ if (toolOutput) {
210
+ messages.push({
211
+ id: `${span.spanId}-tool-result`,
212
+ timestamp: span.endTime,
213
+ role: 'tool_result',
214
+ content: typeof toolOutput === 'object' ? JSON.stringify(toolOutput, null, 2) : String(toolOutput),
215
+ metadata: {
216
+ spanId: span.spanId,
217
+ spanName: span.name,
218
+ toolName: String(toolName),
219
+ },
220
+ });
221
+ }
222
+ }
223
+ // Fallback: attributes-only extraction when no events present
224
+ if (events.length === 0 && !toolName) {
225
+ const prompt = attrs['gen_ai.prompt'] || attrs['test.case.input'];
226
+ const completion = attrs['gen_ai.completion'] || attrs['test.case.output'];
227
+ if (prompt) {
228
+ messages.push({
229
+ id: `${span.spanId}-attr-prompt`,
230
+ timestamp: span.startTime,
231
+ role: 'user',
232
+ content: typeof prompt === 'object' ? JSON.stringify(prompt, null, 2) : String(prompt),
233
+ metadata: { spanId: span.spanId, spanName: span.name },
234
+ });
235
+ }
236
+ if (completion) {
237
+ messages.push({
238
+ id: `${span.spanId}-attr-completion`,
239
+ timestamp: span.endTime,
240
+ role: 'assistant',
241
+ content: typeof completion === 'object' ? JSON.stringify(completion, null, 2) : String(completion),
242
+ metadata: {
243
+ spanId: span.spanId,
244
+ spanName: span.name,
245
+ model: String(attrs['gen_ai.request.model'] || ''),
246
+ },
247
+ });
248
+ }
249
+ }
250
+ }
251
+ //# sourceMappingURL=messageExtraction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageExtraction.js","sourceRoot":"","sources":["../../../../services/traces/messageExtraction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Span Categorization Service
3
+ *
4
+ * Categorizes spans based on OTel GenAI semantic conventions.
5
+ * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-agent-spans/
6
+ */
7
+ import { Span, SpanCategory, CategorizedSpan, OTelComplianceResult } from '../../types/index.js';
8
+ /**
9
+ * Category metadata (color, icon, label)
10
+ */
11
+ interface CategoryMeta {
12
+ color: string;
13
+ bgColor: string;
14
+ icon: string;
15
+ label: string;
16
+ }
17
+ /**
18
+ * Get category metadata for a given category
19
+ */
20
+ export declare function getCategoryMeta(category: SpanCategory): CategoryMeta;
21
+ /**
22
+ * Determine span category based on OTel gen_ai.operation.name attribute,
23
+ * with fallback to name-based pattern matching for legacy agents (e.g., Langgraph).
24
+ */
25
+ export declare function getSpanCategory(span: Span): SpanCategory;
26
+ /**
27
+ * Build display name for a span using OTel attributes
28
+ */
29
+ export declare function buildDisplayName(span: Span, category: SpanCategory): string;
30
+ /**
31
+ * Categorize a single span with full metadata
32
+ */
33
+ export declare function categorizeSpan(span: Span): CategorizedSpan;
34
+ /**
35
+ * Categorize an array of spans
36
+ */
37
+ export declare function categorizeSpans(spans: Span[]): CategorizedSpan[];
38
+ /**
39
+ * Categorize a span tree (preserving hierarchy)
40
+ */
41
+ export declare function categorizeSpanTree(spans: Span[]): CategorizedSpan[];
42
+ /**
43
+ * Filter spans by categories
44
+ */
45
+ export declare function filterSpansByCategory(spans: CategorizedSpan[], categories: SpanCategory[]): CategorizedSpan[];
46
+ /**
47
+ * Filter span tree by categories (preserves hierarchy, hides non-matching)
48
+ */
49
+ export declare function filterSpanTreeByCategory(spans: CategorizedSpan[], categories: SpanCategory[]): CategorizedSpan[];
50
+ /**
51
+ * Count spans by category
52
+ */
53
+ export declare function countByCategory(spans: CategorizedSpan[]): Record<SpanCategory, number>;
54
+ /**
55
+ * Check if a span follows OTEL GenAI semantic conventions
56
+ */
57
+ export declare function checkOTelCompliance(span: CategorizedSpan): OTelComplianceResult;
58
+ /**
59
+ * Check if any span in array has OTEL compliance warnings
60
+ */
61
+ export declare function hasAnyWarnings(spans: CategorizedSpan[]): boolean;
62
+ export {};
63
+ //# sourceMappingURL=spanCategorization.d.ts.map