@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,155 @@
1
+ /*
2
+ * Copyright OpenSearch Contributors
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+
6
+ /**
7
+ * Agent Health Configuration
8
+ *
9
+ * Copy this file to `agent-health.config.ts` and customize for your environment.
10
+ * The config file is automatically detected in the current working directory.
11
+ *
12
+ * By default, user-defined agents and models are merged with the built-in defaults.
13
+ * Set `extends: false` to use only your agents and models.
14
+ *
15
+ * Supported config file names (in priority order):
16
+ * - agent-health.config.ts
17
+ * - agent-health.config.js
18
+ * - agent-health.config.mjs
19
+ */
20
+
21
+ export default {
22
+ // Custom agents are merged with built-in agents by default.
23
+ // Each agent `key` must be unique — if it matches a built-in key,
24
+ // it will override that built-in agent.
25
+ agents: [
26
+ // Example 1: REST connector (synchronous JSON response)
27
+ {
28
+ key: "my-rest-agent",
29
+ name: "My REST Agent",
30
+ endpoint: "http://localhost:8000/api/agent",
31
+ connectorType: "rest",
32
+ useTraces: true, // Enable OpenTelemetry trace collection
33
+ },
34
+
35
+ // Example 2: Streaming connector (Server-Sent Events)
36
+ {
37
+ key: "my-streaming-agent",
38
+ name: "My Streaming Agent",
39
+ endpoint: "http://localhost:9000/agent/stream",
40
+ connectorType: "agui-streaming",
41
+ useTraces: false,
42
+ },
43
+
44
+ // Example 3: CLI tool connector
45
+ // {
46
+ // key: "my-cli-agent",
47
+ // name: "My CLI Agent",
48
+ // endpoint: "/usr/local/bin/my-agent",
49
+ // connectorType: "subprocess",
50
+ // useTraces: false,
51
+ // },
52
+
53
+ // Example 4: LangGraph REST connector (non-streaming invoke)
54
+ // {
55
+ // key: "my-langgraph-agent",
56
+ // name: "My LangGraph Agent",
57
+ // endpoint: "http://localhost:8123",
58
+ // connectorType: "langgraph",
59
+ // connectorConfig: {
60
+ // graphId: "agent", // Assistant/graph ID (defaults to "agent")
61
+ // // threadId: "...", // Optional thread ID for multi-turn
62
+ // },
63
+ // useTraces: true,
64
+ // },
65
+
66
+ // Example 5: Amazon Strands connector (Bedrock Agent Runtime)
67
+ // {
68
+ // key: "my-strands-agent",
69
+ // name: "My Strands Agent",
70
+ // endpoint: "ABCDEF1234", // Bedrock Agent ID
71
+ // connectorType: "strands",
72
+ // connectorConfig: {
73
+ // agentAliasId: "TSTALIASID", // Agent alias ID
74
+ // region: "us-west-2", // AWS region (defaults to AWS_REGION)
75
+ // },
76
+ // useTraces: false,
77
+ // },
78
+
79
+ // Example 6: Agent with authentication hook
80
+ // {
81
+ // key: "authenticated-agent",
82
+ // name: "Authenticated Agent",
83
+ // endpoint: "https://api.example.com/agent",
84
+ // connectorType: "rest",
85
+ // useTraces: true,
86
+ // hooks: {
87
+ // beforeRequest: async ({ endpoint, payload, headers }) => {
88
+ // return {
89
+ // endpoint,
90
+ // payload,
91
+ // headers: {
92
+ // ...headers,
93
+ // 'Authorization': `Bearer ${process.env.API_TOKEN}`,
94
+ // },
95
+ // };
96
+ // },
97
+ // },
98
+ // },
99
+
100
+ // Example 7: Claude Code with MCP servers (competitive evaluation)
101
+ // Uses a standard MCP config JSON file (same format as ~/.claude.json mcpServers)
102
+ // {
103
+ // key: "claude-code-eval",
104
+ // name: "Claude Code (Eval)",
105
+ // endpoint: "claude",
106
+ // connectorType: "claude-code",
107
+ // useTraces: true,
108
+ // connectorConfig: {
109
+ // dangerouslySkipPermissions: true,
110
+ // appendSystemPrompt: "You are an observability agent...",
111
+ // allowedTools: ["mcp__aws-prometheus__*", "mcp__aws-cloudwatch__*", "Bash"],
112
+ // mcpConfigPath: "./mcp-config.json", // standard MCP config file
113
+ // strictMcpConfig: true,
114
+ // env: { CLAUDE_CODE_USE_BEDROCK: "1", AWS_PROFILE: "Bedrock" },
115
+ // },
116
+ // },
117
+ ],
118
+
119
+ // --- Data sources (OpenSearch clusters) ----------------------------------
120
+ // storage: where eval results are persisted (omit for file-based).
121
+ // observability: where agent traces/logs are read from (Traces tab).
122
+ // Precedence: agent-health.config.json (Settings UI) -> these TS fields ->
123
+ // OPENSEARCH_STORAGE_*/OPENSEARCH_LOGS_* env -> file-based fallback.
124
+ // Read secrets from process.env so this committed file carries none.
125
+ //
126
+ // storage: {
127
+ // endpoint: process.env.OPENSEARCH_STORAGE_ENDPOINT,
128
+ // authType: 'sigv4', // 'none' | 'basic' | 'sigv4'
129
+ // awsRegion: 'us-east-1',
130
+ // awsService: 'es', // 'es' (managed) | 'aoss' (serverless)
131
+ // awsProfile: process.env.AWS_PROFILE,
132
+ // },
133
+ //
134
+ // observability: {
135
+ // endpoint: process.env.OPENSEARCH_LOGS_ENDPOINT,
136
+ // authType: 'sigv4',
137
+ // awsRegion: 'us-east-1',
138
+ // indexes: { traces: 'otel-v1-apm-span-*', logs: 'ml-commons-logs-*' },
139
+ // },
140
+
141
+ // Custom models (merged with built-in models by default)
142
+ // models: [
143
+ // {
144
+ // key: "my-model",
145
+ // model_id: "us.anthropic.claude-sonnet-4-20250514-v1:0",
146
+ // display_name: "My Model",
147
+ // provider: "bedrock", // "bedrock" | "openai-compatible" | "demo"
148
+ // context_window: 200000,
149
+ // max_output_tokens: 4096,
150
+ // },
151
+ // ],
152
+
153
+ // Set to false to ignore all built-in agents and models
154
+ // extends: false,
155
+ };
@@ -0,0 +1,131 @@
1
+ /*
2
+ * Copyright OpenSearch Contributors
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+
6
+ /**
7
+ * Example: a custom connector that wraps a simple HTTP echo agent.
8
+ *
9
+ * This is the smallest realistic shape of a connector. It implements the
10
+ * three abstract members of `BaseConnector` (`buildPayload`, `execute`,
11
+ * `parseResponse`) plus the three readonly identity fields (`type`,
12
+ * `name`, `supportsStreaming`).
13
+ *
14
+ * Drop this file at `connectors/echo.ts` in your project and register it
15
+ * from your `agent-health.config.ts`:
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * import { defineConfig, registerConnector } from '@opensearch-project/agent-health';
20
+ * import { EchoConnector } from './connectors/echo';
21
+ *
22
+ * registerConnector(new EchoConnector());
23
+ *
24
+ * export default defineConfig({
25
+ * agents: [
26
+ * {
27
+ * key: 'echo',
28
+ * name: 'Echo Agent',
29
+ * endpoint: 'http://localhost:8080/echo',
30
+ * connectorType: 'rest', // or any registered protocol
31
+ * },
32
+ * ],
33
+ * });
34
+ * ```
35
+ *
36
+ * To understand the lifecycle this connector plugs into — abort signal
37
+ * handling, progress callbacks, trajectory shape, raw-event replay —
38
+ * read the base class and types directly in the installed package:
39
+ *
40
+ * node_modules/@opensearch-project/agent-health/lib/dist/services/connectors/base/BaseConnector.js
41
+ * node_modules/@opensearch-project/agent-health/lib/dist/services/connectors/types.d.ts
42
+ *
43
+ * The compiled `.js` preserves the original JSDoc, and the matching
44
+ * `.d.ts` next to it gives you the precise type contract — no need to
45
+ * cross-reference an arbitrary GitHub commit, you're reading exactly
46
+ * the version your `package.json` resolved to.
47
+ *
48
+ * NOTE: `ConnectorProtocol` is a closed string-literal union of the
49
+ * built-in protocol ids ('rest', 'agui-streaming', 'subprocess', ...).
50
+ * The simplest path for a custom connector is to reuse one of those ids
51
+ * (e.g. 'rest' for HTTP-JSON agents) and replace the built-in connector
52
+ * via `registerConnector(new EchoConnector())`. If you need a brand-new
53
+ * protocol id, fork this repo and widen the `ConnectorProtocol` union
54
+ * in `services/connectors/types.ts`.
55
+ */
56
+
57
+ import {
58
+ BaseConnector,
59
+ type ConnectorAuth,
60
+ type ConnectorRequest,
61
+ type ConnectorResponse,
62
+ type ConnectorProgressCallback,
63
+ type ConnectorRawEventCallback,
64
+ } from '@opensearch-project/agent-health';
65
+
66
+ import type { TrajectoryStep } from '@opensearch-project/agent-health';
67
+
68
+ export class EchoConnector extends BaseConnector {
69
+ // Replaces the built-in 'rest' connector when registered. Pick a
70
+ // different id (and widen ConnectorProtocol in your fork) if you
71
+ // want to coexist with the default REST connector.
72
+ readonly type = 'rest' as const;
73
+ readonly name = 'Echo Agent';
74
+ readonly supportsStreaming = false;
75
+
76
+ /**
77
+ * Build the JSON payload sent to the agent's HTTP endpoint.
78
+ * Called by `execute()` and also when re-processing stored raw events
79
+ * during trace replay (see `parseResponse`).
80
+ */
81
+ buildPayload(request: ConnectorRequest): { message: string } {
82
+ return { message: request.testCase.initialPrompt };
83
+ }
84
+
85
+ /**
86
+ * Single-turn HTTP call → single response.
87
+ */
88
+ async execute(
89
+ endpoint: string,
90
+ request: ConnectorRequest,
91
+ _auth: ConnectorAuth,
92
+ onProgress?: ConnectorProgressCallback,
93
+ _onRawEvent?: ConnectorRawEventCallback,
94
+ ): Promise<ConnectorResponse> {
95
+ const startedAt = Date.now();
96
+
97
+ const res = await fetch(endpoint, {
98
+ method: 'POST',
99
+ headers: { 'Content-Type': 'application/json' },
100
+ body: JSON.stringify(this.buildPayload(request)),
101
+ });
102
+ if (!res.ok) {
103
+ throw new Error(`Echo agent failed: ${res.status} ${res.statusText}`);
104
+ }
105
+ const json = (await res.json()) as { reply: string };
106
+
107
+ // Build a single-step trajectory and emit progress for live UIs.
108
+ const step = this.createStep('response', json.reply);
109
+ onProgress?.(step);
110
+
111
+ return {
112
+ success: true,
113
+ response: json.reply,
114
+ trajectory: [step],
115
+ rawEvents: [{ type: 'ECHO_REPLY', reply: json.reply }],
116
+ durationMs: Date.now() - startedAt,
117
+ runId: `echo-${startedAt}`,
118
+ };
119
+ }
120
+
121
+ /**
122
+ * Re-derive trajectory from previously stored raw events. Used by
123
+ * the run replayer / trace recovery path.
124
+ */
125
+ parseResponse(rawResponse: unknown): TrajectoryStep[] {
126
+ const events = Array.isArray(rawResponse) ? rawResponse : [];
127
+ return events
128
+ .filter((e: { type?: string }) => e?.type === 'ECHO_REPLY')
129
+ .map((e: { reply: string }) => this.createStep('response', e.reply));
130
+ }
131
+ }
@@ -0,0 +1,128 @@
1
+ /*
2
+ * Copyright OpenSearch Contributors
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+
6
+ /**
7
+ * Demo eval — five test cases that show off the SDK end-to-end against
8
+ * the live Observio agent.
9
+ *
10
+ * 1. observio-says-hello Pure deterministic, no LLM (free, fast)
11
+ * 2. observio-uses-a-tool Trajectory inspection — must invoke at least one tool
12
+ * 3. observio-rca-is-coherent Hybrid — deterministic + LLM judge
13
+ * 4. labels-only-no-prompt No agent invocation at all (data-only test)
14
+ * 5. budget-aware Uses traces fixture for token-budget assertion
15
+ *
16
+ * Run with:
17
+ * curl -sN -X POST http://localhost:4002/api/storage/evaluation-runs \
18
+ * -H 'Content-Type: application/json' \
19
+ * -d '{
20
+ * "name":"SDK Demo",
21
+ * "sources":[{"type":"code-import","filenames":["evals/demo.eval.js"],"testCaseIds":[]}],
22
+ * "agentKey":"observio",
23
+ * "modelId":"claude-sonnet"
24
+ * }'
25
+ */
26
+
27
+ const { test, expect } = require('@opensearch-project/agent-health');
28
+
29
+ // ─────────────────────────────────────────────────────────────────────────────
30
+ // Test 1: Pure deterministic — no LLM, $0, fully reproducible
31
+ // ─────────────────────────────────────────────────────────────────────────────
32
+
33
+ test('observio-says-hello', {
34
+ prompt: 'Say hello to me in one short sentence.',
35
+ description: 'Smoke test: agent produces a non-trivial response',
36
+ labels: ['category:Smoke', 'difficulty:Easy', 'demo', 'agent:observio'],
37
+ }, function ({ result }) {
38
+ // Trajectory must exist
39
+ expect(result.trajectory).to.have.length.greaterThan(0);
40
+
41
+ // Final output is non-empty
42
+ expect(result.agentOutput.trim()).to.have.length.greaterThan(0);
43
+
44
+ // Reasonable timing budget
45
+ expect(result).to.haveCompletedWithin(60_000);
46
+ });
47
+
48
+ // ─────────────────────────────────────────────────────────────────────────────
49
+ // Test 2: Trajectory inspection — proves the agent actually investigates
50
+ // ─────────────────────────────────────────────────────────────────────────────
51
+
52
+ test('observio-uses-a-tool', {
53
+ prompt: 'Find the source of the most recent error log entry.',
54
+ description: 'Agent must call at least one tool, not just answer from memory',
55
+ labels: ['category:Tool Use', 'difficulty:Medium', 'demo', 'agent:observio'],
56
+ }, function ({ result }) {
57
+ // At least one action step (tool invocation)
58
+ expect(result.trajectory).to.haveStepsOfType('action');
59
+
60
+ // The trajectory accessor sugar makes the assertion read like prose
61
+ const tools = result.trajectory.toolCalls();
62
+ expect(tools).to.have.length.greaterThan(0);
63
+ });
64
+
65
+ // ─────────────────────────────────────────────────────────────────────────────
66
+ // Test 3: Hybrid — deterministic preflight + targeted LLM judge
67
+ // ─────────────────────────────────────────────────────────────────────────────
68
+
69
+ test('observio-rca-is-coherent', {
70
+ prompt: 'Diagnose why the payment service is failing and explain the root cause.',
71
+ description: 'Hybrid: cheap structural checks first, then LLM judge for semantic correctness',
72
+ context: [
73
+ {
74
+ description: 'Error log',
75
+ value: 'ERROR 2024-01-15 10:31:22 [payment-service] Connection refused to database-primary:5432',
76
+ },
77
+ ],
78
+ labels: ['category:RCA', 'difficulty:Hard', 'demo', 'agent:observio', 'hybrid'],
79
+ }, async function ({ result, judge }) {
80
+ // Cheap deterministic preflight — fail fast, never spend $ on the judge
81
+ expect(result.trajectory).to.have.length.greaterThan(0);
82
+ expect(result).to.haveCompletedWithin(120_000);
83
+ expect(result.agentOutput).to.haveOutputMatching(/payment[- ]service/i);
84
+
85
+ // Now invoke the LLM judge for the semantic claim. This produces a
86
+ // 'hybrid' evaluation method on the resulting report.
87
+ await judge(result, 'Correctly identifies that the payment-service cannot connect to its database');
88
+ await judge(result, 'Provides a plausible root-cause hypothesis (e.g. database down, network issue)');
89
+ });
90
+
91
+ // ─────────────────────────────────────────────────────────────────────────────
92
+ // Test 4: No prompt at all — pure data-only test, agent never invoked
93
+ // ─────────────────────────────────────────────────────────────────────────────
94
+ //
95
+ // Useful for tests that assert against external state, fixtures, or static
96
+ // data without needing any agent involvement.
97
+
98
+ test('labels-only-no-prompt', {
99
+ description: 'Verify a fixture file matches a baseline (no agent involvement)',
100
+ labels: ['category:Data Quality', 'difficulty:Easy', 'demo'],
101
+ }, function ({ result }) {
102
+ // No agent ran — durationMs is 0, trajectory empty
103
+ expect(result.durationMs).to.equal(0);
104
+ expect(result.trajectory).to.have.length(0);
105
+
106
+ // The actual deterministic check (could load a JSON file, compute, etc.)
107
+ const baseline = { name: 'demo', version: 1 };
108
+ expect(baseline.version).to.equal(1);
109
+ expect(baseline.name).to.equal('demo');
110
+ });
111
+
112
+ // ─────────────────────────────────────────────────────────────────────────────
113
+ // Test 5: Budget-aware — uses the traces fixture for token / span timing checks
114
+ // ─────────────────────────────────────────────────────────────────────────────
115
+ //
116
+ // `traces` is pre-loaded by the runner when the agent emits OTel spans. When
117
+ // no traces are available the accessor returns 0 / empty for all helpers,
118
+ // so this test still passes (vacuously) on agents without instrumentation.
119
+
120
+ test('budget-aware', {
121
+ prompt: 'Summarize the system in one paragraph.',
122
+ description: 'Token budget + span-timing assertions via the traces fixture',
123
+ labels: ['category:Budget', 'difficulty:Easy', 'demo', 'agent:observio'],
124
+ }, function ({ result, traces }) {
125
+ expect(result.agentOutput.length).to.be.greaterThan(0);
126
+ // Cheap budget cap — fails if the agent burned more than 50k tokens
127
+ expect(traces.totalTokens).to.be.lessThan(50_000);
128
+ });
@@ -0,0 +1,99 @@
1
+ /*
2
+ * Copyright OpenSearch Contributors
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+
6
+ /**
7
+ * SDK lifecycle hooks demo — shows beforeEach/afterEach, beforeAll/afterAll,
8
+ * and the `provide()` mechanism for surfacing per-test provisioned values
9
+ * to the body and the teardown hook.
10
+ *
11
+ * The example uses a temp directory as the "out-of-band resource" — the
12
+ * exact thing connectors can't do today (no lifecycle, no teardown). Each
13
+ * test gets its own directory; concurrent runs are isolated automatically.
14
+ *
15
+ * Run with:
16
+ * AH_PORT=4002 npx @opensearch-project/agent-health benchmark \
17
+ * -f evals/sdk-hooks-demo.eval.js -a demo
18
+ */
19
+
20
+ const fs = require('fs');
21
+ const os = require('os');
22
+ const path = require('path');
23
+
24
+ const {
25
+ test,
26
+ beforeAll,
27
+ afterAll,
28
+ beforeEach,
29
+ afterEach,
30
+ expect,
31
+ } = require('@opensearch-project/agent-health');
32
+
33
+ // ─────────────────────────────────────────────────────────────────────────────
34
+ // Suite-scoped: runs once before any test, once after them all.
35
+ // ─────────────────────────────────────────────────────────────────────────────
36
+
37
+ let suiteRoot;
38
+
39
+ beforeAll(() => {
40
+ suiteRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'ah-hooks-demo-'));
41
+ });
42
+
43
+ afterAll(() => {
44
+ if (suiteRoot && fs.existsSync(suiteRoot)) {
45
+ fs.rmSync(suiteRoot, { recursive: true, force: true });
46
+ }
47
+ });
48
+
49
+ // ─────────────────────────────────────────────────────────────────────────────
50
+ // Per-test: each test gets its own subdirectory, surfaced via `provide()`.
51
+ // `afterEach` reads the same key from `provisioned` to clean up, even when
52
+ // the body throws.
53
+ // ─────────────────────────────────────────────────────────────────────────────
54
+
55
+ beforeEach(({ provide, testInfo }) => {
56
+ const safe = testInfo.name.replace(/[^a-z0-9-]+/gi, '_');
57
+ const dir = fs.mkdtempSync(path.join(suiteRoot, `${safe}-`));
58
+ provide('workspaceDir', dir);
59
+ });
60
+
61
+ afterEach(({ provisioned }) => {
62
+ const dir = provisioned.workspaceDir;
63
+ if (typeof dir === 'string' && fs.existsSync(dir)) {
64
+ fs.rmSync(dir, { recursive: true, force: true });
65
+ }
66
+ });
67
+
68
+ // ─────────────────────────────────────────────────────────────────────────────
69
+ // Tests — read the provisioned value via `fixtures.provisioned`. No prompt
70
+ // is set so the runner skips the agent and runs the body directly; the
71
+ // hooks still run because they don't depend on the agent step.
72
+ // ─────────────────────────────────────────────────────────────────────────────
73
+
74
+ test('hook-demo-uses-workspace', {
75
+ description: 'beforeEach provisioned a fresh temp dir for this test',
76
+ labels: ['category:Smoke', 'feature:hooks'],
77
+ }, ({ provisioned, testInfo }) => {
78
+ expect(provisioned.workspaceDir).to.be.a('string');
79
+ expect(fs.existsSync(provisioned.workspaceDir)).to.equal(true);
80
+
81
+ // The dir's basename must include the test name, proving testInfo flowed
82
+ // through `provide()` correctly.
83
+ expect(path.basename(provisioned.workspaceDir)).to.include(
84
+ testInfo.name.replace(/[^a-z0-9-]+/gi, '_')
85
+ );
86
+
87
+ // Write a file inside, just to show it's a real, writable workspace.
88
+ fs.writeFileSync(path.join(provisioned.workspaceDir, 'marker'), 'hello');
89
+ });
90
+
91
+ test('hook-demo-isolation', {
92
+ description: 'A second test gets its own isolated workspace',
93
+ labels: ['category:Smoke', 'feature:hooks'],
94
+ }, ({ provisioned }) => {
95
+ expect(provisioned.workspaceDir).to.be.a('string');
96
+ // Concurrent tests would each see their own dir; this one in particular
97
+ // must NOT see the marker file from the other test.
98
+ expect(fs.existsSync(path.join(provisioned.workspaceDir, 'marker'))).to.equal(false);
99
+ });
@@ -0,0 +1,77 @@
1
+ <!--
2
+ * Copyright OpenSearch Contributors
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ -->
5
+
6
+ # Pi session profiling — drop-in extension
7
+
8
+ Profile your **pi.dev** coding sessions with Agent Health, the way a CPU profiler
9
+ profiles a running process: instrument a real session, then get back what to fix
10
+ (scored against an evaluator rubric) to improve the agent and your own
11
+ productivity.
12
+
13
+ pi has **no native OpenTelemetry telemetry**, so `agent-health profile` has
14
+ nothing to read for a live pi session. This single file supplies that missing
15
+ half: it instruments the running session (emitting OTel spans) **and** registers
16
+ the `/agent-health-profile` command. It is **zero-dependency** — it speaks OTLP
17
+ over the built-in `fetch`, so there is nothing to `npm install`.
18
+
19
+ ## Install (out of the box)
20
+
21
+ ```bash
22
+ # 1. Drop the extension in (global = every pi session; or .pi/extensions/ per project)
23
+ mkdir -p ~/.pi/agent/extensions
24
+ cp agent-health-profile.ts ~/.pi/agent/extensions/
25
+
26
+ # 2. Point telemetry at a trace store BEFORE starting pi.
27
+ # Simplest: Agent Health in FILE mode (no OpenSearch) — its embedded receiver
28
+ # persists spans and matches sessions out of the box:
29
+ agent-health serve # or any command that boots the server on :4001
30
+ export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4001 # /v1/traces is appended
31
+ ```
32
+
33
+ That's it. Use pi normally, then run `/agent-health-profile` (or
34
+ `/agent-health-profile -e <evaluator-id> -f "focus on X"`).
35
+
36
+ ## How it routes (important for OpenSearch users)
37
+
38
+ The extension exports OTLP/JSON to `OTEL_EXPORTER_OTLP_ENDPOINT`:
39
+
40
+ - **File mode (recommended for getting started):** point it at Agent Health's
41
+ embedded `:4001/v1/traces`. Spans persist to disk and `profile` matches them by
42
+ `session.id` directly. Zero infra.
43
+ - **OpenSearch-backed Agent Health:** the embedded `:4001` receiver *drops*
44
+ payloads when a cluster is configured (no split-brain). Point the extension at
45
+ the **same OTLP ingest the cluster reads from** (your OTel Collector / OSIS
46
+ pipeline). The extension emits a standard OTLP `session.id` attribute — it is
47
+ schema-agnostic; what matters is that your ingest and `agent-health profile`'s
48
+ session query agree on where `session.id` lands. Agent Health is standardizing
49
+ on the plain/nested schema (`attributes.session.id`; OSIS
50
+ `trace-analytics-plain-raw`), moving off the legacy `@`-flattened
51
+ `span.attributes.session@id` layout.
52
+
53
+ ## Config (env)
54
+
55
+ | Var | Default | Meaning |
56
+ |-----|---------|---------|
57
+ | `OTEL_EXPORTER_OTLP_ENDPOINT` | `http://localhost:4001` | OTLP traces target (`/v1/traces` appended) |
58
+ | `OTEL_SERVICE_NAME` | `pi-agent` | service.name on spans (keep `pi-agent` for `--service` defaults) |
59
+ | `OTEL_ENABLED` | `true` | set `false` to disable telemetry |
60
+ | `AGENT_HEALTH_REDACT` | unset | `1` → redact prompt / tool I/O |
61
+ | `AGENT_HEALTH_CLI` | `npx @opensearch-project/agent-health` | how the command invokes the CLI |
62
+
63
+ ## What it emits
64
+
65
+ | Span | `gen_ai.operation.name` | Notes |
66
+ |------|-------------------------|-------|
67
+ | `invoke_agent pi` (root) | `invoke_agent` | one per session; carries `session.id` |
68
+ | `chat <model>` (per turn) | `chat` | token usage + `llm.request`/`llm.response` events |
69
+ | `execute_tool <name>` | `execute_tool` | `gen_ai.tool.input`/`output`; ERROR status on failure |
70
+
71
+ Every span carries `session.id`; the resource carries `service.name=pi-agent`.
72
+
73
+ ## Caveat
74
+
75
+ Profiling only sees sessions that ran **while the extension was loaded and
76
+ telemetry was on** — you can't profile a session retroactively. Run a session,
77
+ then `/agent-health-profile`.