@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,475 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { debug } from '../../lib/debug.js';
|
|
6
|
+
import { fetchTracesForRun } from './index.js';
|
|
7
|
+
import { buildJudgeAgentsHints } from './judgeAgentsHints.js';
|
|
8
|
+
import { asyncRunStorage } from '../storage/asyncRunStorage.js';
|
|
9
|
+
import { executeBuildTrajectoryHook } from '../../lib/hooks.js';
|
|
10
|
+
import { buildEvaluatorErrorPatch } from '../../services/evaluation/evaluatorError.js';
|
|
11
|
+
import { spansToTrajectory } from './spansToTrajectory.js';
|
|
12
|
+
// Polling configuration. Defaults are overridable via env vars so that
|
|
13
|
+
// CI / E2E runs without a real OpenSearch trace backend can fail fast
|
|
14
|
+
// instead of waiting the full ~10 min before the poller gives up.
|
|
15
|
+
//
|
|
16
|
+
// NOTE: this module is imported by browser code (RunDetailsContent.tsx) for
|
|
17
|
+
// recovery polling, where `process` is not defined. Guard the access so we
|
|
18
|
+
// silently fall back to defaults in the browser instead of throwing
|
|
19
|
+
// `ReferenceError: process is not defined` at module load time.
|
|
20
|
+
const envInt = (name, fallback) => {
|
|
21
|
+
const raw = typeof process !== 'undefined' && process?.env ? process.env[name] : undefined;
|
|
22
|
+
if (!raw)
|
|
23
|
+
return fallback;
|
|
24
|
+
const parsed = parseInt(raw, 10);
|
|
25
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
|
|
26
|
+
};
|
|
27
|
+
const DEFAULT_POLL_INTERVAL_MS = envInt('TRACE_POLL_INTERVAL_MS', 10000); // 10 seconds
|
|
28
|
+
const DEFAULT_MAX_ATTEMPTS = envInt('TRACE_POLL_MAX_ATTEMPTS', 60); // 10 minutes total at default interval
|
|
29
|
+
// Hard ceiling: never exceed this many attempts regardless of agent config or
|
|
30
|
+
// env override. Raised 60 → 240 (40 min at the default interval): the old
|
|
31
|
+
// ceiling silently clamped explicit agent `tracePolling.maxAttempts` overrides
|
|
32
|
+
// (e.g. 180 for slow OTLP→API-Gateway→cluster ingestion) back down to 10 min.
|
|
33
|
+
const MAX_POLL_CEILING = 240;
|
|
34
|
+
/**
|
|
35
|
+
* Trace Polling Manager
|
|
36
|
+
*
|
|
37
|
+
* Singleton that manages active polling for trace availability.
|
|
38
|
+
* State is in-memory only - polling is short-lived (~10 min max).
|
|
39
|
+
*
|
|
40
|
+
* Polling runs in two places for redundancy:
|
|
41
|
+
* - Server (experimentRunner.ts): Primary - starts immediately after agent execution
|
|
42
|
+
* - Browser (RunDetailsContent.tsx): Recovery - starts when viewing a pending report
|
|
43
|
+
*/
|
|
44
|
+
class TracePollingManager {
|
|
45
|
+
constructor() {
|
|
46
|
+
this.polls = new Map();
|
|
47
|
+
this.callbacks = new Map();
|
|
48
|
+
this.completionPromises = new Map();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Start polling for traces for a specific report
|
|
52
|
+
*/
|
|
53
|
+
startPolling(reportId, runId, callbacks, options) {
|
|
54
|
+
// Don't start if already polling for this report
|
|
55
|
+
if (this.polls.has(reportId) && this.polls.get(reportId).running) {
|
|
56
|
+
debug('TracePoller', `Already polling for report ${reportId}`);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// Explicit options win; otherwise fall back to the agent's configured
|
|
60
|
+
// tracePolling budget (callers like evaluationRunner pass agentConfig but
|
|
61
|
+
// not the numbers — per-agent overrides were silently ignored there).
|
|
62
|
+
const cfgPolling = options?.agentConfig?.tracePolling;
|
|
63
|
+
const requestedMax = Number.isFinite(options?.maxAttempts)
|
|
64
|
+
? options.maxAttempts
|
|
65
|
+
: Number.isFinite(cfgPolling?.maxAttempts) ? cfgPolling.maxAttempts : DEFAULT_MAX_ATTEMPTS;
|
|
66
|
+
const state = {
|
|
67
|
+
reportId,
|
|
68
|
+
runId,
|
|
69
|
+
attempts: 0,
|
|
70
|
+
maxAttempts: Math.min(requestedMax, MAX_POLL_CEILING),
|
|
71
|
+
intervalMs: options?.intervalMs ?? cfgPolling?.intervalMs ?? DEFAULT_POLL_INTERVAL_MS,
|
|
72
|
+
lastAttempt: null,
|
|
73
|
+
running: true,
|
|
74
|
+
agentConfig: options?.agentConfig,
|
|
75
|
+
};
|
|
76
|
+
this.polls.set(reportId, state);
|
|
77
|
+
this.callbacks.set(reportId, callbacks);
|
|
78
|
+
debug('TracePoller', `Starting polling for report ${reportId}, runId ${runId}`);
|
|
79
|
+
this.poll(reportId);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Stop polling for a specific report.
|
|
83
|
+
* If a completion promise exists (from startPollingAsync), it is rejected
|
|
84
|
+
* so callers awaiting it are unblocked.
|
|
85
|
+
*/
|
|
86
|
+
stopPolling(reportId) {
|
|
87
|
+
const state = this.polls.get(reportId);
|
|
88
|
+
if (state) {
|
|
89
|
+
if (state.timerId) {
|
|
90
|
+
clearTimeout(state.timerId);
|
|
91
|
+
}
|
|
92
|
+
state.running = false;
|
|
93
|
+
debug('TracePoller', `Stopped polling for report ${reportId}`);
|
|
94
|
+
}
|
|
95
|
+
// Reject any pending completion promise so awaiting callers don't hang
|
|
96
|
+
const pending = this.completionPromises.get(reportId);
|
|
97
|
+
if (pending) {
|
|
98
|
+
pending.reject(new Error(`Polling stopped for report ${reportId}`));
|
|
99
|
+
this.completionPromises.delete(reportId);
|
|
100
|
+
}
|
|
101
|
+
this.callbacks.delete(reportId);
|
|
102
|
+
this.polls.delete(reportId);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get the state for a specific poll
|
|
106
|
+
*/
|
|
107
|
+
getState(reportId) {
|
|
108
|
+
return this.polls.get(reportId);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get all active polls
|
|
112
|
+
*/
|
|
113
|
+
getAllActivePolls() {
|
|
114
|
+
const active = new Map();
|
|
115
|
+
this.polls.forEach((state, reportId) => {
|
|
116
|
+
if (state.running) {
|
|
117
|
+
active.set(reportId, state);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
return active;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Start polling and return a Promise that resolves when polling completes.
|
|
124
|
+
* This allows callers (e.g., benchmark runner) to await trace availability
|
|
125
|
+
* instead of firing and forgetting.
|
|
126
|
+
*
|
|
127
|
+
* If polling is already active for this reportId, returns the existing
|
|
128
|
+
* completion promise (no duplicate poll started).
|
|
129
|
+
*/
|
|
130
|
+
startPollingAsync(reportId, runId, callbacks, options) {
|
|
131
|
+
// If already polling, return the existing completion promise
|
|
132
|
+
const existing = this.completionPromises.get(reportId);
|
|
133
|
+
if (existing && this.polls.has(reportId) && this.polls.get(reportId).running) {
|
|
134
|
+
debug('TracePoller', `Already polling for report ${reportId}, returning existing promise`);
|
|
135
|
+
return new Promise((resolve, reject) => {
|
|
136
|
+
const current = this.completionPromises.get(reportId);
|
|
137
|
+
this.completionPromises.set(reportId, {
|
|
138
|
+
resolve: () => { current.resolve(); resolve(); },
|
|
139
|
+
reject: (err) => { current.reject(err); reject(err); },
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return new Promise((resolve, reject) => {
|
|
144
|
+
this.completionPromises.set(reportId, { resolve, reject });
|
|
145
|
+
// Wrap callbacks to resolve/reject the promise on completion
|
|
146
|
+
const wrappedCallbacks = {
|
|
147
|
+
onTracesFound: async (spans, report) => {
|
|
148
|
+
try {
|
|
149
|
+
await callbacks.onTracesFound(spans, report);
|
|
150
|
+
this.completionPromises.get(reportId)?.resolve();
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
this.completionPromises.get(reportId)?.reject(err);
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
this.completionPromises.delete(reportId);
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
onAttempt: callbacks.onAttempt,
|
|
160
|
+
onError: (error) => {
|
|
161
|
+
callbacks.onError(error);
|
|
162
|
+
this.completionPromises.get(reportId)?.reject(error);
|
|
163
|
+
this.completionPromises.delete(reportId);
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
this.startPolling(reportId, runId, wrappedCallbacks, options);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Fetch a report defensively: storage failures and missing docs both
|
|
171
|
+
* resolve to null (callers treat null as "unknown — proceed").
|
|
172
|
+
*/
|
|
173
|
+
async safeGetReport(reportId) {
|
|
174
|
+
try {
|
|
175
|
+
return (await asyncRunStorage.getReportById(reportId)) ?? null;
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Write an evaluator-error patch ONLY if the report is still pending /
|
|
183
|
+
* calculating. A report judged through another path (eager judge, another
|
|
184
|
+
* server's poller) must never have its verdict clobbered by this poller's
|
|
185
|
+
* timeout/error bookkeeping.
|
|
186
|
+
*/
|
|
187
|
+
async patchErrorIfStillPending(reportId, patch) {
|
|
188
|
+
try {
|
|
189
|
+
const fresh = await this.safeGetReport(reportId);
|
|
190
|
+
if (fresh && (fresh.metricsStatus === 'ready' || fresh.metricsStatus === 'error')) {
|
|
191
|
+
// 'ready': a real verdict landed — never overwrite it.
|
|
192
|
+
// 'error': another path already wrote a (likely more specific) error
|
|
193
|
+
// cause — don't stomp it with a generic timeout.
|
|
194
|
+
debug('TracePoller', `Skipping error patch for ${reportId} — already '${fresh.metricsStatus}'`);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
await asyncRunStorage.updateReport(reportId, patch);
|
|
198
|
+
}
|
|
199
|
+
catch (updateErr) {
|
|
200
|
+
console.error(`[TracePoller] CRITICAL: Failed to update report ${reportId} error status. Report may be stuck in pending state.`, updateErr);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Execute a single poll attempt
|
|
205
|
+
*/
|
|
206
|
+
async poll(reportId) {
|
|
207
|
+
const state = this.polls.get(reportId);
|
|
208
|
+
const callbacks = this.callbacks.get(reportId);
|
|
209
|
+
if (!state || !state.running) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
state.attempts++;
|
|
213
|
+
state.lastAttempt = new Date().toISOString();
|
|
214
|
+
debug('TracePoller', `Poll attempt ${state.attempts}/${state.maxAttempts} for report ${reportId}`);
|
|
215
|
+
// Notify about attempt
|
|
216
|
+
callbacks?.onAttempt?.(state.attempts, state.maxAttempts);
|
|
217
|
+
// Update report with attempt count
|
|
218
|
+
try {
|
|
219
|
+
await asyncRunStorage.updateReport(reportId, {
|
|
220
|
+
traceFetchAttempts: state.attempts,
|
|
221
|
+
lastTraceFetchAt: state.lastAttempt,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
console.warn(`[TracePoller] Failed to update attempt count:`, err);
|
|
226
|
+
}
|
|
227
|
+
try {
|
|
228
|
+
// Fetch the current report FIRST. Two reasons:
|
|
229
|
+
// 1. Clobber guard: if the report was already judged (eager path — a
|
|
230
|
+
// browser fan-out can start polls for transiently-pending eager
|
|
231
|
+
// reports), STOP instead of racing the verdict. A trace_timeout
|
|
232
|
+
// patch 10 minutes later must never overwrite a real judgment
|
|
233
|
+
// (2026-08-25: run-inspector fan-out clobbered a full run's early
|
|
234
|
+
// verdicts this way).
|
|
235
|
+
// 2. Correlation hints: the report carries sessionId / timestamp /
|
|
236
|
+
// connectorProtocol, from which we derive the service-window +
|
|
237
|
+
// sessionId hints (Strategies C/D). Claude Code spans carry only
|
|
238
|
+
// `session.id` (no runId tag), pi/REST spans carry neither —
|
|
239
|
+
// runId-only polling (Strategy B) can never find them.
|
|
240
|
+
const currentReport = await this.safeGetReport(reportId);
|
|
241
|
+
if (currentReport && (currentReport.metricsStatus === 'ready' || currentReport.metricsStatus === 'error')) {
|
|
242
|
+
debug('TracePoller', `Report ${reportId} is already '${currentReport.metricsStatus}' — stopping poll (no clobber)`);
|
|
243
|
+
state.running = false;
|
|
244
|
+
this.callbacks.delete(reportId);
|
|
245
|
+
this.polls.delete(reportId);
|
|
246
|
+
// Resolve (not reject) any completion promise — the report reached a
|
|
247
|
+
// terminal state through another path; nothing is owed here. Plain
|
|
248
|
+
// startPolling callers are notified via onStopped (promise wrappers
|
|
249
|
+
// like waitForTracesAndJudge resolve there — otherwise they'd hang).
|
|
250
|
+
this.completionPromises.get(reportId)?.resolve();
|
|
251
|
+
this.completionPromises.delete(reportId);
|
|
252
|
+
try {
|
|
253
|
+
callbacks?.onStopped?.();
|
|
254
|
+
}
|
|
255
|
+
catch { /* notification only */ }
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
const windowAgents = currentReport
|
|
259
|
+
? buildJudgeAgentsHints(currentReport, state.agentConfig?.traceServiceName)
|
|
260
|
+
: [];
|
|
261
|
+
const sessionId = currentReport?.sessionId;
|
|
262
|
+
// The run's own OTel traceId (test_case eval span) — stamped by the
|
|
263
|
+
// runners at case start. Agents that adopt the propagated traceparent
|
|
264
|
+
// (REST via header, pi via TRACEPARENT env — both verified) emit their
|
|
265
|
+
// spans under this exact traceId (Strategy A).
|
|
266
|
+
const evalTraceId = currentReport?.traceId;
|
|
267
|
+
if (!state.runId && !sessionId && !evalTraceId && windowAgents.length === 0) {
|
|
268
|
+
// No correlator at all this attempt (report fetch may have failed
|
|
269
|
+
// transiently, or the report carries no correlation fields yet).
|
|
270
|
+
// An unfiltered query would be rejected by the traces API anyway —
|
|
271
|
+
// skip the fetch and let the attempt budget advance.
|
|
272
|
+
debug('TracePoller', `No correlator available for report ${reportId} (attempt ${state.attempts}) — skipping fetch`);
|
|
273
|
+
if (state.attempts >= state.maxAttempts) {
|
|
274
|
+
state.running = false;
|
|
275
|
+
callbacks?.onError(new Error(`Traces not available after ${state.maxAttempts} attempts (no correlation keys on report)`));
|
|
276
|
+
await this.patchErrorIfStillPending(reportId, buildEvaluatorErrorPatch('trace_timeout', `no correlation keys (runId/sessionId/traceId/service-window) available after ${state.maxAttempts} attempts`));
|
|
277
|
+
this.callbacks.delete(reportId);
|
|
278
|
+
this.polls.delete(reportId);
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
state.timerId = setTimeout(() => this.poll(reportId), state.intervalMs);
|
|
282
|
+
}
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
// Try to fetch traces — union of Strategy A (eval traceId), B (runId),
|
|
286
|
+
// C (service.name + time window) and D (session.id inside the window hint).
|
|
287
|
+
const result = await fetchTracesForRun({
|
|
288
|
+
runId: state.runId,
|
|
289
|
+
evalTraceId,
|
|
290
|
+
windowAgents,
|
|
291
|
+
includeWindowFallback: windowAgents.length > 0,
|
|
292
|
+
});
|
|
293
|
+
// EXACT-MATCH FILTER (fail-closed): the window clause (Strategy C) is a
|
|
294
|
+
// discovery fallback and can return spans from CONCURRENT runs of the
|
|
295
|
+
// same agent — or from unrelated emitters sharing the service name
|
|
296
|
+
// (observed live: a pi-web session's spans were fetched for a pi eval
|
|
297
|
+
// run). When the report carries a precise correlator, judge ONLY spans
|
|
298
|
+
// matching it — and if none match yet, treat the attempt as "traces
|
|
299
|
+
// not available" and keep polling rather than judging foreign spans:
|
|
300
|
+
// session.id (Claude Code) > eval traceId (traceparent adopters).
|
|
301
|
+
let spans = result.spans || [];
|
|
302
|
+
if (spans.length > 0) {
|
|
303
|
+
if (sessionId) {
|
|
304
|
+
spans = spans.filter(sp => sp.attributes?.['session.id'] === sessionId);
|
|
305
|
+
if (spans.length === 0)
|
|
306
|
+
debug('TracePoller', `Fetched ${result.spans.length} spans but none match session ${sessionId} — waiting`);
|
|
307
|
+
}
|
|
308
|
+
else if (evalTraceId) {
|
|
309
|
+
spans = spans.filter(sp => sp.traceId === evalTraceId);
|
|
310
|
+
if (spans.length === 0)
|
|
311
|
+
debug('TracePoller', `Fetched ${result.spans.length} spans but none match eval traceId ${evalTraceId} — waiting`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
const filteredResult = { ...result, spans };
|
|
315
|
+
if (filteredResult.spans && filteredResult.spans.length > 0) {
|
|
316
|
+
// Traces found!
|
|
317
|
+
debug('TracePoller', `Found ${filteredResult.spans.length} spans for report ${reportId} (fetched ${result.spans?.length ?? 0})`);
|
|
318
|
+
// Get the current report (reuse the top-of-poll fetch when it
|
|
319
|
+
// succeeded — one storage read per attempt).
|
|
320
|
+
const report = currentReport ?? await asyncRunStorage.getReportById(reportId);
|
|
321
|
+
if (!report) {
|
|
322
|
+
throw new Error(`Report ${reportId} not found`);
|
|
323
|
+
}
|
|
324
|
+
// Build trajectory from trace spans
|
|
325
|
+
const { trajectory, shouldContinuePolling, fromHook } = await this.buildTrajectory(filteredResult.spans, state);
|
|
326
|
+
// Check if we should continue polling
|
|
327
|
+
if (shouldContinuePolling) {
|
|
328
|
+
if (state.attempts >= state.maxAttempts) {
|
|
329
|
+
console.log(`[TracePoller] Max attempts reached with incomplete trace`);
|
|
330
|
+
state.running = false;
|
|
331
|
+
callbacks?.onError(new Error(`Trace incomplete after ${state.maxAttempts} attempts`));
|
|
332
|
+
await this.patchErrorIfStillPending(reportId, buildEvaluatorErrorPatch('trace_incomplete', `found ${filteredResult.spans.length} spans but no root span after ${state.maxAttempts} attempts`));
|
|
333
|
+
this.callbacks.delete(reportId);
|
|
334
|
+
this.polls.delete(reportId);
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
// Schedule next poll
|
|
338
|
+
state.timerId = setTimeout(() => this.poll(reportId), state.intervalMs);
|
|
339
|
+
}
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
// Trajectory replacement policy:
|
|
343
|
+
// - an agent's explicit buildTrajectory HOOK is intentional — its
|
|
344
|
+
// output always wins (issue #320);
|
|
345
|
+
// - the DEFAULT span→trajectory conversion replaces the connector
|
|
346
|
+
// trajectory so tool calls are visible to the judge (#320) — BUT
|
|
347
|
+
// if the span-built steps carry no response content (e.g. Claude
|
|
348
|
+
// Code tool spans: prompts/responses live in OTel LOGS, not span
|
|
349
|
+
// attributes), the connector trajectory's response steps are
|
|
350
|
+
// appended so the judge still sees the agent's actual answer.
|
|
351
|
+
// Replacing wholesale with content-less span stubs made the judge
|
|
352
|
+
// fail every case of a live benchmark.
|
|
353
|
+
if (trajectory.length > 0) {
|
|
354
|
+
if (fromHook) {
|
|
355
|
+
report.trajectory = trajectory;
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
const hasResponseContent = trajectory.some((st) => st?.type === 'response' && typeof st.content === 'string' && st.content.trim().length > 0);
|
|
359
|
+
const originalResponses = (report.trajectory || []).filter((st) => (st?.type === 'response' || st?.type === 'assistant') &&
|
|
360
|
+
typeof st.content === 'string' && st.content.trim().length > 0);
|
|
361
|
+
report.trajectory = !hasResponseContent && originalResponses.length > 0
|
|
362
|
+
? [...trajectory, ...originalResponses]
|
|
363
|
+
: trajectory;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
// Stop polling and notify success
|
|
367
|
+
state.running = false;
|
|
368
|
+
// Claim the report before judging (pending -> calculating). Not an
|
|
369
|
+
// atomic lease — the storage layer has no CAS — but it makes the
|
|
370
|
+
// browser recovery's "someone else is judging" guard effective and
|
|
371
|
+
// narrows the double-judge window between sibling pollers to the
|
|
372
|
+
// fetch-to-claim gap.
|
|
373
|
+
try {
|
|
374
|
+
await asyncRunStorage.updateReport(reportId, { metricsStatus: 'calculating' });
|
|
375
|
+
}
|
|
376
|
+
catch { /* best-effort claim — proceed to judge regardless */ }
|
|
377
|
+
try {
|
|
378
|
+
await callbacks?.onTracesFound(filteredResult.spans, report);
|
|
379
|
+
}
|
|
380
|
+
catch (callbackErr) {
|
|
381
|
+
// onTracesFound failed (e.g., judge + error recovery both failed).
|
|
382
|
+
// Write error status so the report doesn't stay stuck in 'pending'.
|
|
383
|
+
console.error(`[TracePoller] onTracesFound callback failed for report ${reportId}:`, callbackErr);
|
|
384
|
+
try {
|
|
385
|
+
await asyncRunStorage.updateReport(reportId, buildEvaluatorErrorPatch('trace_callback_failed', callbackErr));
|
|
386
|
+
}
|
|
387
|
+
catch (updateErr) {
|
|
388
|
+
console.error(`[TracePoller] CRITICAL: Failed to update report ${reportId} error status after callback failure.`, updateErr);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
this.callbacks.delete(reportId);
|
|
392
|
+
this.polls.delete(reportId);
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
// No traces yet
|
|
396
|
+
if (state.attempts >= state.maxAttempts) {
|
|
397
|
+
// Max attempts reached
|
|
398
|
+
debug('TracePoller', `Max attempts reached for report ${reportId}`);
|
|
399
|
+
state.running = false;
|
|
400
|
+
callbacks?.onError(new Error(`Traces not available after ${state.maxAttempts} attempts`));
|
|
401
|
+
// Update report with error status - critical as report will remain stuck otherwise
|
|
402
|
+
await this.patchErrorIfStillPending(reportId, buildEvaluatorErrorPatch('trace_timeout', `traces not available after ${state.maxAttempts} attempts (${state.maxAttempts * state.intervalMs / 60000} minutes)`));
|
|
403
|
+
this.callbacks.delete(reportId);
|
|
404
|
+
this.polls.delete(reportId);
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
// Schedule next poll
|
|
408
|
+
state.timerId = setTimeout(() => this.poll(reportId), state.intervalMs);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
catch (error) {
|
|
413
|
+
console.error(`[TracePoller] Error polling for report ${reportId}:`, error);
|
|
414
|
+
if (state.attempts >= state.maxAttempts) {
|
|
415
|
+
state.running = false;
|
|
416
|
+
callbacks?.onError(error);
|
|
417
|
+
// Update report with error status - critical as report will remain stuck otherwise
|
|
418
|
+
await this.patchErrorIfStillPending(reportId, buildEvaluatorErrorPatch('trace_fetch_failed', error));
|
|
419
|
+
this.callbacks.delete(reportId);
|
|
420
|
+
this.polls.delete(reportId);
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
// Schedule retry
|
|
424
|
+
state.timerId = setTimeout(() => this.poll(reportId), state.intervalMs);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Build trajectory from spans with proper error handling
|
|
430
|
+
*/
|
|
431
|
+
async buildTrajectory(spans, state) {
|
|
432
|
+
const traceId = spans[0]?.traceId;
|
|
433
|
+
if (!traceId) {
|
|
434
|
+
console.warn(`[TracePoller] No traceId found in spans`);
|
|
435
|
+
return { trajectory: [], shouldContinuePolling: false, fromHook: false };
|
|
436
|
+
}
|
|
437
|
+
// No buildTrajectory hook: fall back to the generic span→trajectory
|
|
438
|
+
// conversion so the judge grades what the traces actually show (tool
|
|
439
|
+
// calls included) instead of the tool-call-less AG-UI trajectory.
|
|
440
|
+
// Previously this returned [] and trace-only agents could not be judged
|
|
441
|
+
// from their traces without a custom hook (issue #320, root cause 2).
|
|
442
|
+
if (!state.agentConfig?.hooks?.buildTrajectory) {
|
|
443
|
+
try {
|
|
444
|
+
const converted = spansToTrajectory(spans, state.agentConfig?.traceServiceName);
|
|
445
|
+
if (converted.length > 0) {
|
|
446
|
+
debug('TracePoller', `Default span→trajectory conversion produced ${converted.length} steps for trace ${traceId}`);
|
|
447
|
+
}
|
|
448
|
+
return { trajectory: converted, shouldContinuePolling: false, fromHook: false };
|
|
449
|
+
}
|
|
450
|
+
catch (err) {
|
|
451
|
+
console.error(`[TracePoller] Default span→trajectory conversion failed for ${traceId}:`, err);
|
|
452
|
+
return { trajectory: [], shouldContinuePolling: false, fromHook: false };
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
try {
|
|
456
|
+
console.log(`[TracePoller] Building trajectory from hook for trace ${traceId}`);
|
|
457
|
+
const hookResult = await executeBuildTrajectoryHook(state.agentConfig.hooks, { spans, runId: state.runId }, state.agentConfig.key);
|
|
458
|
+
if (hookResult !== null) {
|
|
459
|
+
console.log(`[TracePoller] Hook returned ${hookResult.length} trajectory steps`);
|
|
460
|
+
return { trajectory: hookResult, shouldContinuePolling: false, fromHook: true };
|
|
461
|
+
}
|
|
462
|
+
else {
|
|
463
|
+
console.log(`[TracePoller] Hook returned null - trace not ready yet`);
|
|
464
|
+
return { trajectory: [], shouldContinuePolling: true, fromHook: true };
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
catch (err) {
|
|
468
|
+
console.error(`[TracePoller] Failed to build trajectory for ${traceId}:`, err);
|
|
469
|
+
return { trajectory: [], shouldContinuePolling: false, fromHook: true };
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
// Singleton instance
|
|
474
|
+
export const tracePollingManager = new TracePollingManager();
|
|
475
|
+
//# sourceMappingURL=tracePoller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracePoller.js","sourceRoot":"","sources":["../../../../services/traces/tracePoller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trace Statistics Utilities
|
|
3
|
+
*
|
|
4
|
+
* Shared helper functions for calculating trace statistics.
|
|
5
|
+
* Used by TraceFlowView.
|
|
6
|
+
*/
|
|
7
|
+
import { CategorizedSpan, SpanCategory } from '../../types/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Category statistics for trace analysis
|
|
10
|
+
*/
|
|
11
|
+
export interface CategoryStats {
|
|
12
|
+
category: SpanCategory;
|
|
13
|
+
count: number;
|
|
14
|
+
totalDuration: number;
|
|
15
|
+
percentage: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Tool usage information
|
|
19
|
+
*/
|
|
20
|
+
export interface ToolInfo {
|
|
21
|
+
name: string;
|
|
22
|
+
count: number;
|
|
23
|
+
totalDuration: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Extract tool name from a span
|
|
27
|
+
*/
|
|
28
|
+
export declare function extractToolName(span: CategorizedSpan): string | null;
|
|
29
|
+
/**
|
|
30
|
+
* Flatten span tree and collect all spans
|
|
31
|
+
*/
|
|
32
|
+
export declare function flattenSpans(spans: CategorizedSpan[]): CategorizedSpan[];
|
|
33
|
+
/**
|
|
34
|
+
* Calculate category statistics from spans
|
|
35
|
+
*
|
|
36
|
+
* Percentages are calculated relative to the sum of all category durations,
|
|
37
|
+
* not trace duration, because spans can overlap (LLM calls inside AGENT spans).
|
|
38
|
+
* This ensures percentages naturally sum to 100%.
|
|
39
|
+
*/
|
|
40
|
+
export declare function calculateCategoryStats(spans: CategorizedSpan[], _totalDuration: number): CategoryStats[];
|
|
41
|
+
/**
|
|
42
|
+
* Extract unique tools with usage stats
|
|
43
|
+
*/
|
|
44
|
+
export declare function extractToolStats(spans: CategorizedSpan[]): ToolInfo[];
|
|
45
|
+
//# sourceMappingURL=traceStats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceStats.d.ts","sourceRoot":"","sources":["../../../../services/traces/traceStats.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGxD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CA8BpE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAcxE;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,cAAc,EAAE,MAAM,GAAG,aAAa,EAAE,CA6BxG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,QAAQ,EAAE,CA2BrE"}
|