@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,359 @@
1
+ /*
2
+ * Copyright OpenSearch Contributors
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { recordVerdict } from '../matchers/session.js';
6
+ import { readEnv } from '../envCompat.js';
7
+ import { getBackendUrl, isBackendPortExplicit, DEFAULT_BACKEND_PORT } from '../portConfig.js';
8
+ // Warn at most once per process when judge() falls back to the default
9
+ // backend port. Defaulting to 4001 is dangerous when a *foreign* agent-health
10
+ // server (a live demo, another checkout) is listening there — the judge call
11
+ // would hit it instead of the run's own server. We warn rather than throw so
12
+ // existing zero-config local usage (server actually on 4001) keeps working.
13
+ let warnedDefaultJudgePort = false;
14
+ function resolveJudgeServerUrl(explicit) {
15
+ if (explicit)
16
+ return explicit;
17
+ if (!isBackendPortExplicit() && !warnedDefaultJudgePort) {
18
+ warnedDefaultJudgePort = true;
19
+ // eslint-disable-next-line no-console
20
+ console.warn(`[agent-health] judge(): AH_PORT is not set and no options.serverUrl was ` +
21
+ `provided — defaulting to http://localhost:${DEFAULT_BACKEND_PORT}. If a ` +
22
+ `different agent-health server is on that port, judging will hit it. Set ` +
23
+ `AH_PORT or pass options.serverUrl to target the right server.`);
24
+ }
25
+ return getBackendUrl();
26
+ }
27
+ /** Test-only: reset the warn-once latch so unit tests can assert it fires. */
28
+ export function __resetJudgePortWarning() {
29
+ warnedDefaultJudgePort = false;
30
+ }
31
+ const verdictCache = new Map();
32
+ /** Clear the in-process judge verdict cache (test isolation / new run). */
33
+ export function clearJudgeCache() {
34
+ verdictCache.clear();
35
+ }
36
+ /**
37
+ * Stable, collision-resistant cache key over the judging inputs. Uses
38
+ * `sha256` when Node's crypto is available, falling back to a fast JS hash
39
+ * so the SDK stays bundler-safe.
40
+ */
41
+ function judgeCacheKey(input) {
42
+ const canonical = JSON.stringify({
43
+ evaluatorId: input.evaluatorId ?? '',
44
+ model: input.model ?? '',
45
+ claims: input.claims,
46
+ trajectory: input.trajectory,
47
+ });
48
+ try {
49
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
50
+ const { createHash } = require('crypto');
51
+ return createHash('sha256').update(canonical).digest('hex');
52
+ }
53
+ catch {
54
+ // FNV-1a fallback — non-cryptographic but fine for cache addressing.
55
+ let h = 0x811c9dc5;
56
+ for (let i = 0; i < canonical.length; i++) {
57
+ h ^= canonical.charCodeAt(i);
58
+ h = Math.imul(h, 0x01000193);
59
+ }
60
+ return (h >>> 0).toString(16);
61
+ }
62
+ }
63
+ /** Whether judging is globally skipped via env (CLI `--no-judge`). */
64
+ function judgeSkippedByEnv() {
65
+ const v = readEnv('AH_SKIP_JUDGE', 'AGENT_HEALTH_SKIP_JUDGE');
66
+ return v === '1' || v === 'true' || v === 'yes';
67
+ }
68
+ let judgeCalledInCurrentEval = false;
69
+ export function wasJudgeCalled() {
70
+ return judgeCalledInCurrentEval;
71
+ }
72
+ export function resetJudgeFlag() {
73
+ judgeCalledInCurrentEval = false;
74
+ }
75
+ function isTrajectory(x) {
76
+ return Array.isArray(x);
77
+ }
78
+ function isResultLike(x) {
79
+ return typeof x === 'object' && x !== null && 'trajectory' in x;
80
+ }
81
+ /**
82
+ * Build a {@link Verdict} object with the `orThrow()` escape hatch attached.
83
+ */
84
+ function makeVerdict(v) {
85
+ const verdict = {
86
+ ...v,
87
+ pass: v.passFailStatus === 'passed',
88
+ score: v.score ?? (typeof v.accuracy === 'number' ? v.accuracy / 100 : 0),
89
+ orThrow() {
90
+ // Passing or skipped verdicts never throw. Failed/errored ones do.
91
+ if (this.pass || this.skipped)
92
+ return this;
93
+ const label = this.errored ? 'errored' : 'FAILED';
94
+ throw new Error(`LLM Judge: ${label} (accuracy: ${this.accuracy})\n${this.errorMessage ?? this.reasoning}`);
95
+ },
96
+ };
97
+ return verdict;
98
+ }
99
+ /**
100
+ * Core judge implementation. Records exactly one MatcherResult (carrying
101
+ * `role`) and returns a non-throwing {@link Verdict}.
102
+ */
103
+ async function runJudge(resultOrTrajectory, claimOrClaims, options, role) {
104
+ judgeCalledInCurrentEval = true;
105
+ const trajectory = isTrajectory(resultOrTrajectory)
106
+ ? resultOrTrajectory
107
+ : (isResultLike(resultOrTrajectory) ? resultOrTrajectory.trajectory ?? [] : []);
108
+ // Agent run id for trace/log correlation — lets the agentic trace judge
109
+ // scope its read-only tools to this single run. Only present when the
110
+ // caller passed a RunResult (not a bare trajectory array).
111
+ const runId = !isTrajectory(resultOrTrajectory) && isResultLike(resultOrTrajectory)
112
+ ? resultOrTrajectory.runId
113
+ : undefined;
114
+ // Strategy-C trace-correlation hints the runner attached to the result
115
+ // (service-name + window). Forwarding them as `agents` lets the agent
116
+ // (trace) judge find this run's spans in OpenSearch the same way the
117
+ // classic `waitForTracesAndJudge` path does (#264) — without them the SDK
118
+ // judge sends only `runId` and misses subprocess agents' spans. This is
119
+ // the SDK↔UI convergence fix.
120
+ const judgeAgents = !isTrajectory(resultOrTrajectory) && isResultLike(resultOrTrajectory)
121
+ ? resultOrTrajectory.judgeAgents
122
+ : undefined;
123
+ const claims = Array.isArray(claimOrClaims) ? claimOrClaims : [claimOrClaims];
124
+ const serverUrl = resolveJudgeServerUrl(options?.serverUrl);
125
+ const description = claims.length === 1 ? `judge: ${claims[0]}` : `judge: ${claims.length} claims`;
126
+ // Body shape matches the UI's /api/judge POST exactly: trajectory,
127
+ // expectedOutcomes, expectedTrajectory, optional modelId, optional
128
+ // evaluatorId. The server applies the same evaluator-resolution and
129
+ // provider-routing logic regardless of caller, so SDK and UI runs
130
+ // produce comparable verdicts.
131
+ const requestBody = {
132
+ trajectory,
133
+ expectedOutcomes: claims,
134
+ expectedTrajectory: [],
135
+ };
136
+ if (options?.model)
137
+ requestBody.modelId = options.model;
138
+ if (options?.evaluatorId)
139
+ requestBody.evaluatorId = options.evaluatorId;
140
+ if (runId)
141
+ requestBody.runId = runId;
142
+ if (Array.isArray(judgeAgents) && judgeAgents.length > 0)
143
+ requestBody.agents = judgeAgents;
144
+ // Record the success path identically whether the verdict came fresh from
145
+ // the endpoint or from the in-process cache.
146
+ const finalize = (raw, durationMs) => {
147
+ const accuracy = raw.metrics?.accuracy ?? 0;
148
+ const verdict = makeVerdict({
149
+ passFailStatus: raw.passFailStatus ?? 'failed',
150
+ accuracy,
151
+ reasoning: raw.llmJudgeReasoning ?? '',
152
+ role,
153
+ skipped: false,
154
+ errored: false,
155
+ });
156
+ recordVerdict({
157
+ description,
158
+ pass: verdict.pass,
159
+ method: 'llm-judge',
160
+ role,
161
+ durationMs,
162
+ score: verdict.score,
163
+ reasoning: verdict.reasoning,
164
+ model: options?.model,
165
+ errorMessage: verdict.passFailStatus === 'failed' ? verdict.reasoning : undefined,
166
+ // Preserve the rest of the judge payload — these were silently
167
+ // dropped before, which made SDK `judge()` calls strictly less
168
+ // informative than the legacy auto-judge path. See MatcherResult.
169
+ ...(Array.isArray(raw.improvementStrategies) && raw.improvementStrategies.length > 0
170
+ ? { improvementStrategies: raw.improvementStrategies }
171
+ : {}),
172
+ ...(raw.metrics && typeof raw.metrics === 'object'
173
+ ? { judgeMetrics: { ...raw.metrics } }
174
+ : {}),
175
+ });
176
+ return verdict;
177
+ };
178
+ // SKIP: no LLM call. `skip` is tri-state and takes precedence over the env:
179
+ // skip === true → always skip
180
+ // skip === false → never skip (force the judge to run, even if AH_SKIP_JUDGE is set)
181
+ // skip undefined → defer to AH_SKIP_JUDGE
182
+ // This makes a per-call/bound `skip: false` a meaningful override rather than
183
+ // having the env unconditionally win.
184
+ const shouldSkip = options?.skip === true || (options?.skip !== false && judgeSkippedByEnv());
185
+ if (shouldSkip) {
186
+ recordVerdict({
187
+ description: `${description} (skipped)`,
188
+ pass: true,
189
+ method: 'llm-judge',
190
+ role: 'observe',
191
+ durationMs: 0,
192
+ reasoning: 'Judge skipped (AH_SKIP_JUDGE / skip option).',
193
+ });
194
+ return makeVerdict({
195
+ passFailStatus: 'passed',
196
+ accuracy: 0,
197
+ reasoning: 'Judge skipped.',
198
+ role,
199
+ skipped: true,
200
+ errored: false,
201
+ });
202
+ }
203
+ // CACHE: identical (evaluator, model, claims, trajectory) → reuse verdict.
204
+ const cacheKey = judgeCacheKey({
205
+ evaluatorId: options?.evaluatorId,
206
+ model: options?.model,
207
+ claims,
208
+ trajectory,
209
+ });
210
+ const cached = verdictCache.get(cacheKey);
211
+ if (cached) {
212
+ return finalize(cached, 0);
213
+ }
214
+ const startedAt = Date.now();
215
+ // Resilience: the agentic (trace) judge can be slow and, under load (in-process
216
+ // pi sessions + query_spans/query_logs round-trips on the same server), the
217
+ // loopback fetch to /api/judge can transiently throw "fetch failed" (undici
218
+ // keep-alive socket reset / ~300s headersTimeout) or return a 5xx/429. Without
219
+ // a retry, ONE such transient blip records an `errored` matcher — which makes
220
+ // the runner clear `passFailStatus` to null and bucket the whole run as
221
+ // "errored" (#247) even when every other gate passed. Retry transient failures
222
+ // with exponential backoff before giving up. Deterministic 4xx (not 429) are
223
+ // not retried.
224
+ const MAX_JUDGE_ATTEMPTS = 3;
225
+ let response;
226
+ let lastErrMsg = '';
227
+ for (let attempt = 1; attempt <= MAX_JUDGE_ATTEMPTS; attempt++) {
228
+ try {
229
+ const r = await fetch(`${serverUrl}/api/judge`, {
230
+ method: 'POST',
231
+ headers: { 'Content-Type': 'application/json' },
232
+ body: JSON.stringify(requestBody),
233
+ });
234
+ if (r.ok) {
235
+ response = r;
236
+ break;
237
+ }
238
+ lastErrMsg = `Judge HTTP ${r.status}: ${await r.text()}`;
239
+ // 4xx (except 429) are deterministic — retrying won't help; surface as errored.
240
+ if (r.status < 500 && r.status !== 429) {
241
+ response = r;
242
+ break;
243
+ }
244
+ }
245
+ catch (err) {
246
+ lastErrMsg = err?.message || String(err); // e.g. "fetch failed"
247
+ }
248
+ if (attempt < MAX_JUDGE_ATTEMPTS) {
249
+ // Exponential backoff (1s, 2s). Overridable via AH_JUDGE_RETRY_BACKOFF_MS
250
+ // (set to 0 in tests to avoid real delays); 0 disables the wait.
251
+ const baseMs = process.env.AH_JUDGE_RETRY_BACKOFF_MS !== undefined
252
+ ? Number(process.env.AH_JUDGE_RETRY_BACKOFF_MS)
253
+ : 1000;
254
+ if (baseMs > 0)
255
+ await new Promise((res) => setTimeout(res, baseMs * 2 ** (attempt - 1)));
256
+ }
257
+ }
258
+ if (!response) {
259
+ // Every attempt failed transiently — the judge could not run. `errored`,
260
+ // not a clean `pass: false`.
261
+ recordVerdict({
262
+ description,
263
+ pass: false,
264
+ method: 'llm-judge',
265
+ role,
266
+ errored: true,
267
+ durationMs: Date.now() - startedAt,
268
+ errorMessage: `Judge request failed after ${MAX_JUDGE_ATTEMPTS} attempts: ${lastErrMsg}`,
269
+ reasoning: '',
270
+ });
271
+ return makeVerdict({
272
+ passFailStatus: 'failed',
273
+ accuracy: 0,
274
+ reasoning: '',
275
+ role,
276
+ skipped: false,
277
+ errored: true,
278
+ errorMessage: `Judge request failed after ${MAX_JUDGE_ATTEMPTS} attempts: ${lastErrMsg}`,
279
+ });
280
+ }
281
+ if (!response.ok) {
282
+ recordVerdict({
283
+ description,
284
+ pass: false,
285
+ method: 'llm-judge',
286
+ role,
287
+ errored: true,
288
+ durationMs: Date.now() - startedAt,
289
+ errorMessage: lastErrMsg,
290
+ reasoning: '',
291
+ });
292
+ return makeVerdict({
293
+ passFailStatus: 'failed',
294
+ accuracy: 0,
295
+ reasoning: '',
296
+ role,
297
+ skipped: false,
298
+ errored: true,
299
+ errorMessage: lastErrMsg,
300
+ });
301
+ }
302
+ const raw = (await response.json());
303
+ // Only successful, non-errored verdicts are cached.
304
+ verdictCache.set(cacheKey, raw);
305
+ return finalize(raw, Date.now() - startedAt);
306
+ }
307
+ /**
308
+ * Single-claim ergonomic form (gate role).
309
+ * @example
310
+ * const v = await judge(result, 'identifies the failing dependency');
311
+ * if (!v.pass) { ... } // non-throwing
312
+ * (await judge(result, claim)).orThrow(); // explicit hard-stop
313
+ * await judge.observe(result, claim); // score-only, never gates
314
+ */
315
+ export const judge = Object.assign((resultOrTrajectory, claimOrClaims, options) => runJudge(resultOrTrajectory, claimOrClaims, options, 'gate'), {
316
+ observe: (resultOrTrajectory, claimOrClaims, options) => runJudge(resultOrTrajectory, claimOrClaims, options, 'observe'),
317
+ });
318
+ /**
319
+ * Bind run-level defaults to `judge` and return a callable with the same
320
+ * signature. Used by the SDK runner to inject `run.evaluatorId` (and
321
+ * optionally a default judge model) into the `TestFixtures.judge` slot,
322
+ * so test bodies that destructure `({ judge })` automatically inherit
323
+ * the run's evaluator selection — matching the UI's behaviour where the
324
+ * evaluator picked on the run config applies to every judged test case.
325
+ *
326
+ * Per-call options always win over the bound defaults; pass an empty
327
+ * object (or omit the field) to fall through to the bound value.
328
+ *
329
+ * const boundJudge = bindJudge({ evaluatorId: run.evaluatorId });
330
+ * await boundJudge(result, claim); // uses run.evaluatorId
331
+ * await boundJudge(result, claim, { evaluatorId: 'other' }); // overrides
332
+ * await boundJudge(result, claim, { evaluatorId: undefined }); // still uses bound default
333
+ */
334
+ export function bindJudge(defaults) {
335
+ // No defaults set → return the unbound function unchanged. Keeps zero
336
+ // overhead for tests that don't use a run-level evaluator. Note `skip` is
337
+ // compared against `undefined` (not falsiness) so a binding of
338
+ // `{ skip: false }` — a meaningful "force the judge to run" — is preserved
339
+ // rather than short-circuited to the unbound judge.
340
+ if (!defaults ||
341
+ (!defaults.evaluatorId && !defaults.model && !defaults.serverUrl && defaults.skip === undefined)) {
342
+ return judge;
343
+ }
344
+ const mergeOptions = (options) => ({
345
+ // Per-call options win on every field that's actually set. We treat
346
+ // an explicit `undefined` the same as a missing field — callers who
347
+ // want to *clear* a bound default should pass an empty string or
348
+ // call the unbound `judge` directly.
349
+ serverUrl: options?.serverUrl ?? defaults.serverUrl,
350
+ model: options?.model ?? defaults.model,
351
+ evaluatorId: options?.evaluatorId ?? defaults.evaluatorId,
352
+ skip: options?.skip ?? defaults.skip,
353
+ });
354
+ const bound = Object.assign((resultOrTrajectory, claimOrClaims, options) => runJudge(resultOrTrajectory, claimOrClaims, mergeOptions(options), 'gate'), {
355
+ observe: (resultOrTrajectory, claimOrClaims, options) => runJudge(resultOrTrajectory, claimOrClaims, mergeOptions(options), 'observe'),
356
+ });
357
+ return bound;
358
+ }
359
+ //# sourceMappingURL=judge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judge.js","sourceRoot":"","sources":["../../../testCases/judge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { CodeTestCase, RegisteredHook } from './types.js';
2
+ export declare function isCodeFile(filename: string): boolean;
3
+ export declare function computeTestCaseHash(tc: CodeTestCase): string;
4
+ export interface LoadedTestCase extends CodeTestCase {
5
+ hash: string;
6
+ }
7
+ export interface LoadResult {
8
+ testCases: LoadedTestCase[];
9
+ filePath: string;
10
+ /**
11
+ * Benchmark groups derived from `describe()` blocks in the file.
12
+ * Maps benchmark name (the joined describe path, e.g. 'RCA Suite' or
13
+ * 'A > B' for nested) to the test case names within. Tests outside any
14
+ * `describe()` are not in this map; they go to the file-default benchmark
15
+ * (CLI / server names it after the filename).
16
+ */
17
+ benchmarks: Map<string, string[]>;
18
+ /**
19
+ * All lifecycle hooks (`beforeEach`/`afterEach`/`beforeAll`/`afterAll`)
20
+ * registered while loading this file. Empty when the file declares none.
21
+ * The orchestrator filters by `(sourceFile, describePath)` at run time.
22
+ */
23
+ hooks: RegisteredHook[];
24
+ }
25
+ export declare function loadTestCasesFromModule(filePath: string): Promise<LoadResult>;
26
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../testCases/loader.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAW/D,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGpD;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,CAgB5D;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC;;;;OAIG;IACH,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAkInF"}
@@ -0,0 +1,149 @@
1
+ /*
2
+ * Copyright OpenSearch Contributors
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { createHash } from 'crypto';
6
+ import { readFileSync } from 'fs';
7
+ import { resolve, dirname } from 'path';
8
+ import { pathToFileURL } from 'url';
9
+ import { createRequire, Module as NodeModule } from 'module';
10
+ import { setActiveFile, getRegisteredTests, getRegisteredHooks, clearRegistry, } from './define.js';
11
+ import { getAuthoringSurface } from './authoringSurface.js';
12
+ const CODE_EXTENSIONS = ['.ts', '.js', '.mjs'];
13
+ export function isCodeFile(filename) {
14
+ const lower = filename.toLowerCase();
15
+ return CODE_EXTENSIONS.some(ext => lower.endsWith(ext));
16
+ }
17
+ export function computeTestCaseHash(tc) {
18
+ const content = JSON.stringify({
19
+ name: tc.name,
20
+ prompt: tc.options.prompt,
21
+ context: tc.options.context,
22
+ labels: tc.options.labels,
23
+ description: tc.options.description,
24
+ // Include the new expected* fields so editing them invalidates the
25
+ // sourceHash and the upsert path picks up the change. Without this,
26
+ // a user adding `expectedOutcomes: [...]` to an existing test would
27
+ // see the test case stay on its old version and the new outcomes
28
+ // would never reach storage.
29
+ expectedOutcomes: tc.options.expectedOutcomes,
30
+ expectedTrajectory: tc.options.expectedTrajectory,
31
+ });
32
+ return createHash('sha256').update(content).digest('hex');
33
+ }
34
+ export async function loadTestCasesFromModule(filePath) {
35
+ const absPath = resolve(filePath);
36
+ // Clear any prior registration for this file and set it as active
37
+ clearRegistry(absPath);
38
+ setActiveFile(absPath);
39
+ let module;
40
+ if (absPath.endsWith('.js')) {
41
+ // For CJS .js files, execute in a fresh context with our test() function
42
+ // injected. This avoids module caching issues across multiple loads.
43
+ const code = readFileSync(absPath, 'utf-8');
44
+ const fileDir = dirname(absPath);
45
+ // NOTE: do not call require('module') here — this file is bundled as ESM
46
+ // by esbuild for the server, and Dynamic require of built-ins is unsupported
47
+ // in ESM output. Use the statically-imported NodeModule instead.
48
+ const Module = NodeModule;
49
+ const m = new Module(absPath);
50
+ m.filename = absPath;
51
+ m.paths = Module._nodeModulePaths(fileDir);
52
+ // Provide a require function scoped to the file's directory, but override
53
+ // any require of the define module to return our own instance
54
+ const fileRequire = createRequire(absPath);
55
+ // Match if `id` looks like our own define module before doing any
56
+ // filesystem resolution. Required because:
57
+ // 1) the loader is bundled as ESM by esbuild, so synthetic CJS
58
+ // `require.resolve` is unavailable here, and
59
+ // 2) `lib/testCases/define.ts` is not compiled to a .js sibling, so
60
+ // `fileRequire.resolve('../../lib/testCases/define')` from a
61
+ // fixture would throw MODULE_NOT_FOUND.
62
+ const isDefineId = (id) => {
63
+ const normalized = id.replace(/\\/g, '/').replace(/\.js$/, '');
64
+ return (normalized === 'lib/testCases/define' ||
65
+ normalized.endsWith('/lib/testCases/define'));
66
+ };
67
+ // Intercept the published package name as well — fixtures generally
68
+ // do `require('@opensearch-project/agent-health')` and Node's resolver
69
+ // would otherwise hit the package's exports map (which only exposes
70
+ // 'import' for ESM consumers).
71
+ const isPackageName = (id) => id === '@opensearch-project/agent-health' ||
72
+ id === '@opensearch/agent-health' ||
73
+ id === 'agent-health';
74
+ // The object handed back when a CJS eval file requires the SDK. Single
75
+ // source of truth shared with the package exports (see authoringSurface)
76
+ // so `.js` and `.ts`/`.mjs` files see the SAME surface — no drift (#232).
77
+ const sdkExports = getAuthoringSurface();
78
+ const wrappedRequire = (id) => {
79
+ if (isDefineId(id) || isPackageName(id)) {
80
+ return sdkExports;
81
+ }
82
+ // Fall back to a resolution-based check so that fixtures requiring the
83
+ // SDK by absolute path or via the published package name still hand back
84
+ // our test() registrar (and therefore land in our file-scoped registry).
85
+ try {
86
+ const resolved = fileRequire.resolve(id);
87
+ const normalized = resolved.replace(/\\/g, '/');
88
+ if (normalized.endsWith('/lib/testCases/define.js') ||
89
+ normalized.endsWith('/lib/testCases/define')) {
90
+ return sdkExports;
91
+ }
92
+ }
93
+ catch {
94
+ // ignore unresolvable IDs — fileRequire below will surface the error
95
+ }
96
+ return fileRequire(id);
97
+ };
98
+ wrappedRequire.resolve = fileRequire.resolve;
99
+ const wrapper = `(function(exports, require, module, __filename, __dirname) { ${code}\n});`;
100
+ const compiledFn = eval(wrapper);
101
+ compiledFn(m.exports, wrappedRequire, m, absPath, fileDir);
102
+ module = m.exports;
103
+ }
104
+ else {
105
+ // For .ts and .mjs files, use dynamic import
106
+ try {
107
+ const fileUrl = pathToFileURL(absPath).href;
108
+ module = await import(fileUrl);
109
+ }
110
+ catch (err) {
111
+ if (err.code === 'ERR_UNKNOWN_FILE_EXTENSION' && absPath.endsWith('.ts')) {
112
+ throw new Error(`Cannot import TypeScript file: ${filePath}\n` +
113
+ 'Install tsx as a dependency: npm install tsx\n' +
114
+ 'Or pre-compile .eval.ts to .eval.js before running.');
115
+ }
116
+ throw new Error(`Failed to import module: ${filePath}\n${err.message}`);
117
+ }
118
+ }
119
+ // Tests come exclusively from test() / describe() registration calls
120
+ // (Playwright-style). Legacy default-export array form was removed when
121
+ // we dropped defineTestCases() — the SDK is experimental and the API
122
+ // shape is intentionally narrow.
123
+ const testCases = getRegisteredTests(absPath);
124
+ if (testCases.length === 0) {
125
+ throw new Error(`Module ${filePath} has no test cases. Register tests with test(name, options?, body) inside the file.`);
126
+ }
127
+ // Compute per-test-case hash
128
+ const loaded = testCases.map(tc => ({
129
+ ...tc,
130
+ hash: computeTestCaseHash(tc),
131
+ }));
132
+ // Derive describe-group → test names mapping. Tests outside any
133
+ // describe() have benchmarkPath=undefined and are excluded; the CLI/
134
+ // server adds them to the file-default benchmark separately.
135
+ const benchmarks = new Map();
136
+ for (const tc of loaded) {
137
+ if (tc.benchmarkPath) {
138
+ const list = benchmarks.get(tc.benchmarkPath) ?? [];
139
+ list.push(tc.name);
140
+ benchmarks.set(tc.benchmarkPath, list);
141
+ }
142
+ }
143
+ // Collect every hook the file registered. Empty when no
144
+ // beforeEach/afterEach/beforeAll/afterAll were called — the orchestrator
145
+ // is a no-op in that case so existing tests are unaffected.
146
+ const hooks = getRegisteredHooks(absPath);
147
+ return { testCases: loaded, filePath: absPath, benchmarks, hooks };
148
+ }
149
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../testCases/loader.ts"],"names":[],"mappings":"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"}