@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,56 @@
1
+ /*
2
+ * Copyright OpenSearch Contributors
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ export const CATEGORY_COLORS = {
6
+ AGENT: {
7
+ border: 'border-indigo-500/50',
8
+ bg: 'bg-indigo-500/10',
9
+ text: 'text-indigo-400',
10
+ bar: 'bg-indigo-500',
11
+ chipHover: 'hover:bg-indigo-500/20',
12
+ },
13
+ LLM: {
14
+ border: 'border-purple-500/50',
15
+ bg: 'bg-purple-500/10',
16
+ text: 'text-purple-400',
17
+ bar: 'bg-purple-500',
18
+ chipHover: 'hover:bg-purple-500/20',
19
+ },
20
+ TOOL: {
21
+ border: 'border-amber-500/50',
22
+ bg: 'bg-amber-500/10',
23
+ text: 'text-amber-400',
24
+ bar: 'bg-amber-500',
25
+ chipHover: 'hover:bg-amber-500/20',
26
+ },
27
+ EVAL: {
28
+ border: 'border-emerald-500/50',
29
+ bg: 'bg-emerald-500/10',
30
+ text: 'text-emerald-400',
31
+ bar: 'bg-emerald-500',
32
+ chipHover: 'hover:bg-emerald-500/20',
33
+ },
34
+ ERROR: {
35
+ border: 'border-red-500/50',
36
+ bg: 'bg-red-500/10',
37
+ text: 'text-red-400',
38
+ bar: 'bg-red-500',
39
+ chipHover: 'hover:bg-red-500/20',
40
+ },
41
+ OTHER: {
42
+ border: 'border-slate-500/50',
43
+ bg: 'bg-slate-500/10',
44
+ text: 'text-slate-400',
45
+ bar: 'bg-slate-500',
46
+ chipHover: 'hover:bg-slate-500/20',
47
+ },
48
+ };
49
+ /**
50
+ * Get category colors for a given category string.
51
+ * Falls back to OTHER for unknown categories.
52
+ */
53
+ export function getCategoryColors(category) {
54
+ return CATEGORY_COLORS[category] || CATEGORY_COLORS.OTHER;
55
+ }
56
+ //# sourceMappingURL=categoryStyles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categoryStyles.js","sourceRoot":"","sources":["../../../../services/traces/categoryStyles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,MAAM,CAAC,MAAM,eAAe,GAAwD;IAClF,KAAK,EAAE;QACL,MAAM,EAAE,sBAAsB;QAC9B,EAAE,EAAE,kBAAkB;QACtB,IAAI,EAAE,iBAAiB;QACvB,GAAG,EAAE,eAAe;QACpB,SAAS,EAAE,wBAAwB;KACpC;IACD,GAAG,EAAE;QACH,MAAM,EAAE,sBAAsB;QAC9B,EAAE,EAAE,kBAAkB;QACtB,IAAI,EAAE,iBAAiB;QACvB,GAAG,EAAE,eAAe;QACpB,SAAS,EAAE,wBAAwB;KACpC;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,qBAAqB;QAC7B,EAAE,EAAE,iBAAiB;QACrB,IAAI,EAAE,gBAAgB;QACtB,GAAG,EAAE,cAAc;QACnB,SAAS,EAAE,uBAAuB;KACnC;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,uBAAuB;QAC/B,EAAE,EAAE,mBAAmB;QACvB,IAAI,EAAE,kBAAkB;QACxB,GAAG,EAAE,gBAAgB;QACrB,SAAS,EAAE,yBAAyB;KACrC;IACD,KAAK,EAAE;QACL,MAAM,EAAE,mBAAmB;QAC3B,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,cAAc;QACpB,GAAG,EAAE,YAAY;QACjB,SAAS,EAAE,qBAAqB;KACjC;IACD,KAAK,EAAE;QACL,MAAM,EAAE,qBAAqB;QAC7B,EAAE,EAAE,iBAAiB;QACrB,IAAI,EAAE,gBAAgB;QACtB,GAAG,EAAE,cAAc;QACnB,SAAS,EAAE,uBAAuB;KACnC;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,eAAe,CAAC,QAAwB,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { CategorizedSpan, FlowTransformResult, FlowTransformOptions } from '../../types/index.js';
2
+ /**
3
+ * Detect if a span is a container span (wrapper for entire execution).
4
+ * Container spans are excluded from flow nodes - only their children are shown.
5
+ *
6
+ * Uses multiple heuristics to support different agent implementations:
7
+ * 1. OTEL GenAI semantic convention (gen_ai.operation.name)
8
+ * 2. Name-based pattern matching
9
+ * 3. Duration heuristic (span covers 90%+ of children duration)
10
+ */
11
+ declare function isContainerSpan(span: CategorizedSpan): boolean;
12
+ /**
13
+ * Find the main flow spans (entry point for execution flow).
14
+ * Adapts to different agent span structures.
15
+ */
16
+ declare function findMainFlowSpans(spanTree: CategorizedSpan[]): CategorizedSpan[];
17
+ /**
18
+ * Sort spans by startTime for execution order
19
+ */
20
+ declare function sortByStartTime(spans: CategorizedSpan[]): CategorizedSpan[];
21
+ /**
22
+ * Main transform function: Convert span tree to execution-order flow.
23
+ *
24
+ * Algorithm:
25
+ * 1. Find main flow spans (skip container root if present)
26
+ * 2. Process each level: create nodes, sequential edges between siblings
27
+ * 3. For spans with children: create branch edges, recurse into children
28
+ * 4. Apply dagre layout for positioning
29
+ */
30
+ export declare function spansToExecutionFlow(spanTree: CategorizedSpan[], totalDuration: number, options?: FlowTransformOptions): FlowTransformResult;
31
+ /**
32
+ * Export utility functions for testing
33
+ */
34
+ export { isContainerSpan, findMainFlowSpans, sortByStartTime };
35
+ //# sourceMappingURL=executionOrderTransform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executionOrderTransform.d.ts","sourceRoot":"","sources":["../../../../services/traces/executionOrderTransform.ts"],"names":[],"mappings":"AAoBA,OAAO,EACL,eAAe,EAEf,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,SAAS,CAAC;AAqBjB;;;;;;;;GAQG;AACH,iBAAS,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAyCvD;AAED;;;GAGG;AACH,iBAAS,iBAAiB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAmBzE;AAED;;GAEG;AACH,iBAAS,eAAe,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAIpE;AAmJD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EAAE,EAC3B,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CAgDrB;AAwDD;;GAEG;AACH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,313 @@
1
+ /*
2
+ * Copyright OpenSearch Contributors
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ /**
6
+ * Execution Order Transform Service
7
+ *
8
+ * Transforms span trees to React Flow format using execution-order linking
9
+ * (like AWS Step Functions) instead of parent-child hierarchy.
10
+ *
11
+ * Key differences from hierarchy mode:
12
+ * - Siblings at each level linked by execution order (startTime)
13
+ * - Container spans (like agent.run) excluded from flow nodes
14
+ * - Parent→child shown as branch edges (detail), not main flow
15
+ * - Parallel detection only among siblings with overlapping times
16
+ */
17
+ import { MarkerType } from '@xyflow/react';
18
+ import dagre from 'dagre';
19
+ import { ATTR_GEN_AI_OPERATION_NAME, GEN_AI_OPERATION_NAME_VALUE_INVOKE_AGENT, GEN_AI_OPERATION_NAME_VALUE_CREATE_AGENT, } from '@opentelemetry/semantic-conventions/incubating';
20
+ const DEFAULT_OPTIONS = {
21
+ direction: 'TB',
22
+ mode: 'execution-order',
23
+ nodeWidth: 200,
24
+ nodeHeight: 70,
25
+ nodeSpacingX: 50,
26
+ nodeSpacingY: 80,
27
+ };
28
+ /**
29
+ * Detect if a span is a container span (wrapper for entire execution).
30
+ * Container spans are excluded from flow nodes - only their children are shown.
31
+ *
32
+ * Uses multiple heuristics to support different agent implementations:
33
+ * 1. OTEL GenAI semantic convention (gen_ai.operation.name)
34
+ * 2. Name-based pattern matching
35
+ * 3. Duration heuristic (span covers 90%+ of children duration)
36
+ */
37
+ function isContainerSpan(span) {
38
+ // 1. OTEL GenAI convention: invoke_agent/create_agent are container operations
39
+ const operationName = span.attributes?.[ATTR_GEN_AI_OPERATION_NAME];
40
+ if (operationName === GEN_AI_OPERATION_NAME_VALUE_INVOKE_AGENT ||
41
+ operationName === GEN_AI_OPERATION_NAME_VALUE_CREATE_AGENT) {
42
+ return true;
43
+ }
44
+ // 2. Name-based heuristic for agents that don't use OTEL attributes
45
+ const name = span.name?.toLowerCase() || '';
46
+ if (name.includes('agent.run') || name.includes('invoke_agent')) {
47
+ return true;
48
+ }
49
+ // 3. Single root with children that spans entire trace
50
+ if (!span.parentSpanId && span.children && span.children.length > 1) {
51
+ const spanStart = new Date(span.startTime).getTime();
52
+ const spanEnd = new Date(span.endTime).getTime();
53
+ const spanDuration = spanEnd - spanStart;
54
+ // Get min start and max end from children
55
+ const children = span.children;
56
+ let minChildStart = Infinity;
57
+ let maxChildEnd = -Infinity;
58
+ children.forEach(child => {
59
+ const childStart = new Date(child.startTime).getTime();
60
+ const childEnd = new Date(child.endTime).getTime();
61
+ minChildStart = Math.min(minChildStart, childStart);
62
+ maxChildEnd = Math.max(maxChildEnd, childEnd);
63
+ });
64
+ const childrenSpan = maxChildEnd - minChildStart;
65
+ // If span encompasses children (90%+ coverage), it's likely a container
66
+ if (childrenSpan > 0 && spanDuration >= childrenSpan * 0.9) {
67
+ return true;
68
+ }
69
+ }
70
+ return false;
71
+ }
72
+ /**
73
+ * Find the main flow spans (entry point for execution flow).
74
+ * Adapts to different agent span structures.
75
+ */
76
+ function findMainFlowSpans(spanTree) {
77
+ // spanTree contains top-level spans from processSpansIntoTree().
78
+ // These are tree roots even if they have a parentSpanId pointing to a span
79
+ // outside the fetched data (e.g., a parent in a different service/trace context).
80
+ // Use all top-level spans as roots instead of filtering by !parentSpanId.
81
+ const roots = spanTree;
82
+ // Case 1: Single root that's a container → main flow is its children
83
+ if (roots.length === 1 && isContainerSpan(roots[0])) {
84
+ const children = roots[0].children || [];
85
+ if (children.length === 0) {
86
+ // Fallback: container has no children, show the root itself instead of empty graph
87
+ return roots;
88
+ }
89
+ return children;
90
+ }
91
+ // Case 2: Multiple roots OR single non-container root → roots are main flow
92
+ return roots;
93
+ }
94
+ /**
95
+ * Sort spans by startTime for execution order
96
+ */
97
+ function sortByStartTime(spans) {
98
+ return [...spans].sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime());
99
+ }
100
+ /**
101
+ * Create a flow node from a categorized span
102
+ */
103
+ function createNode(span, totalDuration, options) {
104
+ return {
105
+ id: span.spanId,
106
+ type: span.category.toLowerCase(),
107
+ data: {
108
+ span,
109
+ totalDuration,
110
+ },
111
+ position: { x: 0, y: 0 }, // Will be set by dagre layout
112
+ style: {
113
+ width: options.nodeWidth,
114
+ height: options.nodeHeight,
115
+ },
116
+ };
117
+ }
118
+ /**
119
+ * Create an edge between two nodes with appropriate styling
120
+ */
121
+ function createEdge(sourceId, targetId, edgeType) {
122
+ const baseStyle = {
123
+ strokeWidth: 2,
124
+ };
125
+ switch (edgeType) {
126
+ case 'sequential':
127
+ return {
128
+ id: `${sourceId}-${targetId}`,
129
+ source: sourceId,
130
+ target: targetId,
131
+ type: 'smoothstep',
132
+ animated: false,
133
+ style: {
134
+ ...baseStyle,
135
+ stroke: '#64748b', // slate
136
+ },
137
+ markerEnd: {
138
+ type: MarkerType.ArrowClosed,
139
+ width: 12,
140
+ height: 12,
141
+ color: '#64748b',
142
+ },
143
+ };
144
+ case 'parallel':
145
+ return {
146
+ id: `${sourceId}-${targetId}`,
147
+ source: sourceId,
148
+ target: targetId,
149
+ type: 'smoothstep',
150
+ animated: true,
151
+ style: {
152
+ ...baseStyle,
153
+ stroke: '#f59e0b', // amber
154
+ strokeDasharray: '5,5',
155
+ },
156
+ markerEnd: {
157
+ type: MarkerType.ArrowClosed,
158
+ width: 12,
159
+ height: 12,
160
+ color: '#f59e0b',
161
+ },
162
+ };
163
+ case 'branch':
164
+ return {
165
+ id: `${sourceId}-branch-${targetId}`,
166
+ source: sourceId,
167
+ target: targetId,
168
+ type: 'smoothstep',
169
+ animated: false,
170
+ style: {
171
+ ...baseStyle,
172
+ stroke: '#6366f1', // indigo
173
+ strokeDasharray: '3,3',
174
+ strokeWidth: 1.5,
175
+ },
176
+ markerEnd: {
177
+ type: MarkerType.ArrowClosed,
178
+ width: 10,
179
+ height: 10,
180
+ color: '#6366f1',
181
+ },
182
+ };
183
+ }
184
+ }
185
+ /**
186
+ * Create edges between siblings in execution order.
187
+ * Detects parallel execution when spans overlap in time.
188
+ */
189
+ function createSiblingEdges(siblings) {
190
+ if (siblings.length < 2)
191
+ return [];
192
+ const edges = [];
193
+ const sorted = sortByStartTime(siblings);
194
+ for (let i = 0; i < sorted.length - 1; i++) {
195
+ const current = sorted[i];
196
+ const next = sorted[i + 1];
197
+ // Check for parallel execution (overlapping times)
198
+ const currentEnd = new Date(current.endTime).getTime();
199
+ const nextStart = new Date(next.startTime).getTime();
200
+ // Allow small overlap threshold (10ms) for timing jitter
201
+ const isParallel = nextStart < currentEnd - 10;
202
+ edges.push(createEdge(current.spanId, next.spanId, isParallel ? 'parallel' : 'sequential'));
203
+ }
204
+ return edges;
205
+ }
206
+ /**
207
+ * Create branch edges from parent to its first child.
208
+ * Shows nesting/detail relationship, not main execution flow.
209
+ */
210
+ function createBranchEdges(span) {
211
+ if (!span.children || span.children.length === 0)
212
+ return [];
213
+ const children = span.children;
214
+ const sorted = sortByStartTime(children);
215
+ // Edge from parent to first child only (branch off point)
216
+ return [createEdge(span.spanId, sorted[0].spanId, 'branch')];
217
+ }
218
+ /**
219
+ * Main transform function: Convert span tree to execution-order flow.
220
+ *
221
+ * Algorithm:
222
+ * 1. Find main flow spans (skip container root if present)
223
+ * 2. Process each level: create nodes, sequential edges between siblings
224
+ * 3. For spans with children: create branch edges, recurse into children
225
+ * 4. Apply dagre layout for positioning
226
+ */
227
+ export function spansToExecutionFlow(spanTree, totalDuration, options = {}) {
228
+ const opts = { ...DEFAULT_OPTIONS, ...options };
229
+ const nodes = [];
230
+ const edges = [];
231
+ // Find the main flow entry point
232
+ const mainFlowSpans = findMainFlowSpans(spanTree);
233
+ if (mainFlowSpans.length === 0) {
234
+ return { nodes: [], edges: [] };
235
+ }
236
+ /**
237
+ * Process a level of siblings in the span hierarchy.
238
+ * Creates nodes and edges for this level, then recurses into children.
239
+ */
240
+ function processLevel(siblings) {
241
+ if (siblings.length === 0)
242
+ return;
243
+ const sorted = sortByStartTime(siblings);
244
+ // Create nodes for all spans at this level
245
+ sorted.forEach(span => {
246
+ nodes.push(createNode(span, totalDuration, opts));
247
+ });
248
+ // Create sequential edges between siblings
249
+ edges.push(...createSiblingEdges(sorted));
250
+ // Process children for each span
251
+ sorted.forEach(span => {
252
+ if (span.children && span.children.length > 0) {
253
+ const children = span.children;
254
+ // Create branch edge from parent to children
255
+ edges.push(...createBranchEdges(span));
256
+ // Recursively process children
257
+ processLevel(children);
258
+ }
259
+ });
260
+ }
261
+ // Start processing from main flow level
262
+ processLevel(mainFlowSpans);
263
+ // Apply dagre layout for positioning
264
+ return applyDagreLayout(nodes, edges, opts);
265
+ }
266
+ /**
267
+ * Apply dagre layout algorithm to position nodes.
268
+ * Uses TB (top-to-bottom) direction for vertical flow.
269
+ */
270
+ function applyDagreLayout(nodes, edges, options) {
271
+ if (nodes.length === 0) {
272
+ return { nodes: [], edges: [] };
273
+ }
274
+ const dagreGraph = new dagre.graphlib.Graph();
275
+ dagreGraph.setDefaultEdgeLabel(() => ({}));
276
+ dagreGraph.setGraph({
277
+ rankdir: options.direction, // TB for vertical flow
278
+ nodesep: options.nodeSpacingX,
279
+ ranksep: options.nodeSpacingY,
280
+ marginx: 20,
281
+ marginy: 20,
282
+ });
283
+ // Add nodes to dagre
284
+ nodes.forEach(node => {
285
+ dagreGraph.setNode(node.id, {
286
+ width: options.nodeWidth,
287
+ height: options.nodeHeight,
288
+ });
289
+ });
290
+ // Add edges to dagre
291
+ edges.forEach(edge => {
292
+ dagreGraph.setEdge(edge.source, edge.target);
293
+ });
294
+ // Run layout algorithm
295
+ dagre.layout(dagreGraph);
296
+ // Apply calculated positions to nodes
297
+ const layoutedNodes = nodes.map(node => {
298
+ const nodeWithPosition = dagreGraph.node(node.id);
299
+ return {
300
+ ...node,
301
+ position: {
302
+ x: nodeWithPosition.x - options.nodeWidth / 2,
303
+ y: nodeWithPosition.y - options.nodeHeight / 2,
304
+ },
305
+ };
306
+ });
307
+ return { nodes: layoutedNodes, edges };
308
+ }
309
+ /**
310
+ * Export utility functions for testing
311
+ */
312
+ export { isContainerSpan, findMainFlowSpans, sortByStartTime };
313
+ //# sourceMappingURL=executionOrderTransform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executionOrderTransform.js","sourceRoot":"","sources":["../../../../services/traces/executionOrderTransform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Lightweight polling helper used by the SDK runner to pre-load OTel
3
+ * spans into the `traces` fixture for deterministic test bodies (#230).
4
+ *
5
+ * This is a thinner cousin of `tracePollingManager.startPolling`:
6
+ * - no judge wiring, no report storage updates, no trajectory rebuild
7
+ * - returns a result object that includes the **last error message**
8
+ * when polling never produced spans, so the caller can build a
9
+ * specific `unavailableTracesAccessor("fetch failed: …")` reason
10
+ * instead of a generic "no spans found"
11
+ *
12
+ * **Defaults are deliberately faster than the judge poller** in
13
+ * `services/traces/tracePoller.ts`. The judge runs as a background
14
+ * task while the user already sees a "pending" badge; ten minutes of
15
+ * polling there is fine. The SDK fixture pre-load, however, is
16
+ * synchronous inside the test body — every test waits on it before
17
+ * its first assertion can run, so we cap the default budget at
18
+ * ~10 seconds (10 × 1s). Users can still bump this via `tracePolling`
19
+ * on the agent config or via `TRACE_POLL_INTERVAL_MS` /
20
+ * `TRACE_POLL_MAX_ATTEMPTS` env vars (the same vars the judge poller
21
+ * honours), and a hard `MAX_POLL_CEILING` mirrors the one in
22
+ * `tracePoller.ts` so a misconfigured agent can't block a test for
23
+ * an unbounded time.
24
+ */
25
+ import type { Span } from '../../types/index.js';
26
+ /**
27
+ * Strategy-C correlation input: an agent's OTel `service.name` plus the run's
28
+ * wall-clock window. Used as a fallback (and union) when the agent's spans are
29
+ * not tagged with the connector `runId` (Strategy B) — e.g. Claude Code / any
30
+ * subprocess agent whose OTel SDK emits its own trace and never sees our runId.
31
+ * Mirrors the `windowAgents` clause the run-report Traces tab already issues.
32
+ */
33
+ export interface TraceWindowAgent {
34
+ serviceName: string;
35
+ startedAt: number;
36
+ endedAt: number;
37
+ /** Strategy D: precise per-run correlator (e.g. Claude Code `session.id`). */
38
+ sessionId?: string;
39
+ }
40
+ /**
41
+ * Hard ceiling on `maxAttempts`, mirroring the constant in
42
+ * `services/traces/tracePoller.ts`. Prevents a misconfigured agent
43
+ * (e.g. `tracePolling.maxAttempts: 10_000`) from blocking a test body
44
+ * indefinitely.
45
+ */
46
+ export declare const SDK_TRACE_POLL_CEILING = 60;
47
+ /** Default interval between polling attempts. ~1s for SDK interactivity. */
48
+ export declare const SDK_DEFAULT_POLL_INTERVAL_MS: number;
49
+ /** Default attempt budget. 10 attempts × ~1s ≈ 10s total for SDK pre-load. */
50
+ export declare const SDK_DEFAULT_MAX_ATTEMPTS: number;
51
+ export interface FetchSpansForRunOptions {
52
+ /** Total number of attempts. Capped at {@link SDK_TRACE_POLL_CEILING}. */
53
+ maxAttempts?: number;
54
+ /** Delay between attempts in ms. */
55
+ intervalMs?: number;
56
+ /**
57
+ * Strategy-C fallback: when provided, each poll unions the `runId` clause
58
+ * with a service-name + time-window clause. This is what lets the SDK
59
+ * `traces` fixture (and therefore the judge) actually receive spans from
60
+ * agents like Claude Code whose OTel spans carry their own traceId +
61
+ * `service.name` but NOT our connector `runId`. Without this, runId-only
62
+ * correlation returns 0 spans and the judge never sees the trace (#XXX).
63
+ */
64
+ windowAgents?: TraceWindowAgent[];
65
+ }
66
+ export interface FetchSpansForRunResult {
67
+ /** Spans returned on the first non-empty attempt, or `[]` on timeout / error. */
68
+ spans: Span[];
69
+ /**
70
+ * If `spans` is empty, the message of the last error thrown by
71
+ * `fetchTracesByRunIds` (auth failure, 5xx, network down, etc.).
72
+ * `undefined` when polling completed without errors but the trace
73
+ * backend simply had no spans for this `runId` yet — in that case the
74
+ * caller should report a "no spans found" reason rather than a "fetch
75
+ * failed" reason.
76
+ */
77
+ lastError?: string;
78
+ }
79
+ /**
80
+ * Poll for spans associated with a single agent runId. Resolves with
81
+ * the spans on the first non-empty fetch, or with `{ spans: [],
82
+ * lastError? }` after `maxAttempts` of empty / failing responses.
83
+ * Never throws.
84
+ */
85
+ export declare function fetchSpansForRun(runId: string | undefined, options?: FetchSpansForRunOptions): Promise<FetchSpansForRunResult>;
86
+ //# sourceMappingURL=fetchSpansForRun.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchSpansForRun.d.ts","sourceRoot":"","sources":["../../../../services/traces/fetchSpansForRun.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAIpC;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,KAAK,CAAC;AASzC,4EAA4E;AAC5E,eAAO,MAAM,4BAA4B,QAAyC,CAAC;AACnF,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB,QAAwC,CAAC;AAE9E,MAAM,WAAW,uBAAuB;IACtC,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,iFAAiF;IACjF,KAAK,EAAE,IAAI,EAAE,CAAC;IACd;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,sBAAsB,CAAC,CAwCjC"}
@@ -0,0 +1,69 @@
1
+ /*
2
+ * Copyright OpenSearch Contributors
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { debug } from '../../lib/debug.js';
6
+ import { fetchTracesForRun } from './index.js';
7
+ /**
8
+ * Hard ceiling on `maxAttempts`, mirroring the constant in
9
+ * `services/traces/tracePoller.ts`. Prevents a misconfigured agent
10
+ * (e.g. `tracePolling.maxAttempts: 10_000`) from blocking a test body
11
+ * indefinitely.
12
+ */
13
+ export const SDK_TRACE_POLL_CEILING = 60;
14
+ const envInt = (name, fallback) => {
15
+ const raw = process.env?.[name];
16
+ if (!raw)
17
+ return fallback;
18
+ const n = parseInt(raw, 10);
19
+ return Number.isFinite(n) && n > 0 ? n : fallback;
20
+ };
21
+ /** Default interval between polling attempts. ~1s for SDK interactivity. */
22
+ export const SDK_DEFAULT_POLL_INTERVAL_MS = envInt('TRACE_POLL_INTERVAL_MS', 1000);
23
+ /** Default attempt budget. 10 attempts × ~1s ≈ 10s total for SDK pre-load. */
24
+ export const SDK_DEFAULT_MAX_ATTEMPTS = envInt('TRACE_POLL_MAX_ATTEMPTS', 10);
25
+ /**
26
+ * Poll for spans associated with a single agent runId. Resolves with
27
+ * the spans on the first non-empty fetch, or with `{ spans: [],
28
+ * lastError? }` after `maxAttempts` of empty / failing responses.
29
+ * Never throws.
30
+ */
31
+ export async function fetchSpansForRun(runId, options = {}) {
32
+ const requestedMax = options.maxAttempts ?? SDK_DEFAULT_MAX_ATTEMPTS;
33
+ const maxAttempts = Math.max(1, Math.min(requestedMax, SDK_TRACE_POLL_CEILING));
34
+ const intervalMs = Math.max(0, options.intervalMs ?? SDK_DEFAULT_POLL_INTERVAL_MS);
35
+ const windowAgents = options.windowAgents?.length ? options.windowAgents : undefined;
36
+ const label = runId ?? `service:${windowAgents?.map(a => a.serviceName).join(',') ?? 'none'}`;
37
+ let lastError;
38
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
39
+ try {
40
+ // Union of Strategy B (runId) and Strategy C (service-name + time window),
41
+ // matching the run-report Traces tab. Either clause alone can be empty
42
+ // (e.g. Claude Code never tags spans with our runId), so we need both.
43
+ const result = await fetchTracesForRun({
44
+ runId: runId || undefined,
45
+ includeWindowFallback: !!windowAgents,
46
+ windowAgents,
47
+ });
48
+ if (result?.spans && result.spans.length > 0) {
49
+ debug('FetchSpansForRun', `${label} attempt=${attempt} found ${result.spans.length} spans`);
50
+ return { spans: result.spans };
51
+ }
52
+ // Successful fetch but no spans yet — clear any previous transient
53
+ // error so the caller doesn't blame a long-since-recovered hiccup.
54
+ lastError = undefined;
55
+ debug('FetchSpansForRun', `${label} attempt=${attempt}/${maxAttempts} empty`);
56
+ }
57
+ catch (err) {
58
+ // Capture the message but keep retrying — the caller decides
59
+ // whether to surface it as `unavailableTracesAccessor` reason.
60
+ lastError = err instanceof Error ? err.message : String(err);
61
+ debug('FetchSpansForRun', `${label} attempt=${attempt} fetch error: ${lastError}`);
62
+ }
63
+ if (attempt < maxAttempts && intervalMs > 0) {
64
+ await new Promise(resolve => setTimeout(resolve, intervalMs));
65
+ }
66
+ }
67
+ return { spans: [], lastError };
68
+ }
69
+ //# sourceMappingURL=fetchSpansForRun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchSpansForRun.js","sourceRoot":"","sources":["../../../../services/traces/fetchSpansForRun.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { Node, Edge } from '@xyflow/react';
2
+ import { CategorizedSpan, SpanNodeData, FlowTransformResult, FlowTransformOptions, ParallelGroup } from '../../types/index.js';
3
+ /**
4
+ * Convert a categorized span tree to React Flow nodes and edges.
5
+ *
6
+ * @param spanTree - Categorized span tree to transform
7
+ * @param totalDuration - Total trace duration for relative sizing
8
+ * @param options - Transform options including mode
9
+ * @returns Flow nodes and edges for React Flow
10
+ */
11
+ export declare function spansToFlow(spanTree: CategorizedSpan[], totalDuration: number, options?: FlowTransformOptions): FlowTransformResult;
12
+ /**
13
+ * Detect parallel execution among sibling spans by checking time overlap
14
+ */
15
+ export declare function detectParallelExecution(spans: CategorizedSpan[]): ParallelGroup[];
16
+ /**
17
+ * Apply dagre layout algorithm to position nodes
18
+ */
19
+ export declare function applyDagreLayout(nodes: Node<SpanNodeData>[], edges: Edge[], options?: FlowTransformOptions): FlowTransformResult;
20
+ /**
21
+ * Get total span count from a tree (for stats display)
22
+ */
23
+ export declare function countSpansInTree(spans: CategorizedSpan[]): number;
24
+ //# sourceMappingURL=flowTransform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flowTransform.d.ts","sourceRoot":"","sources":["../../../../services/traces/flowTransform.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAc,MAAM,eAAe,CAAC;AACvD,OAAO,EACL,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACd,MAAM,SAAS,CAAC;AAYjB;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,eAAe,EAAE,EAC3B,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CAUrB;AAsGD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,aAAa,EAAE,CAqDjF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAC3B,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CA0CrB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,MAAM,CAYjE"}