@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,309 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { debug } from '../../lib/debug.js';
|
|
6
|
+
import { fetchTracesByRunIds } from './index.js';
|
|
7
|
+
import { asyncRunStorage } from '../storage/asyncRunStorage.js';
|
|
8
|
+
import { executeBuildTrajectoryHook } from '../../lib/hooks.js';
|
|
9
|
+
import { buildEvaluatorErrorPatch } from '../../services/evaluation/evaluatorError.js';
|
|
10
|
+
// Polling configuration. Defaults are overridable via env vars so that
|
|
11
|
+
// CI / E2E runs without a real OpenSearch trace backend can fail fast
|
|
12
|
+
// instead of waiting the full ~10 min before the poller gives up.
|
|
13
|
+
//
|
|
14
|
+
// NOTE: this module is imported by browser code (RunDetailsContent.tsx) for
|
|
15
|
+
// recovery polling, where `process` is not defined. Guard the access so we
|
|
16
|
+
// silently fall back to defaults in the browser instead of throwing
|
|
17
|
+
// `ReferenceError: process is not defined` at module load time.
|
|
18
|
+
const envInt = (name, fallback) => {
|
|
19
|
+
const raw = typeof process !== 'undefined' && process?.env ? process.env[name] : undefined;
|
|
20
|
+
if (!raw)
|
|
21
|
+
return fallback;
|
|
22
|
+
const parsed = parseInt(raw, 10);
|
|
23
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
|
|
24
|
+
};
|
|
25
|
+
const DEFAULT_POLL_INTERVAL_MS = envInt('TRACE_POLL_INTERVAL_MS', 10000); // 10 seconds
|
|
26
|
+
const DEFAULT_MAX_ATTEMPTS = envInt('TRACE_POLL_MAX_ATTEMPTS', 60); // 10 minutes total at default interval
|
|
27
|
+
const MAX_POLL_CEILING = 60; // Hard ceiling: never exceed 60 attempts regardless of agent config or env override
|
|
28
|
+
/**
|
|
29
|
+
* Trace Polling Manager
|
|
30
|
+
*
|
|
31
|
+
* Singleton that manages active polling for trace availability.
|
|
32
|
+
* State is in-memory only - polling is short-lived (~10 min max).
|
|
33
|
+
*
|
|
34
|
+
* Polling runs in two places for redundancy:
|
|
35
|
+
* - Server (experimentRunner.ts): Primary - starts immediately after agent execution
|
|
36
|
+
* - Browser (RunDetailsContent.tsx): Recovery - starts when viewing a pending report
|
|
37
|
+
*/
|
|
38
|
+
class TracePollingManager {
|
|
39
|
+
constructor() {
|
|
40
|
+
this.polls = new Map();
|
|
41
|
+
this.callbacks = new Map();
|
|
42
|
+
this.completionPromises = new Map();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Start polling for traces for a specific report
|
|
46
|
+
*/
|
|
47
|
+
startPolling(reportId, runId, callbacks, options) {
|
|
48
|
+
// Don't start if already polling for this report
|
|
49
|
+
if (this.polls.has(reportId) && this.polls.get(reportId).running) {
|
|
50
|
+
debug('TracePoller', `Already polling for report ${reportId}`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const state = {
|
|
54
|
+
reportId,
|
|
55
|
+
runId,
|
|
56
|
+
attempts: 0,
|
|
57
|
+
maxAttempts: Math.min(Number.isFinite(options?.maxAttempts) ? options.maxAttempts : DEFAULT_MAX_ATTEMPTS, MAX_POLL_CEILING),
|
|
58
|
+
intervalMs: options?.intervalMs ?? DEFAULT_POLL_INTERVAL_MS,
|
|
59
|
+
lastAttempt: null,
|
|
60
|
+
running: true,
|
|
61
|
+
agentConfig: options?.agentConfig,
|
|
62
|
+
};
|
|
63
|
+
this.polls.set(reportId, state);
|
|
64
|
+
this.callbacks.set(reportId, callbacks);
|
|
65
|
+
debug('TracePoller', `Starting polling for report ${reportId}, runId ${runId}`);
|
|
66
|
+
this.poll(reportId);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Stop polling for a specific report.
|
|
70
|
+
* If a completion promise exists (from startPollingAsync), it is rejected
|
|
71
|
+
* so callers awaiting it are unblocked.
|
|
72
|
+
*/
|
|
73
|
+
stopPolling(reportId) {
|
|
74
|
+
const state = this.polls.get(reportId);
|
|
75
|
+
if (state) {
|
|
76
|
+
if (state.timerId) {
|
|
77
|
+
clearTimeout(state.timerId);
|
|
78
|
+
}
|
|
79
|
+
state.running = false;
|
|
80
|
+
debug('TracePoller', `Stopped polling for report ${reportId}`);
|
|
81
|
+
}
|
|
82
|
+
// Reject any pending completion promise so awaiting callers don't hang
|
|
83
|
+
const pending = this.completionPromises.get(reportId);
|
|
84
|
+
if (pending) {
|
|
85
|
+
pending.reject(new Error(`Polling stopped for report ${reportId}`));
|
|
86
|
+
this.completionPromises.delete(reportId);
|
|
87
|
+
}
|
|
88
|
+
this.callbacks.delete(reportId);
|
|
89
|
+
this.polls.delete(reportId);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Get the state for a specific poll
|
|
93
|
+
*/
|
|
94
|
+
getState(reportId) {
|
|
95
|
+
return this.polls.get(reportId);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get all active polls
|
|
99
|
+
*/
|
|
100
|
+
getAllActivePolls() {
|
|
101
|
+
const active = new Map();
|
|
102
|
+
this.polls.forEach((state, reportId) => {
|
|
103
|
+
if (state.running) {
|
|
104
|
+
active.set(reportId, state);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
return active;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Start polling and return a Promise that resolves when polling completes.
|
|
111
|
+
* This allows callers (e.g., benchmark runner) to await trace availability
|
|
112
|
+
* instead of firing and forgetting.
|
|
113
|
+
*
|
|
114
|
+
* If polling is already active for this reportId, returns the existing
|
|
115
|
+
* completion promise (no duplicate poll started).
|
|
116
|
+
*/
|
|
117
|
+
startPollingAsync(reportId, runId, callbacks, options) {
|
|
118
|
+
// If already polling, return the existing completion promise
|
|
119
|
+
const existing = this.completionPromises.get(reportId);
|
|
120
|
+
if (existing && this.polls.has(reportId) && this.polls.get(reportId).running) {
|
|
121
|
+
debug('TracePoller', `Already polling for report ${reportId}, returning existing promise`);
|
|
122
|
+
return new Promise((resolve, reject) => {
|
|
123
|
+
const current = this.completionPromises.get(reportId);
|
|
124
|
+
this.completionPromises.set(reportId, {
|
|
125
|
+
resolve: () => { current.resolve(); resolve(); },
|
|
126
|
+
reject: (err) => { current.reject(err); reject(err); },
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return new Promise((resolve, reject) => {
|
|
131
|
+
this.completionPromises.set(reportId, { resolve, reject });
|
|
132
|
+
// Wrap callbacks to resolve/reject the promise on completion
|
|
133
|
+
const wrappedCallbacks = {
|
|
134
|
+
onTracesFound: async (spans, report) => {
|
|
135
|
+
try {
|
|
136
|
+
await callbacks.onTracesFound(spans, report);
|
|
137
|
+
this.completionPromises.get(reportId)?.resolve();
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
this.completionPromises.get(reportId)?.reject(err);
|
|
141
|
+
}
|
|
142
|
+
finally {
|
|
143
|
+
this.completionPromises.delete(reportId);
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
onAttempt: callbacks.onAttempt,
|
|
147
|
+
onError: (error) => {
|
|
148
|
+
callbacks.onError(error);
|
|
149
|
+
this.completionPromises.get(reportId)?.reject(error);
|
|
150
|
+
this.completionPromises.delete(reportId);
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
this.startPolling(reportId, runId, wrappedCallbacks, options);
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Execute a single poll attempt
|
|
158
|
+
*/
|
|
159
|
+
async poll(reportId) {
|
|
160
|
+
const state = this.polls.get(reportId);
|
|
161
|
+
const callbacks = this.callbacks.get(reportId);
|
|
162
|
+
if (!state || !state.running) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
state.attempts++;
|
|
166
|
+
state.lastAttempt = new Date().toISOString();
|
|
167
|
+
debug('TracePoller', `Poll attempt ${state.attempts}/${state.maxAttempts} for report ${reportId}`);
|
|
168
|
+
// Notify about attempt
|
|
169
|
+
callbacks?.onAttempt?.(state.attempts, state.maxAttempts);
|
|
170
|
+
// Update report with attempt count
|
|
171
|
+
try {
|
|
172
|
+
await asyncRunStorage.updateReport(reportId, {
|
|
173
|
+
traceFetchAttempts: state.attempts,
|
|
174
|
+
lastTraceFetchAt: state.lastAttempt,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
console.warn(`[TracePoller] Failed to update attempt count:`, err);
|
|
179
|
+
}
|
|
180
|
+
try {
|
|
181
|
+
// Try to fetch traces
|
|
182
|
+
const result = await fetchTracesByRunIds([state.runId]);
|
|
183
|
+
if (result.spans && result.spans.length > 0) {
|
|
184
|
+
// Traces found!
|
|
185
|
+
debug('TracePoller', `Found ${result.spans.length} spans for report ${reportId}`);
|
|
186
|
+
// Get the current report
|
|
187
|
+
const report = await asyncRunStorage.getReportById(reportId);
|
|
188
|
+
if (!report) {
|
|
189
|
+
throw new Error(`Report ${reportId} not found`);
|
|
190
|
+
}
|
|
191
|
+
// Build trajectory from trace spans
|
|
192
|
+
const { trajectory, shouldContinuePolling } = await this.buildTrajectory(result.spans, state);
|
|
193
|
+
// Check if we should continue polling
|
|
194
|
+
if (shouldContinuePolling) {
|
|
195
|
+
if (state.attempts >= state.maxAttempts) {
|
|
196
|
+
console.log(`[TracePoller] Max attempts reached with incomplete trace`);
|
|
197
|
+
state.running = false;
|
|
198
|
+
callbacks?.onError(new Error(`Trace incomplete after ${state.maxAttempts} attempts`));
|
|
199
|
+
await asyncRunStorage.updateReport(reportId, buildEvaluatorErrorPatch('trace_incomplete', `found ${result.spans.length} spans but no root span after ${state.maxAttempts} attempts`)).catch(err => console.error(`[TracePoller] Failed to update report error status:`, err));
|
|
200
|
+
this.callbacks.delete(reportId);
|
|
201
|
+
this.polls.delete(reportId);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
// Schedule next poll
|
|
205
|
+
state.timerId = setTimeout(() => this.poll(reportId), state.intervalMs);
|
|
206
|
+
}
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
// Trajectory is ready - only overwrite if the hook produced steps
|
|
210
|
+
if (trajectory.length > 0) {
|
|
211
|
+
report.trajectory = trajectory;
|
|
212
|
+
}
|
|
213
|
+
// Stop polling and notify success
|
|
214
|
+
state.running = false;
|
|
215
|
+
try {
|
|
216
|
+
await callbacks?.onTracesFound(result.spans, report);
|
|
217
|
+
}
|
|
218
|
+
catch (callbackErr) {
|
|
219
|
+
// onTracesFound failed (e.g., judge + error recovery both failed).
|
|
220
|
+
// Write error status so the report doesn't stay stuck in 'pending'.
|
|
221
|
+
console.error(`[TracePoller] onTracesFound callback failed for report ${reportId}:`, callbackErr);
|
|
222
|
+
try {
|
|
223
|
+
await asyncRunStorage.updateReport(reportId, buildEvaluatorErrorPatch('trace_callback_failed', callbackErr));
|
|
224
|
+
}
|
|
225
|
+
catch (updateErr) {
|
|
226
|
+
console.error(`[TracePoller] CRITICAL: Failed to update report ${reportId} error status after callback failure.`, updateErr);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
this.callbacks.delete(reportId);
|
|
230
|
+
this.polls.delete(reportId);
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
// No traces yet
|
|
234
|
+
if (state.attempts >= state.maxAttempts) {
|
|
235
|
+
// Max attempts reached
|
|
236
|
+
debug('TracePoller', `Max attempts reached for report ${reportId}`);
|
|
237
|
+
state.running = false;
|
|
238
|
+
callbacks?.onError(new Error(`Traces not available after ${state.maxAttempts} attempts`));
|
|
239
|
+
// Update report with error status - critical as report will remain stuck otherwise
|
|
240
|
+
try {
|
|
241
|
+
await asyncRunStorage.updateReport(reportId, buildEvaluatorErrorPatch('trace_timeout', `traces not available after ${state.maxAttempts} attempts (${state.maxAttempts * state.intervalMs / 60000} minutes)`));
|
|
242
|
+
}
|
|
243
|
+
catch (updateErr) {
|
|
244
|
+
console.error(`[TracePoller] CRITICAL: Failed to update report ${reportId} error status. Report may be stuck in pending state.`, updateErr);
|
|
245
|
+
}
|
|
246
|
+
this.callbacks.delete(reportId);
|
|
247
|
+
this.polls.delete(reportId);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
// Schedule next poll
|
|
251
|
+
state.timerId = setTimeout(() => this.poll(reportId), state.intervalMs);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
console.error(`[TracePoller] Error polling for report ${reportId}:`, error);
|
|
257
|
+
if (state.attempts >= state.maxAttempts) {
|
|
258
|
+
state.running = false;
|
|
259
|
+
callbacks?.onError(error);
|
|
260
|
+
// Update report with error status - critical as report will remain stuck otherwise
|
|
261
|
+
try {
|
|
262
|
+
await asyncRunStorage.updateReport(reportId, buildEvaluatorErrorPatch('trace_fetch_failed', error));
|
|
263
|
+
}
|
|
264
|
+
catch (updateErr) {
|
|
265
|
+
console.error(`[TracePoller] CRITICAL: Failed to update report ${reportId} error status. Report may be stuck in pending state.`, updateErr);
|
|
266
|
+
}
|
|
267
|
+
this.callbacks.delete(reportId);
|
|
268
|
+
this.polls.delete(reportId);
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
// Schedule retry
|
|
272
|
+
state.timerId = setTimeout(() => this.poll(reportId), state.intervalMs);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Build trajectory from spans with proper error handling
|
|
278
|
+
*/
|
|
279
|
+
async buildTrajectory(spans, state) {
|
|
280
|
+
const traceId = spans[0]?.traceId;
|
|
281
|
+
if (!traceId) {
|
|
282
|
+
console.warn(`[TracePoller] No traceId found in spans`);
|
|
283
|
+
return { trajectory: [], shouldContinuePolling: false };
|
|
284
|
+
}
|
|
285
|
+
// If no buildTrajectory hook, return empty trajectory (will use SSE trajectory)
|
|
286
|
+
if (!state.agentConfig?.hooks?.buildTrajectory) {
|
|
287
|
+
return { trajectory: [], shouldContinuePolling: false };
|
|
288
|
+
}
|
|
289
|
+
try {
|
|
290
|
+
console.log(`[TracePoller] Building trajectory from hook for trace ${traceId}`);
|
|
291
|
+
const hookResult = await executeBuildTrajectoryHook(state.agentConfig.hooks, { spans, runId: state.runId }, state.agentConfig.key);
|
|
292
|
+
if (hookResult !== null) {
|
|
293
|
+
console.log(`[TracePoller] Hook returned ${hookResult.length} trajectory steps`);
|
|
294
|
+
return { trajectory: hookResult, shouldContinuePolling: false };
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
console.log(`[TracePoller] Hook returned null - trace not ready yet`);
|
|
298
|
+
return { trajectory: [], shouldContinuePolling: true };
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
catch (err) {
|
|
302
|
+
console.error(`[TracePoller] Failed to build trajectory for ${traceId}:`, err);
|
|
303
|
+
return { trajectory: [], shouldContinuePolling: false };
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// Singleton instance
|
|
308
|
+
export const tracePollingManager = new TracePollingManager();
|
|
309
|
+
//# 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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { ATTR_GEN_AI_TOOL_NAME } from '@opentelemetry/semantic-conventions/incubating';
|
|
6
|
+
/**
|
|
7
|
+
* Extract tool name from a span
|
|
8
|
+
*/
|
|
9
|
+
export function extractToolName(span) {
|
|
10
|
+
// Try gen_ai.tool.name attribute first (OTel semantic convention)
|
|
11
|
+
const toolName = span.attributes?.[ATTR_GEN_AI_TOOL_NAME];
|
|
12
|
+
if (toolName)
|
|
13
|
+
return toolName;
|
|
14
|
+
// Parse from displayName or name
|
|
15
|
+
const name = span.displayName || span.name || '';
|
|
16
|
+
// Look for tool name patterns
|
|
17
|
+
const patterns = [
|
|
18
|
+
/execute_tool\s+(\S+)/i,
|
|
19
|
+
/executeTools,\s*(\S+)/i,
|
|
20
|
+
/tool\.execute\s+(\S+)/i,
|
|
21
|
+
];
|
|
22
|
+
for (const pattern of patterns) {
|
|
23
|
+
const match = name.match(pattern);
|
|
24
|
+
if (match)
|
|
25
|
+
return match[1];
|
|
26
|
+
}
|
|
27
|
+
// Try to get the last meaningful part after comma
|
|
28
|
+
if (name.includes(',')) {
|
|
29
|
+
const parts = name.split(',');
|
|
30
|
+
const lastPart = parts[parts.length - 1].trim();
|
|
31
|
+
if (lastPart && !lastPart.includes('agent.node')) {
|
|
32
|
+
return lastPart;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Flatten span tree and collect all spans
|
|
39
|
+
*/
|
|
40
|
+
export function flattenSpans(spans) {
|
|
41
|
+
const result = [];
|
|
42
|
+
const collect = (spanList) => {
|
|
43
|
+
for (const span of spanList) {
|
|
44
|
+
result.push(span);
|
|
45
|
+
if (span.children && span.children.length > 0) {
|
|
46
|
+
collect(span.children);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
collect(spans);
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Calculate category statistics from spans
|
|
55
|
+
*
|
|
56
|
+
* Percentages are calculated relative to the sum of all category durations,
|
|
57
|
+
* not trace duration, because spans can overlap (LLM calls inside AGENT spans).
|
|
58
|
+
* This ensures percentages naturally sum to 100%.
|
|
59
|
+
*/
|
|
60
|
+
export function calculateCategoryStats(spans, _totalDuration) {
|
|
61
|
+
const categoryMap = new Map();
|
|
62
|
+
for (const span of spans) {
|
|
63
|
+
const existing = categoryMap.get(span.category) || { count: 0, duration: 0 };
|
|
64
|
+
categoryMap.set(span.category, {
|
|
65
|
+
count: existing.count + 1,
|
|
66
|
+
duration: existing.duration + (span.duration || 0),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// Calculate sum of all category durations for percentage calculation
|
|
70
|
+
let sumOfAllDurations = 0;
|
|
71
|
+
categoryMap.forEach((data) => {
|
|
72
|
+
sumOfAllDurations += data.duration;
|
|
73
|
+
});
|
|
74
|
+
const stats = [];
|
|
75
|
+
categoryMap.forEach((data, category) => {
|
|
76
|
+
stats.push({
|
|
77
|
+
category,
|
|
78
|
+
count: data.count,
|
|
79
|
+
totalDuration: data.duration,
|
|
80
|
+
percentage: sumOfAllDurations > 0 ? (data.duration / sumOfAllDurations) * 100 : 0,
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
// Sort by duration descending
|
|
84
|
+
return stats.sort((a, b) => b.totalDuration - a.totalDuration);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Extract unique tools with usage stats
|
|
88
|
+
*/
|
|
89
|
+
export function extractToolStats(spans) {
|
|
90
|
+
const toolMap = new Map();
|
|
91
|
+
for (const span of spans) {
|
|
92
|
+
if (span.category === 'TOOL') {
|
|
93
|
+
const toolName = extractToolName(span);
|
|
94
|
+
if (toolName) {
|
|
95
|
+
const existing = toolMap.get(toolName) || { count: 0, duration: 0 };
|
|
96
|
+
toolMap.set(toolName, {
|
|
97
|
+
count: existing.count + 1,
|
|
98
|
+
duration: existing.duration + (span.duration || 0),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const tools = [];
|
|
104
|
+
toolMap.forEach((data, name) => {
|
|
105
|
+
tools.push({
|
|
106
|
+
name,
|
|
107
|
+
count: data.count,
|
|
108
|
+
totalDuration: data.duration,
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
// Sort by usage count descending
|
|
112
|
+
return tools.sort((a, b) => b.count - a.count);
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=traceStats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceStats.js","sourceRoot":"","sources":["../../../../services/traces/traceStats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* traceSummary
|
|
3
|
+
*
|
|
4
|
+
* Computes a compact summary for a trace's span tree — the same set of
|
|
5
|
+
* non-redundant signals shown in the Agent Traces inline-expansion header
|
|
6
|
+
* strip and the fullscreen header. Keeping the computation in one place
|
|
7
|
+
* means inline and fullscreen render exactly the same numbers from the
|
|
8
|
+
* same source-of-truth (`categorizeSpanTree` for category buckets,
|
|
9
|
+
* `gen_ai.usage.*` attribute aggregation for tokens, and dedup over
|
|
10
|
+
* `gen_ai.request.model` / `gen_ai.response.model` / `model` for the
|
|
11
|
+
* model name list).
|
|
12
|
+
*/
|
|
13
|
+
import { Span } from '../../types/index.js';
|
|
14
|
+
export interface TraceSummary {
|
|
15
|
+
llm: number;
|
|
16
|
+
tool: number;
|
|
17
|
+
agent: number;
|
|
18
|
+
evalCount: number;
|
|
19
|
+
errors: number;
|
|
20
|
+
inputTokens: number;
|
|
21
|
+
outputTokens: number;
|
|
22
|
+
totalTokens: number;
|
|
23
|
+
/** Largest single-span input-token count in the trace. Used for
|
|
24
|
+
context-window utilization (Ctx%) — the peak request, not the sum. */
|
|
25
|
+
peakInputTokens: number;
|
|
26
|
+
models: string[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Aggregate the headline signals from a span tree.
|
|
30
|
+
*
|
|
31
|
+
* The category counts come from {@link countByCategory} on a categorized
|
|
32
|
+
* tree. The token counters look at every span (including children) and
|
|
33
|
+
* sum the OTel GenAI usage attributes, with `prompt_tokens` /
|
|
34
|
+
* `completion_tokens` accepted as fallbacks for older instrumentation
|
|
35
|
+
* that pre-dates the input/output rename. Models are collected and
|
|
36
|
+
* deduplicated across the trace because some agents fan out to multiple
|
|
37
|
+
* models in one trace (e.g. a planner + a tool-using model).
|
|
38
|
+
*/
|
|
39
|
+
export declare function computeTraceSummary(spanTree: Span[]): TraceSummary;
|
|
40
|
+
/**
|
|
41
|
+
* True when no headline signal is present (no LLM/tool/agent/eval span,
|
|
42
|
+
* no errors, no token counters, no model). Callers can use this to fall
|
|
43
|
+
* back to a "no summary attributes available" placeholder instead of
|
|
44
|
+
* collapsing to an empty bar.
|
|
45
|
+
*/
|
|
46
|
+
export declare function isEmptyTraceSummary(s: TraceSummary): boolean;
|
|
47
|
+
//# sourceMappingURL=traceSummary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceSummary.d.ts","sourceRoot":"","sources":["../../../../services/traces/traceSummary.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAI/B,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB;6EACyE;IACzE,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,YAAY,CAqClE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAU5D"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { categorizeSpanTree, countByCategory } from './spanCategorization.js';
|
|
6
|
+
import { flattenSpans } from './traceStats.js';
|
|
7
|
+
/**
|
|
8
|
+
* Aggregate the headline signals from a span tree.
|
|
9
|
+
*
|
|
10
|
+
* The category counts come from {@link countByCategory} on a categorized
|
|
11
|
+
* tree. The token counters look at every span (including children) and
|
|
12
|
+
* sum the OTel GenAI usage attributes, with `prompt_tokens` /
|
|
13
|
+
* `completion_tokens` accepted as fallbacks for older instrumentation
|
|
14
|
+
* that pre-dates the input/output rename. Models are collected and
|
|
15
|
+
* deduplicated across the trace because some agents fan out to multiple
|
|
16
|
+
* models in one trace (e.g. a planner + a tool-using model).
|
|
17
|
+
*/
|
|
18
|
+
export function computeTraceSummary(spanTree) {
|
|
19
|
+
const categorized = categorizeSpanTree(spanTree);
|
|
20
|
+
const counts = countByCategory(categorized);
|
|
21
|
+
const flat = flattenSpans(categorized);
|
|
22
|
+
let inputTokens = 0;
|
|
23
|
+
let outputTokens = 0;
|
|
24
|
+
let totalTokens = 0;
|
|
25
|
+
let peakInputTokens = 0;
|
|
26
|
+
const modelSet = new Set();
|
|
27
|
+
for (const s of flat) {
|
|
28
|
+
const a = s.attributes || {};
|
|
29
|
+
const it = Number(a['gen_ai.usage.input_tokens'] ?? a['gen_ai.usage.prompt_tokens'] ?? a['input_tokens'] ?? 0) || 0;
|
|
30
|
+
const ot = Number(a['gen_ai.usage.output_tokens'] ?? a['gen_ai.usage.completion_tokens'] ?? a['output_tokens'] ?? 0) || 0;
|
|
31
|
+
inputTokens += it;
|
|
32
|
+
outputTokens += ot;
|
|
33
|
+
totalTokens += it + ot;
|
|
34
|
+
if (it > peakInputTokens)
|
|
35
|
+
peakInputTokens = it;
|
|
36
|
+
const m = a['gen_ai.request.model'] || a['gen_ai.response.model'] || a['model'];
|
|
37
|
+
if (typeof m === 'string' && m.trim())
|
|
38
|
+
modelSet.add(m.trim());
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
llm: counts.LLM,
|
|
42
|
+
tool: counts.TOOL,
|
|
43
|
+
agent: counts.AGENT,
|
|
44
|
+
evalCount: counts.EVAL,
|
|
45
|
+
errors: counts.ERROR,
|
|
46
|
+
inputTokens,
|
|
47
|
+
outputTokens,
|
|
48
|
+
totalTokens,
|
|
49
|
+
peakInputTokens,
|
|
50
|
+
models: Array.from(modelSet),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* True when no headline signal is present (no LLM/tool/agent/eval span,
|
|
55
|
+
* no errors, no token counters, no model). Callers can use this to fall
|
|
56
|
+
* back to a "no summary attributes available" placeholder instead of
|
|
57
|
+
* collapsing to an empty bar.
|
|
58
|
+
*/
|
|
59
|
+
export function isEmptyTraceSummary(s) {
|
|
60
|
+
return (s.llm === 0 &&
|
|
61
|
+
s.tool === 0 &&
|
|
62
|
+
s.agent === 0 &&
|
|
63
|
+
s.evalCount === 0 &&
|
|
64
|
+
s.errors === 0 &&
|
|
65
|
+
s.totalTokens === 0 &&
|
|
66
|
+
s.models.length === 0);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=traceSummary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceSummary.js","sourceRoot":"","sources":["../../../../services/traces/traceSummary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAiB5C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,MAAM,WAAW,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAEvC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;QAC7B,MAAM,EAAE,GACN,MAAM,CAAC,CAAC,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3G,MAAM,EAAE,GACN,MAAM,CAAC,CAAC,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,gCAAgC,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QACjH,WAAW,IAAI,EAAE,CAAC;QAClB,YAAY,IAAI,EAAE,CAAC;QACnB,WAAW,IAAI,EAAE,GAAG,EAAE,CAAC;QACvB,IAAI,EAAE,GAAG,eAAe;YAAE,eAAe,GAAG,EAAE,CAAC;QAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;QAChF,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,IAAI;QACtB,MAAM,EAAE,MAAM,CAAC,KAAK;QACpB,WAAW;QACX,YAAY;QACZ,WAAW;QACX,eAAe;QACf,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;KAC7B,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,CAAe;IACjD,OAAO,CACL,CAAC,CAAC,GAAG,KAAK,CAAC;QACX,CAAC,CAAC,IAAI,KAAK,CAAC;QACZ,CAAC,CAAC,KAAK,KAAK,CAAC;QACb,CAAC,CAAC,SAAS,KAAK,CAAC;QACjB,CAAC,CAAC,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,WAAW,KAAK,CAAC;QACnB,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CACtB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trace Utility Functions
|
|
3
|
+
*/
|
|
4
|
+
import { Span } from '../../types/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Format duration in human-readable format
|
|
7
|
+
*/
|
|
8
|
+
export declare function formatDuration(ms: number | null | undefined): string;
|
|
9
|
+
/**
|
|
10
|
+
* Extract key attributes based on span type
|
|
11
|
+
*/
|
|
12
|
+
export declare function getKeyAttributes(span: Span): Record<string, string | number | null>;
|
|
13
|
+
/**
|
|
14
|
+
* Estimate token count from text (rough approximation)
|
|
15
|
+
*/
|
|
16
|
+
export declare function estimateTokens(text: string | object | null | undefined): number;
|
|
17
|
+
/**
|
|
18
|
+
* Truncate text with ellipsis
|
|
19
|
+
*/
|
|
20
|
+
export declare function truncateText(text: string, maxLength: number): string;
|
|
21
|
+
/**
|
|
22
|
+
* Format timestamp for display
|
|
23
|
+
*/
|
|
24
|
+
export declare function formatTimestamp(timestamp: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Format large numbers in compact notation: 999 → "999", 1200 → "1.2k", 1500000 → "1.5M"
|
|
27
|
+
*/
|
|
28
|
+
export declare function formatCompact(n: number): string;
|
|
29
|
+
/**
|
|
30
|
+
* Parse JSON safely
|
|
31
|
+
*/
|
|
32
|
+
export declare function safeParseJSON(str: string): object | string;
|
|
33
|
+
//# sourceMappingURL=utils.d.ts.map
|