@opensearch-project/agent-health 0.3.0 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +77 -6
- package/cli/dist/index.js +10072 -4502
- package/deployment/cloudformation/agent-health-observability.yaml +762 -0
- package/dist/assets/index-CCQRDlO0.js +243 -0
- package/dist/assets/index-CNHQVbcj.css +1 -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 +431 -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 +390 -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 +577 -0
- package/docs/SKILLS.md +264 -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 +598 -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/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/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/benchmarkVersionUtils.d.ts +37 -0
- package/lib/dist/lib/benchmarkVersionUtils.d.ts.map +1 -0
- package/lib/dist/lib/benchmarkVersionUtils.js +68 -0
- package/lib/dist/lib/benchmarkVersionUtils.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 +258 -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 +231 -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 +70 -0
- package/lib/dist/lib/constants.d.ts.map +1 -0
- package/lib/dist/lib/constants.js +365 -0
- package/lib/dist/lib/constants.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 +73 -0
- package/lib/dist/lib/envCompat.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 +55 -0
- package/lib/dist/lib/matchers/traces.d.ts.map +1 -0
- package/lib/dist/lib/matchers/traces.js +116 -0
- package/lib/dist/lib/matchers/traces.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 +92 -0
- package/lib/dist/lib/runStats.d.ts.map +1 -0
- package/lib/dist/lib/runStats.js +160 -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 +26 -0
- package/lib/dist/lib/testCases/loader.d.ts.map +1 -0
- package/lib/dist/lib/testCases/loader.js +149 -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 +96 -0
- package/lib/dist/lib/utils.d.ts.map +1 -0
- package/lib/dist/lib/utils.js +232 -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 +116 -0
- package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.js +403 -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 +418 -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 +64 -0
- package/lib/dist/services/evaluation/bedrockJudge.d.ts.map +1 -0
- package/lib/dist/services/evaluation/bedrockJudge.js +167 -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 +429 -0
- package/lib/dist/services/storage/asyncBenchmarkStorage.js.map +1 -0
- package/lib/dist/services/storage/asyncRunStorage.d.ts +127 -0
- package/lib/dist/services/storage/asyncRunStorage.d.ts.map +1 -0
- package/lib/dist/services/storage/asyncRunStorage.js +448 -0
- package/lib/dist/services/storage/asyncRunStorage.js.map +1 -0
- package/lib/dist/services/storage/asyncTestCaseStorage.d.ts +156 -0
- package/lib/dist/services/storage/asyncTestCaseStorage.d.ts.map +1 -0
- package/lib/dist/services/storage/asyncTestCaseStorage.js +285 -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 +924 -0
- package/lib/dist/services/storage/opensearchClient.d.ts.map +1 -0
- package/lib/dist/services/storage/opensearchClient.js +435 -0
- package/lib/dist/services/storage/opensearchClient.js.map +1 -0
- package/lib/dist/services/traces/browserRecovery.d.ts +26 -0
- package/lib/dist/services/traces/browserRecovery.d.ts.map +1 -0
- package/lib/dist/services/traces/browserRecovery.js +81 -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 +251 -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 +387 -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 +84 -0
- package/lib/dist/services/traces/tracePoller.d.ts.map +1 -0
- package/lib/dist/services/traces/tracePoller.js +309 -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 +1175 -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 +64 -13
- package/server/dist/app.js +32651 -17637
- package/server/dist/index.js +29875 -14638
- package/tsconfig.lib.json +71 -0
- package/dist/assets/index-EvPLSTAS.js +0 -267
- package/dist/assets/index-RXasQKUs.css +0 -1
- package/lib/dist/config/index.js +0 -404
- package/lib/dist/index.js +0 -1665
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { hasAnyWarnings, getCategoryMeta } from './spanCategorization.js';
|
|
6
|
+
import { isContainerSpan } from './executionOrderTransform.js';
|
|
7
|
+
/**
|
|
8
|
+
* Flatten span tree into execution order, skipping container spans
|
|
9
|
+
* Container span children are promoted to their parent's level
|
|
10
|
+
*/
|
|
11
|
+
function flattenInExecutionOrder(spanTree) {
|
|
12
|
+
const result = [];
|
|
13
|
+
const processSpan = (span) => {
|
|
14
|
+
// Safely extract children with default empty array
|
|
15
|
+
const children = (span.children ?? []);
|
|
16
|
+
const sortedChildren = children.length > 0
|
|
17
|
+
? [...children].sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime())
|
|
18
|
+
: [];
|
|
19
|
+
if (isContainerSpan(span)) {
|
|
20
|
+
// Skip container, process children directly
|
|
21
|
+
for (const child of sortedChildren) {
|
|
22
|
+
processSpan(child);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
// Include this span, then process children
|
|
27
|
+
result.push(span);
|
|
28
|
+
for (const child of sortedChildren) {
|
|
29
|
+
processSpan(child);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
// Sort root spans by start time
|
|
34
|
+
const sortedRoots = [...spanTree].sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime());
|
|
35
|
+
for (const root of sortedRoots) {
|
|
36
|
+
processSpan(root);
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Build subtitle for an IntentNode from its spans
|
|
42
|
+
*/
|
|
43
|
+
function buildSubtitle(spans) {
|
|
44
|
+
if (spans.length === 1) {
|
|
45
|
+
return spans[0].displayName || spans[0].name;
|
|
46
|
+
}
|
|
47
|
+
// For multiple spans, show first few names
|
|
48
|
+
const names = spans.slice(0, 3).map(s => s.displayName || s.name);
|
|
49
|
+
if (spans.length > 3) {
|
|
50
|
+
return `${names.join(', ')}...`;
|
|
51
|
+
}
|
|
52
|
+
return names.join(', ');
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Group consecutive same-category spans into IntentNodes
|
|
56
|
+
*/
|
|
57
|
+
function groupConsecutive(spans) {
|
|
58
|
+
if (spans.length === 0)
|
|
59
|
+
return [];
|
|
60
|
+
const nodes = [];
|
|
61
|
+
let currentGroup = [spans[0]];
|
|
62
|
+
let currentCategory = spans[0].category;
|
|
63
|
+
let currentStartIndex = 0; // Track global span index
|
|
64
|
+
for (let i = 1; i < spans.length; i++) {
|
|
65
|
+
const span = spans[i];
|
|
66
|
+
if (span.category === currentCategory) {
|
|
67
|
+
// Same category - add to current group
|
|
68
|
+
currentGroup.push(span);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// Different category - close current group, start new one
|
|
72
|
+
nodes.push(createIntentNode(currentGroup, nodes.length, currentStartIndex));
|
|
73
|
+
currentStartIndex += currentGroup.length;
|
|
74
|
+
currentGroup = [span];
|
|
75
|
+
currentCategory = span.category;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Don't forget the last group
|
|
79
|
+
if (currentGroup.length > 0) {
|
|
80
|
+
nodes.push(createIntentNode(currentGroup, nodes.length, currentStartIndex));
|
|
81
|
+
}
|
|
82
|
+
return nodes;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Create an IntentNode from a group of consecutive spans
|
|
86
|
+
*/
|
|
87
|
+
function createIntentNode(spans, order, startIndex) {
|
|
88
|
+
const category = spans[0].category;
|
|
89
|
+
const meta = getCategoryMeta(category);
|
|
90
|
+
const count = spans.length;
|
|
91
|
+
// Calculate total duration for all spans in this node
|
|
92
|
+
const totalDuration = spans.reduce((sum, span) => sum + (span.duration ?? 0), 0);
|
|
93
|
+
return {
|
|
94
|
+
id: `intent-${category}-${order}`,
|
|
95
|
+
category,
|
|
96
|
+
spans,
|
|
97
|
+
count,
|
|
98
|
+
displayName: count > 1 ? `${meta.label} ×${count}` : meta.label,
|
|
99
|
+
subtitle: buildSubtitle(spans),
|
|
100
|
+
hasWarnings: hasAnyWarnings(spans),
|
|
101
|
+
executionOrder: order,
|
|
102
|
+
startIndex,
|
|
103
|
+
totalDuration,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Transform a categorized span tree into IntentNodes for the Intent view.
|
|
108
|
+
* Groups only consecutive same-category spans, preserving execution order.
|
|
109
|
+
*/
|
|
110
|
+
export function spansToIntentNodes(spanTree) {
|
|
111
|
+
// 1. Flatten all spans in execution order (skip container spans)
|
|
112
|
+
const flatSpans = flattenInExecutionOrder(spanTree);
|
|
113
|
+
// 2. Group consecutive same-category spans
|
|
114
|
+
return groupConsecutive(flatSpans);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get the root/container span for display as header (if exists)
|
|
118
|
+
*/
|
|
119
|
+
export function getRootContainerSpan(spanTree) {
|
|
120
|
+
if (spanTree.length === 0)
|
|
121
|
+
return null;
|
|
122
|
+
// Find first container span (usually the agent.run)
|
|
123
|
+
for (const span of spanTree) {
|
|
124
|
+
if (isContainerSpan(span)) {
|
|
125
|
+
return span;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Fallback to first span if no container found
|
|
129
|
+
return spanTree[0];
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=intentTransform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intentTransform.js","sourceRoot":"","sources":["../../../../services/traces/intentTransform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derive Strategy C correlation hints (`agents` array) for the agent (trace)
|
|
3
|
+
* judge from a persisted run report.
|
|
4
|
+
*
|
|
5
|
+
* Background (#264): the agent (trace) judge's `query_spans` tool reads
|
|
6
|
+
* `/api/traces` to find the spans it should reason over. Without these hints
|
|
7
|
+
* the route only matches spans whose `gen_ai.request.id` equals
|
|
8
|
+
* agent-health's runId (Strategy B) — i.e. agent-health's OWN eval-emitter
|
|
9
|
+
* spans. Subprocess agents like claude-code emit instrumentation under their
|
|
10
|
+
* own session ids, so they're invisible to Strategy B alone.
|
|
11
|
+
*
|
|
12
|
+
* Forwarding `agents: [{serviceName, startedAt, endedAt}]` lets `/api/traces`
|
|
13
|
+
* union Strategy B with Strategy C (service.name + time-window). This is the
|
|
14
|
+
* same correlation the run-detail Traces tab uses (see
|
|
15
|
+
* components/RunDetailsContent.tsx), extracted here so the trace judge tool
|
|
16
|
+
* and the UI converge on one read-side query.
|
|
17
|
+
*
|
|
18
|
+
* The full unification (one shared `buildSpanQuery(report)` for every
|
|
19
|
+
* caller) is tracked in #264 — this helper is the minimum surgery to make
|
|
20
|
+
* the agent (trace) judge functional in the meantime.
|
|
21
|
+
*/
|
|
22
|
+
import type { TestCaseRun, ConnectorProtocol } from '../../types/index.js';
|
|
23
|
+
export interface JudgeAgentsHint {
|
|
24
|
+
serviceName: string;
|
|
25
|
+
startedAt: number;
|
|
26
|
+
endedAt: number;
|
|
27
|
+
/**
|
|
28
|
+
* Agent-emitted session id (Strategy D). When present, trace queries
|
|
29
|
+
* correlate precisely on `attributes.session.id` (unioned with the
|
|
30
|
+
* service.name + window fallback). Sourced from `report.sessionId`.
|
|
31
|
+
*/
|
|
32
|
+
sessionId?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Resolve the `service.name` an agent emits OTel spans under. Priority:
|
|
36
|
+
* 1. Explicit `agentConfig.traceServiceName` (the per-agent override).
|
|
37
|
+
* 2. Protocol-default from the table above.
|
|
38
|
+
* 3. `<connectorProtocol>-agent` heuristic (last-resort fallback).
|
|
39
|
+
* 4. `<agentKey>-agent` as a final guess when protocol is unknown.
|
|
40
|
+
*
|
|
41
|
+
* Returns `undefined` when none of the above is derivable; the caller
|
|
42
|
+
* should then skip Strategy C and fall back to Strategy B alone.
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveAgentServiceName(args: {
|
|
45
|
+
agentTraceServiceName?: string;
|
|
46
|
+
connectorProtocol?: ConnectorProtocol;
|
|
47
|
+
agentKey?: string;
|
|
48
|
+
}): string | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* Build the `agents: [{...}]` array to forward as `JudgeRequest.agents`.
|
|
51
|
+
*
|
|
52
|
+
* `endedAt` defaults to the report's persisted timestamp; `startedAt`
|
|
53
|
+
* defaults to that minus `performanceMetrics.durationMs` (with slack), or
|
|
54
|
+
* a 30-minute lookback when duration is missing. The trace tool sends
|
|
55
|
+
* these through to `/api/traces` which intersects them with
|
|
56
|
+
* `service.name = serviceName`.
|
|
57
|
+
*
|
|
58
|
+
* Returns an empty array when we can't derive a meaningful service name —
|
|
59
|
+
* the caller can still pass that and the route just falls back to
|
|
60
|
+
* Strategy B (runIds-only) without breaking.
|
|
61
|
+
*/
|
|
62
|
+
export declare function buildJudgeAgentsHints(report: Pick<TestCaseRun, 'agentKey' | 'connectorProtocol' | 'timestamp' | 'performanceMetrics' | 'sessionId'>, agentTraceServiceName?: string): JudgeAgentsHint[];
|
|
63
|
+
//# sourceMappingURL=judgeAgentsHints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"judgeAgentsHints.d.ts","sourceRoot":"","sources":["../../../../services/traces/judgeAgentsHints.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AA4B9D,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,GAAG,SAAS,CAQrB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,mBAAmB,GAAG,WAAW,GAAG,oBAAoB,GAAG,WAAW,CAAC,EAC9G,qBAAqB,CAAC,EAAE,MAAM,GAC7B,eAAe,EAAE,CAyBnB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Default `service.name` per connector protocol/key, mirroring `AGENTS.md`'s
|
|
7
|
+
* "Trace correlation conventions" table. Used when the agent config doesn't
|
|
8
|
+
* set an explicit `traceServiceName`. Keyed by `string` rather than
|
|
9
|
+
* `ConnectorProtocol` so user-configured connectors (e.g. `kiro`, which
|
|
10
|
+
* isn't in the upstream union) still resolve to a default.
|
|
11
|
+
*/
|
|
12
|
+
const PROTOCOL_TO_SERVICE_NAME = {
|
|
13
|
+
'claude-code': 'claude-code-agent',
|
|
14
|
+
'kiro': 'kiro-agent',
|
|
15
|
+
'pi': 'pi-agent',
|
|
16
|
+
'agui-streaming': 'observio-sample-agent',
|
|
17
|
+
'subprocess': 'subprocess-agent',
|
|
18
|
+
};
|
|
19
|
+
/** Time-window slack on each side of the run window to absorb clock skew. */
|
|
20
|
+
const SLACK_MS = 60_000;
|
|
21
|
+
/**
|
|
22
|
+
* Lookback used when `report.performanceMetrics.durationMs` is missing
|
|
23
|
+
* (older runs persisted before that field). Wide enough to cover any
|
|
24
|
+
* realistic run, narrow enough to keep noise on a shared OTel cluster
|
|
25
|
+
* minimal. Mirrors the run-detail Traces tab fallback.
|
|
26
|
+
*/
|
|
27
|
+
const FALLBACK_LOOKBACK_MS = 30 * 60_000;
|
|
28
|
+
/**
|
|
29
|
+
* Resolve the `service.name` an agent emits OTel spans under. Priority:
|
|
30
|
+
* 1. Explicit `agentConfig.traceServiceName` (the per-agent override).
|
|
31
|
+
* 2. Protocol-default from the table above.
|
|
32
|
+
* 3. `<connectorProtocol>-agent` heuristic (last-resort fallback).
|
|
33
|
+
* 4. `<agentKey>-agent` as a final guess when protocol is unknown.
|
|
34
|
+
*
|
|
35
|
+
* Returns `undefined` when none of the above is derivable; the caller
|
|
36
|
+
* should then skip Strategy C and fall back to Strategy B alone.
|
|
37
|
+
*/
|
|
38
|
+
export function resolveAgentServiceName(args) {
|
|
39
|
+
if (args.agentTraceServiceName)
|
|
40
|
+
return args.agentTraceServiceName;
|
|
41
|
+
if (args.connectorProtocol && PROTOCOL_TO_SERVICE_NAME[args.connectorProtocol]) {
|
|
42
|
+
return PROTOCOL_TO_SERVICE_NAME[args.connectorProtocol];
|
|
43
|
+
}
|
|
44
|
+
if (args.connectorProtocol)
|
|
45
|
+
return `${args.connectorProtocol}-agent`;
|
|
46
|
+
if (args.agentKey)
|
|
47
|
+
return `${args.agentKey}-agent`;
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Build the `agents: [{...}]` array to forward as `JudgeRequest.agents`.
|
|
52
|
+
*
|
|
53
|
+
* `endedAt` defaults to the report's persisted timestamp; `startedAt`
|
|
54
|
+
* defaults to that minus `performanceMetrics.durationMs` (with slack), or
|
|
55
|
+
* a 30-minute lookback when duration is missing. The trace tool sends
|
|
56
|
+
* these through to `/api/traces` which intersects them with
|
|
57
|
+
* `service.name = serviceName`.
|
|
58
|
+
*
|
|
59
|
+
* Returns an empty array when we can't derive a meaningful service name —
|
|
60
|
+
* the caller can still pass that and the route just falls back to
|
|
61
|
+
* Strategy B (runIds-only) without breaking.
|
|
62
|
+
*/
|
|
63
|
+
export function buildJudgeAgentsHints(report, agentTraceServiceName) {
|
|
64
|
+
const serviceName = resolveAgentServiceName({
|
|
65
|
+
agentTraceServiceName,
|
|
66
|
+
connectorProtocol: report.connectorProtocol,
|
|
67
|
+
agentKey: report.agentKey,
|
|
68
|
+
});
|
|
69
|
+
if (!serviceName)
|
|
70
|
+
return [];
|
|
71
|
+
const ts = Date.parse(report.timestamp || '') || Date.now();
|
|
72
|
+
const durationMs = report.performanceMetrics?.durationMs ?? 0;
|
|
73
|
+
const span = durationMs > 0 ? durationMs + SLACK_MS : FALLBACK_LOOKBACK_MS;
|
|
74
|
+
// `report.timestamp` is NOT reliably the run END: trace-mode / subprocess
|
|
75
|
+
// reports (e.g. Claude Code) are persisted at run START, so anchoring the
|
|
76
|
+
// window's `endedAt` on the timestamp and looking only backwards lands the
|
|
77
|
+
// entire window BEFORE the run and misses every span. Anchor SYMMETRICALLY
|
|
78
|
+
// around the timestamp by ±(duration + slack) so the window covers the run
|
|
79
|
+
// whether the timestamp marks its start or its end (empty-by-default is the
|
|
80
|
+
// worse failure mode — see trace-correlation notes). Mirrors the deep-dive's
|
|
81
|
+
// resolveWindow.
|
|
82
|
+
return [{
|
|
83
|
+
serviceName,
|
|
84
|
+
startedAt: ts - span,
|
|
85
|
+
endedAt: ts + span,
|
|
86
|
+
...(report.sessionId ? { sessionId: report.sessionId } : {}),
|
|
87
|
+
}];
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=judgeAgentsHints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"judgeAgentsHints.js","sourceRoot":"","sources":["../../../../services/traces/judgeAgentsHints.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA0BH;;;;;;GAMG;AACH,MAAM,wBAAwB,GAA2B;IACvD,aAAa,EAAE,mBAAmB;IAClC,MAAM,EAAE,YAAY;IACpB,IAAI,EAAE,UAAU;IAChB,gBAAgB,EAAE,uBAAuB;IACzC,YAAY,EAAE,kBAAkB;CACjC,CAAC;AAEF,6EAA6E;AAC7E,MAAM,QAAQ,GAAG,MAAM,CAAC;AAExB;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,EAAE,GAAG,MAAM,CAAC;AAczC;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAIvC;IACC,IAAI,IAAI,CAAC,qBAAqB;QAAE,OAAO,IAAI,CAAC,qBAAqB,CAAC;IAClE,IAAI,IAAI,CAAC,iBAAiB,IAAI,wBAAwB,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC/E,OAAO,wBAAwB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,IAAI,CAAC,iBAAiB;QAAE,OAAO,GAAG,IAAI,CAAC,iBAAiB,QAAQ,CAAC;IACrE,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,GAAG,IAAI,CAAC,QAAQ,QAAQ,CAAC;IACnD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAA8G,EAC9G,qBAA8B;IAE9B,MAAM,WAAW,GAAG,uBAAuB,CAAC;QAC1C,qBAAqB;QACrB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAC;IACH,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,CAAC;IAE5B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,kBAAkB,EAAE,UAAU,IAAI,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAC3E,0EAA0E;IAC1E,0EAA0E;IAC1E,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,4EAA4E;IAC5E,6EAA6E;IAC7E,iBAAiB;IACjB,OAAO,CAAC;YACN,WAAW;YACX,SAAS,EAAE,EAAE,GAAG,IAAI;YACpB,OAAO,EAAE,EAAE,GAAG,IAAI;YAClB,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7D,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message Extraction Service
|
|
3
|
+
*
|
|
4
|
+
* Transforms OTel spans into a chronological conversation message list.
|
|
5
|
+
* Supports Claude Code telemetry events and generic OTel GenAI conventions.
|
|
6
|
+
*/
|
|
7
|
+
import { Span, ConversationMessage } from '../../types/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Extract conversation messages from a flat array of spans.
|
|
10
|
+
*
|
|
11
|
+
* Claude Code emits spans with events: user_prompt, api_request, tool_decision, tool_result.
|
|
12
|
+
* Generic agents use OTel GenAI conventions: llm.request/llm.response events and gen_ai.* attributes.
|
|
13
|
+
*/
|
|
14
|
+
export declare function extractMessagesFromSpans(spans: Span[], serviceName?: string): ConversationMessage[];
|
|
15
|
+
//# sourceMappingURL=messageExtraction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messageExtraction.d.ts","sourceRoot":"","sources":["../../../../services/traces/messageExtraction.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEpD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,IAAI,EAAE,EACb,WAAW,CAAC,EAAE,MAAM,GACnB,mBAAmB,EAAE,CAuBvB"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Extract conversation messages from a flat array of spans.
|
|
7
|
+
*
|
|
8
|
+
* Claude Code emits spans with events: user_prompt, api_request, tool_decision, tool_result.
|
|
9
|
+
* Generic agents use OTel GenAI conventions: llm.request/llm.response events and gen_ai.* attributes.
|
|
10
|
+
*/
|
|
11
|
+
export function extractMessagesFromSpans(spans, serviceName) {
|
|
12
|
+
if (!spans || spans.length === 0)
|
|
13
|
+
return [];
|
|
14
|
+
const isClaudeCode = serviceName === 'claude-code' ||
|
|
15
|
+
spans.some(s => s.attributes?.['service.name'] === 'claude-code');
|
|
16
|
+
const sorted = [...spans]
|
|
17
|
+
.filter(s => s.startTime && !isNaN(new Date(s.startTime).getTime()))
|
|
18
|
+
.sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime());
|
|
19
|
+
const messages = [];
|
|
20
|
+
for (const span of sorted) {
|
|
21
|
+
if (isClaudeCode) {
|
|
22
|
+
extractClaudeCodeMessages(span, messages);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
extractGenericMessages(span, messages);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return messages;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Extract messages from Claude Code span events.
|
|
32
|
+
*
|
|
33
|
+
* Claude Code span hierarchy:
|
|
34
|
+
* interaction (root) → llm_request / tool → tool.execution
|
|
35
|
+
*
|
|
36
|
+
* Event names: user_prompt, api_request, tool_decision, tool_result
|
|
37
|
+
*/
|
|
38
|
+
function extractClaudeCodeMessages(span, messages) {
|
|
39
|
+
const events = span.events || [];
|
|
40
|
+
const attrs = span.attributes || {};
|
|
41
|
+
const spanName = span.name?.toLowerCase() || '';
|
|
42
|
+
// User prompt events on interaction spans
|
|
43
|
+
for (const event of events) {
|
|
44
|
+
if (event.name === 'user_prompt') {
|
|
45
|
+
const content = event.attributes?.['user.prompt'] ||
|
|
46
|
+
event.attributes?.['prompt'] ||
|
|
47
|
+
event.attributes?.['content'] || '';
|
|
48
|
+
messages.push({
|
|
49
|
+
id: `${span.spanId}-user-prompt`,
|
|
50
|
+
timestamp: event.time || span.startTime,
|
|
51
|
+
role: 'user',
|
|
52
|
+
content: content || '[User prompt — content not captured. Set OTEL_LOG_USER_PROMPTS=1]',
|
|
53
|
+
metadata: { spanId: span.spanId, spanName: span.name },
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Tool decision / tool call spans
|
|
58
|
+
if (spanName.includes('tool') && !spanName.includes('execution')) {
|
|
59
|
+
const toolName = attrs['tool_name'] || attrs['gen_ai.tool.name'] || attrs['tool.name'] || span.name;
|
|
60
|
+
const toolInput = attrs['tool_input'] || attrs['gen_ai.tool.input'] || '';
|
|
61
|
+
// Check for tool_decision events
|
|
62
|
+
const toolDecisionEvent = events.find(e => e.name === 'tool_decision');
|
|
63
|
+
const input = toolDecisionEvent?.attributes?.['input'] ||
|
|
64
|
+
toolDecisionEvent?.attributes?.['tool.input'] ||
|
|
65
|
+
toolInput;
|
|
66
|
+
if (toolName) {
|
|
67
|
+
messages.push({
|
|
68
|
+
id: `${span.spanId}-tool-call`,
|
|
69
|
+
timestamp: span.startTime,
|
|
70
|
+
role: 'tool_call',
|
|
71
|
+
content: typeof input === 'object' ? JSON.stringify(input, null, 2) : String(input || ''),
|
|
72
|
+
metadata: {
|
|
73
|
+
spanId: span.spanId,
|
|
74
|
+
spanName: span.name,
|
|
75
|
+
toolName: String(toolName),
|
|
76
|
+
durationMs: span.duration || (new Date(span.endTime).getTime() - new Date(span.startTime).getTime()),
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Tool result events
|
|
82
|
+
for (const event of events) {
|
|
83
|
+
if (event.name === 'tool_result') {
|
|
84
|
+
const content = event.attributes?.['result'] ||
|
|
85
|
+
event.attributes?.['output'] ||
|
|
86
|
+
event.attributes?.['tool.output'] || '';
|
|
87
|
+
messages.push({
|
|
88
|
+
id: `${span.spanId}-tool-result-${event.time}`,
|
|
89
|
+
timestamp: event.time || span.endTime,
|
|
90
|
+
role: 'tool_result',
|
|
91
|
+
content: typeof content === 'object' ? JSON.stringify(content, null, 2) : String(content || '[Tool result — content not captured. Set OTEL_LOG_TOOL_CONTENT=1]'),
|
|
92
|
+
metadata: {
|
|
93
|
+
spanId: span.spanId,
|
|
94
|
+
spanName: span.name,
|
|
95
|
+
toolName: String(span.attributes?.['tool_name'] || span.attributes?.['gen_ai.tool.name'] || ''),
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Tool result from tool.execution span attributes (fallback)
|
|
101
|
+
if (spanName.includes('tool.execution') || spanName.includes('tool_execution')) {
|
|
102
|
+
const output = attrs['gen_ai.tool.output'] || attrs['tool.output'] || attrs['output'];
|
|
103
|
+
if (output && !events.some(e => e.name === 'tool_result')) {
|
|
104
|
+
messages.push({
|
|
105
|
+
id: `${span.spanId}-tool-output`,
|
|
106
|
+
timestamp: span.endTime,
|
|
107
|
+
role: 'tool_result',
|
|
108
|
+
content: typeof output === 'object' ? JSON.stringify(output, null, 2) : String(output),
|
|
109
|
+
metadata: {
|
|
110
|
+
spanId: span.spanId,
|
|
111
|
+
spanName: span.name,
|
|
112
|
+
toolName: String(attrs['tool_name'] || attrs['gen_ai.tool.name'] || ''),
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// LLM response from llm_request spans
|
|
118
|
+
if (spanName.includes('llm') || spanName.includes('api_request')) {
|
|
119
|
+
const model = attrs['model'] || attrs['gen_ai.request.model'] || '';
|
|
120
|
+
const inputTokens = attrs['input_tokens'] || attrs['gen_ai.usage.input_tokens'];
|
|
121
|
+
const outputTokens = attrs['output_tokens'] || attrs['gen_ai.usage.output_tokens'];
|
|
122
|
+
// Look for api_request or llm.response events for the completion
|
|
123
|
+
const responseEvent = events.find(e => e.name === 'llm.response' || e.name === 'api_response');
|
|
124
|
+
const completion = responseEvent?.attributes?.['llm.completion'] ||
|
|
125
|
+
responseEvent?.attributes?.['completion'] ||
|
|
126
|
+
attrs['gen_ai.completion'] || '';
|
|
127
|
+
if (completion) {
|
|
128
|
+
messages.push({
|
|
129
|
+
id: `${span.spanId}-assistant`,
|
|
130
|
+
timestamp: span.endTime,
|
|
131
|
+
role: 'assistant',
|
|
132
|
+
content: String(completion),
|
|
133
|
+
metadata: {
|
|
134
|
+
spanId: span.spanId,
|
|
135
|
+
spanName: span.name,
|
|
136
|
+
model: String(model),
|
|
137
|
+
inputTokens: inputTokens ? Number(inputTokens) : undefined,
|
|
138
|
+
outputTokens: outputTokens ? Number(outputTokens) : undefined,
|
|
139
|
+
durationMs: span.duration || (new Date(span.endTime).getTime() - new Date(span.startTime).getTime()),
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Extract messages from generic OTel GenAI spans.
|
|
147
|
+
* Uses standard llm.request/llm.response events and gen_ai.* attributes.
|
|
148
|
+
*/
|
|
149
|
+
function extractGenericMessages(span, messages) {
|
|
150
|
+
const events = span.events || [];
|
|
151
|
+
const attrs = span.attributes || {};
|
|
152
|
+
// LLM request event → extract user prompt
|
|
153
|
+
const llmRequest = events.find(e => e.name === 'llm.request');
|
|
154
|
+
if (llmRequest) {
|
|
155
|
+
const prompt = llmRequest.attributes?.['llm.prompt'] ||
|
|
156
|
+
llmRequest.attributes?.['gen_ai.prompt'] ||
|
|
157
|
+
attrs['gen_ai.prompt'];
|
|
158
|
+
if (prompt) {
|
|
159
|
+
messages.push({
|
|
160
|
+
id: `${span.spanId}-prompt`,
|
|
161
|
+
timestamp: span.startTime,
|
|
162
|
+
role: 'user',
|
|
163
|
+
content: typeof prompt === 'object' ? JSON.stringify(prompt, null, 2) : String(prompt),
|
|
164
|
+
metadata: { spanId: span.spanId, spanName: span.name },
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// LLM response event → extract completion
|
|
169
|
+
const llmResponse = events.find(e => e.name === 'llm.response');
|
|
170
|
+
if (llmResponse) {
|
|
171
|
+
const completion = llmResponse.attributes?.['llm.completion'] ||
|
|
172
|
+
attrs['gen_ai.completion'];
|
|
173
|
+
if (completion) {
|
|
174
|
+
messages.push({
|
|
175
|
+
id: `${span.spanId}-completion`,
|
|
176
|
+
timestamp: span.endTime,
|
|
177
|
+
role: 'assistant',
|
|
178
|
+
content: typeof completion === 'object' ? JSON.stringify(completion, null, 2) : String(completion),
|
|
179
|
+
metadata: {
|
|
180
|
+
spanId: span.spanId,
|
|
181
|
+
spanName: span.name,
|
|
182
|
+
model: String(attrs['gen_ai.request.model'] || ''),
|
|
183
|
+
inputTokens: attrs['gen_ai.usage.input_tokens'] ? Number(attrs['gen_ai.usage.input_tokens']) : undefined,
|
|
184
|
+
outputTokens: attrs['gen_ai.usage.output_tokens'] ? Number(attrs['gen_ai.usage.output_tokens']) : undefined,
|
|
185
|
+
durationMs: span.duration || (new Date(span.endTime).getTime() - new Date(span.startTime).getTime()),
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// Tool spans → tool_call + tool_result
|
|
191
|
+
const toolName = attrs['gen_ai.tool.name'] || attrs['tool.name'];
|
|
192
|
+
if (toolName) {
|
|
193
|
+
const toolInput = attrs['gen_ai.tool.input'] || attrs['input'];
|
|
194
|
+
if (toolInput) {
|
|
195
|
+
messages.push({
|
|
196
|
+
id: `${span.spanId}-tool-call`,
|
|
197
|
+
timestamp: span.startTime,
|
|
198
|
+
role: 'tool_call',
|
|
199
|
+
content: typeof toolInput === 'object' ? JSON.stringify(toolInput, null, 2) : String(toolInput),
|
|
200
|
+
metadata: {
|
|
201
|
+
spanId: span.spanId,
|
|
202
|
+
spanName: span.name,
|
|
203
|
+
toolName: String(toolName),
|
|
204
|
+
durationMs: span.duration || (new Date(span.endTime).getTime() - new Date(span.startTime).getTime()),
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
const toolOutput = attrs['gen_ai.tool.output'] || attrs['output'];
|
|
209
|
+
if (toolOutput) {
|
|
210
|
+
messages.push({
|
|
211
|
+
id: `${span.spanId}-tool-result`,
|
|
212
|
+
timestamp: span.endTime,
|
|
213
|
+
role: 'tool_result',
|
|
214
|
+
content: typeof toolOutput === 'object' ? JSON.stringify(toolOutput, null, 2) : String(toolOutput),
|
|
215
|
+
metadata: {
|
|
216
|
+
spanId: span.spanId,
|
|
217
|
+
spanName: span.name,
|
|
218
|
+
toolName: String(toolName),
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// Fallback: attributes-only extraction when no events present
|
|
224
|
+
if (events.length === 0 && !toolName) {
|
|
225
|
+
const prompt = attrs['gen_ai.prompt'] || attrs['test.case.input'];
|
|
226
|
+
const completion = attrs['gen_ai.completion'] || attrs['test.case.output'];
|
|
227
|
+
if (prompt) {
|
|
228
|
+
messages.push({
|
|
229
|
+
id: `${span.spanId}-attr-prompt`,
|
|
230
|
+
timestamp: span.startTime,
|
|
231
|
+
role: 'user',
|
|
232
|
+
content: typeof prompt === 'object' ? JSON.stringify(prompt, null, 2) : String(prompt),
|
|
233
|
+
metadata: { spanId: span.spanId, spanName: span.name },
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
if (completion) {
|
|
237
|
+
messages.push({
|
|
238
|
+
id: `${span.spanId}-attr-completion`,
|
|
239
|
+
timestamp: span.endTime,
|
|
240
|
+
role: 'assistant',
|
|
241
|
+
content: typeof completion === 'object' ? JSON.stringify(completion, null, 2) : String(completion),
|
|
242
|
+
metadata: {
|
|
243
|
+
spanId: span.spanId,
|
|
244
|
+
spanName: span.name,
|
|
245
|
+
model: String(attrs['gen_ai.request.model'] || ''),
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=messageExtraction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messageExtraction.js","sourceRoot":"","sources":["../../../../services/traces/messageExtraction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Span Categorization Service
|
|
3
|
+
*
|
|
4
|
+
* Categorizes spans based on OTel GenAI semantic conventions.
|
|
5
|
+
* @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-agent-spans/
|
|
6
|
+
*/
|
|
7
|
+
import { Span, SpanCategory, CategorizedSpan, OTelComplianceResult } from '../../types/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Category metadata (color, icon, label)
|
|
10
|
+
*/
|
|
11
|
+
interface CategoryMeta {
|
|
12
|
+
color: string;
|
|
13
|
+
bgColor: string;
|
|
14
|
+
icon: string;
|
|
15
|
+
label: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get category metadata for a given category
|
|
19
|
+
*/
|
|
20
|
+
export declare function getCategoryMeta(category: SpanCategory): CategoryMeta;
|
|
21
|
+
/**
|
|
22
|
+
* Determine span category based on OTel gen_ai.operation.name attribute,
|
|
23
|
+
* with fallback to name-based pattern matching for legacy agents (e.g., Langgraph).
|
|
24
|
+
*/
|
|
25
|
+
export declare function getSpanCategory(span: Span): SpanCategory;
|
|
26
|
+
/**
|
|
27
|
+
* Build display name for a span using OTel attributes
|
|
28
|
+
*/
|
|
29
|
+
export declare function buildDisplayName(span: Span, category: SpanCategory): string;
|
|
30
|
+
/**
|
|
31
|
+
* Categorize a single span with full metadata
|
|
32
|
+
*/
|
|
33
|
+
export declare function categorizeSpan(span: Span): CategorizedSpan;
|
|
34
|
+
/**
|
|
35
|
+
* Categorize an array of spans
|
|
36
|
+
*/
|
|
37
|
+
export declare function categorizeSpans(spans: Span[]): CategorizedSpan[];
|
|
38
|
+
/**
|
|
39
|
+
* Categorize a span tree (preserving hierarchy)
|
|
40
|
+
*/
|
|
41
|
+
export declare function categorizeSpanTree(spans: Span[]): CategorizedSpan[];
|
|
42
|
+
/**
|
|
43
|
+
* Filter spans by categories
|
|
44
|
+
*/
|
|
45
|
+
export declare function filterSpansByCategory(spans: CategorizedSpan[], categories: SpanCategory[]): CategorizedSpan[];
|
|
46
|
+
/**
|
|
47
|
+
* Filter span tree by categories (preserves hierarchy, hides non-matching)
|
|
48
|
+
*/
|
|
49
|
+
export declare function filterSpanTreeByCategory(spans: CategorizedSpan[], categories: SpanCategory[]): CategorizedSpan[];
|
|
50
|
+
/**
|
|
51
|
+
* Count spans by category
|
|
52
|
+
*/
|
|
53
|
+
export declare function countByCategory(spans: CategorizedSpan[]): Record<SpanCategory, number>;
|
|
54
|
+
/**
|
|
55
|
+
* Check if a span follows OTEL GenAI semantic conventions
|
|
56
|
+
*/
|
|
57
|
+
export declare function checkOTelCompliance(span: CategorizedSpan): OTelComplianceResult;
|
|
58
|
+
/**
|
|
59
|
+
* Check if any span in array has OTEL compliance warnings
|
|
60
|
+
*/
|
|
61
|
+
export declare function hasAnyWarnings(spans: CategorizedSpan[]): boolean;
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=spanCategorization.d.ts.map
|