@opensearch-project/agent-health 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -5
- package/cli/dist/index.js +8292 -2938
- package/deployment/cloudformation/agent-health-observability.yaml +223 -32
- package/dist/assets/index-BfxtxmKc.css +1 -0
- package/dist/assets/index-CrjAfDHu.js +243 -0
- package/dist/index.html +2 -2
- package/docs/ARCHITECTURE.md +450 -0
- package/docs/BACKEND_JOB_QUEUE.md +405 -0
- package/docs/CLAUDE_CODE_TELEMETRY.md +283 -0
- package/docs/CLI.md +474 -0
- package/docs/CODING_AGENT_ANALYTICS.md +298 -0
- package/docs/CONFIGURATION.md +388 -0
- package/docs/CONNECTORS.md +536 -0
- package/docs/INSTRUMENT_WITH_OTEL.md +397 -0
- package/docs/ML-COMMONS-SETUP.md +289 -0
- package/docs/NPX_PACKAGING.md +195 -0
- package/docs/PERFORMANCE-MONITORING.md +200 -0
- package/docs/PERFORMANCE.md +390 -0
- package/docs/PI_PROFILING.md +169 -0
- package/docs/PLAN-non-agui-agent-support.md +525 -0
- package/docs/SDK.md +626 -0
- package/docs/SKILLS.md +264 -0
- package/docs/STORAGE_INDEX_FIELD_LIMITS.md +216 -0
- package/docs/blogs/2026-02-28-opensearch-agent-health.md +200 -0
- package/docs/blogs/getting-started-blog.md +608 -0
- package/docs/diagrams/Agent-health.excalidraw +5656 -0
- package/docs/diagrams/architecture.png +0 -0
- package/docs/plans/field-redesign.md +468 -0
- package/docs/rfcs/001-coding-agent-analytics.md +374 -0
- package/docs/rfcs/002-enterprise-leaderboard.md +267 -0
- package/docs/rfcs/003-remote-aggregation.md +146 -0
- package/docs/rfcs/004-test-sdk-v2.md +599 -0
- package/docs/skills/AGENT_HEALTH.md +652 -0
- package/docs/skills/AGENT_PROFILE.md +191 -0
- package/docs/skills/add-connector/SKILL.md +68 -0
- package/docs/skills/agent-health-profile/SKILL.md +40 -0
- package/docs/skills/config-auth/SKILL.md +194 -0
- package/docs/skills/config-auth/evals/evals.json +35 -0
- package/docs/skills/create-pr/SKILL.md +73 -0
- package/docs/skills/instrument-otel/SKILL.md +84 -0
- package/docs/skills/write-test/SKILL.md +124 -0
- package/docs/ui prd.md +376 -0
- package/examples/README.md +53 -0
- package/examples/config/agent-health.config.example.ts +155 -0
- package/examples/connectors/echo-connector.ts +131 -0
- package/examples/eval-files/demo.eval.js +128 -0
- package/examples/eval-files/ops-rca-classification.eval.js +71 -0
- package/examples/eval-files/ops-rca-evaluator.json +15 -0
- package/examples/eval-files/sdk-demo.eval.js +72 -0
- package/examples/eval-files/sdk-describe-demo.eval.js +50 -0
- package/examples/eval-files/sdk-hooks-demo.eval.js +99 -0
- package/examples/pi-profiling/README.md +77 -0
- package/examples/pi-profiling/agent-health-profile.ts +417 -0
- package/lib/dist/lib/agentUtils.d.ts +29 -0
- package/lib/dist/lib/agentUtils.d.ts.map +1 -0
- package/lib/dist/lib/agentUtils.js +43 -0
- package/lib/dist/lib/agentUtils.js.map +1 -0
- package/lib/dist/lib/bedrockCompat.d.ts +27 -0
- package/lib/dist/lib/bedrockCompat.d.ts.map +1 -0
- package/lib/dist/lib/bedrockCompat.js +83 -0
- package/lib/dist/lib/bedrockCompat.js.map +1 -0
- package/lib/dist/lib/benchmarkExport.d.ts +14 -0
- package/lib/dist/lib/benchmarkExport.d.ts.map +1 -0
- package/lib/dist/lib/benchmarkExport.js +41 -0
- package/lib/dist/lib/benchmarkExport.js.map +1 -0
- package/lib/dist/lib/benchmarkImage.d.ts +52 -0
- package/lib/dist/lib/benchmarkImage.d.ts.map +1 -0
- package/lib/dist/lib/benchmarkImage.js +113 -0
- package/lib/dist/lib/benchmarkImage.js.map +1 -0
- package/lib/dist/lib/benchmarkVersionUtils.d.ts +50 -0
- package/lib/dist/lib/benchmarkVersionUtils.d.ts.map +1 -0
- package/lib/dist/lib/benchmarkVersionUtils.js +89 -0
- package/lib/dist/lib/benchmarkVersionUtils.js.map +1 -0
- package/lib/dist/lib/chunkedFetch.d.ts +18 -0
- package/lib/dist/lib/chunkedFetch.d.ts.map +1 -0
- package/lib/dist/lib/chunkedFetch.js +40 -0
- package/lib/dist/lib/chunkedFetch.js.map +1 -0
- package/lib/dist/lib/comparisonInsights.d.ts +104 -0
- package/lib/dist/lib/comparisonInsights.d.ts.map +1 -0
- package/lib/dist/lib/comparisonInsights.js +212 -0
- package/lib/dist/lib/comparisonInsights.js.map +1 -0
- package/lib/dist/lib/config/defineConfig.d.ts +27 -0
- package/lib/dist/lib/config/defineConfig.d.ts.map +1 -0
- package/lib/dist/lib/config/defineConfig.js +28 -0
- package/lib/dist/lib/config/defineConfig.js.map +1 -0
- package/lib/dist/lib/config/index.d.ts +9 -0
- package/lib/dist/lib/config/index.d.ts.map +1 -0
- package/lib/dist/lib/config/index.js +8 -0
- package/lib/dist/lib/config/index.js.map +1 -0
- package/lib/dist/lib/config/loader.d.ts +39 -0
- package/lib/dist/lib/config/loader.d.ts.map +1 -0
- package/lib/dist/lib/config/loader.js +263 -0
- package/lib/dist/lib/config/loader.js.map +1 -0
- package/lib/dist/lib/config/statePaths.d.ts +61 -0
- package/lib/dist/lib/config/statePaths.d.ts.map +1 -0
- package/lib/dist/lib/config/statePaths.js +188 -0
- package/lib/dist/lib/config/statePaths.js.map +1 -0
- package/lib/dist/lib/config/types.d.ts +245 -0
- package/lib/dist/lib/config/types.d.ts.map +1 -0
- package/lib/dist/lib/config/types.js +6 -0
- package/lib/dist/lib/config/types.js.map +1 -0
- package/lib/dist/lib/config.d.ts +39 -0
- package/lib/dist/lib/config.d.ts.map +1 -0
- package/lib/dist/lib/config.js +118 -0
- package/lib/dist/lib/config.js.map +1 -0
- package/lib/dist/lib/constants.d.ts +81 -0
- package/lib/dist/lib/constants.d.ts.map +1 -0
- package/lib/dist/lib/constants.js +374 -0
- package/lib/dist/lib/constants.js.map +1 -0
- package/lib/dist/lib/contextFormat.d.ts +26 -0
- package/lib/dist/lib/contextFormat.d.ts.map +1 -0
- package/lib/dist/lib/contextFormat.js +28 -0
- package/lib/dist/lib/contextFormat.js.map +1 -0
- package/lib/dist/lib/contextUtilization.d.ts +23 -0
- package/lib/dist/lib/contextUtilization.d.ts.map +1 -0
- package/lib/dist/lib/contextUtilization.js +72 -0
- package/lib/dist/lib/contextUtilization.js.map +1 -0
- package/lib/dist/lib/dashboardMetrics.d.ts +87 -0
- package/lib/dist/lib/dashboardMetrics.d.ts.map +1 -0
- package/lib/dist/lib/dashboardMetrics.js +242 -0
- package/lib/dist/lib/dashboardMetrics.js.map +1 -0
- package/lib/dist/lib/dataSourceConfig.d.ts +108 -0
- package/lib/dist/lib/dataSourceConfig.d.ts.map +1 -0
- package/lib/dist/lib/dataSourceConfig.js +166 -0
- package/lib/dist/lib/dataSourceConfig.js.map +1 -0
- package/lib/dist/lib/debug.d.ts +26 -0
- package/lib/dist/lib/debug.d.ts.map +1 -0
- package/lib/dist/lib/debug.js +132 -0
- package/lib/dist/lib/debug.js.map +1 -0
- package/lib/dist/lib/diagnostics.d.ts +28 -0
- package/lib/dist/lib/diagnostics.d.ts.map +1 -0
- package/lib/dist/lib/diagnostics.js +65 -0
- package/lib/dist/lib/diagnostics.js.map +1 -0
- package/lib/dist/lib/envCompat.d.ts +27 -0
- package/lib/dist/lib/envCompat.d.ts.map +1 -0
- package/lib/dist/lib/envCompat.js +82 -0
- package/lib/dist/lib/envCompat.js.map +1 -0
- package/lib/dist/lib/evaluationRerun.d.ts +63 -0
- package/lib/dist/lib/evaluationRerun.d.ts.map +1 -0
- package/lib/dist/lib/evaluationRerun.js +85 -0
- package/lib/dist/lib/evaluationRerun.js.map +1 -0
- package/lib/dist/lib/findPackageRoot.d.ts +7 -0
- package/lib/dist/lib/findPackageRoot.d.ts.map +1 -0
- package/lib/dist/lib/findPackageRoot.js +57 -0
- package/lib/dist/lib/findPackageRoot.js.map +1 -0
- package/lib/dist/lib/hooks.d.ts +36 -0
- package/lib/dist/lib/hooks.d.ts.map +1 -0
- package/lib/dist/lib/hooks.js +112 -0
- package/lib/dist/lib/hooks.js.map +1 -0
- package/lib/dist/lib/index.d.ts +47 -0
- package/lib/dist/lib/index.d.ts.map +1 -0
- package/lib/dist/lib/index.js +62 -0
- package/lib/dist/lib/index.js.map +1 -0
- package/lib/dist/lib/labels.d.ts +90 -0
- package/lib/dist/lib/labels.d.ts.map +1 -0
- package/lib/dist/lib/labels.js +158 -0
- package/lib/dist/lib/labels.js.map +1 -0
- package/lib/dist/lib/markdown.d.ts +16 -0
- package/lib/dist/lib/markdown.d.ts.map +1 -0
- package/lib/dist/lib/markdown.js +42 -0
- package/lib/dist/lib/markdown.js.map +1 -0
- package/lib/dist/lib/matchers/expect.d.ts +3 -0
- package/lib/dist/lib/matchers/expect.d.ts.map +1 -0
- package/lib/dist/lib/matchers/expect.js +225 -0
- package/lib/dist/lib/matchers/expect.js.map +1 -0
- package/lib/dist/lib/matchers/index.d.ts +8 -0
- package/lib/dist/lib/matchers/index.d.ts.map +1 -0
- package/lib/dist/lib/matchers/index.js +9 -0
- package/lib/dist/lib/matchers/index.js.map +1 -0
- package/lib/dist/lib/matchers/judgeAccessor.d.ts +113 -0
- package/lib/dist/lib/matchers/judgeAccessor.d.ts.map +1 -0
- package/lib/dist/lib/matchers/judgeAccessor.js +183 -0
- package/lib/dist/lib/matchers/judgeAccessor.js.map +1 -0
- package/lib/dist/lib/matchers/session.d.ts +39 -0
- package/lib/dist/lib/matchers/session.d.ts.map +1 -0
- package/lib/dist/lib/matchers/session.js +116 -0
- package/lib/dist/lib/matchers/session.js.map +1 -0
- package/lib/dist/lib/matchers/traces.d.ts +70 -0
- package/lib/dist/lib/matchers/traces.d.ts.map +1 -0
- package/lib/dist/lib/matchers/traces.js +236 -0
- package/lib/dist/lib/matchers/traces.js.map +1 -0
- package/lib/dist/lib/matchers/tracesPricing.d.ts +38 -0
- package/lib/dist/lib/matchers/tracesPricing.d.ts.map +1 -0
- package/lib/dist/lib/matchers/tracesPricing.js +64 -0
- package/lib/dist/lib/matchers/tracesPricing.js.map +1 -0
- package/lib/dist/lib/matchers/types.d.ts +75 -0
- package/lib/dist/lib/matchers/types.d.ts.map +1 -0
- package/lib/dist/lib/matchers/types.js +6 -0
- package/lib/dist/lib/matchers/types.js.map +1 -0
- package/lib/dist/lib/packagePaths.d.ts +29 -0
- package/lib/dist/lib/packagePaths.d.ts.map +1 -0
- package/lib/dist/lib/packagePaths.js +63 -0
- package/lib/dist/lib/packagePaths.js.map +1 -0
- package/lib/dist/lib/performance.d.ts +51 -0
- package/lib/dist/lib/performance.d.ts.map +1 -0
- package/lib/dist/lib/performance.js +159 -0
- package/lib/dist/lib/performance.js.map +1 -0
- package/lib/dist/lib/portConfig.d.ts +29 -0
- package/lib/dist/lib/portConfig.d.ts.map +1 -0
- package/lib/dist/lib/portConfig.js +64 -0
- package/lib/dist/lib/portConfig.js.map +1 -0
- package/lib/dist/lib/preferences.d.ts +63 -0
- package/lib/dist/lib/preferences.d.ts.map +1 -0
- package/lib/dist/lib/preferences.js +117 -0
- package/lib/dist/lib/preferences.js.map +1 -0
- package/lib/dist/lib/resolveAgentModel.d.ts +22 -0
- package/lib/dist/lib/resolveAgentModel.d.ts.map +1 -0
- package/lib/dist/lib/resolveAgentModel.js +37 -0
- package/lib/dist/lib/resolveAgentModel.js.map +1 -0
- package/lib/dist/lib/runStats.d.ts +116 -0
- package/lib/dist/lib/runStats.d.ts.map +1 -0
- package/lib/dist/lib/runStats.js +192 -0
- package/lib/dist/lib/runStats.js.map +1 -0
- package/lib/dist/lib/telemetry/constants.d.ts +60 -0
- package/lib/dist/lib/telemetry/constants.d.ts.map +1 -0
- package/lib/dist/lib/telemetry/constants.js +87 -0
- package/lib/dist/lib/telemetry/constants.js.map +1 -0
- package/lib/dist/lib/telemetry/evalSpans.d.ts +61 -0
- package/lib/dist/lib/telemetry/evalSpans.d.ts.map +1 -0
- package/lib/dist/lib/telemetry/evalSpans.js +254 -0
- package/lib/dist/lib/telemetry/evalSpans.js.map +1 -0
- package/lib/dist/lib/telemetry/index.d.ts +11 -0
- package/lib/dist/lib/telemetry/index.d.ts.map +1 -0
- package/lib/dist/lib/telemetry/index.js +15 -0
- package/lib/dist/lib/telemetry/index.js.map +1 -0
- package/lib/dist/lib/telemetry/opensearchExporter.d.ts +43 -0
- package/lib/dist/lib/telemetry/opensearchExporter.d.ts.map +1 -0
- package/lib/dist/lib/telemetry/opensearchExporter.js +217 -0
- package/lib/dist/lib/telemetry/opensearchExporter.js.map +1 -0
- package/lib/dist/lib/telemetry/provider.d.ts +55 -0
- package/lib/dist/lib/telemetry/provider.d.ts.map +1 -0
- package/lib/dist/lib/telemetry/provider.js +140 -0
- package/lib/dist/lib/telemetry/provider.js.map +1 -0
- package/lib/dist/lib/testCaseLabels.d.ts +34 -0
- package/lib/dist/lib/testCaseLabels.d.ts.map +1 -0
- package/lib/dist/lib/testCaseLabels.js +88 -0
- package/lib/dist/lib/testCaseLabels.js.map +1 -0
- package/lib/dist/lib/testCaseValidation.d.ts +140 -0
- package/lib/dist/lib/testCaseValidation.d.ts.map +1 -0
- package/lib/dist/lib/testCaseValidation.js +162 -0
- package/lib/dist/lib/testCaseValidation.js.map +1 -0
- package/lib/dist/lib/testCases/agentFixture.d.ts +80 -0
- package/lib/dist/lib/testCases/agentFixture.d.ts.map +1 -0
- package/lib/dist/lib/testCases/agentFixture.js +43 -0
- package/lib/dist/lib/testCases/agentFixture.js.map +1 -0
- package/lib/dist/lib/testCases/authoringSurface.d.ts +10 -0
- package/lib/dist/lib/testCases/authoringSurface.d.ts.map +1 -0
- package/lib/dist/lib/testCases/authoringSurface.js +54 -0
- package/lib/dist/lib/testCases/authoringSurface.js.map +1 -0
- package/lib/dist/lib/testCases/codemod.d.ts +13 -0
- package/lib/dist/lib/testCases/codemod.d.ts.map +1 -0
- package/lib/dist/lib/testCases/codemod.js +169 -0
- package/lib/dist/lib/testCases/codemod.js.map +1 -0
- package/lib/dist/lib/testCases/define.d.ts +114 -0
- package/lib/dist/lib/testCases/define.d.ts.map +1 -0
- package/lib/dist/lib/testCases/define.js +253 -0
- package/lib/dist/lib/testCases/define.js.map +1 -0
- package/lib/dist/lib/testCases/evaluators.d.ts +80 -0
- package/lib/dist/lib/testCases/evaluators.d.ts.map +1 -0
- package/lib/dist/lib/testCases/evaluators.js +105 -0
- package/lib/dist/lib/testCases/evaluators.js.map +1 -0
- package/lib/dist/lib/testCases/index.d.ts +14 -0
- package/lib/dist/lib/testCases/index.d.ts.map +1 -0
- package/lib/dist/lib/testCases/index.js +12 -0
- package/lib/dist/lib/testCases/index.js.map +1 -0
- package/lib/dist/lib/testCases/judge.d.ts +165 -0
- package/lib/dist/lib/testCases/judge.d.ts.map +1 -0
- package/lib/dist/lib/testCases/judge.js +359 -0
- package/lib/dist/lib/testCases/judge.js.map +1 -0
- package/lib/dist/lib/testCases/loader.d.ts +36 -0
- package/lib/dist/lib/testCases/loader.d.ts.map +1 -0
- package/lib/dist/lib/testCases/loader.js +179 -0
- package/lib/dist/lib/testCases/loader.js.map +1 -0
- package/lib/dist/lib/testCases/types.d.ts +242 -0
- package/lib/dist/lib/testCases/types.d.ts.map +1 -0
- package/lib/dist/lib/testCases/types.js +6 -0
- package/lib/dist/lib/testCases/types.js.map +1 -0
- package/lib/dist/lib/theme.d.ts +6 -0
- package/lib/dist/lib/theme.d.ts.map +1 -0
- package/lib/dist/lib/theme.js +36 -0
- package/lib/dist/lib/theme.js.map +1 -0
- package/lib/dist/lib/uiTelemetry.d.ts +7 -0
- package/lib/dist/lib/uiTelemetry.d.ts.map +1 -0
- package/lib/dist/lib/uiTelemetry.js +25 -0
- package/lib/dist/lib/uiTelemetry.js.map +1 -0
- package/lib/dist/lib/utils.d.ts +111 -0
- package/lib/dist/lib/utils.d.ts.map +1 -0
- package/lib/dist/lib/utils.js +254 -0
- package/lib/dist/lib/utils.js.map +1 -0
- package/lib/dist/lib/workflow/consolidate.d.ts +12 -0
- package/lib/dist/lib/workflow/consolidate.d.ts.map +1 -0
- package/lib/dist/lib/workflow/consolidate.js +33 -0
- package/lib/dist/lib/workflow/consolidate.js.map +1 -0
- package/lib/dist/lib/workflow/index.d.ts +13 -0
- package/lib/dist/lib/workflow/index.d.ts.map +1 -0
- package/lib/dist/lib/workflow/index.js +12 -0
- package/lib/dist/lib/workflow/index.js.map +1 -0
- package/lib/dist/lib/workflow/ledger.d.ts +30 -0
- package/lib/dist/lib/workflow/ledger.d.ts.map +1 -0
- package/lib/dist/lib/workflow/ledger.js +41 -0
- package/lib/dist/lib/workflow/ledger.js.map +1 -0
- package/lib/dist/lib/workflow/pool.d.ts +13 -0
- package/lib/dist/lib/workflow/pool.d.ts.map +1 -0
- package/lib/dist/lib/workflow/pool.js +44 -0
- package/lib/dist/lib/workflow/pool.js.map +1 -0
- package/lib/dist/lib/workflow/source.d.ts +22 -0
- package/lib/dist/lib/workflow/source.d.ts.map +1 -0
- package/lib/dist/lib/workflow/source.js +29 -0
- package/lib/dist/lib/workflow/source.js.map +1 -0
- package/lib/dist/lib/workflow/stepB.d.ts +71 -0
- package/lib/dist/lib/workflow/stepB.d.ts.map +1 -0
- package/lib/dist/lib/workflow/stepB.js +99 -0
- package/lib/dist/lib/workflow/stepB.js.map +1 -0
- package/lib/dist/lib/workflow/types.d.ts +86 -0
- package/lib/dist/lib/workflow/types.d.ts.map +1 -0
- package/lib/dist/lib/workflow/types.js +6 -0
- package/lib/dist/lib/workflow/types.js.map +1 -0
- package/lib/dist/lib/workflow/workflow.d.ts +119 -0
- package/lib/dist/lib/workflow/workflow.d.ts.map +1 -0
- package/lib/dist/lib/workflow/workflow.js +195 -0
- package/lib/dist/lib/workflow/workflow.js.map +1 -0
- package/lib/dist/services/agent/aguiConverter.d.ts +50 -0
- package/lib/dist/services/agent/aguiConverter.d.ts.map +1 -0
- package/lib/dist/services/agent/aguiConverter.js +449 -0
- package/lib/dist/services/agent/aguiConverter.js.map +1 -0
- package/lib/dist/services/agent/index.d.ts +10 -0
- package/lib/dist/services/agent/index.d.ts.map +1 -0
- package/lib/dist/services/agent/index.js +12 -0
- package/lib/dist/services/agent/index.js.map +1 -0
- package/lib/dist/services/agent/payloadBuilder.d.ts +33 -0
- package/lib/dist/services/agent/payloadBuilder.d.ts.map +1 -0
- package/lib/dist/services/agent/payloadBuilder.js +75 -0
- package/lib/dist/services/agent/payloadBuilder.js.map +1 -0
- package/lib/dist/services/agent/sseStream.d.ts +43 -0
- package/lib/dist/services/agent/sseStream.d.ts.map +1 -0
- package/lib/dist/services/agent/sseStream.js +223 -0
- package/lib/dist/services/agent/sseStream.js.map +1 -0
- package/lib/dist/services/connectors/agui/AGUIStreamingConnector.d.ts +44 -0
- package/lib/dist/services/connectors/agui/AGUIStreamingConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/agui/AGUIStreamingConnector.js +95 -0
- package/lib/dist/services/connectors/agui/AGUIStreamingConnector.js.map +1 -0
- package/lib/dist/services/connectors/base/BaseConnector.d.ts +81 -0
- package/lib/dist/services/connectors/base/BaseConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/base/BaseConnector.js +170 -0
- package/lib/dist/services/connectors/base/BaseConnector.js.map +1 -0
- package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.d.ts +126 -0
- package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.js +417 -0
- package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.js.map +1 -0
- package/lib/dist/services/connectors/index.d.ts +13 -0
- package/lib/dist/services/connectors/index.d.ts.map +1 -0
- package/lib/dist/services/connectors/index.js +32 -0
- package/lib/dist/services/connectors/index.js.map +1 -0
- package/lib/dist/services/connectors/kiro/KiroConnector.d.ts +48 -0
- package/lib/dist/services/connectors/kiro/KiroConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/kiro/KiroConnector.js +158 -0
- package/lib/dist/services/connectors/kiro/KiroConnector.js.map +1 -0
- package/lib/dist/services/connectors/langgraph/LangGraphConnector.d.ts +36 -0
- package/lib/dist/services/connectors/langgraph/LangGraphConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/langgraph/LangGraphConnector.js +175 -0
- package/lib/dist/services/connectors/langgraph/LangGraphConnector.js.map +1 -0
- package/lib/dist/services/connectors/mock/MockConnector.d.ts +37 -0
- package/lib/dist/services/connectors/mock/MockConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/mock/MockConnector.js +120 -0
- package/lib/dist/services/connectors/mock/MockConnector.js.map +1 -0
- package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.d.ts +42 -0
- package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.js +133 -0
- package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.js.map +1 -0
- package/lib/dist/services/connectors/pi/PiConnector.d.ts +87 -0
- package/lib/dist/services/connectors/pi/PiConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/pi/PiConnector.js +274 -0
- package/lib/dist/services/connectors/pi/PiConnector.js.map +1 -0
- package/lib/dist/services/connectors/registry.d.ts +57 -0
- package/lib/dist/services/connectors/registry.d.ts.map +1 -0
- package/lib/dist/services/connectors/registry.js +106 -0
- package/lib/dist/services/connectors/registry.js.map +1 -0
- package/lib/dist/services/connectors/rest/RESTConnector.d.ts +38 -0
- package/lib/dist/services/connectors/rest/RESTConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/rest/RESTConnector.js +117 -0
- package/lib/dist/services/connectors/rest/RESTConnector.js.map +1 -0
- package/lib/dist/services/connectors/server.d.ts +13 -0
- package/lib/dist/services/connectors/server.d.ts.map +1 -0
- package/lib/dist/services/connectors/server.js +34 -0
- package/lib/dist/services/connectors/server.js.map +1 -0
- package/lib/dist/services/connectors/strands/StrandsConnector.d.ts +48 -0
- package/lib/dist/services/connectors/strands/StrandsConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/strands/StrandsConnector.js +221 -0
- package/lib/dist/services/connectors/strands/StrandsConnector.js.map +1 -0
- package/lib/dist/services/connectors/subprocess/SubprocessConnector.d.ts +88 -0
- package/lib/dist/services/connectors/subprocess/SubprocessConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/subprocess/SubprocessConnector.js +426 -0
- package/lib/dist/services/connectors/subprocess/SubprocessConnector.js.map +1 -0
- package/lib/dist/services/connectors/types.d.ts +213 -0
- package/lib/dist/services/connectors/types.d.ts.map +1 -0
- package/lib/dist/services/connectors/types.js +6 -0
- package/lib/dist/services/connectors/types.js.map +1 -0
- package/lib/dist/services/evaluation/bedrockJudge.d.ts +71 -0
- package/lib/dist/services/evaluation/bedrockJudge.d.ts.map +1 -0
- package/lib/dist/services/evaluation/bedrockJudge.js +169 -0
- package/lib/dist/services/evaluation/bedrockJudge.js.map +1 -0
- package/lib/dist/services/evaluation/evaluatorError.d.ts +56 -0
- package/lib/dist/services/evaluation/evaluatorError.d.ts.map +1 -0
- package/lib/dist/services/evaluation/evaluatorError.js +56 -0
- package/lib/dist/services/evaluation/evaluatorError.js.map +1 -0
- package/lib/dist/services/evaluation/index.d.ts +106 -0
- package/lib/dist/services/evaluation/index.d.ts.map +1 -0
- package/lib/dist/services/evaluation/index.js +684 -0
- package/lib/dist/services/evaluation/index.js.map +1 -0
- package/lib/dist/services/evaluation/mockTrajectory.d.ts +3 -0
- package/lib/dist/services/evaluation/mockTrajectory.d.ts.map +1 -0
- package/lib/dist/services/evaluation/mockTrajectory.js +72 -0
- package/lib/dist/services/evaluation/mockTrajectory.js.map +1 -0
- package/lib/dist/services/opensearch/client.d.ts +26 -0
- package/lib/dist/services/opensearch/client.d.ts.map +1 -0
- package/lib/dist/services/opensearch/client.js +131 -0
- package/lib/dist/services/opensearch/client.js.map +1 -0
- package/lib/dist/services/opensearch/index.d.ts +16 -0
- package/lib/dist/services/opensearch/index.d.ts.map +1 -0
- package/lib/dist/services/opensearch/index.js +25 -0
- package/lib/dist/services/opensearch/index.js.map +1 -0
- package/lib/dist/services/storage/asyncBenchmarkStorage.d.ts +123 -0
- package/lib/dist/services/storage/asyncBenchmarkStorage.d.ts.map +1 -0
- package/lib/dist/services/storage/asyncBenchmarkStorage.js +440 -0
- package/lib/dist/services/storage/asyncBenchmarkStorage.js.map +1 -0
- package/lib/dist/services/storage/asyncRunStorage.d.ts +135 -0
- package/lib/dist/services/storage/asyncRunStorage.d.ts.map +1 -0
- package/lib/dist/services/storage/asyncRunStorage.js +524 -0
- package/lib/dist/services/storage/asyncRunStorage.js.map +1 -0
- package/lib/dist/services/storage/asyncTestCaseStorage.d.ts +170 -0
- package/lib/dist/services/storage/asyncTestCaseStorage.d.ts.map +1 -0
- package/lib/dist/services/storage/asyncTestCaseStorage.js +301 -0
- package/lib/dist/services/storage/asyncTestCaseStorage.js.map +1 -0
- package/lib/dist/services/storage/index.d.ts +17 -0
- package/lib/dist/services/storage/index.d.ts.map +1 -0
- package/lib/dist/services/storage/index.js +20 -0
- package/lib/dist/services/storage/index.js.map +1 -0
- package/lib/dist/services/storage/migration.d.ts +54 -0
- package/lib/dist/services/storage/migration.d.ts.map +1 -0
- package/lib/dist/services/storage/migration.js +296 -0
- package/lib/dist/services/storage/migration.js.map +1 -0
- package/lib/dist/services/storage/opensearchClient.d.ts +947 -0
- package/lib/dist/services/storage/opensearchClient.d.ts.map +1 -0
- package/lib/dist/services/storage/opensearchClient.js +442 -0
- package/lib/dist/services/storage/opensearchClient.js.map +1 -0
- package/lib/dist/services/traces/browserRecovery.d.ts +37 -0
- package/lib/dist/services/traces/browserRecovery.d.ts.map +1 -0
- package/lib/dist/services/traces/browserRecovery.js +108 -0
- package/lib/dist/services/traces/browserRecovery.js.map +1 -0
- package/lib/dist/services/traces/categoryStyles.d.ts +21 -0
- package/lib/dist/services/traces/categoryStyles.d.ts.map +1 -0
- package/lib/dist/services/traces/categoryStyles.js +56 -0
- package/lib/dist/services/traces/categoryStyles.js.map +1 -0
- package/lib/dist/services/traces/executionOrderTransform.d.ts +35 -0
- package/lib/dist/services/traces/executionOrderTransform.d.ts.map +1 -0
- package/lib/dist/services/traces/executionOrderTransform.js +313 -0
- package/lib/dist/services/traces/executionOrderTransform.js.map +1 -0
- package/lib/dist/services/traces/fetchSpansForRun.d.ts +86 -0
- package/lib/dist/services/traces/fetchSpansForRun.d.ts.map +1 -0
- package/lib/dist/services/traces/fetchSpansForRun.js +69 -0
- package/lib/dist/services/traces/fetchSpansForRun.js.map +1 -0
- package/lib/dist/services/traces/flowTransform.d.ts +24 -0
- package/lib/dist/services/traces/flowTransform.d.ts.map +1 -0
- package/lib/dist/services/traces/flowTransform.js +228 -0
- package/lib/dist/services/traces/flowTransform.js.map +1 -0
- package/lib/dist/services/traces/index.d.ts +121 -0
- package/lib/dist/services/traces/index.d.ts.map +1 -0
- package/lib/dist/services/traces/index.js +255 -0
- package/lib/dist/services/traces/index.js.map +1 -0
- package/lib/dist/services/traces/intentTransform.d.ts +20 -0
- package/lib/dist/services/traces/intentTransform.d.ts.map +1 -0
- package/lib/dist/services/traces/intentTransform.js +131 -0
- package/lib/dist/services/traces/intentTransform.js.map +1 -0
- package/lib/dist/services/traces/judgeAgentsHints.d.ts +63 -0
- package/lib/dist/services/traces/judgeAgentsHints.d.ts.map +1 -0
- package/lib/dist/services/traces/judgeAgentsHints.js +89 -0
- package/lib/dist/services/traces/judgeAgentsHints.js.map +1 -0
- package/lib/dist/services/traces/messageExtraction.d.ts +15 -0
- package/lib/dist/services/traces/messageExtraction.d.ts.map +1 -0
- package/lib/dist/services/traces/messageExtraction.js +313 -0
- package/lib/dist/services/traces/messageExtraction.js.map +1 -0
- package/lib/dist/services/traces/spanCategorization.d.ts +63 -0
- package/lib/dist/services/traces/spanCategorization.d.ts.map +1 -0
- package/lib/dist/services/traces/spanCategorization.js +276 -0
- package/lib/dist/services/traces/spanCategorization.js.map +1 -0
- package/lib/dist/services/traces/spanPreprocessing.d.ts +37 -0
- package/lib/dist/services/traces/spanPreprocessing.d.ts.map +1 -0
- package/lib/dist/services/traces/spanPreprocessing.js +102 -0
- package/lib/dist/services/traces/spanPreprocessing.js.map +1 -0
- package/lib/dist/services/traces/spansToTrajectory.d.ts +36 -0
- package/lib/dist/services/traces/spansToTrajectory.d.ts.map +1 -0
- package/lib/dist/services/traces/spansToTrajectory.js +425 -0
- package/lib/dist/services/traces/spansToTrajectory.js.map +1 -0
- package/lib/dist/services/traces/toolSimilarity.d.ts +35 -0
- package/lib/dist/services/traces/toolSimilarity.d.ts.map +1 -0
- package/lib/dist/services/traces/toolSimilarity.js +203 -0
- package/lib/dist/services/traces/toolSimilarity.js.map +1 -0
- package/lib/dist/services/traces/traceComparison.d.ts +31 -0
- package/lib/dist/services/traces/traceComparison.d.ts.map +1 -0
- package/lib/dist/services/traces/traceComparison.js +318 -0
- package/lib/dist/services/traces/traceComparison.js.map +1 -0
- package/lib/dist/services/traces/traceGrouping.d.ts +19 -0
- package/lib/dist/services/traces/traceGrouping.d.ts.map +1 -0
- package/lib/dist/services/traces/traceGrouping.js +107 -0
- package/lib/dist/services/traces/traceGrouping.js.map +1 -0
- package/lib/dist/services/traces/tracePoller.d.ts +108 -0
- package/lib/dist/services/traces/tracePoller.d.ts.map +1 -0
- package/lib/dist/services/traces/tracePoller.js +475 -0
- package/lib/dist/services/traces/tracePoller.js.map +1 -0
- package/lib/dist/services/traces/traceStats.d.ts +45 -0
- package/lib/dist/services/traces/traceStats.d.ts.map +1 -0
- package/lib/dist/services/traces/traceStats.js +114 -0
- package/lib/dist/services/traces/traceStats.js.map +1 -0
- package/lib/dist/services/traces/traceSummary.d.ts +47 -0
- package/lib/dist/services/traces/traceSummary.d.ts.map +1 -0
- package/lib/dist/services/traces/traceSummary.js +68 -0
- package/lib/dist/services/traces/traceSummary.js.map +1 -0
- package/lib/dist/services/traces/utils.d.ts +33 -0
- package/lib/dist/services/traces/utils.d.ts.map +1 -0
- package/lib/dist/services/traces/utils.js +114 -0
- package/lib/dist/services/traces/utils.js.map +1 -0
- package/lib/dist/types/agui.d.ts +13 -0
- package/lib/dist/types/agui.d.ts.map +1 -0
- package/lib/dist/types/agui.js +16 -0
- package/lib/dist/types/agui.js.map +1 -0
- package/lib/dist/types/index.d.ts +1229 -0
- package/lib/dist/types/index.d.ts.map +1 -0
- package/lib/dist/types/index.js +12 -0
- package/lib/dist/types/index.js.map +1 -0
- package/lib/dist/types/skills.d.ts +146 -0
- package/lib/dist/types/skills.d.ts.map +1 -0
- package/lib/dist/types/skills.js +6 -0
- package/lib/dist/types/skills.js.map +1 -0
- package/observio-sample-agent/pi-package/README.md +112 -0
- package/observio-sample-agent/pi-package/extensions/agent-health.ts +373 -0
- package/observio-sample-agent/pi-package/package.json +17 -0
- package/observio-sample-agent/pi-package/prompts/agent-health.md +37 -0
- package/observio-sample-agent/pi-package/skills/create-pr/SKILL.md +88 -0
- package/observio-sample-agent/pi-package/skills/fix-bug/SKILL.md +71 -0
- package/observio-sample-agent/pi-package/skills/implement-feature/SKILL.md +156 -0
- package/observio-sample-agent/pi-package/skills/instrument-otel/SKILL.md +208 -0
- package/observio-sample-agent/pi-package/skills/setup-collector/SKILL.md +146 -0
- package/observio-sample-agent/pi-package/skills/write-test/SKILL.md +115 -0
- package/package.json +45 -9
- package/server/dist/app.js +34031 -18731
- package/server/dist/index.js +30737 -15338
- package/tsconfig.lib.json +71 -0
- package/dist/assets/index-BOIP5L7h.js +0 -246
- package/dist/assets/index-CU9YKpAL.css +0 -1
- package/lib/dist/config/index.js +0 -452
- package/lib/dist/index.js +0 -1725
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Absolute path to the agent-health package root, computed once per process.
|
|
3
|
+
*
|
|
4
|
+
* Works in three runtime contexts:
|
|
5
|
+
* - Production (`node_modules/@opensearch-project/agent-health/...`)
|
|
6
|
+
* - Local dev from a checkout (`<repo>/...`)
|
|
7
|
+
* - Bundled output from esbuild (`<root>/server/dist/...`)
|
|
8
|
+
*
|
|
9
|
+
* @throws if the package root cannot be located.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getPackageRoot(): string;
|
|
12
|
+
/**
|
|
13
|
+
* Resolve a path inside `<package_root>/docs/skills/`.
|
|
14
|
+
*
|
|
15
|
+
* @param fileName Defaults to `AGENT_HEALTH.md` for the top-level skill.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getSkillPath(fileName?: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Resolve the bundled pi-package directory shipped alongside the
|
|
20
|
+
* Observio sample agent. Used by the Pi judge service.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getPiPackagePath(): string;
|
|
23
|
+
/**
|
|
24
|
+
* TEST-ONLY: reset the cached root. Exported so unit tests for the
|
|
25
|
+
* resolver itself (or downstream services) can re-evaluate without
|
|
26
|
+
* spawning a fresh process.
|
|
27
|
+
*/
|
|
28
|
+
export declare function _resetPackageRootCacheForTests(): void;
|
|
29
|
+
//# sourceMappingURL=packagePaths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packagePaths.d.ts","sourceRoot":"","sources":["../../packagePaths.ts"],"names":[],"mappings":"AA4BA;;;;;;;;;GASG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,GAAE,MAA0B,GAAG,MAAM,CAEzE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,IAAI,IAAI,CAErD"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Package asset path resolution.
|
|
7
|
+
*
|
|
8
|
+
* Resolves the location of files that ship inside the agent-health package
|
|
9
|
+
* (skill markdown files, the bundled pi-package, etc.) regardless of the
|
|
10
|
+
* caller's working directory. This unblocks running agent-health from a
|
|
11
|
+
* directory other than the repo root (e.g., from inside the user's own
|
|
12
|
+
* agent project).
|
|
13
|
+
*
|
|
14
|
+
* Anchors on `import.meta.url` of THIS module, then walks upwards looking
|
|
15
|
+
* for the agent-health package's own `package.json`. The pure walking
|
|
16
|
+
* logic lives in `findPackageRoot.ts` so it can be unit-tested under
|
|
17
|
+
* Jest's CommonJS loader (which doesn't support `import.meta.url`).
|
|
18
|
+
*/
|
|
19
|
+
import { fileURLToPath } from 'url';
|
|
20
|
+
import { dirname, join } from 'path';
|
|
21
|
+
import { findPackageRootFrom } from './findPackageRoot.js';
|
|
22
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
23
|
+
let cachedRoot = null;
|
|
24
|
+
/**
|
|
25
|
+
* Absolute path to the agent-health package root, computed once per process.
|
|
26
|
+
*
|
|
27
|
+
* Works in three runtime contexts:
|
|
28
|
+
* - Production (`node_modules/@opensearch-project/agent-health/...`)
|
|
29
|
+
* - Local dev from a checkout (`<repo>/...`)
|
|
30
|
+
* - Bundled output from esbuild (`<root>/server/dist/...`)
|
|
31
|
+
*
|
|
32
|
+
* @throws if the package root cannot be located.
|
|
33
|
+
*/
|
|
34
|
+
export function getPackageRoot() {
|
|
35
|
+
if (cachedRoot)
|
|
36
|
+
return cachedRoot;
|
|
37
|
+
cachedRoot = findPackageRootFrom(__dirname);
|
|
38
|
+
return cachedRoot;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Resolve a path inside `<package_root>/docs/skills/`.
|
|
42
|
+
*
|
|
43
|
+
* @param fileName Defaults to `AGENT_HEALTH.md` for the top-level skill.
|
|
44
|
+
*/
|
|
45
|
+
export function getSkillPath(fileName = 'AGENT_HEALTH.md') {
|
|
46
|
+
return join(getPackageRoot(), 'docs', 'skills', fileName);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Resolve the bundled pi-package directory shipped alongside the
|
|
50
|
+
* Observio sample agent. Used by the Pi judge service.
|
|
51
|
+
*/
|
|
52
|
+
export function getPiPackagePath() {
|
|
53
|
+
return join(getPackageRoot(), 'observio-sample-agent', 'pi-package');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* TEST-ONLY: reset the cached root. Exported so unit tests for the
|
|
57
|
+
* resolver itself (or downstream services) can re-evaluate without
|
|
58
|
+
* spawning a fresh process.
|
|
59
|
+
*/
|
|
60
|
+
export function _resetPackageRootCacheForTests() {
|
|
61
|
+
cachedRoot = null;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=packagePaths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packagePaths.js","sourceRoot":"","sources":["../../packagePaths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,IAAI,UAAU,GAAkB,IAAI,CAAC;AAErC;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAClC,UAAU,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC5C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,WAAmB,iBAAiB;IAC/D,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,uBAAuB,EAAE,YAAY,CAAC,CAAC;AACvE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,8BAA8B;IAC5C,UAAU,GAAG,IAAI,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
interface PerformanceMetric {
|
|
2
|
+
name: string;
|
|
3
|
+
duration: number;
|
|
4
|
+
timestamp: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Start a performance measurement
|
|
8
|
+
*/
|
|
9
|
+
export declare function startMeasure(name: string): void;
|
|
10
|
+
/**
|
|
11
|
+
* End a performance measurement and log the duration
|
|
12
|
+
*/
|
|
13
|
+
export declare function endMeasure(name: string, logToConsole?: boolean): number | null;
|
|
14
|
+
/**
|
|
15
|
+
* Measure a synchronous function
|
|
16
|
+
*/
|
|
17
|
+
export declare function measureSync<T>(name: string, fn: () => T, logToConsole?: boolean): T;
|
|
18
|
+
/**
|
|
19
|
+
* Measure an async function
|
|
20
|
+
*/
|
|
21
|
+
export declare function measureAsync<T>(name: string, fn: () => Promise<T>, logToConsole?: boolean): Promise<T>;
|
|
22
|
+
/**
|
|
23
|
+
* Get all recorded metrics
|
|
24
|
+
*/
|
|
25
|
+
export declare function getMetrics(): PerformanceMetric[];
|
|
26
|
+
/**
|
|
27
|
+
* Get metrics for a specific measurement name
|
|
28
|
+
*/
|
|
29
|
+
export declare function getMetricsByName(name: string): PerformanceMetric[];
|
|
30
|
+
/**
|
|
31
|
+
* Get average duration for a metric
|
|
32
|
+
*/
|
|
33
|
+
export declare function getAverageDuration(name: string): number | null;
|
|
34
|
+
/**
|
|
35
|
+
* Clear all metrics
|
|
36
|
+
*/
|
|
37
|
+
export declare function clearMetrics(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Log a summary of all metrics
|
|
40
|
+
*/
|
|
41
|
+
export declare function logSummary(): void;
|
|
42
|
+
/**
|
|
43
|
+
* Enable performance monitoring
|
|
44
|
+
*/
|
|
45
|
+
export declare function enable(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Disable performance monitoring
|
|
48
|
+
*/
|
|
49
|
+
export declare function disable(): void;
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=performance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance.d.ts","sourceRoot":"","sources":["../../performance.ts"],"names":[],"mappings":"AAiBA,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAgBD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAO/C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,UAAO,GAAG,MAAM,GAAG,IAAI,CA2B3E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,YAAY,UAAO,GAAG,CAAC,CAShF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,YAAY,UAAO,GAClB,OAAO,CAAC,CAAC,CAAC,CASZ;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,iBAAiB,EAAE,CAEhD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAElE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM9D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAGnC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CA+BjC;AAED;;GAEG;AACH,wBAAgB,MAAM,IAAI,IAAI,CAO7B;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,IAAI,CAO9B"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
// In-memory storage for performance marks and metrics
|
|
6
|
+
const marks = new Map();
|
|
7
|
+
const metrics = [];
|
|
8
|
+
// Performance monitoring enabled in development or when DEBUG=true
|
|
9
|
+
const isEnabled = () => {
|
|
10
|
+
if (typeof window !== 'undefined') {
|
|
11
|
+
return localStorage.getItem('DEBUG_PERFORMANCE') === 'true' ||
|
|
12
|
+
process.env.NODE_ENV === 'development';
|
|
13
|
+
}
|
|
14
|
+
return process.env.DEBUG_PERFORMANCE === 'true' ||
|
|
15
|
+
process.env.NODE_ENV === 'development';
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Start a performance measurement
|
|
19
|
+
*/
|
|
20
|
+
export function startMeasure(name) {
|
|
21
|
+
if (!isEnabled())
|
|
22
|
+
return;
|
|
23
|
+
marks.set(name, {
|
|
24
|
+
name,
|
|
25
|
+
startTime: performance.now(),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* End a performance measurement and log the duration
|
|
30
|
+
*/
|
|
31
|
+
export function endMeasure(name, logToConsole = true) {
|
|
32
|
+
if (!isEnabled())
|
|
33
|
+
return null;
|
|
34
|
+
const mark = marks.get(name);
|
|
35
|
+
if (!mark) {
|
|
36
|
+
console.warn(`[Performance] No start mark found for: ${name}`);
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const duration = performance.now() - mark.startTime;
|
|
40
|
+
const metric = {
|
|
41
|
+
name,
|
|
42
|
+
duration,
|
|
43
|
+
timestamp: Date.now(),
|
|
44
|
+
};
|
|
45
|
+
metrics.push(metric);
|
|
46
|
+
marks.delete(name);
|
|
47
|
+
if (logToConsole) {
|
|
48
|
+
const color = duration < 50 ? '🟢' : duration < 200 ? '🟡' : '🔴';
|
|
49
|
+
console.log(`[Performance] ${color} ${name}: ${duration.toFixed(2)}ms`);
|
|
50
|
+
}
|
|
51
|
+
return duration;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Measure a synchronous function
|
|
55
|
+
*/
|
|
56
|
+
export function measureSync(name, fn, logToConsole = true) {
|
|
57
|
+
if (!isEnabled())
|
|
58
|
+
return fn();
|
|
59
|
+
startMeasure(name);
|
|
60
|
+
try {
|
|
61
|
+
return fn();
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
endMeasure(name, logToConsole);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Measure an async function
|
|
69
|
+
*/
|
|
70
|
+
export async function measureAsync(name, fn, logToConsole = true) {
|
|
71
|
+
if (!isEnabled())
|
|
72
|
+
return fn();
|
|
73
|
+
startMeasure(name);
|
|
74
|
+
try {
|
|
75
|
+
return await fn();
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
endMeasure(name, logToConsole);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get all recorded metrics
|
|
83
|
+
*/
|
|
84
|
+
export function getMetrics() {
|
|
85
|
+
return [...metrics];
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get metrics for a specific measurement name
|
|
89
|
+
*/
|
|
90
|
+
export function getMetricsByName(name) {
|
|
91
|
+
return metrics.filter(m => m.name === name);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get average duration for a metric
|
|
95
|
+
*/
|
|
96
|
+
export function getAverageDuration(name) {
|
|
97
|
+
const metricsForName = getMetricsByName(name);
|
|
98
|
+
if (metricsForName.length === 0)
|
|
99
|
+
return null;
|
|
100
|
+
const sum = metricsForName.reduce((acc, m) => acc + m.duration, 0);
|
|
101
|
+
return sum / metricsForName.length;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Clear all metrics
|
|
105
|
+
*/
|
|
106
|
+
export function clearMetrics() {
|
|
107
|
+
metrics.length = 0;
|
|
108
|
+
marks.clear();
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Log a summary of all metrics
|
|
112
|
+
*/
|
|
113
|
+
export function logSummary() {
|
|
114
|
+
if (!isEnabled() || metrics.length === 0)
|
|
115
|
+
return;
|
|
116
|
+
console.group('📊 Performance Summary');
|
|
117
|
+
// Group metrics by name
|
|
118
|
+
const grouped = new Map();
|
|
119
|
+
metrics.forEach(m => {
|
|
120
|
+
if (!grouped.has(m.name)) {
|
|
121
|
+
grouped.set(m.name, []);
|
|
122
|
+
}
|
|
123
|
+
grouped.get(m.name).push(m);
|
|
124
|
+
});
|
|
125
|
+
// Calculate stats for each metric
|
|
126
|
+
grouped.forEach((metricsForName, name) => {
|
|
127
|
+
const durations = metricsForName.map(m => m.duration);
|
|
128
|
+
const avg = durations.reduce((a, b) => a + b, 0) / durations.length;
|
|
129
|
+
const min = Math.min(...durations);
|
|
130
|
+
const max = Math.max(...durations);
|
|
131
|
+
console.log(`${name}:`, `avg=${avg.toFixed(2)}ms`, `min=${min.toFixed(2)}ms`, `max=${max.toFixed(2)}ms`, `count=${metricsForName.length}`);
|
|
132
|
+
});
|
|
133
|
+
console.groupEnd();
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Enable performance monitoring
|
|
137
|
+
*/
|
|
138
|
+
export function enable() {
|
|
139
|
+
if (typeof window !== 'undefined') {
|
|
140
|
+
localStorage.setItem('DEBUG_PERFORMANCE', 'true');
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
process.env.DEBUG_PERFORMANCE = 'true';
|
|
144
|
+
}
|
|
145
|
+
console.log('✅ Performance monitoring enabled');
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Disable performance monitoring
|
|
149
|
+
*/
|
|
150
|
+
export function disable() {
|
|
151
|
+
if (typeof window !== 'undefined') {
|
|
152
|
+
localStorage.removeItem('DEBUG_PERFORMANCE');
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
delete process.env.DEBUG_PERFORMANCE;
|
|
156
|
+
}
|
|
157
|
+
console.log('❌ Performance monitoring disabled');
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=performance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance.js","sourceRoot":"","sources":["../../performance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export declare const DEFAULT_BACKEND_PORT = 4001;
|
|
2
|
+
export declare const DEFAULT_DEV_PORT = 4000;
|
|
3
|
+
/**
|
|
4
|
+
* Resolve the backend server port from AH_PORT env var (legacy: AGENT_HEALTH_PORT).
|
|
5
|
+
*/
|
|
6
|
+
export declare function resolveBackendPort(): number;
|
|
7
|
+
/**
|
|
8
|
+
* Resolve the frontend dev server port from AH_DEV_PORT env var (legacy: AGENT_HEALTH_DEV_PORT).
|
|
9
|
+
*/
|
|
10
|
+
export declare function resolveDevPort(): number;
|
|
11
|
+
/**
|
|
12
|
+
* Whether the backend port was *explicitly* configured (AH_PORT /
|
|
13
|
+
* AGENT_HEALTH_PORT set) vs. silently defaulted to {@link DEFAULT_BACKEND_PORT}.
|
|
14
|
+
*
|
|
15
|
+
* Callers that dial the backend over HTTP (e.g. the SDK `judge()` matcher
|
|
16
|
+
* run outside the server lifecycle) use this to warn before defaulting to
|
|
17
|
+
* 4001 — where a foreign instance (a live demo, another checkout) may be
|
|
18
|
+
* listening. See AGENTS.md → server lifecycle.
|
|
19
|
+
*
|
|
20
|
+
* Only a value that parses to a valid integer counts as explicit — a
|
|
21
|
+
* garbage `AH_PORT=abc` silently falls back to the default in
|
|
22
|
+
* {@link resolveBackendPort}, so the warn-once must still fire for it.
|
|
23
|
+
*/
|
|
24
|
+
export declare function isBackendPortExplicit(): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Get the full backend URL (http://localhost:<port>).
|
|
27
|
+
*/
|
|
28
|
+
export declare function getBackendUrl(): string;
|
|
29
|
+
//# sourceMappingURL=portConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portConfig.d.ts","sourceRoot":"","sources":["../../portConfig.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,oBAAoB,OAAO,CAAC;AACzC,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAO3C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAOvC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAG/C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Port Configuration - Single source of truth for all port settings.
|
|
7
|
+
*
|
|
8
|
+
* Backend port: AH_PORT (default 4001)
|
|
9
|
+
* Frontend dev port: AH_DEV_PORT (default 4000)
|
|
10
|
+
*
|
|
11
|
+
* The legacy names AGENT_HEALTH_PORT and AGENT_HEALTH_DEV_PORT are still
|
|
12
|
+
* accepted for one release with a deprecation warning.
|
|
13
|
+
*/
|
|
14
|
+
import { readEnv } from './envCompat.js';
|
|
15
|
+
export const DEFAULT_BACKEND_PORT = 4001;
|
|
16
|
+
export const DEFAULT_DEV_PORT = 4000;
|
|
17
|
+
/**
|
|
18
|
+
* Resolve the backend server port from AH_PORT env var (legacy: AGENT_HEALTH_PORT).
|
|
19
|
+
*/
|
|
20
|
+
export function resolveBackendPort() {
|
|
21
|
+
const port = readEnv('AH_PORT', 'AGENT_HEALTH_PORT');
|
|
22
|
+
if (port) {
|
|
23
|
+
const parsed = parseInt(port, 10);
|
|
24
|
+
if (!isNaN(parsed))
|
|
25
|
+
return parsed;
|
|
26
|
+
}
|
|
27
|
+
return DEFAULT_BACKEND_PORT;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Resolve the frontend dev server port from AH_DEV_PORT env var (legacy: AGENT_HEALTH_DEV_PORT).
|
|
31
|
+
*/
|
|
32
|
+
export function resolveDevPort() {
|
|
33
|
+
const port = readEnv('AH_DEV_PORT', 'AGENT_HEALTH_DEV_PORT');
|
|
34
|
+
if (port) {
|
|
35
|
+
const parsed = parseInt(port, 10);
|
|
36
|
+
if (!isNaN(parsed))
|
|
37
|
+
return parsed;
|
|
38
|
+
}
|
|
39
|
+
return DEFAULT_DEV_PORT;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Whether the backend port was *explicitly* configured (AH_PORT /
|
|
43
|
+
* AGENT_HEALTH_PORT set) vs. silently defaulted to {@link DEFAULT_BACKEND_PORT}.
|
|
44
|
+
*
|
|
45
|
+
* Callers that dial the backend over HTTP (e.g. the SDK `judge()` matcher
|
|
46
|
+
* run outside the server lifecycle) use this to warn before defaulting to
|
|
47
|
+
* 4001 — where a foreign instance (a live demo, another checkout) may be
|
|
48
|
+
* listening. See AGENTS.md → server lifecycle.
|
|
49
|
+
*
|
|
50
|
+
* Only a value that parses to a valid integer counts as explicit — a
|
|
51
|
+
* garbage `AH_PORT=abc` silently falls back to the default in
|
|
52
|
+
* {@link resolveBackendPort}, so the warn-once must still fire for it.
|
|
53
|
+
*/
|
|
54
|
+
export function isBackendPortExplicit() {
|
|
55
|
+
const port = readEnv('AH_PORT', 'AGENT_HEALTH_PORT');
|
|
56
|
+
return !!port && !isNaN(parseInt(port, 10));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get the full backend URL (http://localhost:<port>).
|
|
60
|
+
*/
|
|
61
|
+
export function getBackendUrl() {
|
|
62
|
+
return `http://localhost:${resolveBackendPort()}`;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=portConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portConfig.js","sourceRoot":"","sources":["../../portConfig.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AACzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAErC;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IACrD,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;IACpC,CAAC;IACD,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,EAAE,uBAAuB,CAAC,CAAC;IAC7D,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;IACpC,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IACrD,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,oBAAoB,kBAAkB,EAAE,EAAE,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-page user preferences.
|
|
3
|
+
*
|
|
4
|
+
* Each entry below is a single localStorage key (under the
|
|
5
|
+
* `agent-health:` prefix) shared by every page that exposes the
|
|
6
|
+
* corresponding control, so e.g. picking "30d" on the Eval Runs page is
|
|
7
|
+
* also reflected on Benchmarks and Test Cases.
|
|
8
|
+
*
|
|
9
|
+
* Storage layout is intentionally a flat, JSON-serialisable key/value
|
|
10
|
+
* map: each preference is its own localStorage entry. That keeps the
|
|
11
|
+
* format portable so prefs can be exported, copied across environments,
|
|
12
|
+
* or backed up to a server store later without rewriting call sites.
|
|
13
|
+
*
|
|
14
|
+
* Helpers `getPreferencesSnapshot()` / `applyPreferencesSnapshot()`
|
|
15
|
+
* below give a single-call dump and restore for that bundle, which is
|
|
16
|
+
* the natural shape to send over the network.
|
|
17
|
+
*/
|
|
18
|
+
/** Stable, user-facing namespace for all cross-page preferences. */
|
|
19
|
+
export declare const PREFS_KEYS: {
|
|
20
|
+
/** Run-config: agent the user wants to RUN (QuickRunModal, NewRunPage). */
|
|
21
|
+
readonly agentKey: "prefs:agentKey";
|
|
22
|
+
/** Run-config: model the user wants to RUN (QuickRunModal, NewRunPage). */
|
|
23
|
+
readonly modelId: "prefs:modelId";
|
|
24
|
+
/** Time-range filter, shared by evaluation list pages and Agent Traces. */
|
|
25
|
+
readonly timeRange: "prefs:timeRange";
|
|
26
|
+
/** Agent filter dropdown shared by Benchmarks and Eval Runs. Defaults to `'all'`. */
|
|
27
|
+
readonly agentFilter: "prefs:agentFilter";
|
|
28
|
+
/** Benchmark filter dropdown shared by Test Cases (and any future page). */
|
|
29
|
+
readonly benchmarkFilter: "prefs:benchmarkFilter";
|
|
30
|
+
/** Flat / grouped view mode shared by list pages. */
|
|
31
|
+
readonly viewMode: "prefs:viewMode";
|
|
32
|
+
};
|
|
33
|
+
/** Possible string values for {@link PREFS_KEYS.timeRange}. */
|
|
34
|
+
export type SharedTimeRange = '1h' | '6h' | '1d' | '7d' | '30d' | 'all';
|
|
35
|
+
/**
|
|
36
|
+
* Convert a {@link SharedTimeRange} to a "minutes ago" cutoff suitable
|
|
37
|
+
* for the AgentTraces query. `'all'` is mapped to a very large window
|
|
38
|
+
* (90d) so that there's always *some* finite cutoff sent to the server.
|
|
39
|
+
*/
|
|
40
|
+
export declare function sharedTimeRangeToMinutes(range: SharedTimeRange): number;
|
|
41
|
+
/**
|
|
42
|
+
* Return a portable snapshot of every cross-page preference currently
|
|
43
|
+
* stored in localStorage. Keys are the unprefixed identifiers (e.g.
|
|
44
|
+
* `'prefs:timeRange'`) and values are already JSON-decoded.
|
|
45
|
+
*
|
|
46
|
+
* Use this to copy a user's preferences to clipboard, persist them
|
|
47
|
+
* server-side, or assert against them in tests.
|
|
48
|
+
*/
|
|
49
|
+
export declare function getPreferencesSnapshot(): Record<string, unknown>;
|
|
50
|
+
/**
|
|
51
|
+
* Apply a snapshot produced by {@link getPreferencesSnapshot}.
|
|
52
|
+
* Unknown keys are ignored so the snapshot format stays forward-
|
|
53
|
+
* compatible with future preferences. Pass an empty object to clear
|
|
54
|
+
* every preference (sets nothing — call {@link clearPreferences} for
|
|
55
|
+
* an explicit reset).
|
|
56
|
+
*/
|
|
57
|
+
export declare function applyPreferencesSnapshot(snapshot: Record<string, unknown>): void;
|
|
58
|
+
/**
|
|
59
|
+
* Remove every preference from localStorage. Useful for "Reset
|
|
60
|
+
* preferences" buttons and tests.
|
|
61
|
+
*/
|
|
62
|
+
export declare function clearPreferences(): void;
|
|
63
|
+
//# sourceMappingURL=preferences.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preferences.d.ts","sourceRoot":"","sources":["../../preferences.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;GAgBG;AAEH,oEAAoE;AACpE,eAAO,MAAM,UAAU;IACrB,2EAA2E;;IAE3E,2EAA2E;;IAE3E,2EAA2E;;IAE3E,qFAAqF;;IAErF,4EAA4E;;IAE5E,qDAAqD;;CAE7C,CAAC;AAEX,+DAA+D;AAC/D,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;AAExE;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CASvE;AAID;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAchE;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAWhF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CASvC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Cross-page user preferences.
|
|
7
|
+
*
|
|
8
|
+
* Each entry below is a single localStorage key (under the
|
|
9
|
+
* `agent-health:` prefix) shared by every page that exposes the
|
|
10
|
+
* corresponding control, so e.g. picking "30d" on the Eval Runs page is
|
|
11
|
+
* also reflected on Benchmarks and Test Cases.
|
|
12
|
+
*
|
|
13
|
+
* Storage layout is intentionally a flat, JSON-serialisable key/value
|
|
14
|
+
* map: each preference is its own localStorage entry. That keeps the
|
|
15
|
+
* format portable so prefs can be exported, copied across environments,
|
|
16
|
+
* or backed up to a server store later without rewriting call sites.
|
|
17
|
+
*
|
|
18
|
+
* Helpers `getPreferencesSnapshot()` / `applyPreferencesSnapshot()`
|
|
19
|
+
* below give a single-call dump and restore for that bundle, which is
|
|
20
|
+
* the natural shape to send over the network.
|
|
21
|
+
*/
|
|
22
|
+
/** Stable, user-facing namespace for all cross-page preferences. */
|
|
23
|
+
export const PREFS_KEYS = {
|
|
24
|
+
/** Run-config: agent the user wants to RUN (QuickRunModal, NewRunPage). */
|
|
25
|
+
agentKey: 'prefs:agentKey',
|
|
26
|
+
/** Run-config: model the user wants to RUN (QuickRunModal, NewRunPage). */
|
|
27
|
+
modelId: 'prefs:modelId',
|
|
28
|
+
/** Time-range filter, shared by evaluation list pages and Agent Traces. */
|
|
29
|
+
timeRange: 'prefs:timeRange',
|
|
30
|
+
/** Agent filter dropdown shared by Benchmarks and Eval Runs. Defaults to `'all'`. */
|
|
31
|
+
agentFilter: 'prefs:agentFilter',
|
|
32
|
+
/** Benchmark filter dropdown shared by Test Cases (and any future page). */
|
|
33
|
+
benchmarkFilter: 'prefs:benchmarkFilter',
|
|
34
|
+
/** Flat / grouped view mode shared by list pages. */
|
|
35
|
+
viewMode: 'prefs:viewMode',
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Convert a {@link SharedTimeRange} to a "minutes ago" cutoff suitable
|
|
39
|
+
* for the AgentTraces query. `'all'` is mapped to a very large window
|
|
40
|
+
* (90d) so that there's always *some* finite cutoff sent to the server.
|
|
41
|
+
*/
|
|
42
|
+
export function sharedTimeRangeToMinutes(range) {
|
|
43
|
+
switch (range) {
|
|
44
|
+
case '1h': return 60;
|
|
45
|
+
case '6h': return 360;
|
|
46
|
+
case '1d': return 1440;
|
|
47
|
+
case '7d': return 10080;
|
|
48
|
+
case '30d': return 43200;
|
|
49
|
+
case 'all': return 60 * 24 * 90; // 90 days as a practical "all"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const STORAGE_PREFIX = 'agent-health:';
|
|
53
|
+
/**
|
|
54
|
+
* Return a portable snapshot of every cross-page preference currently
|
|
55
|
+
* stored in localStorage. Keys are the unprefixed identifiers (e.g.
|
|
56
|
+
* `'prefs:timeRange'`) and values are already JSON-decoded.
|
|
57
|
+
*
|
|
58
|
+
* Use this to copy a user's preferences to clipboard, persist them
|
|
59
|
+
* server-side, or assert against them in tests.
|
|
60
|
+
*/
|
|
61
|
+
export function getPreferencesSnapshot() {
|
|
62
|
+
if (typeof window === 'undefined')
|
|
63
|
+
return {};
|
|
64
|
+
const out = {};
|
|
65
|
+
for (const key of Object.values(PREFS_KEYS)) {
|
|
66
|
+
try {
|
|
67
|
+
const raw = localStorage.getItem(STORAGE_PREFIX + key);
|
|
68
|
+
if (raw === null)
|
|
69
|
+
continue;
|
|
70
|
+
out[key] = JSON.parse(raw);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Skip entries we can't decode; the caller will treat them as
|
|
74
|
+
// missing and the corresponding page will fall back to its default.
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return out;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Apply a snapshot produced by {@link getPreferencesSnapshot}.
|
|
81
|
+
* Unknown keys are ignored so the snapshot format stays forward-
|
|
82
|
+
* compatible with future preferences. Pass an empty object to clear
|
|
83
|
+
* every preference (sets nothing — call {@link clearPreferences} for
|
|
84
|
+
* an explicit reset).
|
|
85
|
+
*/
|
|
86
|
+
export function applyPreferencesSnapshot(snapshot) {
|
|
87
|
+
if (typeof window === 'undefined')
|
|
88
|
+
return;
|
|
89
|
+
const known = new Set(Object.values(PREFS_KEYS));
|
|
90
|
+
for (const [key, value] of Object.entries(snapshot)) {
|
|
91
|
+
if (!known.has(key))
|
|
92
|
+
continue;
|
|
93
|
+
try {
|
|
94
|
+
localStorage.setItem(STORAGE_PREFIX + key, JSON.stringify(value));
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Quota / storage disabled — ignore.
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Remove every preference from localStorage. Useful for "Reset
|
|
103
|
+
* preferences" buttons and tests.
|
|
104
|
+
*/
|
|
105
|
+
export function clearPreferences() {
|
|
106
|
+
if (typeof window === 'undefined')
|
|
107
|
+
return;
|
|
108
|
+
for (const key of Object.values(PREFS_KEYS)) {
|
|
109
|
+
try {
|
|
110
|
+
localStorage.removeItem(STORAGE_PREFIX + key);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// ignore
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=preferences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preferences.js","sourceRoot":"","sources":["../../preferences.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;;;GAgBG;AAEH,oEAAoE;AACpE,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,2EAA2E;IAC3E,QAAQ,EAAE,gBAAgB;IAC1B,2EAA2E;IAC3E,OAAO,EAAE,eAAe;IACxB,2EAA2E;IAC3E,SAAS,EAAE,iBAAiB;IAC5B,qFAAqF;IACrF,WAAW,EAAE,mBAAmB;IAChC,4EAA4E;IAC5E,eAAe,EAAE,uBAAuB;IACxC,qDAAqD;IACrD,QAAQ,EAAE,gBAAgB;CAClB,CAAC;AAKX;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAsB;IAC7D,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC;QACtB,KAAK,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC;QACvB,KAAK,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC;QACxB,KAAK,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC;QACzB,KAAK,KAAK,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,+BAA+B;IAClE,CAAC;AACH,CAAC;AAED,MAAM,cAAc,GAAG,eAAe,CAAC;AAEvC;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB;IACpC,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IAC7C,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC;YACvD,IAAI,GAAG,KAAK,IAAI;gBAAE,SAAS;YAC3B,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,8DAA8D;YAC9D,oEAAoE;QACtE,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAiC;IACxE,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IAC1C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IACzD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC9B,IAAI,CAAC;YACH,YAAY,CAAC,OAAO,CAAC,cAAc,GAAG,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,YAAY,CAAC,UAAU,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AgentConfig } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve the LLM an agent runs on.
|
|
4
|
+
*
|
|
5
|
+
* The agent's model is owned by the agent's OWN config (`agent-health.config.ts`),
|
|
6
|
+
* NOT a user-facing "agent model" selector. There is intentionally no run-level
|
|
7
|
+
* or UI/CLI way to override it — picking a model separately from the agent is a
|
|
8
|
+
* leaky abstraction (subprocess agents like Claude Code / pi ignore it and run
|
|
9
|
+
* on whatever their connector is configured with). Claude-like agents that DO
|
|
10
|
+
* accept a model take it via their connector config.
|
|
11
|
+
*
|
|
12
|
+
* Resolution order (all from the agent's `connectorConfig`):
|
|
13
|
+
* 1. `connectorConfig.model` — pi / streaming / openai-compatible
|
|
14
|
+
* 2. `connectorConfig.env.ANTHROPIC_MODEL` — claude-code
|
|
15
|
+
* 3. `connectorConfig.args` `--model <id>` — any subprocess agent passing a flag
|
|
16
|
+
*
|
|
17
|
+
* `fallback` exists only for backward compatibility with runs/agents created
|
|
18
|
+
* before the agent-model concept was removed (where the run carried a
|
|
19
|
+
* user-selected `modelId`). New code should not rely on it.
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveAgentModel(agent: AgentConfig | undefined | null, fallback?: string): string;
|
|
22
|
+
//# sourceMappingURL=resolveAgentModel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveAgentModel.d.ts","sourceRoot":"","sources":["../../resolveAgentModel.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,EACrC,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAWR"}
|