@opensearch-project/agent-health 0.4.0 → 0.6.0
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.
- package/README.md +36 -5
- package/cli/dist/index.js +8292 -2938
- package/deployment/cloudformation/agent-health-observability.yaml +223 -32
- package/dist/assets/index-BfxtxmKc.css +1 -0
- package/dist/assets/index-CrjAfDHu.js +243 -0
- package/dist/index.html +2 -2
- package/docs/ARCHITECTURE.md +450 -0
- package/docs/BACKEND_JOB_QUEUE.md +405 -0
- package/docs/CLAUDE_CODE_TELEMETRY.md +283 -0
- package/docs/CLI.md +474 -0
- package/docs/CODING_AGENT_ANALYTICS.md +298 -0
- package/docs/CONFIGURATION.md +388 -0
- package/docs/CONNECTORS.md +536 -0
- package/docs/INSTRUMENT_WITH_OTEL.md +397 -0
- package/docs/ML-COMMONS-SETUP.md +289 -0
- package/docs/NPX_PACKAGING.md +195 -0
- package/docs/PERFORMANCE-MONITORING.md +200 -0
- package/docs/PERFORMANCE.md +390 -0
- package/docs/PI_PROFILING.md +169 -0
- package/docs/PLAN-non-agui-agent-support.md +525 -0
- package/docs/SDK.md +626 -0
- package/docs/SKILLS.md +264 -0
- package/docs/STORAGE_INDEX_FIELD_LIMITS.md +216 -0
- package/docs/blogs/2026-02-28-opensearch-agent-health.md +200 -0
- package/docs/blogs/getting-started-blog.md +608 -0
- package/docs/diagrams/Agent-health.excalidraw +5656 -0
- package/docs/diagrams/architecture.png +0 -0
- package/docs/plans/field-redesign.md +468 -0
- package/docs/rfcs/001-coding-agent-analytics.md +374 -0
- package/docs/rfcs/002-enterprise-leaderboard.md +267 -0
- package/docs/rfcs/003-remote-aggregation.md +146 -0
- package/docs/rfcs/004-test-sdk-v2.md +599 -0
- package/docs/skills/AGENT_HEALTH.md +652 -0
- package/docs/skills/AGENT_PROFILE.md +191 -0
- package/docs/skills/add-connector/SKILL.md +68 -0
- package/docs/skills/agent-health-profile/SKILL.md +40 -0
- package/docs/skills/config-auth/SKILL.md +194 -0
- package/docs/skills/config-auth/evals/evals.json +35 -0
- package/docs/skills/create-pr/SKILL.md +73 -0
- package/docs/skills/instrument-otel/SKILL.md +84 -0
- package/docs/skills/write-test/SKILL.md +124 -0
- package/docs/ui prd.md +376 -0
- package/examples/README.md +53 -0
- package/examples/config/agent-health.config.example.ts +155 -0
- package/examples/connectors/echo-connector.ts +131 -0
- package/examples/eval-files/demo.eval.js +128 -0
- package/examples/eval-files/ops-rca-classification.eval.js +71 -0
- package/examples/eval-files/ops-rca-evaluator.json +15 -0
- package/examples/eval-files/sdk-demo.eval.js +72 -0
- package/examples/eval-files/sdk-describe-demo.eval.js +50 -0
- package/examples/eval-files/sdk-hooks-demo.eval.js +99 -0
- package/examples/pi-profiling/README.md +77 -0
- package/examples/pi-profiling/agent-health-profile.ts +417 -0
- package/lib/dist/lib/agentUtils.d.ts +29 -0
- package/lib/dist/lib/agentUtils.d.ts.map +1 -0
- package/lib/dist/lib/agentUtils.js +43 -0
- package/lib/dist/lib/agentUtils.js.map +1 -0
- package/lib/dist/lib/bedrockCompat.d.ts +27 -0
- package/lib/dist/lib/bedrockCompat.d.ts.map +1 -0
- package/lib/dist/lib/bedrockCompat.js +83 -0
- package/lib/dist/lib/bedrockCompat.js.map +1 -0
- package/lib/dist/lib/benchmarkExport.d.ts +14 -0
- package/lib/dist/lib/benchmarkExport.d.ts.map +1 -0
- package/lib/dist/lib/benchmarkExport.js +41 -0
- package/lib/dist/lib/benchmarkExport.js.map +1 -0
- package/lib/dist/lib/benchmarkImage.d.ts +52 -0
- package/lib/dist/lib/benchmarkImage.d.ts.map +1 -0
- package/lib/dist/lib/benchmarkImage.js +113 -0
- package/lib/dist/lib/benchmarkImage.js.map +1 -0
- package/lib/dist/lib/benchmarkVersionUtils.d.ts +50 -0
- package/lib/dist/lib/benchmarkVersionUtils.d.ts.map +1 -0
- package/lib/dist/lib/benchmarkVersionUtils.js +89 -0
- package/lib/dist/lib/benchmarkVersionUtils.js.map +1 -0
- package/lib/dist/lib/chunkedFetch.d.ts +18 -0
- package/lib/dist/lib/chunkedFetch.d.ts.map +1 -0
- package/lib/dist/lib/chunkedFetch.js +40 -0
- package/lib/dist/lib/chunkedFetch.js.map +1 -0
- package/lib/dist/lib/comparisonInsights.d.ts +104 -0
- package/lib/dist/lib/comparisonInsights.d.ts.map +1 -0
- package/lib/dist/lib/comparisonInsights.js +212 -0
- package/lib/dist/lib/comparisonInsights.js.map +1 -0
- package/lib/dist/lib/config/defineConfig.d.ts +27 -0
- package/lib/dist/lib/config/defineConfig.d.ts.map +1 -0
- package/lib/dist/lib/config/defineConfig.js +28 -0
- package/lib/dist/lib/config/defineConfig.js.map +1 -0
- package/lib/dist/lib/config/index.d.ts +9 -0
- package/lib/dist/lib/config/index.d.ts.map +1 -0
- package/lib/dist/lib/config/index.js +8 -0
- package/lib/dist/lib/config/index.js.map +1 -0
- package/lib/dist/lib/config/loader.d.ts +39 -0
- package/lib/dist/lib/config/loader.d.ts.map +1 -0
- package/lib/dist/lib/config/loader.js +263 -0
- package/lib/dist/lib/config/loader.js.map +1 -0
- package/lib/dist/lib/config/statePaths.d.ts +61 -0
- package/lib/dist/lib/config/statePaths.d.ts.map +1 -0
- package/lib/dist/lib/config/statePaths.js +188 -0
- package/lib/dist/lib/config/statePaths.js.map +1 -0
- package/lib/dist/lib/config/types.d.ts +245 -0
- package/lib/dist/lib/config/types.d.ts.map +1 -0
- package/lib/dist/lib/config/types.js +6 -0
- package/lib/dist/lib/config/types.js.map +1 -0
- package/lib/dist/lib/config.d.ts +39 -0
- package/lib/dist/lib/config.d.ts.map +1 -0
- package/lib/dist/lib/config.js +118 -0
- package/lib/dist/lib/config.js.map +1 -0
- package/lib/dist/lib/constants.d.ts +81 -0
- package/lib/dist/lib/constants.d.ts.map +1 -0
- package/lib/dist/lib/constants.js +374 -0
- package/lib/dist/lib/constants.js.map +1 -0
- package/lib/dist/lib/contextFormat.d.ts +26 -0
- package/lib/dist/lib/contextFormat.d.ts.map +1 -0
- package/lib/dist/lib/contextFormat.js +28 -0
- package/lib/dist/lib/contextFormat.js.map +1 -0
- package/lib/dist/lib/contextUtilization.d.ts +23 -0
- package/lib/dist/lib/contextUtilization.d.ts.map +1 -0
- package/lib/dist/lib/contextUtilization.js +72 -0
- package/lib/dist/lib/contextUtilization.js.map +1 -0
- package/lib/dist/lib/dashboardMetrics.d.ts +87 -0
- package/lib/dist/lib/dashboardMetrics.d.ts.map +1 -0
- package/lib/dist/lib/dashboardMetrics.js +242 -0
- package/lib/dist/lib/dashboardMetrics.js.map +1 -0
- package/lib/dist/lib/dataSourceConfig.d.ts +108 -0
- package/lib/dist/lib/dataSourceConfig.d.ts.map +1 -0
- package/lib/dist/lib/dataSourceConfig.js +166 -0
- package/lib/dist/lib/dataSourceConfig.js.map +1 -0
- package/lib/dist/lib/debug.d.ts +26 -0
- package/lib/dist/lib/debug.d.ts.map +1 -0
- package/lib/dist/lib/debug.js +132 -0
- package/lib/dist/lib/debug.js.map +1 -0
- package/lib/dist/lib/diagnostics.d.ts +28 -0
- package/lib/dist/lib/diagnostics.d.ts.map +1 -0
- package/lib/dist/lib/diagnostics.js +65 -0
- package/lib/dist/lib/diagnostics.js.map +1 -0
- package/lib/dist/lib/envCompat.d.ts +27 -0
- package/lib/dist/lib/envCompat.d.ts.map +1 -0
- package/lib/dist/lib/envCompat.js +82 -0
- package/lib/dist/lib/envCompat.js.map +1 -0
- package/lib/dist/lib/evaluationRerun.d.ts +63 -0
- package/lib/dist/lib/evaluationRerun.d.ts.map +1 -0
- package/lib/dist/lib/evaluationRerun.js +85 -0
- package/lib/dist/lib/evaluationRerun.js.map +1 -0
- package/lib/dist/lib/findPackageRoot.d.ts +7 -0
- package/lib/dist/lib/findPackageRoot.d.ts.map +1 -0
- package/lib/dist/lib/findPackageRoot.js +57 -0
- package/lib/dist/lib/findPackageRoot.js.map +1 -0
- package/lib/dist/lib/hooks.d.ts +36 -0
- package/lib/dist/lib/hooks.d.ts.map +1 -0
- package/lib/dist/lib/hooks.js +112 -0
- package/lib/dist/lib/hooks.js.map +1 -0
- package/lib/dist/lib/index.d.ts +47 -0
- package/lib/dist/lib/index.d.ts.map +1 -0
- package/lib/dist/lib/index.js +62 -0
- package/lib/dist/lib/index.js.map +1 -0
- package/lib/dist/lib/labels.d.ts +90 -0
- package/lib/dist/lib/labels.d.ts.map +1 -0
- package/lib/dist/lib/labels.js +158 -0
- package/lib/dist/lib/labels.js.map +1 -0
- package/lib/dist/lib/markdown.d.ts +16 -0
- package/lib/dist/lib/markdown.d.ts.map +1 -0
- package/lib/dist/lib/markdown.js +42 -0
- package/lib/dist/lib/markdown.js.map +1 -0
- package/lib/dist/lib/matchers/expect.d.ts +3 -0
- package/lib/dist/lib/matchers/expect.d.ts.map +1 -0
- package/lib/dist/lib/matchers/expect.js +225 -0
- package/lib/dist/lib/matchers/expect.js.map +1 -0
- package/lib/dist/lib/matchers/index.d.ts +8 -0
- package/lib/dist/lib/matchers/index.d.ts.map +1 -0
- package/lib/dist/lib/matchers/index.js +9 -0
- package/lib/dist/lib/matchers/index.js.map +1 -0
- package/lib/dist/lib/matchers/judgeAccessor.d.ts +113 -0
- package/lib/dist/lib/matchers/judgeAccessor.d.ts.map +1 -0
- package/lib/dist/lib/matchers/judgeAccessor.js +183 -0
- package/lib/dist/lib/matchers/judgeAccessor.js.map +1 -0
- package/lib/dist/lib/matchers/session.d.ts +39 -0
- package/lib/dist/lib/matchers/session.d.ts.map +1 -0
- package/lib/dist/lib/matchers/session.js +116 -0
- package/lib/dist/lib/matchers/session.js.map +1 -0
- package/lib/dist/lib/matchers/traces.d.ts +70 -0
- package/lib/dist/lib/matchers/traces.d.ts.map +1 -0
- package/lib/dist/lib/matchers/traces.js +236 -0
- package/lib/dist/lib/matchers/traces.js.map +1 -0
- package/lib/dist/lib/matchers/tracesPricing.d.ts +38 -0
- package/lib/dist/lib/matchers/tracesPricing.d.ts.map +1 -0
- package/lib/dist/lib/matchers/tracesPricing.js +64 -0
- package/lib/dist/lib/matchers/tracesPricing.js.map +1 -0
- package/lib/dist/lib/matchers/types.d.ts +75 -0
- package/lib/dist/lib/matchers/types.d.ts.map +1 -0
- package/lib/dist/lib/matchers/types.js +6 -0
- package/lib/dist/lib/matchers/types.js.map +1 -0
- package/lib/dist/lib/packagePaths.d.ts +29 -0
- package/lib/dist/lib/packagePaths.d.ts.map +1 -0
- package/lib/dist/lib/packagePaths.js +63 -0
- package/lib/dist/lib/packagePaths.js.map +1 -0
- package/lib/dist/lib/performance.d.ts +51 -0
- package/lib/dist/lib/performance.d.ts.map +1 -0
- package/lib/dist/lib/performance.js +159 -0
- package/lib/dist/lib/performance.js.map +1 -0
- package/lib/dist/lib/portConfig.d.ts +29 -0
- package/lib/dist/lib/portConfig.d.ts.map +1 -0
- package/lib/dist/lib/portConfig.js +64 -0
- package/lib/dist/lib/portConfig.js.map +1 -0
- package/lib/dist/lib/preferences.d.ts +63 -0
- package/lib/dist/lib/preferences.d.ts.map +1 -0
- package/lib/dist/lib/preferences.js +117 -0
- package/lib/dist/lib/preferences.js.map +1 -0
- package/lib/dist/lib/resolveAgentModel.d.ts +22 -0
- package/lib/dist/lib/resolveAgentModel.d.ts.map +1 -0
- package/lib/dist/lib/resolveAgentModel.js +37 -0
- package/lib/dist/lib/resolveAgentModel.js.map +1 -0
- package/lib/dist/lib/runStats.d.ts +116 -0
- package/lib/dist/lib/runStats.d.ts.map +1 -0
- package/lib/dist/lib/runStats.js +192 -0
- package/lib/dist/lib/runStats.js.map +1 -0
- package/lib/dist/lib/telemetry/constants.d.ts +60 -0
- package/lib/dist/lib/telemetry/constants.d.ts.map +1 -0
- package/lib/dist/lib/telemetry/constants.js +87 -0
- package/lib/dist/lib/telemetry/constants.js.map +1 -0
- package/lib/dist/lib/telemetry/evalSpans.d.ts +61 -0
- package/lib/dist/lib/telemetry/evalSpans.d.ts.map +1 -0
- package/lib/dist/lib/telemetry/evalSpans.js +254 -0
- package/lib/dist/lib/telemetry/evalSpans.js.map +1 -0
- package/lib/dist/lib/telemetry/index.d.ts +11 -0
- package/lib/dist/lib/telemetry/index.d.ts.map +1 -0
- package/lib/dist/lib/telemetry/index.js +15 -0
- package/lib/dist/lib/telemetry/index.js.map +1 -0
- package/lib/dist/lib/telemetry/opensearchExporter.d.ts +43 -0
- package/lib/dist/lib/telemetry/opensearchExporter.d.ts.map +1 -0
- package/lib/dist/lib/telemetry/opensearchExporter.js +217 -0
- package/lib/dist/lib/telemetry/opensearchExporter.js.map +1 -0
- package/lib/dist/lib/telemetry/provider.d.ts +55 -0
- package/lib/dist/lib/telemetry/provider.d.ts.map +1 -0
- package/lib/dist/lib/telemetry/provider.js +140 -0
- package/lib/dist/lib/telemetry/provider.js.map +1 -0
- package/lib/dist/lib/testCaseLabels.d.ts +34 -0
- package/lib/dist/lib/testCaseLabels.d.ts.map +1 -0
- package/lib/dist/lib/testCaseLabels.js +88 -0
- package/lib/dist/lib/testCaseLabels.js.map +1 -0
- package/lib/dist/lib/testCaseValidation.d.ts +140 -0
- package/lib/dist/lib/testCaseValidation.d.ts.map +1 -0
- package/lib/dist/lib/testCaseValidation.js +162 -0
- package/lib/dist/lib/testCaseValidation.js.map +1 -0
- package/lib/dist/lib/testCases/agentFixture.d.ts +80 -0
- package/lib/dist/lib/testCases/agentFixture.d.ts.map +1 -0
- package/lib/dist/lib/testCases/agentFixture.js +43 -0
- package/lib/dist/lib/testCases/agentFixture.js.map +1 -0
- package/lib/dist/lib/testCases/authoringSurface.d.ts +10 -0
- package/lib/dist/lib/testCases/authoringSurface.d.ts.map +1 -0
- package/lib/dist/lib/testCases/authoringSurface.js +54 -0
- package/lib/dist/lib/testCases/authoringSurface.js.map +1 -0
- package/lib/dist/lib/testCases/codemod.d.ts +13 -0
- package/lib/dist/lib/testCases/codemod.d.ts.map +1 -0
- package/lib/dist/lib/testCases/codemod.js +169 -0
- package/lib/dist/lib/testCases/codemod.js.map +1 -0
- package/lib/dist/lib/testCases/define.d.ts +114 -0
- package/lib/dist/lib/testCases/define.d.ts.map +1 -0
- package/lib/dist/lib/testCases/define.js +253 -0
- package/lib/dist/lib/testCases/define.js.map +1 -0
- package/lib/dist/lib/testCases/evaluators.d.ts +80 -0
- package/lib/dist/lib/testCases/evaluators.d.ts.map +1 -0
- package/lib/dist/lib/testCases/evaluators.js +105 -0
- package/lib/dist/lib/testCases/evaluators.js.map +1 -0
- package/lib/dist/lib/testCases/index.d.ts +14 -0
- package/lib/dist/lib/testCases/index.d.ts.map +1 -0
- package/lib/dist/lib/testCases/index.js +12 -0
- package/lib/dist/lib/testCases/index.js.map +1 -0
- package/lib/dist/lib/testCases/judge.d.ts +165 -0
- package/lib/dist/lib/testCases/judge.d.ts.map +1 -0
- package/lib/dist/lib/testCases/judge.js +359 -0
- package/lib/dist/lib/testCases/judge.js.map +1 -0
- package/lib/dist/lib/testCases/loader.d.ts +36 -0
- package/lib/dist/lib/testCases/loader.d.ts.map +1 -0
- package/lib/dist/lib/testCases/loader.js +179 -0
- package/lib/dist/lib/testCases/loader.js.map +1 -0
- package/lib/dist/lib/testCases/types.d.ts +242 -0
- package/lib/dist/lib/testCases/types.d.ts.map +1 -0
- package/lib/dist/lib/testCases/types.js +6 -0
- package/lib/dist/lib/testCases/types.js.map +1 -0
- package/lib/dist/lib/theme.d.ts +6 -0
- package/lib/dist/lib/theme.d.ts.map +1 -0
- package/lib/dist/lib/theme.js +36 -0
- package/lib/dist/lib/theme.js.map +1 -0
- package/lib/dist/lib/uiTelemetry.d.ts +7 -0
- package/lib/dist/lib/uiTelemetry.d.ts.map +1 -0
- package/lib/dist/lib/uiTelemetry.js +25 -0
- package/lib/dist/lib/uiTelemetry.js.map +1 -0
- package/lib/dist/lib/utils.d.ts +111 -0
- package/lib/dist/lib/utils.d.ts.map +1 -0
- package/lib/dist/lib/utils.js +254 -0
- package/lib/dist/lib/utils.js.map +1 -0
- package/lib/dist/lib/workflow/consolidate.d.ts +12 -0
- package/lib/dist/lib/workflow/consolidate.d.ts.map +1 -0
- package/lib/dist/lib/workflow/consolidate.js +33 -0
- package/lib/dist/lib/workflow/consolidate.js.map +1 -0
- package/lib/dist/lib/workflow/index.d.ts +13 -0
- package/lib/dist/lib/workflow/index.d.ts.map +1 -0
- package/lib/dist/lib/workflow/index.js +12 -0
- package/lib/dist/lib/workflow/index.js.map +1 -0
- package/lib/dist/lib/workflow/ledger.d.ts +30 -0
- package/lib/dist/lib/workflow/ledger.d.ts.map +1 -0
- package/lib/dist/lib/workflow/ledger.js +41 -0
- package/lib/dist/lib/workflow/ledger.js.map +1 -0
- package/lib/dist/lib/workflow/pool.d.ts +13 -0
- package/lib/dist/lib/workflow/pool.d.ts.map +1 -0
- package/lib/dist/lib/workflow/pool.js +44 -0
- package/lib/dist/lib/workflow/pool.js.map +1 -0
- package/lib/dist/lib/workflow/source.d.ts +22 -0
- package/lib/dist/lib/workflow/source.d.ts.map +1 -0
- package/lib/dist/lib/workflow/source.js +29 -0
- package/lib/dist/lib/workflow/source.js.map +1 -0
- package/lib/dist/lib/workflow/stepB.d.ts +71 -0
- package/lib/dist/lib/workflow/stepB.d.ts.map +1 -0
- package/lib/dist/lib/workflow/stepB.js +99 -0
- package/lib/dist/lib/workflow/stepB.js.map +1 -0
- package/lib/dist/lib/workflow/types.d.ts +86 -0
- package/lib/dist/lib/workflow/types.d.ts.map +1 -0
- package/lib/dist/lib/workflow/types.js +6 -0
- package/lib/dist/lib/workflow/types.js.map +1 -0
- package/lib/dist/lib/workflow/workflow.d.ts +119 -0
- package/lib/dist/lib/workflow/workflow.d.ts.map +1 -0
- package/lib/dist/lib/workflow/workflow.js +195 -0
- package/lib/dist/lib/workflow/workflow.js.map +1 -0
- package/lib/dist/services/agent/aguiConverter.d.ts +50 -0
- package/lib/dist/services/agent/aguiConverter.d.ts.map +1 -0
- package/lib/dist/services/agent/aguiConverter.js +449 -0
- package/lib/dist/services/agent/aguiConverter.js.map +1 -0
- package/lib/dist/services/agent/index.d.ts +10 -0
- package/lib/dist/services/agent/index.d.ts.map +1 -0
- package/lib/dist/services/agent/index.js +12 -0
- package/lib/dist/services/agent/index.js.map +1 -0
- package/lib/dist/services/agent/payloadBuilder.d.ts +33 -0
- package/lib/dist/services/agent/payloadBuilder.d.ts.map +1 -0
- package/lib/dist/services/agent/payloadBuilder.js +75 -0
- package/lib/dist/services/agent/payloadBuilder.js.map +1 -0
- package/lib/dist/services/agent/sseStream.d.ts +43 -0
- package/lib/dist/services/agent/sseStream.d.ts.map +1 -0
- package/lib/dist/services/agent/sseStream.js +223 -0
- package/lib/dist/services/agent/sseStream.js.map +1 -0
- package/lib/dist/services/connectors/agui/AGUIStreamingConnector.d.ts +44 -0
- package/lib/dist/services/connectors/agui/AGUIStreamingConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/agui/AGUIStreamingConnector.js +95 -0
- package/lib/dist/services/connectors/agui/AGUIStreamingConnector.js.map +1 -0
- package/lib/dist/services/connectors/base/BaseConnector.d.ts +81 -0
- package/lib/dist/services/connectors/base/BaseConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/base/BaseConnector.js +170 -0
- package/lib/dist/services/connectors/base/BaseConnector.js.map +1 -0
- package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.d.ts +126 -0
- package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.js +417 -0
- package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.js.map +1 -0
- package/lib/dist/services/connectors/index.d.ts +13 -0
- package/lib/dist/services/connectors/index.d.ts.map +1 -0
- package/lib/dist/services/connectors/index.js +32 -0
- package/lib/dist/services/connectors/index.js.map +1 -0
- package/lib/dist/services/connectors/kiro/KiroConnector.d.ts +48 -0
- package/lib/dist/services/connectors/kiro/KiroConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/kiro/KiroConnector.js +158 -0
- package/lib/dist/services/connectors/kiro/KiroConnector.js.map +1 -0
- package/lib/dist/services/connectors/langgraph/LangGraphConnector.d.ts +36 -0
- package/lib/dist/services/connectors/langgraph/LangGraphConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/langgraph/LangGraphConnector.js +175 -0
- package/lib/dist/services/connectors/langgraph/LangGraphConnector.js.map +1 -0
- package/lib/dist/services/connectors/mock/MockConnector.d.ts +37 -0
- package/lib/dist/services/connectors/mock/MockConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/mock/MockConnector.js +120 -0
- package/lib/dist/services/connectors/mock/MockConnector.js.map +1 -0
- package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.d.ts +42 -0
- package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.js +133 -0
- package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.js.map +1 -0
- package/lib/dist/services/connectors/pi/PiConnector.d.ts +87 -0
- package/lib/dist/services/connectors/pi/PiConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/pi/PiConnector.js +274 -0
- package/lib/dist/services/connectors/pi/PiConnector.js.map +1 -0
- package/lib/dist/services/connectors/registry.d.ts +57 -0
- package/lib/dist/services/connectors/registry.d.ts.map +1 -0
- package/lib/dist/services/connectors/registry.js +106 -0
- package/lib/dist/services/connectors/registry.js.map +1 -0
- package/lib/dist/services/connectors/rest/RESTConnector.d.ts +38 -0
- package/lib/dist/services/connectors/rest/RESTConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/rest/RESTConnector.js +117 -0
- package/lib/dist/services/connectors/rest/RESTConnector.js.map +1 -0
- package/lib/dist/services/connectors/server.d.ts +13 -0
- package/lib/dist/services/connectors/server.d.ts.map +1 -0
- package/lib/dist/services/connectors/server.js +34 -0
- package/lib/dist/services/connectors/server.js.map +1 -0
- package/lib/dist/services/connectors/strands/StrandsConnector.d.ts +48 -0
- package/lib/dist/services/connectors/strands/StrandsConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/strands/StrandsConnector.js +221 -0
- package/lib/dist/services/connectors/strands/StrandsConnector.js.map +1 -0
- package/lib/dist/services/connectors/subprocess/SubprocessConnector.d.ts +88 -0
- package/lib/dist/services/connectors/subprocess/SubprocessConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/subprocess/SubprocessConnector.js +426 -0
- package/lib/dist/services/connectors/subprocess/SubprocessConnector.js.map +1 -0
- package/lib/dist/services/connectors/types.d.ts +213 -0
- package/lib/dist/services/connectors/types.d.ts.map +1 -0
- package/lib/dist/services/connectors/types.js +6 -0
- package/lib/dist/services/connectors/types.js.map +1 -0
- package/lib/dist/services/evaluation/bedrockJudge.d.ts +71 -0
- package/lib/dist/services/evaluation/bedrockJudge.d.ts.map +1 -0
- package/lib/dist/services/evaluation/bedrockJudge.js +169 -0
- package/lib/dist/services/evaluation/bedrockJudge.js.map +1 -0
- package/lib/dist/services/evaluation/evaluatorError.d.ts +56 -0
- package/lib/dist/services/evaluation/evaluatorError.d.ts.map +1 -0
- package/lib/dist/services/evaluation/evaluatorError.js +56 -0
- package/lib/dist/services/evaluation/evaluatorError.js.map +1 -0
- package/lib/dist/services/evaluation/index.d.ts +106 -0
- package/lib/dist/services/evaluation/index.d.ts.map +1 -0
- package/lib/dist/services/evaluation/index.js +684 -0
- package/lib/dist/services/evaluation/index.js.map +1 -0
- package/lib/dist/services/evaluation/mockTrajectory.d.ts +3 -0
- package/lib/dist/services/evaluation/mockTrajectory.d.ts.map +1 -0
- package/lib/dist/services/evaluation/mockTrajectory.js +72 -0
- package/lib/dist/services/evaluation/mockTrajectory.js.map +1 -0
- package/lib/dist/services/opensearch/client.d.ts +26 -0
- package/lib/dist/services/opensearch/client.d.ts.map +1 -0
- package/lib/dist/services/opensearch/client.js +131 -0
- package/lib/dist/services/opensearch/client.js.map +1 -0
- package/lib/dist/services/opensearch/index.d.ts +16 -0
- package/lib/dist/services/opensearch/index.d.ts.map +1 -0
- package/lib/dist/services/opensearch/index.js +25 -0
- package/lib/dist/services/opensearch/index.js.map +1 -0
- package/lib/dist/services/storage/asyncBenchmarkStorage.d.ts +123 -0
- package/lib/dist/services/storage/asyncBenchmarkStorage.d.ts.map +1 -0
- package/lib/dist/services/storage/asyncBenchmarkStorage.js +440 -0
- package/lib/dist/services/storage/asyncBenchmarkStorage.js.map +1 -0
- package/lib/dist/services/storage/asyncRunStorage.d.ts +135 -0
- package/lib/dist/services/storage/asyncRunStorage.d.ts.map +1 -0
- package/lib/dist/services/storage/asyncRunStorage.js +524 -0
- package/lib/dist/services/storage/asyncRunStorage.js.map +1 -0
- package/lib/dist/services/storage/asyncTestCaseStorage.d.ts +170 -0
- package/lib/dist/services/storage/asyncTestCaseStorage.d.ts.map +1 -0
- package/lib/dist/services/storage/asyncTestCaseStorage.js +301 -0
- package/lib/dist/services/storage/asyncTestCaseStorage.js.map +1 -0
- package/lib/dist/services/storage/index.d.ts +17 -0
- package/lib/dist/services/storage/index.d.ts.map +1 -0
- package/lib/dist/services/storage/index.js +20 -0
- package/lib/dist/services/storage/index.js.map +1 -0
- package/lib/dist/services/storage/migration.d.ts +54 -0
- package/lib/dist/services/storage/migration.d.ts.map +1 -0
- package/lib/dist/services/storage/migration.js +296 -0
- package/lib/dist/services/storage/migration.js.map +1 -0
- package/lib/dist/services/storage/opensearchClient.d.ts +947 -0
- package/lib/dist/services/storage/opensearchClient.d.ts.map +1 -0
- package/lib/dist/services/storage/opensearchClient.js +442 -0
- package/lib/dist/services/storage/opensearchClient.js.map +1 -0
- package/lib/dist/services/traces/browserRecovery.d.ts +37 -0
- package/lib/dist/services/traces/browserRecovery.d.ts.map +1 -0
- package/lib/dist/services/traces/browserRecovery.js +108 -0
- package/lib/dist/services/traces/browserRecovery.js.map +1 -0
- package/lib/dist/services/traces/categoryStyles.d.ts +21 -0
- package/lib/dist/services/traces/categoryStyles.d.ts.map +1 -0
- package/lib/dist/services/traces/categoryStyles.js +56 -0
- package/lib/dist/services/traces/categoryStyles.js.map +1 -0
- package/lib/dist/services/traces/executionOrderTransform.d.ts +35 -0
- package/lib/dist/services/traces/executionOrderTransform.d.ts.map +1 -0
- package/lib/dist/services/traces/executionOrderTransform.js +313 -0
- package/lib/dist/services/traces/executionOrderTransform.js.map +1 -0
- package/lib/dist/services/traces/fetchSpansForRun.d.ts +86 -0
- package/lib/dist/services/traces/fetchSpansForRun.d.ts.map +1 -0
- package/lib/dist/services/traces/fetchSpansForRun.js +69 -0
- package/lib/dist/services/traces/fetchSpansForRun.js.map +1 -0
- package/lib/dist/services/traces/flowTransform.d.ts +24 -0
- package/lib/dist/services/traces/flowTransform.d.ts.map +1 -0
- package/lib/dist/services/traces/flowTransform.js +228 -0
- package/lib/dist/services/traces/flowTransform.js.map +1 -0
- package/lib/dist/services/traces/index.d.ts +121 -0
- package/lib/dist/services/traces/index.d.ts.map +1 -0
- package/lib/dist/services/traces/index.js +255 -0
- package/lib/dist/services/traces/index.js.map +1 -0
- package/lib/dist/services/traces/intentTransform.d.ts +20 -0
- package/lib/dist/services/traces/intentTransform.d.ts.map +1 -0
- package/lib/dist/services/traces/intentTransform.js +131 -0
- package/lib/dist/services/traces/intentTransform.js.map +1 -0
- package/lib/dist/services/traces/judgeAgentsHints.d.ts +63 -0
- package/lib/dist/services/traces/judgeAgentsHints.d.ts.map +1 -0
- package/lib/dist/services/traces/judgeAgentsHints.js +89 -0
- package/lib/dist/services/traces/judgeAgentsHints.js.map +1 -0
- package/lib/dist/services/traces/messageExtraction.d.ts +15 -0
- package/lib/dist/services/traces/messageExtraction.d.ts.map +1 -0
- package/lib/dist/services/traces/messageExtraction.js +313 -0
- package/lib/dist/services/traces/messageExtraction.js.map +1 -0
- package/lib/dist/services/traces/spanCategorization.d.ts +63 -0
- package/lib/dist/services/traces/spanCategorization.d.ts.map +1 -0
- package/lib/dist/services/traces/spanCategorization.js +276 -0
- package/lib/dist/services/traces/spanCategorization.js.map +1 -0
- package/lib/dist/services/traces/spanPreprocessing.d.ts +37 -0
- package/lib/dist/services/traces/spanPreprocessing.d.ts.map +1 -0
- package/lib/dist/services/traces/spanPreprocessing.js +102 -0
- package/lib/dist/services/traces/spanPreprocessing.js.map +1 -0
- package/lib/dist/services/traces/spansToTrajectory.d.ts +36 -0
- package/lib/dist/services/traces/spansToTrajectory.d.ts.map +1 -0
- package/lib/dist/services/traces/spansToTrajectory.js +425 -0
- package/lib/dist/services/traces/spansToTrajectory.js.map +1 -0
- package/lib/dist/services/traces/toolSimilarity.d.ts +35 -0
- package/lib/dist/services/traces/toolSimilarity.d.ts.map +1 -0
- package/lib/dist/services/traces/toolSimilarity.js +203 -0
- package/lib/dist/services/traces/toolSimilarity.js.map +1 -0
- package/lib/dist/services/traces/traceComparison.d.ts +31 -0
- package/lib/dist/services/traces/traceComparison.d.ts.map +1 -0
- package/lib/dist/services/traces/traceComparison.js +318 -0
- package/lib/dist/services/traces/traceComparison.js.map +1 -0
- package/lib/dist/services/traces/traceGrouping.d.ts +19 -0
- package/lib/dist/services/traces/traceGrouping.d.ts.map +1 -0
- package/lib/dist/services/traces/traceGrouping.js +107 -0
- package/lib/dist/services/traces/traceGrouping.js.map +1 -0
- package/lib/dist/services/traces/tracePoller.d.ts +108 -0
- package/lib/dist/services/traces/tracePoller.d.ts.map +1 -0
- package/lib/dist/services/traces/tracePoller.js +475 -0
- package/lib/dist/services/traces/tracePoller.js.map +1 -0
- package/lib/dist/services/traces/traceStats.d.ts +45 -0
- package/lib/dist/services/traces/traceStats.d.ts.map +1 -0
- package/lib/dist/services/traces/traceStats.js +114 -0
- package/lib/dist/services/traces/traceStats.js.map +1 -0
- package/lib/dist/services/traces/traceSummary.d.ts +47 -0
- package/lib/dist/services/traces/traceSummary.d.ts.map +1 -0
- package/lib/dist/services/traces/traceSummary.js +68 -0
- package/lib/dist/services/traces/traceSummary.js.map +1 -0
- package/lib/dist/services/traces/utils.d.ts +33 -0
- package/lib/dist/services/traces/utils.d.ts.map +1 -0
- package/lib/dist/services/traces/utils.js +114 -0
- package/lib/dist/services/traces/utils.js.map +1 -0
- package/lib/dist/types/agui.d.ts +13 -0
- package/lib/dist/types/agui.d.ts.map +1 -0
- package/lib/dist/types/agui.js +16 -0
- package/lib/dist/types/agui.js.map +1 -0
- package/lib/dist/types/index.d.ts +1229 -0
- package/lib/dist/types/index.d.ts.map +1 -0
- package/lib/dist/types/index.js +12 -0
- package/lib/dist/types/index.js.map +1 -0
- package/lib/dist/types/skills.d.ts +146 -0
- package/lib/dist/types/skills.d.ts.map +1 -0
- package/lib/dist/types/skills.js +6 -0
- package/lib/dist/types/skills.js.map +1 -0
- package/observio-sample-agent/pi-package/README.md +112 -0
- package/observio-sample-agent/pi-package/extensions/agent-health.ts +373 -0
- package/observio-sample-agent/pi-package/package.json +17 -0
- package/observio-sample-agent/pi-package/prompts/agent-health.md +37 -0
- package/observio-sample-agent/pi-package/skills/create-pr/SKILL.md +88 -0
- package/observio-sample-agent/pi-package/skills/fix-bug/SKILL.md +71 -0
- package/observio-sample-agent/pi-package/skills/implement-feature/SKILL.md +156 -0
- package/observio-sample-agent/pi-package/skills/instrument-otel/SKILL.md +208 -0
- package/observio-sample-agent/pi-package/skills/setup-collector/SKILL.md +146 -0
- package/observio-sample-agent/pi-package/skills/write-test/SKILL.md +115 -0
- package/package.json +45 -9
- package/server/dist/app.js +34031 -18731
- package/server/dist/index.js +30737 -15338
- package/tsconfig.lib.json +71 -0
- package/dist/assets/index-BOIP5L7h.js +0 -246
- package/dist/assets/index-CU9YKpAL.css +0 -1
- package/lib/dist/config/index.js +0 -452
- package/lib/dist/index.js +0 -1725
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { readEnv } from '../envCompat.js';
|
|
6
|
+
const registries = new Map();
|
|
7
|
+
// Hooks live in a parallel registry keyed by file path, exactly matching
|
|
8
|
+
// the test() registry. The HookOrchestrator filters by describePath at
|
|
9
|
+
// run time. Cross-file hooks never leak — the loader resets per file.
|
|
10
|
+
const hookRegistries = new Map();
|
|
11
|
+
let activeFile = null;
|
|
12
|
+
const DEFAULT_KEY = '__default__';
|
|
13
|
+
// Active describe stack (synchronous push/pop). Each entry is a describe
|
|
14
|
+
// name; nested describes accumulate. When test() runs, it captures the
|
|
15
|
+
// current stack and joins with ' > ' to derive the test's benchmarkPath.
|
|
16
|
+
const describeStack = [];
|
|
17
|
+
// Emit a one-time experimental-status warning the first time the SDK is
|
|
18
|
+
// touched, unless the user opts out. This is intentionally noisy enough to be
|
|
19
|
+
// noticed but only fires once per process so it doesn't pollute test output.
|
|
20
|
+
let experimentalWarningEmitted = false;
|
|
21
|
+
function emitExperimentalWarningOnce() {
|
|
22
|
+
if (experimentalWarningEmitted)
|
|
23
|
+
return;
|
|
24
|
+
experimentalWarningEmitted = true;
|
|
25
|
+
if (readEnv('AH_SUPPRESS_EXPERIMENTAL', 'AGENT_HEALTH_SUPPRESS_EXPERIMENTAL') === '1')
|
|
26
|
+
return;
|
|
27
|
+
// eslint-disable-next-line no-console
|
|
28
|
+
console.warn('[agent-health] The code-based test SDK (test()/judge()/expect()) is ' +
|
|
29
|
+
'experimental. The API may change in a minor release without a ' +
|
|
30
|
+
'deprecation cycle. Pin your @opensearch-project/agent-health version, ' +
|
|
31
|
+
'or set AH_SUPPRESS_EXPERIMENTAL=1 to silence this notice.');
|
|
32
|
+
}
|
|
33
|
+
/** @internal */
|
|
34
|
+
export function _resetExperimentalWarning() {
|
|
35
|
+
experimentalWarningEmitted = false;
|
|
36
|
+
}
|
|
37
|
+
export function setActiveFile(filePath) {
|
|
38
|
+
activeFile = filePath;
|
|
39
|
+
if (!registries.has(filePath)) {
|
|
40
|
+
registries.set(filePath, []);
|
|
41
|
+
}
|
|
42
|
+
if (!hookRegistries.has(filePath)) {
|
|
43
|
+
hookRegistries.set(filePath, []);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function test(name, optionsOrBody, maybeBody) {
|
|
47
|
+
emitExperimentalWarningOnce();
|
|
48
|
+
// Resolve the two-arg / three-arg overload
|
|
49
|
+
let options;
|
|
50
|
+
let evaluate;
|
|
51
|
+
if (typeof optionsOrBody === 'function') {
|
|
52
|
+
options = {};
|
|
53
|
+
evaluate = optionsOrBody;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
options = optionsOrBody ?? {};
|
|
57
|
+
evaluate = maybeBody;
|
|
58
|
+
}
|
|
59
|
+
if (!name || typeof name !== 'string') {
|
|
60
|
+
throw new Error('test() requires a name (the first argument)');
|
|
61
|
+
}
|
|
62
|
+
if (typeof evaluate !== 'function') {
|
|
63
|
+
throw new Error(`test("${name}") requires a body function`);
|
|
64
|
+
}
|
|
65
|
+
const key = activeFile ?? DEFAULT_KEY;
|
|
66
|
+
if (!registries.has(key)) {
|
|
67
|
+
registries.set(key, []);
|
|
68
|
+
}
|
|
69
|
+
const registry = registries.get(key);
|
|
70
|
+
// Within-file uniqueness guard: a name+benchmarkPath pair must be unique.
|
|
71
|
+
// The same name in two different describe blocks is allowed because they
|
|
72
|
+
// map to different benchmarks.
|
|
73
|
+
const benchmarkPath = describeStack.length > 0 ? describeStack.join(' > ') : undefined;
|
|
74
|
+
if (registry.some(t => t.name === name && t.benchmarkPath === benchmarkPath)) {
|
|
75
|
+
const fileLabel = activeFile ? ` in ${activeFile}` : '';
|
|
76
|
+
const groupLabel = benchmarkPath ? ` (in describe "${benchmarkPath}")` : '';
|
|
77
|
+
throw new Error(`Duplicate test name "${name}"${groupLabel}${fileLabel}. ` +
|
|
78
|
+
`Test names must be unique within their describe block. ` +
|
|
79
|
+
`Move one of the tests to a different describe() or rename it.`);
|
|
80
|
+
}
|
|
81
|
+
registry.push({
|
|
82
|
+
name,
|
|
83
|
+
options,
|
|
84
|
+
evaluate,
|
|
85
|
+
sourceFile: activeFile ?? undefined,
|
|
86
|
+
benchmarkPath,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Group tests under a benchmark name. Equivalent to Playwright's
|
|
91
|
+
* `describe()` — the wrapped `test()` calls inherit the describe's name as
|
|
92
|
+
* their benchmark group. Nested describes flatten with ' > '.
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* describe('RCA Suite', () => {
|
|
96
|
+
* test('payment-service is the root cause', { prompt: ... }, async ({ result, judge }) => {
|
|
97
|
+
* expect(result.trajectory).to.haveCalledTool('search_logs');
|
|
98
|
+
* await judge(result, 'identifies the failing dependency');
|
|
99
|
+
* });
|
|
100
|
+
* });
|
|
101
|
+
*
|
|
102
|
+
* The describe body MUST be synchronous (no `await`/dynamic content), like
|
|
103
|
+
* Playwright. The function is invoked once at registration time.
|
|
104
|
+
*/
|
|
105
|
+
export function describe(name, fn) {
|
|
106
|
+
emitExperimentalWarningOnce();
|
|
107
|
+
if (!name || typeof name !== 'string') {
|
|
108
|
+
throw new Error('describe() requires a name (the first argument)');
|
|
109
|
+
}
|
|
110
|
+
if (typeof fn !== 'function') {
|
|
111
|
+
throw new Error(`describe("${name}") requires a body function`);
|
|
112
|
+
}
|
|
113
|
+
describeStack.push(name);
|
|
114
|
+
try {
|
|
115
|
+
const result = fn();
|
|
116
|
+
if (result && typeof result.then === 'function') {
|
|
117
|
+
// Mirror Playwright — describe bodies must be synchronous because
|
|
118
|
+
// they run during registration, well before any test executes.
|
|
119
|
+
throw new Error(`describe("${name}") body returned a Promise. ` +
|
|
120
|
+
`describe blocks must be synchronous — use test() inside, not await.`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
describeStack.pop();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export function getRegisteredTests(filePath) {
|
|
128
|
+
if (filePath)
|
|
129
|
+
return [...(registries.get(filePath) ?? [])];
|
|
130
|
+
return [...registries.values()].flatMap(r => [...r]);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Return all hooks registered for the given file (or every file when no
|
|
134
|
+
* argument is given). Returns a snapshot — mutating the result has no
|
|
135
|
+
* effect on the registry.
|
|
136
|
+
*/
|
|
137
|
+
export function getRegisteredHooks(filePath) {
|
|
138
|
+
if (filePath)
|
|
139
|
+
return [...(hookRegistries.get(filePath) ?? [])];
|
|
140
|
+
return [...hookRegistries.values()].flatMap(r => [...r]);
|
|
141
|
+
}
|
|
142
|
+
export function clearRegistry(filePath) {
|
|
143
|
+
if (filePath) {
|
|
144
|
+
registries.delete(filePath);
|
|
145
|
+
hookRegistries.delete(filePath);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
registries.clear();
|
|
149
|
+
hookRegistries.clear();
|
|
150
|
+
}
|
|
151
|
+
activeFile = null;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Internal helper used by the four public hook registrars below.
|
|
155
|
+
*
|
|
156
|
+
* Captures the live `(activeFile, [...describeStack])` so the orchestrator
|
|
157
|
+
* can filter hooks by scope at run time. Multiple hooks of the same kind
|
|
158
|
+
* in the same scope are allowed and run in registration order (reversed
|
|
159
|
+
* for `afterEach`/`afterAll`, mirroring Playwright/Jest).
|
|
160
|
+
*/
|
|
161
|
+
function registerHook(kind, fn) {
|
|
162
|
+
emitExperimentalWarningOnce();
|
|
163
|
+
if (typeof fn !== 'function') {
|
|
164
|
+
throw new Error(`${kind}() requires a function as its first argument`);
|
|
165
|
+
}
|
|
166
|
+
const key = activeFile ?? DEFAULT_KEY;
|
|
167
|
+
if (!hookRegistries.has(key)) {
|
|
168
|
+
hookRegistries.set(key, []);
|
|
169
|
+
}
|
|
170
|
+
const describePath = describeStack.length > 0 ? describeStack.join(' > ') : undefined;
|
|
171
|
+
hookRegistries.get(key).push({
|
|
172
|
+
kind,
|
|
173
|
+
fn,
|
|
174
|
+
sourceFile: activeFile ?? undefined,
|
|
175
|
+
describePath,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Register a hook that runs **once** before the first test in its scope.
|
|
180
|
+
*
|
|
181
|
+
* Scope is the surrounding `describe(...)` block, or the whole file when
|
|
182
|
+
* called at the top level. With parallel test execution (the runner
|
|
183
|
+
* dispatches up to `concurrency` tests at once), the orchestrator uses a
|
|
184
|
+
* once-latch so all parallel arrivals await the same `beforeAll` promise.
|
|
185
|
+
*
|
|
186
|
+
* @example
|
|
187
|
+
* beforeAll(async () => {
|
|
188
|
+
* await fs.mkdir('/tmp/agent-health-fixtures', { recursive: true });
|
|
189
|
+
* });
|
|
190
|
+
*/
|
|
191
|
+
export function beforeAll(fn) { registerHook('beforeAll', fn); }
|
|
192
|
+
/**
|
|
193
|
+
* Register a hook that runs **once** after the last test in its scope.
|
|
194
|
+
*
|
|
195
|
+
* Always runs, even when every test in the scope failed. The orchestrator
|
|
196
|
+
* uses a remaining-test counter (decremented on each test completion,
|
|
197
|
+
* regardless of pass/fail) and triggers `afterAll` when it hits zero.
|
|
198
|
+
*
|
|
199
|
+
* @example
|
|
200
|
+
* afterAll(async () => {
|
|
201
|
+
* await fs.rm('/tmp/agent-health-fixtures', { recursive: true });
|
|
202
|
+
* });
|
|
203
|
+
*/
|
|
204
|
+
export function afterAll(fn) { registerHook('afterAll', fn); }
|
|
205
|
+
/**
|
|
206
|
+
* Register a hook that runs **before each test** in its scope.
|
|
207
|
+
*
|
|
208
|
+
* Receives the same fixtures object the body will see, plus a
|
|
209
|
+
* `provide(key, value)` function for stashing values that the test body
|
|
210
|
+
* (and `afterEach`) can read via `fixtures.provisioned[key]`. Each test
|
|
211
|
+
* gets its own provisioned bag, so concurrent tests are isolated.
|
|
212
|
+
*
|
|
213
|
+
* @example
|
|
214
|
+
* beforeEach(async ({ provide, testInfo }) => {
|
|
215
|
+
* const dir = await fs.mkdtemp(`/tmp/${testInfo.name}-`);
|
|
216
|
+
* provide('workspaceDir', dir);
|
|
217
|
+
* });
|
|
218
|
+
*/
|
|
219
|
+
export function beforeEach(fn) { registerHook('beforeEach', fn); }
|
|
220
|
+
/**
|
|
221
|
+
* Register a hook that runs **after each test** in its scope.
|
|
222
|
+
*
|
|
223
|
+
* Always runs, even when the test body or a `beforeEach` threw. Reads
|
|
224
|
+
* provisioned values via `fixtures.provisioned[key]` for cleanup. Errors
|
|
225
|
+
* thrown from `afterEach` are captured as MatcherResult entries on the
|
|
226
|
+
* test — they don't crash the runner.
|
|
227
|
+
*
|
|
228
|
+
* @example
|
|
229
|
+
* afterEach(async ({ provisioned }) => {
|
|
230
|
+
* if (provisioned.workspaceDir) {
|
|
231
|
+
* await fs.rm(provisioned.workspaceDir as string, { recursive: true, force: true });
|
|
232
|
+
* }
|
|
233
|
+
* });
|
|
234
|
+
*/
|
|
235
|
+
export function afterEach(fn) { registerHook('afterEach', fn); }
|
|
236
|
+
// Playwright-style sugar: `test.beforeEach(fn)` etc.
|
|
237
|
+
//
|
|
238
|
+
// Declaration merging here gives TypeScript users typed access to the four
|
|
239
|
+
// hook registrars *and* installs them as properties on the runtime `test`
|
|
240
|
+
// function value. Both `import { beforeEach }` and `test.beforeEach` route
|
|
241
|
+
// to the same internal registerHook() call.
|
|
242
|
+
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
243
|
+
(function (test) {
|
|
244
|
+
// eslint-disable-next-line @typescript-eslint/no-shadow
|
|
245
|
+
test.beforeAll = (fn) => registerHook('beforeAll', fn);
|
|
246
|
+
// eslint-disable-next-line @typescript-eslint/no-shadow
|
|
247
|
+
test.afterAll = (fn) => registerHook('afterAll', fn);
|
|
248
|
+
// eslint-disable-next-line @typescript-eslint/no-shadow
|
|
249
|
+
test.beforeEach = (fn) => registerHook('beforeEach', fn);
|
|
250
|
+
// eslint-disable-next-line @typescript-eslint/no-shadow
|
|
251
|
+
test.afterEach = (fn) => registerHook('afterEach', fn);
|
|
252
|
+
})(test || (test = {}));
|
|
253
|
+
//# sourceMappingURL=define.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define.js","sourceRoot":"","sources":["../../../testCases/define.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `defineEvaluator()` + `evaluate()` — custom programmatic evaluators
|
|
3
|
+
* (RFC 004 §4.4, closes #244).
|
|
4
|
+
*
|
|
5
|
+
* Not every check is an LLM judge or a chai assertion. Sometimes the
|
|
6
|
+
* ground truth lives in code: a SQL result must match a golden row set, a
|
|
7
|
+
* generated diff must apply cleanly, a JSON answer must validate against a
|
|
8
|
+
* schema. A custom evaluator is a plain function that inspects the run and
|
|
9
|
+
* returns a verdict — deterministic, free, and fully under the author's
|
|
10
|
+
* control.
|
|
11
|
+
*
|
|
12
|
+
* ```js
|
|
13
|
+
* const { defineEvaluator, test } = require('@opensearch-project/agent-health');
|
|
14
|
+
*
|
|
15
|
+
* defineEvaluator('sql-matches-golden', ({ result }) => {
|
|
16
|
+
* const rows = JSON.parse(result.agentOutput);
|
|
17
|
+
* return { pass: deepEqual(rows, GOLDEN), reasoning: 'row set comparison' };
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* test('answers the revenue query', { prompt: '...' }, async ({ agent, evaluate }) => {
|
|
21
|
+
* const result = await agent.run();
|
|
22
|
+
* await evaluate(result, 'sql-matches-golden');
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* Evaluators are registered into a process-global registry by id (like a
|
|
27
|
+
* shared helper library), and run **in-process** when the body calls
|
|
28
|
+
* `evaluate()`. They record a `MatcherResult` with `method: 'evaluator'`,
|
|
29
|
+
* gate the test by default, and support an `.observe()` variant that feeds
|
|
30
|
+
* score/insights only — mirroring the `judge` fixture.
|
|
31
|
+
*/
|
|
32
|
+
import type { EvalResult } from './types.js';
|
|
33
|
+
import type { TracesAccessor } from '../matchers/traces.js';
|
|
34
|
+
import type { Verdict } from './judge.js';
|
|
35
|
+
/** Context handed to a custom evaluator. */
|
|
36
|
+
export interface EvaluatorContext {
|
|
37
|
+
/** The agent run under evaluation. */
|
|
38
|
+
result: EvalResult;
|
|
39
|
+
/** Optional free-form criteria string passed at the call site. */
|
|
40
|
+
criteria?: string;
|
|
41
|
+
/** Run-scoped OTel traces, when available (same as `result.traces`). */
|
|
42
|
+
traces?: TracesAccessor;
|
|
43
|
+
}
|
|
44
|
+
/** What a custom evaluator returns. */
|
|
45
|
+
export interface EvaluatorResult {
|
|
46
|
+
/** Whether the check passed. */
|
|
47
|
+
pass: boolean;
|
|
48
|
+
/** Optional normalised score on the [0, 1] interval. */
|
|
49
|
+
score?: number;
|
|
50
|
+
/** Human-readable explanation (shown in the per-matcher breakdown). */
|
|
51
|
+
reasoning?: string;
|
|
52
|
+
}
|
|
53
|
+
export type EvaluatorFn = (ctx: EvaluatorContext) => EvaluatorResult | Promise<EvaluatorResult>;
|
|
54
|
+
/**
|
|
55
|
+
* Register a custom evaluator under `id`.
|
|
56
|
+
*
|
|
57
|
+
* Registering the **same function** under an id again is a no-op (a watched
|
|
58
|
+
* file re-loading the identical module is fine). Registering a *different*
|
|
59
|
+
* function under an id that's already taken throws: the registry is
|
|
60
|
+
* process-global (shared like a helper library), so two `.eval.{js,ts}` files
|
|
61
|
+
* defining `defineEvaluator('len-check', …)` with different bodies would
|
|
62
|
+
* otherwise silently shadow each other based on load order. Fail loudly so the
|
|
63
|
+
* collision is visible at authoring time. Use distinct ids (or a shared helper
|
|
64
|
+
* module) when you need different implementations.
|
|
65
|
+
*/
|
|
66
|
+
export declare function defineEvaluator(id: string, fn: EvaluatorFn): void;
|
|
67
|
+
/** Look up a registered evaluator by id. @internal */
|
|
68
|
+
export declare function getEvaluator(id: string): EvaluatorFn | undefined;
|
|
69
|
+
/** Clear all registered evaluators (test isolation / per-load reset). @internal */
|
|
70
|
+
export declare function clearEvaluators(): void;
|
|
71
|
+
/**
|
|
72
|
+
* The `evaluate` fixture: run a registered custom evaluator against a
|
|
73
|
+
* result. Gate role by default; `.observe()` records score/insights only.
|
|
74
|
+
*/
|
|
75
|
+
export interface EvaluateFn {
|
|
76
|
+
(result: EvalResult, evaluatorId: string, criteria?: string): Promise<Verdict>;
|
|
77
|
+
observe(result: EvalResult, evaluatorId: string, criteria?: string): Promise<Verdict>;
|
|
78
|
+
}
|
|
79
|
+
export declare const evaluate: EvaluateFn;
|
|
80
|
+
//# sourceMappingURL=evaluators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluators.d.ts","sourceRoot":"","sources":["../../../testCases/evaluators.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAa,OAAO,EAAE,MAAM,YAAY,CAAC;AAGrD,4CAA4C;AAC5C,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,MAAM,EAAE,UAAU,CAAC;IACnB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED,uCAAuC;AACvC,MAAM,WAAW,eAAe;IAC9B,gCAAgC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,WAAW,GAAG,CACxB,GAAG,EAAE,gBAAgB,KAClB,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAIhD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,GAAG,IAAI,CAgBjE;AAED,sDAAsD;AACtD,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEhE;AAED,mFAAmF;AACnF,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AA6ED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/E,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvF;AAED,eAAO,MAAM,QAAQ,EAAE,UAOtB,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { recordVerdict } from '../matchers/session.js';
|
|
6
|
+
const evaluatorRegistry = new Map();
|
|
7
|
+
/**
|
|
8
|
+
* Register a custom evaluator under `id`.
|
|
9
|
+
*
|
|
10
|
+
* Registering the **same function** under an id again is a no-op (a watched
|
|
11
|
+
* file re-loading the identical module is fine). Registering a *different*
|
|
12
|
+
* function under an id that's already taken throws: the registry is
|
|
13
|
+
* process-global (shared like a helper library), so two `.eval.{js,ts}` files
|
|
14
|
+
* defining `defineEvaluator('len-check', …)` with different bodies would
|
|
15
|
+
* otherwise silently shadow each other based on load order. Fail loudly so the
|
|
16
|
+
* collision is visible at authoring time. Use distinct ids (or a shared helper
|
|
17
|
+
* module) when you need different implementations.
|
|
18
|
+
*/
|
|
19
|
+
export function defineEvaluator(id, fn) {
|
|
20
|
+
if (!id || typeof id !== 'string') {
|
|
21
|
+
throw new Error('defineEvaluator(id, fn): id must be a non-empty string');
|
|
22
|
+
}
|
|
23
|
+
if (typeof fn !== 'function') {
|
|
24
|
+
throw new Error(`defineEvaluator('${id}', fn): fn must be a function`);
|
|
25
|
+
}
|
|
26
|
+
const existing = evaluatorRegistry.get(id);
|
|
27
|
+
if (existing && existing !== fn) {
|
|
28
|
+
throw new Error(`defineEvaluator('${id}', ...): an evaluator with id '${id}' is already ` +
|
|
29
|
+
`registered with a different function. Evaluator ids are global — use a ` +
|
|
30
|
+
`unique id per evaluator (or share one function) to avoid silent shadowing.`);
|
|
31
|
+
}
|
|
32
|
+
evaluatorRegistry.set(id, fn);
|
|
33
|
+
}
|
|
34
|
+
/** Look up a registered evaluator by id. @internal */
|
|
35
|
+
export function getEvaluator(id) {
|
|
36
|
+
return evaluatorRegistry.get(id);
|
|
37
|
+
}
|
|
38
|
+
/** Clear all registered evaluators (test isolation / per-load reset). @internal */
|
|
39
|
+
export function clearEvaluators() {
|
|
40
|
+
evaluatorRegistry.clear();
|
|
41
|
+
}
|
|
42
|
+
/** Build a {@link Verdict} from a custom-evaluator result. */
|
|
43
|
+
function evaluatorVerdict(r, role, errored, errorMessage) {
|
|
44
|
+
const verdict = {
|
|
45
|
+
passFailStatus: r.pass ? 'passed' : 'failed',
|
|
46
|
+
accuracy: typeof r.score === 'number' ? r.score * 100 : (r.pass ? 100 : 0),
|
|
47
|
+
score: typeof r.score === 'number' ? r.score : (r.pass ? 1 : 0),
|
|
48
|
+
reasoning: r.reasoning ?? '',
|
|
49
|
+
pass: r.pass,
|
|
50
|
+
role,
|
|
51
|
+
skipped: false,
|
|
52
|
+
errored,
|
|
53
|
+
errorMessage,
|
|
54
|
+
orThrow() {
|
|
55
|
+
if (this.pass || this.skipped)
|
|
56
|
+
return this;
|
|
57
|
+
const label = this.errored ? 'errored' : 'FAILED';
|
|
58
|
+
throw new Error(`Evaluator: ${label}\n${this.errorMessage ?? this.reasoning}`);
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
return verdict;
|
|
62
|
+
}
|
|
63
|
+
async function runEvaluator(result, evaluatorId, criteria, role) {
|
|
64
|
+
const fn = getEvaluator(evaluatorId);
|
|
65
|
+
const description = `evaluate: ${evaluatorId}${criteria ? ` — ${criteria}` : ''}`;
|
|
66
|
+
if (!fn) {
|
|
67
|
+
// Unknown evaluator id — this is an authoring error the run can't
|
|
68
|
+
// recover from. Record it as errored (excluded from pass-rate).
|
|
69
|
+
const msg = `No evaluator registered with id '${evaluatorId}'. Did you call defineEvaluator('${evaluatorId}', ...)?`;
|
|
70
|
+
recordVerdict({
|
|
71
|
+
description, pass: false, method: 'evaluator', role, errored: true,
|
|
72
|
+
durationMs: 0, errorMessage: msg, reasoning: '',
|
|
73
|
+
});
|
|
74
|
+
return evaluatorVerdict({ pass: false }, role, true, msg);
|
|
75
|
+
}
|
|
76
|
+
const startedAt = Date.now();
|
|
77
|
+
let out;
|
|
78
|
+
try {
|
|
79
|
+
out = await fn({ result, criteria, traces: result.traces });
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
const msg = err?.message || String(err);
|
|
83
|
+
recordVerdict({
|
|
84
|
+
description, pass: false, method: 'evaluator', role, errored: true,
|
|
85
|
+
durationMs: Date.now() - startedAt, errorMessage: `Evaluator threw: ${msg}`, reasoning: '',
|
|
86
|
+
});
|
|
87
|
+
return evaluatorVerdict({ pass: false }, role, true, `Evaluator threw: ${msg}`);
|
|
88
|
+
}
|
|
89
|
+
const verdict = evaluatorVerdict(out, role, false);
|
|
90
|
+
recordVerdict({
|
|
91
|
+
description,
|
|
92
|
+
pass: verdict.pass,
|
|
93
|
+
method: 'evaluator',
|
|
94
|
+
role,
|
|
95
|
+
durationMs: Date.now() - startedAt,
|
|
96
|
+
score: verdict.score,
|
|
97
|
+
reasoning: verdict.reasoning,
|
|
98
|
+
errorMessage: verdict.pass ? undefined : (verdict.reasoning || 'evaluator failed'),
|
|
99
|
+
});
|
|
100
|
+
return verdict;
|
|
101
|
+
}
|
|
102
|
+
export const evaluate = Object.assign((result, evaluatorId, criteria) => runEvaluator(result, evaluatorId, criteria, 'gate'), {
|
|
103
|
+
observe: (result, evaluatorId, criteria) => runEvaluator(result, evaluatorId, criteria, 'observe'),
|
|
104
|
+
});
|
|
105
|
+
//# sourceMappingURL=evaluators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluators.js","sourceRoot":"","sources":["../../../testCases/evaluators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { test, describe, beforeAll, afterAll, beforeEach, afterEach, getRegisteredTests, getRegisteredHooks, clearRegistry, } from './define.js';
|
|
2
|
+
export { loadTestCasesFromModule, isCodeFile, computeTestCaseHash } from './loader.js';
|
|
3
|
+
export { migrateEvalSource } from './codemod.js';
|
|
4
|
+
export type { CodemodResult } from './codemod.js';
|
|
5
|
+
export { judge, wasJudgeCalled, resetJudgeFlag } from './judge.js';
|
|
6
|
+
export { clearJudgeCache } from './judge.js';
|
|
7
|
+
export { createAgentFixture } from './agentFixture.js';
|
|
8
|
+
export { defineEvaluator, evaluate, getEvaluator, clearEvaluators, } from './evaluators.js';
|
|
9
|
+
export type { EvaluatorContext, EvaluatorResult, EvaluatorFn, EvaluateFn, } from './evaluators.js';
|
|
10
|
+
export type { AgentFixture, AgentRunOptions, AgentInvokeFn, CreateAgentFixtureOptions, } from './agentFixture.js';
|
|
11
|
+
export type { CodeTestCase, EvalResult, TestOptions, TestFixtures, TestInfo, HookKind, HookFn, RegisteredHook, } from './types.js';
|
|
12
|
+
export type { LoadResult, LoadedTestCase } from './loader.js';
|
|
13
|
+
export type { JudgeVerdict, Verdict, JudgeRole, JudgeFn } from './judge.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../testCases/index.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,UAAU,EACV,SAAS,EACT,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EACL,eAAe,EACf,QAAQ,EACR,YAAY,EACZ,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EACb,yBAAyB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,YAAY,EACZ,UAAU,EACV,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
export { test, describe, beforeAll, afterAll, beforeEach, afterEach, getRegisteredTests, getRegisteredHooks, clearRegistry, } from './define.js';
|
|
6
|
+
export { loadTestCasesFromModule, isCodeFile, computeTestCaseHash } from './loader.js';
|
|
7
|
+
export { migrateEvalSource } from './codemod.js';
|
|
8
|
+
export { judge, wasJudgeCalled, resetJudgeFlag } from './judge.js';
|
|
9
|
+
export { clearJudgeCache } from './judge.js';
|
|
10
|
+
export { createAgentFixture } from './agentFixture.js';
|
|
11
|
+
export { defineEvaluator, evaluate, getEvaluator, clearEvaluators, } from './evaluators.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../testCases/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,UAAU,EACV,SAAS,EACT,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EACL,eAAe,EACf,QAAQ,EACR,YAAY,EACZ,eAAe,GAChB,MAAM,iBAAiB,CAAC"}
|