@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
package/docs/SKILLS.md ADDED
@@ -0,0 +1,264 @@
1
+ <!--
2
+ * Copyright OpenSearch Contributors
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ -->
5
+
6
+ # Skills Evaluator — Authoring Guide
7
+
8
+ The Skills Evaluator runs an A/B benchmark on an [AgentSkills](https://agentskills.io/) /
9
+ [Claude Code skill](https://docs.claude.com/en/docs/claude-code/skills): one set of
10
+ agent runs **with** the skill injected, one set **without**, then grades the same
11
+ assertions on both trajectories and reports the delta in pass-rate, latency, and
12
+ tokens. Optionally, an LLM proposes an improved `SKILL.md` body from the failure
13
+ evidence and (with `auto`) applies it.
14
+
15
+ This guide tells you **how to write a skill that the evaluator can score
16
+ fairly** — and what every warning / status the UI shows actually means.
17
+
18
+ ```
19
+ ┌──────────┐ ┌──────────────┐ ┌──────────────┐ ┌────────────┐
20
+ │ SKILL.md │→ │ parseSkill │→ │ runSkillEval │→ │ benchmark │
21
+ └──────────┘ │ validate + │ │ with vs │ │ + diff + │
22
+ │ warn │ │ without │ │ improve │
23
+ └──────────────┘ └──────────────┘ └────────────┘
24
+ ```
25
+
26
+ ---
27
+
28
+ ## 1. Anatomy of a skill folder
29
+
30
+ ```
31
+ my-skill/
32
+ ├── SKILL.md # required — frontmatter + body
33
+ └── evals/
34
+ └── evals.json # optional — auto-generated if absent
35
+ ```
36
+
37
+ `SKILL.md` is a markdown file with a YAML frontmatter block delimited by `---`
38
+ on lines by themselves:
39
+
40
+ ```markdown
41
+ ---
42
+ name: rca-log-analysis
43
+ description: Use when the user asks why a service is failing or wants to find
44
+ the root cause from log lines. Triggers on terms like "why is X failing",
45
+ "RCA", "root cause", "error spike".
46
+ allowed-tools:
47
+ - Read
48
+ - Bash(git:*)
49
+ license: Apache-2.0
50
+ ---
51
+
52
+ # Root-cause analysis from logs
53
+
54
+ When the user asks why a service is failing:
55
+
56
+ 1. Pull the last 5 minutes of logs from the suspect service.
57
+ 2. Group by error code; the dominant code is your starting hypothesis.
58
+ 3. ...
59
+ ```
60
+
61
+ ### Frontmatter rules (enforced by `parseSkill`)
62
+
63
+ | Field | Required | Constraint |
64
+ | --------------- | -------- | ----------------------------------------------------------------------- |
65
+ | `name` | yes | lowercase kebab-case, ≤ 64 chars |
66
+ | `description` | yes | ≤ 1024 chars; **should describe trigger conditions** (see §2) |
67
+ | `allowed-tools` | no | YAML list **or** whitespace-separated string (`Bash(git:*)` patterns ok) |
68
+ | `license` | no | free-form string |
69
+ | `compatibility` | no | free-form string |
70
+ | `metadata` | no | arbitrary YAML mapping |
71
+
72
+ The closing `---` must be on its own line. CRLF line endings are normalised
73
+ before matching.
74
+
75
+ ---
76
+
77
+ ## 2. Why your `description` is the most important field
78
+
79
+ In Claude Code's skill loader the `description` is what the matcher
80
+ **actually reads** when deciding whether to inject the skill into a given
81
+ turn. The body is only loaded after the description has matched. A
82
+ description that reads like a tagline ("A helper for log analysis") will
83
+ silently fail to fire.
84
+
85
+ The parser surfaces two warnings for this:
86
+
87
+ | Warning text | What to do |
88
+ | ---------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
89
+ | `description is only N characters … aim for ≥ 30 chars and explicitly state trigger conditions` | The description is too short to discriminate from peers. Expand it. |
90
+ | `description does not appear to state when the skill should be used` | Add a phrase like **`Use when …`**, **`For requests about …`**, **`Trigger on …`**, **`Invoke when the user asks …`**. The matcher looks for these. |
91
+
92
+ Good descriptions:
93
+
94
+ > ✅ "Use when the user asks why a service is failing or wants RCA from logs.
95
+ > Triggers on phrases like 'why is X erroring', 'root cause', 'error spike'."
96
+
97
+ > ✅ "For requests about diffing two trajectories — invoke when the user
98
+ > mentions 'compare runs', 'why did the agent behave differently', or pastes
99
+ > two run IDs."
100
+
101
+ Bad descriptions (parser will warn):
102
+
103
+ > ❌ "Helper for logs."
104
+ > ❌ "Skill for trace analysis."
105
+ > ❌ "Improves debugging."
106
+
107
+ ---
108
+
109
+ ## 3. Authoring `evals/evals.json`
110
+
111
+ Each eval case is a triple **prompt → expected_output → assertions**. The
112
+ evaluator runs the prompt twice (with and without the skill), then asks the
113
+ LLM judge whether **each** assertion holds against the resulting trajectory.
114
+
115
+ ```json
116
+ {
117
+ "skill_name": "rca-log-analysis",
118
+ "evals": [
119
+ {
120
+ "id": 1,
121
+ "prompt": "The checkout service started returning 503s 10 minutes ago. Why?",
122
+ "expected_output": "Identifies a downstream dependency or resource exhaustion as the cause.",
123
+ "assertions": [
124
+ "The agent searches logs for the affected service before guessing",
125
+ "The agent groups errors by error code or status",
126
+ "The agent's final answer names a specific suspect (service / resource / config)"
127
+ ]
128
+ }
129
+ ]
130
+ }
131
+ ```
132
+
133
+ Tips:
134
+
135
+ - **Make assertions discriminating.** A good assertion is one a *baseline*
136
+ agent (without the skill) would plausibly fail — that's the only way the
137
+ A/B delta surfaces real value. Trivial assertions like "the response is in
138
+ English" don't move the needle.
139
+ - **2–3 assertions per eval is plenty.** Each assertion costs one judge call.
140
+ - **`expected_output` is free-form** — it's used as judge context, not as a
141
+ string-match target.
142
+ - **Auto-generation** runs only if `evals/evals.json` is missing. If it
143
+ fails to parse a JSON eval set from the model response, the evaluator
144
+ **throws with the exact JSON shape** rather than substituting a generic
145
+ placeholder. Hand-author the file in that case.
146
+
147
+ ---
148
+
149
+ ## 4. Reading the validation panel
150
+
151
+ After you select a skill in the UI, the validation panel shows:
152
+
153
+ | Symbol | Meaning |
154
+ | ------ | ---------------------------------------------------------------------------------------------------- |
155
+ | ✅ | `valid: true` — frontmatter parsed, required fields present |
156
+ | ❌ | `valid: false` — at least one hard error; the **Run Evaluation** button stays disabled |
157
+ | ⚠ | Warning, listed below the description. Skill still runs, but you should fix before publishing. |
158
+
159
+ Common warnings (and what they mean):
160
+
161
+ | Warning | Cause / Fix |
162
+ | -------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
163
+ | `description does not appear to state when the skill should be used` | Add a "Use when …" trigger phrase (§2) |
164
+ | `Instructions are ~N tokens (recommended <5000)` | Skill body too long. Split into multiple skills or move examples to bundled reference files. |
165
+ | `evals/evals.json present but invalid: …` | The file exists but parsing failed. The reason follows the colon (e.g. `invalid JSON`, `missing skill_name`). |
166
+ | `No evals/evals.json found — skill cannot be evaluated …` | Auto-generation will run on Evaluate. Provide your own to control what's tested. |
167
+
168
+ ---
169
+
170
+ ## 5. Reading the run progress
171
+
172
+ While a run is in flight, the progress bar shows three counters:
173
+
174
+ ```
175
+ N passed N failed ⚠ N errored
176
+ ```
177
+
178
+ The distinction is intentional and matters:
179
+
180
+ | Status | Meaning | Improver behaviour |
181
+ | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
182
+ | `passed` | Agent ran cleanly **and** every assertion graded true. | Treated as a positive example. |
183
+ | `failed` | Agent ran cleanly but **at least one assertion graded false**. | This is the signal the improver learns from — the skill is the suspect. |
184
+ | `errored` | The **agent itself** crashed / endpoint unreachable / timed out — assertions were skipped because grading them would (a) waste a judge call and (b) wrongly blame the skill. | **Excluded** from improvement-proposal evidence. Fix the agent (endpoint, auth, network) before drawing skill conclusions. |
185
+
186
+ If you see all `errored`, the skill is **unknowable** — the evaluator is
187
+ telling you to debug the agent, not the skill.
188
+
189
+ ---
190
+
191
+ ## 6. Auto-applying improvement proposals (`auto: true`)
192
+
193
+ When the LLM proposes an improved `SKILL.md` body, you can ship it
194
+ automatically with the **Apply & Re-run** button (UI) or `--auto` (CLI).
195
+
196
+ The server applies the change **non-destructively**:
197
+
198
+ 1. Snapshots the current `SKILL.md` to `SKILL.md.bak` next to it.
199
+ 2. Refuses to apply (with an explanatory error pointing to
200
+ `iteration-N/improvement-proposal.json`) if the original instructions
201
+ snapshot doesn't appear verbatim in the file — this prevents the silent
202
+ no-op case where `String.replace` matched nothing but the API still
203
+ claimed `applied: true`.
204
+
205
+ To roll back: `mv SKILL.md.bak SKILL.md`.
206
+
207
+ ---
208
+
209
+ ## 7. Where skills are discovered
210
+
211
+ The discover endpoint scans both **user scope** and **project scope**, in
212
+ this order:
213
+
214
+ | Path | Source label | Notes |
215
+ | -------------------------- | ------------------------ | -------------------------------------- |
216
+ | `~/.claude/skills/` | `Claude Code (user)` | Per Claude Code spec — user-global. |
217
+ | `<cwd>/.claude/skills/` | `Claude Code` | Project scope. |
218
+ | `<cwd>/.kiro/skills/` | `Kiro` | |
219
+ | `<cwd>/.kiro/steering/` | `Kiro` | |
220
+ | `<cwd>/.codex/` | `Codex` | |
221
+ | `<cwd>/.cursor/rules/` | `Cursor` | |
222
+ | `<cwd>/.github/copilot/` | `Copilot` | |
223
+ | `<cwd>/.continue/skills/` | `Continue` | |
224
+ | `<cwd>/skills/` | `Project` | |
225
+
226
+ Duplicate skill folders (same absolute path) appear once. Home-relative
227
+ paths render as `~/…` in the dropdown. You can also paste a path manually
228
+ or upload a single `SKILL.md` from the UI.
229
+
230
+ ---
231
+
232
+ ## 8. CLI
233
+
234
+ ```bash
235
+ # Run on a specific skill folder
236
+ agent-health skill ./my-skill --agent claude-code --model claude-sonnet
237
+
238
+ # Auto-apply the proposed improvement and re-run
239
+ agent-health skill ./my-skill --auto
240
+ ```
241
+
242
+ The CLI emits the same SSE event stream the UI consumes; `evalStatus` per
243
+ case is logged with the same tri-state semantics described in §5.
244
+
245
+ ---
246
+
247
+ ## 9. Troubleshooting
248
+
249
+ | Symptom | Likely cause |
250
+ | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
251
+ | Skill validates but A/B delta is ~0% | Assertions aren't discriminating — a baseline agent passes them too. Rewrite assertions to require knowledge the skill uniquely provides. |
252
+ | All evals graded `errored` | Agent endpoint unreachable, auth failed, or model timed out. Check the agent's settings page first; the skill is unknowable until then. |
253
+ | `Cannot auto-apply: original instructions snapshot does not match …` | The `SKILL.md` was edited between proposal generation and apply. Open `iteration-N/improvement-proposal.json`, review, and merge by hand. |
254
+ | `description does not appear to state when the skill should be used` | Add a "Use when …" trigger phrase. The matcher needs it (§2). |
255
+ | `allowed-tools` parsed wrong (e.g. `["Read,Write"]`) | Pre-PR-206 behaviour — upgrade. The current parser accepts both YAML lists and whitespace-separated strings. |
256
+
257
+ ---
258
+
259
+ ## See also
260
+
261
+ - [AgentSkills open standard](https://agentskills.io/)
262
+ - [Claude Code skills documentation](https://docs.claude.com/en/docs/claude-code/skills)
263
+ - [`docs/SDK.md`](./SDK.md) — code-based test SDK (different surface; complementary)
264
+ - Source: [`services/skills/`](../services/skills/), [`server/routes/skills.ts`](../server/routes/skills.ts), [`components/skills/SkillsPage.tsx`](../components/skills/SkillsPage.tsx)
@@ -0,0 +1,200 @@
1
+ ---
2
+ layout: post
3
+ title: "OpenSearch Agent Health: Open-Source Observability and Evaluation for AI Agents"
4
+ authors:
5
+ - goyamegh
6
+ - thottan
7
+ date: 2026-02-28
8
+ categories:
9
+ - technical-posts
10
+ - community
11
+ meta_keywords:
12
+ meta_description:
13
+ ---
14
+
15
+ *How Observability-Driven Development Lets You Ship Agents in Weeks, Not Months*
16
+
17
+ You've built an Agentic AI application. It's sophisticated, using recursive loops and autonomous tool-calling to navigate data. It passed your local testing with flying colors, so you deploy.
18
+
19
+ Then the logs hit.
20
+
21
+ A user asks for an order update. Your agent retrieves the wrong context, decides it needs to "reason" through a product manual, and triggers a sequence of expensive, irrelevant tool calls. After several seconds and a surprising inference cost, it returns a confident but unhelpful response. Your dashboard shows a healthy cluster and a successful 200 OK, but your agent just failed in silence.
22
+
23
+ ### Why do agents fail in silence?
24
+
25
+ As AI agents move from prototype to production, organizations face a critical challenge that's becoming impossible to ignore. Agents are autonomously making decisions, calling tools, and delivering results, yet the teams building them are often operating without visibility. This creates three critical challenges:
26
+
27
+ **The Reasoning Gap**: You see the final answer your agent delivers, but you don't see the hallucinated steps it took to get there. Did it call the wrong API? Did it misinterpret the user's intent? Did it retry a failed operation three times before succeeding? Without visibility into the reasoning chain, debugging becomes guesswork.
28
+
29
+ **The Cost-Latency Spiral**: Agentic workflows are inherently recursive. A single user query can trigger a cascade of expensive and time-consuming sub-tasks. Without real-time operational observability, you don't know which specific tool or sub-agent is burning your budget. Performance issues are only discovered when the bill arrives.
30
+
31
+ **The Evaluation Paradox**: Without a systematic way to grade agent performance at scale, teams fall back on manual spot-checking. How do you know if your latest prompt change improved accuracy by 5% or silently degraded it by 10%? Without structured evaluation, teams can't confidently deploy to production.
32
+
33
+ ### How will Agent Health help?
34
+
35
+ The transition from a multi-month deployment cycle to weekly deployments comes down to eliminating the "vibes-based" QA cycle. Every time a prompt is tweaked, or a new tool/skill is added to an agent, testing every possible trajectory manually is not feasible at scale. Agent Health accelerates development by converting this testing process into an automated, AI judge based workflow. By catching regressions early during the development phase (and in CI/CD pipelines) and providing real-time visual traces of exactly where the agent failed/diverged, teams reclaim engineering hours previously lost to staring at logs or waiting for customer incident reports. You debug in minutes, test systematically, and deploy with greater confidence.
36
+
37
+ ![Before and after Agent Health](/assets/media/blog-images/2026-02-28-opensearch-agent-health/before-after-agent-health.png){:class="img-centered"}
38
+
39
+ ### Introducing OpenSearch Agent Health
40
+
41
+ ```
42
+ npx @opensearch-project/agent-health
43
+ # ✓ Server running at http://localhost:4001
44
+ # ✓ Demo data loaded
45
+ ```
46
+
47
+ That's it. No installation required. Run one command and the full Agent Health interface is ready with traces, benchmarks, evaluations, and comparisons.
48
+
49
+ OpenSearch Agent Health is an open-source observability and evaluation solution for AI agents. Available as a zero-installation NPX tool that delivers three core capabilities in a lightweight (~4 MB) package.
50
+
51
+ **1. Solving the Reasoning Gap: OpenTelemetry-Native Trace Observability**
52
+
53
+ Agent Health provides timeline and flow visualizations that show exactly what your agent is doing at every step such as which tools it's calling, the sequence of decisions, the data flowing between components, and where things go wrong. All tracing follows OpenTelemetry standards, so your instrumentation remains portable and works alongside your existing observability tooling.
54
+
55
+ **2. Solving the Cost-Latency Spiral: Structured Benchmarking**
56
+
57
+ Agent Health enables systematic A/B comparison of agent configurations across test suites. Test different prompts, models, or configurations side-by-side, and track results over time. By storing all benchmarks and results in OpenSearch, Agent Health gives you a persistent, queryable history of every evaluation run, so you catch regressions before they reach production, not after.
58
+
59
+ **3. Solving the Evaluation Paradox: Real-Time Agent Evaluation**
60
+
61
+ Agent Health uses "Golden Path" trajectory comparison, where an LLM judge scores agent actions against expected outcomes. You define what "good" looks like for your agent (the expected steps, tool calls, and outcomes) and Agent Health measures how well your agent performs against these criteria. Use your preferred LLM provider as your judge, giving you flexibility to choose the evaluation model that fits your needs and budget.
62
+
63
+ ### Built for Developer Workflows
64
+
65
+ Agent Health includes both a web UI (`localhost:4001`) and a headless CLI to support different workflows throughout the development lifecycle.
66
+
67
+ - **AI Agent Developers** can write test cases, run evaluations locally, and integrate agent evaluation directly into CI/CD pipelines. Benchmarks defined in JSON can be executed from the command line, exporting both human and machine-readable reports for automated quality gating.
68
+ - **ML Scientists and Evaluators** can use the web UI (`localhost:4001`) to design golden datasets, define quality criteria, run batch benchmarks across configurations, perform A/B testing to track accuracy trends over time, export results for reports or further analysis, and even compare their benchmarks against different comparable agents.
69
+
70
+ ### Try it yourself
71
+
72
+ Ready to see Agent Health in action? Choose your path: explore with pre-loaded sample data, or connect your own agent and start evaluating.
73
+
74
+ **Quick Start: Explore with Sample Data (No Agent Required)**
75
+
76
+ The fastest way to experience Agent Health is with the built-in sample data. Run a single command and you'll have real traces, benchmarks, and evaluation results to explore immediately.
77
+
78
+ ```
79
+ npx @opensearch-project/agent-health
80
+ # ✓ Server running at http://localhost:4001
81
+ # ✓ Demo data loaded
82
+ # ✓ Ready to trace, evaluate, and ship
83
+ ```
84
+
85
+ Navigate to Traces to explore pre-loaded agent execution data, go to Benchmarks to run the "Travel Planning Accuracy - Demo" and see LLM judge evaluations in action, and visit Compare to see side-by-side run comparisons.
86
+
87
+ **Evaluate Your Own Agent**
88
+
89
+ This walkthrough shows you how to instrument your agent, create benchmarks, and iterate based on evaluation results.
90
+
91
+ **Step 1: Start Agent Health**
92
+
93
+ Start the tool and configure your connections:
94
+
95
+ ```
96
+ npx @opensearch-project/agent-health
97
+ # ✓ Server running at http://localhost:4001
98
+ ```
99
+
100
+ Agent Health needs an OpenSearch cluster for evaluation data (test cases, benchmarks, and results) and for observability data (agent traces). You can use any existing hosted OpenSearch cluster, or spin one up locally with the [OpenSearch Observability Stack](https://github.com/opensearch-project/observability-stack?tab=readme-ov-file#-quickstart).
101
+
102
+ ```bash
103
+ curl -fsSL https://raw.githubusercontent.com/opensearch-project/observability-stack/main/install.sh | bash
104
+ ```
105
+
106
+ The local stack launches two components:
107
+
108
+ - **OpenSearch cluster on port 9200** — Use this as both your evaluation storage and observability storage endpoints in Agent Health Settings.
109
+ - **OTEL Collector on port 4317** — Point your instrumented agent's traces here. Agent Health uses OpenTelemetry for trace collection. Follow the [OpenTelemetry instrumentation guide](https://opentelemetry.io/docs/instrumentation/) for your language to add tracing to your agent.
110
+
111
+ If you're using an existing cluster, add your cluster endpoint directly as both storage endpoints in Settings.
112
+
113
+ In Settings, configure your agent endpoint (name, URL, and connector type), and you can set your own LLM Judge via env variables.
114
+
115
+ **Step 2: Create a Benchmark**
116
+
117
+ Define test cases in JSON format. Example for a travel planner agent (travel-agent-benchmark.json):
118
+
119
+ ```json
120
+ [
121
+ {
122
+ "name": "Check hotel availability",
123
+ "description": "User wants to find hotels in New York for specific dates",
124
+ "labels": ["category:Travel", "difficulty:Easy"],
125
+ "initialPrompt": "Are there any hotels available in Manhattan for next weekend?",
126
+ "expectedOutcomes": [
127
+ "Agent should call search_hotels tool with location and date range",
128
+ "Agent should present available hotels with prices and amenities"
129
+ ]
130
+ },
131
+ {
132
+ "name": "Complete booking with confirmation",
133
+ "description": "User wants to book a specific flight and hotel",
134
+ "labels": ["category:Travel", "difficulty:Medium"],
135
+ "initialPrompt": "Book the morning flight to New York and the Hilton hotel for 2 nights",
136
+ "context": [
137
+ {
138
+ "description": "Previous search results showing available flights and hotels",
139
+ "value": "{\"flights\":[{\"id\":\"AA123\",\"time\":\"8:00 AM\",\"price\":\"$350\"}],\"hotels\":[{\"id\":\"hilton-manhattan\",\"name\":\"Hilton Manhattan\",\"price\":\"$200/night\"}]}"
140
+ }
141
+ ],
142
+ "expectedOutcomes": [
143
+ "Agent should call book_flight tool with the correct flight ID",
144
+ "Agent should call book_hotel tool with hotel ID and number of nights",
145
+ "Agent should confirm both bookings with confirmation numbers and total cost"
146
+ ]
147
+ }
148
+ ]
149
+ ```
150
+
151
+ **Step 3: Run and Analyze**
152
+
153
+ Choose your workflow:
154
+
155
+ **Option A: CLI Mode**
156
+
157
+ ```bash
158
+ npx @opensearch-project/agent-health benchmark \
159
+ -f travel-agent-benchmark.json \
160
+ -a travel-agent \
161
+ --export baseline-results.json \
162
+ -v
163
+ ```
164
+
165
+ This imports the benchmark, creates it, runs it against your agent, and exports results in one command.
166
+
167
+ **Option B: Via UI**
168
+
169
+ Navigate to Benchmarks, then Import JSON and select your file. Choose "Run" and configure the agent and Judge Model. Watch real-time progress as each test case executes.
170
+
171
+ **Step 4: View Results**
172
+
173
+ Access results through the UI (Benchmarks, then Latest Run) to see overall pass rates, per-test-case results with LLM judge reasoning, and improvement strategies ranked by priority. Navigate to Traces for detailed execution visualization showing timeline views, flow views, and span details. Alternatively, analyze the JSON export:
174
+
175
+ ```bash
176
+ cat baseline-results.json | jq '.runs[0].reports[] | select(.passFailStatus == "failed") | {
177
+ testCase: .testCaseId,
178
+ reasoning: .llmJudgeReasoning,
179
+ strategies: .improvementStrategies
180
+ }'
181
+ ```
182
+
183
+ **Step 5: Iterate and Improve**
184
+
185
+ Update your agent based on high-priority recommendations, then re-run the benchmark and compare results. Navigate to Compare from Benchmarks and select two runs to visualize improvements across metrics like pass rate, latency, cost, and failed tests.
186
+
187
+ ![Agent Health benchmark comparison view](/assets/media/blog-images/2026-02-28-opensearch-agent-health/benchmark-comparison.png){:class="img-centered"}
188
+
189
+ ### What's Next
190
+
191
+ This is an experimental release, and we're actively shaping what Agent Health becomes next. As the AI agent ecosystem matures and standards solidify, we'll continue evolving the tool based on real-world usage.
192
+
193
+ Agent Health is designed as a development-phase companion that helps you build, test, and iterate on your agents before they reach production. As the ecosystem matures, we're exploring how Agent Health's evaluation and observability capabilities can extend into production-scale deployments.
194
+
195
+ Install it, run your benchmarks, and share what you find. Open an issue on GitHub, join the discussion in the RFC, or share your experience with the community. Your feedback will directly influence how we prioritize features and refine the developer experience.
196
+
197
+ ### Learn More
198
+
199
+ - **GitHub Repository**: [opensearch-project/agent-health](https://github.com/opensearch-project/agent-health)
200
+ - **RFC**: [Agent Health RFC](https://github.com/opensearch-project/agent-health/issues/42)