@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,88 @@
|
|
|
1
|
+
import type { TrajectoryStep } from '../../../types/index.js';
|
|
2
|
+
import { BaseConnector } from '../../../services/connectors/base/BaseConnector.js';
|
|
3
|
+
import type { ConnectorAuth, ConnectorRequest, ConnectorResponse, ConnectorProgressCallback, ConnectorRawEventCallback, SubprocessConfig, ConnectorProtocol } from '../../../services/connectors/types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Subprocess Connector for CLI tools
|
|
6
|
+
* Spawns a child process and captures output
|
|
7
|
+
*/
|
|
8
|
+
export declare class SubprocessConnector extends BaseConnector {
|
|
9
|
+
readonly type: ConnectorProtocol;
|
|
10
|
+
readonly name: string;
|
|
11
|
+
readonly supportsStreaming = true;
|
|
12
|
+
/**
|
|
13
|
+
* Default trace-context strategy for subprocess agents: propagate via the
|
|
14
|
+
* W3C TRACEPARENT env var. Subclasses (Claude Code, Kiro, Pi) override
|
|
15
|
+
* `serviceName` to point at their OpenSearch service.name for Strategy C.
|
|
16
|
+
*/
|
|
17
|
+
traceContext: {
|
|
18
|
+
propagateEnv: boolean;
|
|
19
|
+
};
|
|
20
|
+
protected config: SubprocessConfig;
|
|
21
|
+
constructor(config?: Partial<SubprocessConfig>);
|
|
22
|
+
/**
|
|
23
|
+
* Build input for the subprocess
|
|
24
|
+
*/
|
|
25
|
+
buildPayload(request: ConnectorRequest): string;
|
|
26
|
+
/**
|
|
27
|
+
* Execute subprocess and capture output
|
|
28
|
+
*/
|
|
29
|
+
execute(endpoint: string, // For subprocess, this is the command name
|
|
30
|
+
request: ConnectorRequest, auth: ConnectorAuth, onProgress?: ConnectorProgressCallback, onRawEvent?: ConnectorRawEventCallback): Promise<ConnectorResponse>;
|
|
31
|
+
/** Buffer of clean stdout lines accumulated during streaming.
|
|
32
|
+
* Used by onBeforeStreamEnd() to emit a consolidated `response` step. */
|
|
33
|
+
private streamBuffer;
|
|
34
|
+
/**
|
|
35
|
+
* Parse a stderr chunk in streaming mode. Default is a no-op.
|
|
36
|
+
*
|
|
37
|
+
* Override in subclasses for CLIs that carry tool-event markers on stderr.
|
|
38
|
+
* Implementations should buffer partial lines (chunks rarely align with
|
|
39
|
+
* line boundaries) and emit steps via `onProgress` AND push them onto
|
|
40
|
+
* `trajectory` so they appear in the final response.
|
|
41
|
+
*/
|
|
42
|
+
protected parseStderrChunk(_chunk: string, _trajectory: TrajectoryStep[], _onProgress?: ConnectorProgressCallback): void;
|
|
43
|
+
/**
|
|
44
|
+
* Subclass hook: extra protocol-specific fields to merge into the
|
|
45
|
+
* connector result `metadata`. Default: none. Claude Code overrides this to
|
|
46
|
+
* surface the captured `sessionId` (Strategy D trace correlation).
|
|
47
|
+
*/
|
|
48
|
+
protected extraResultMetadata(): Record<string, any>;
|
|
49
|
+
/**
|
|
50
|
+
* Parse streaming output and emit steps in real-time.
|
|
51
|
+
*
|
|
52
|
+
* For plain-text CLIs (Kiro etc.) we:
|
|
53
|
+
* 1. strip ANSI escape codes (color, cursor moves, spinner frames)
|
|
54
|
+
* 2. drop lines that are empty / pure control characters / spinner glyphs
|
|
55
|
+
* 3. emit each surviving line as an `assistant` step immediately
|
|
56
|
+
* 4. buffer the cleaned text so `onBeforeStreamEnd()` can emit a final
|
|
57
|
+
* `response` step containing the full coherent answer (good for the
|
|
58
|
+
* judge) — without losing the live stream.
|
|
59
|
+
*/
|
|
60
|
+
protected parseStreamingOutput(chunk: string, trajectory: TrajectoryStep[], onProgress?: ConnectorProgressCallback): void;
|
|
61
|
+
/**
|
|
62
|
+
* On stream end: emit a consolidated `response` step containing the full
|
|
63
|
+
* clean output. Streaming gave the user real-time visibility; this final
|
|
64
|
+
* step gives the judge a single coherent answer to grade against.
|
|
65
|
+
*/
|
|
66
|
+
protected onBeforeStreamEnd(trajectory: TrajectoryStep[], onProgress?: ConnectorProgressCallback): void;
|
|
67
|
+
/**
|
|
68
|
+
* Parse final subprocess output
|
|
69
|
+
*/
|
|
70
|
+
parseResponse(data: {
|
|
71
|
+
stdout: string;
|
|
72
|
+
stderr: string;
|
|
73
|
+
exitCode: number;
|
|
74
|
+
}): TrajectoryStep[];
|
|
75
|
+
/**
|
|
76
|
+
* Parse JSON output into trajectory steps
|
|
77
|
+
*/
|
|
78
|
+
protected parseJsonOutput(data: any): TrajectoryStep[];
|
|
79
|
+
/**
|
|
80
|
+
* Health check - verify command exists
|
|
81
|
+
*/
|
|
82
|
+
healthCheck(endpoint: string, auth: ConnectorAuth): Promise<boolean>;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Default instance for convenience
|
|
86
|
+
*/
|
|
87
|
+
export declare const subprocessConnector: SubprocessConnector;
|
|
88
|
+
//# sourceMappingURL=SubprocessConnector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubprocessConnector.d.ts","sourceRoot":"","sources":["../../../../../services/connectors/subprocess/SubprocessConnector.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACzE,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,yBAAyB,EACzB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AAcrC;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IACpD,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAgB;IAChD,SAAkB,IAAI,EAAE,MAAM,CAAsB;IACpD,QAAQ,CAAC,iBAAiB,QAAQ;IAElC;;;;OAIG;IACM,YAAY;;MAA0B;IAE/C,SAAS,CAAC,MAAM,EAAE,gBAAgB,CAAC;gBAEvB,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAK9C;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM;IAe/C;;OAEG;IACG,OAAO,CACX,QAAQ,EAAE,MAAM,EAAE,2CAA2C;IAC7D,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,aAAa,EACnB,UAAU,CAAC,EAAE,yBAAyB,EACtC,UAAU,CAAC,EAAE,yBAAyB,GACrC,OAAO,CAAC,iBAAiB,CAAC;IA6N7B;8EAC0E;IAC1E,OAAO,CAAC,YAAY,CAAgB;IAEpC;;;;;;;OAOG;IACH,SAAS,CAAC,gBAAgB,CACxB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,cAAc,EAAE,EAC7B,WAAW,CAAC,EAAE,yBAAyB,GACtC,IAAI;IAIP;;;;OAIG;IACH,SAAS,CAAC,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAIpD;;;;;;;;;;OAUG;IACH,SAAS,CAAC,oBAAoB,CAC5B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,cAAc,EAAE,EAC5B,UAAU,CAAC,EAAE,yBAAyB,GACrC,IAAI;IAyBP;;;;OAIG;IACH,SAAS,CAAC,iBAAiB,CACzB,UAAU,EAAE,cAAc,EAAE,EAC5B,UAAU,CAAC,EAAE,yBAAyB,GACrC,IAAI;IAYP;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc,EAAE;IAkC3F;;OAEG;IACH,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,GAAG,cAAc,EAAE;IAuBtD;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;CAe3E;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,qBAA4B,CAAC"}
|
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Subprocess Connector
|
|
7
|
+
* Handles communication with CLI tools by spawning child processes
|
|
8
|
+
*/
|
|
9
|
+
import { spawn } from 'child_process';
|
|
10
|
+
import { ToolCallStatus } from '../../../types/index.js';
|
|
11
|
+
import { BaseConnector } from '../../../services/connectors/base/BaseConnector.js';
|
|
12
|
+
/**
|
|
13
|
+
* Default subprocess configuration
|
|
14
|
+
*/
|
|
15
|
+
const DEFAULT_SUBPROCESS_CONFIG = {
|
|
16
|
+
command: '',
|
|
17
|
+
args: [],
|
|
18
|
+
env: {},
|
|
19
|
+
inputMode: 'stdin',
|
|
20
|
+
outputParser: 'text',
|
|
21
|
+
timeout: 300000, // 5 minutes
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Subprocess Connector for CLI tools
|
|
25
|
+
* Spawns a child process and captures output
|
|
26
|
+
*/
|
|
27
|
+
export class SubprocessConnector extends BaseConnector {
|
|
28
|
+
constructor(config) {
|
|
29
|
+
super();
|
|
30
|
+
this.type = 'subprocess';
|
|
31
|
+
this.name = 'Subprocess (CLI)';
|
|
32
|
+
this.supportsStreaming = true;
|
|
33
|
+
/**
|
|
34
|
+
* Default trace-context strategy for subprocess agents: propagate via the
|
|
35
|
+
* W3C TRACEPARENT env var. Subclasses (Claude Code, Kiro, Pi) override
|
|
36
|
+
* `serviceName` to point at their OpenSearch service.name for Strategy C.
|
|
37
|
+
*/
|
|
38
|
+
this.traceContext = { propagateEnv: true };
|
|
39
|
+
/** Buffer of clean stdout lines accumulated during streaming.
|
|
40
|
+
* Used by onBeforeStreamEnd() to emit a consolidated `response` step. */
|
|
41
|
+
this.streamBuffer = [];
|
|
42
|
+
this.config = { ...DEFAULT_SUBPROCESS_CONFIG, ...config };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Build input for the subprocess
|
|
46
|
+
*/
|
|
47
|
+
buildPayload(request) {
|
|
48
|
+
// Build a simple prompt string for CLI tools
|
|
49
|
+
let prompt = request.testCase.initialPrompt;
|
|
50
|
+
// Add context if available
|
|
51
|
+
if (request.testCase.context && request.testCase.context.length > 0) {
|
|
52
|
+
const contextStr = request.testCase.context
|
|
53
|
+
.map(c => `${c.description}: ${c.value}`)
|
|
54
|
+
.join('\n');
|
|
55
|
+
prompt = `Context:\n${contextStr}\n\nQuestion: ${prompt}`;
|
|
56
|
+
}
|
|
57
|
+
return prompt;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Execute subprocess and capture output
|
|
61
|
+
*/
|
|
62
|
+
async execute(endpoint, // For subprocess, this is the command name
|
|
63
|
+
request, auth, onProgress, onRawEvent) {
|
|
64
|
+
this.debug('========== execute() STARTED ==========');
|
|
65
|
+
// Reset per-run streaming state so consecutive calls don't bleed.
|
|
66
|
+
this.streamBuffer = [];
|
|
67
|
+
// Apply per-request connectorConfig overrides (from agent-health.config.ts).
|
|
68
|
+
// The base SubprocessConnector previously ignored these and only used the
|
|
69
|
+
// constructor defaults. Specialized subclasses (ClaudeCode, Pi) already do
|
|
70
|
+
// this — we replicate the pattern here so any agent registered with
|
|
71
|
+
// connectorType: 'subprocess' can specify command/args/inputMode/etc.
|
|
72
|
+
const cfgOverride = (request.connectorConfig || {});
|
|
73
|
+
if (cfgOverride.command !== undefined)
|
|
74
|
+
this.config.command = cfgOverride.command;
|
|
75
|
+
if (cfgOverride.args !== undefined)
|
|
76
|
+
this.config.args = cfgOverride.args;
|
|
77
|
+
if (cfgOverride.env !== undefined)
|
|
78
|
+
this.config.env = { ...(this.config.env || {}), ...cfgOverride.env };
|
|
79
|
+
if (cfgOverride.inputMode !== undefined)
|
|
80
|
+
this.config.inputMode = cfgOverride.inputMode;
|
|
81
|
+
if (cfgOverride.outputParser !== undefined)
|
|
82
|
+
this.config.outputParser = cfgOverride.outputParser;
|
|
83
|
+
if (cfgOverride.timeout !== undefined)
|
|
84
|
+
this.config.timeout = cfgOverride.timeout;
|
|
85
|
+
if (cfgOverride.workingDir !== undefined)
|
|
86
|
+
this.config.workingDir = cfgOverride.workingDir;
|
|
87
|
+
const command = endpoint || this.config.command;
|
|
88
|
+
const args = this.config.args || [];
|
|
89
|
+
// Use pre-built payload from hook if available, otherwise build fresh
|
|
90
|
+
const input = request.payload || this.buildPayload(request);
|
|
91
|
+
// Generate runId before spawning so the subprocess can include it in OTel spans
|
|
92
|
+
const runId = `subprocess-${Date.now()}`;
|
|
93
|
+
this.debug('Command:', command);
|
|
94
|
+
this.debug('Args:', args);
|
|
95
|
+
this.debug('Input mode:', this.config.inputMode);
|
|
96
|
+
this.debug('Output parser:', this.config.outputParser);
|
|
97
|
+
this.debug('Timeout:', this.config.timeout);
|
|
98
|
+
this.debug('Input (first 500 chars):', input.substring(0, 500));
|
|
99
|
+
this.debug('Working dir:', this.config.workingDir || process.cwd());
|
|
100
|
+
this.debug('Run ID:', runId);
|
|
101
|
+
// Merge environment variables.
|
|
102
|
+
// AGENT_EVAL_RUN_ID is passed so the subprocess can set gen_ai.request.id
|
|
103
|
+
// in its OTel spans, enabling trace correlation in the traces view.
|
|
104
|
+
const env = {
|
|
105
|
+
...process.env,
|
|
106
|
+
...this.buildAuthEnv(auth),
|
|
107
|
+
...this.config.env,
|
|
108
|
+
AGENT_EVAL_RUN_ID: runId,
|
|
109
|
+
};
|
|
110
|
+
return new Promise((resolve, reject) => {
|
|
111
|
+
const trajectory = [];
|
|
112
|
+
const rawOutput = [];
|
|
113
|
+
let stdout = '';
|
|
114
|
+
let stderr = '';
|
|
115
|
+
let settled = false;
|
|
116
|
+
// Build final args (add input as argument if inputMode is 'arg').
|
|
117
|
+
//
|
|
118
|
+
// We spawn with `shell: false` (the default) and pass `args` as an
|
|
119
|
+
// array. The OS exec syscall delivers each array element as a separate
|
|
120
|
+
// argv slot to the child binary verbatim, with NO shell interpretation
|
|
121
|
+
// — so spaces, slashes, quotes, backticks, `$()`, `;`, `&`, and other
|
|
122
|
+
// shell metacharacters in the prompt are passed through as literal
|
|
123
|
+
// bytes instead of being evaluated. This is the only safe way to pass
|
|
124
|
+
// user-controlled prompt strings to spawn().
|
|
125
|
+
//
|
|
126
|
+
// Historical note: an earlier version used `shell: true` and a
|
|
127
|
+
// hand-rolled `shellQuote` that only escaped single quotes. That left
|
|
128
|
+
// a command-injection hole — a prompt containing `'$(rm -rf ~)'` would
|
|
129
|
+
// get evaluated by /bin/sh. Switching to `shell: false` removes the
|
|
130
|
+
// attack surface entirely; quoting is no longer the connector's job.
|
|
131
|
+
const finalArgs = this.config.inputMode === 'arg'
|
|
132
|
+
? [...args, input]
|
|
133
|
+
: args;
|
|
134
|
+
this.debug('Spawning process...');
|
|
135
|
+
this.debug('Full command:', command, finalArgs.join(' '));
|
|
136
|
+
const proc = spawn(command, finalArgs, {
|
|
137
|
+
env,
|
|
138
|
+
cwd: this.config.workingDir,
|
|
139
|
+
shell: false,
|
|
140
|
+
});
|
|
141
|
+
this.debug('Process spawned, PID:', proc.pid);
|
|
142
|
+
// Set timeout
|
|
143
|
+
const timeoutId = setTimeout(() => {
|
|
144
|
+
if (settled)
|
|
145
|
+
return;
|
|
146
|
+
settled = true;
|
|
147
|
+
this.debug('TIMEOUT reached, killing process');
|
|
148
|
+
proc.kill('SIGTERM');
|
|
149
|
+
reject(new Error(`Subprocess timed out after ${this.config.timeout}ms`));
|
|
150
|
+
}, this.config.timeout);
|
|
151
|
+
// Send input via stdin if inputMode is 'stdin'
|
|
152
|
+
if (this.config.inputMode === 'stdin') {
|
|
153
|
+
this.debug('Writing input to stdin...');
|
|
154
|
+
proc.stdin.write(input);
|
|
155
|
+
proc.stdin.end();
|
|
156
|
+
this.debug('stdin closed');
|
|
157
|
+
}
|
|
158
|
+
// Handle stdout
|
|
159
|
+
proc.stdout.on('data', (data) => {
|
|
160
|
+
const chunk = data.toString();
|
|
161
|
+
this.debug('stdout received:', chunk.length, 'bytes');
|
|
162
|
+
this.debug('stdout preview:', chunk.substring(0, 200));
|
|
163
|
+
stdout += chunk;
|
|
164
|
+
rawOutput.push({ type: 'stdout', data: chunk, timestamp: Date.now() });
|
|
165
|
+
onRawEvent?.({ type: 'stdout', data: chunk });
|
|
166
|
+
// For streaming mode, try to parse and emit steps
|
|
167
|
+
if (this.config.outputParser === 'streaming') {
|
|
168
|
+
this.parseStreamingOutput(chunk, trajectory, onProgress);
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
// Handle stderr.
|
|
172
|
+
//
|
|
173
|
+
// We push stderr chunks into rawOutput (alongside stdout) so the saved
|
|
174
|
+
// benchmark report retains them. Without this, agents that emit
|
|
175
|
+
// structured tool events on stderr (e.g. kiro-cli's `[tool] Running:`
|
|
176
|
+
// markers) leave no audit trail in the persisted run, and the LLM judge
|
|
177
|
+
// is forced to grade the agent's narrative alone.
|
|
178
|
+
//
|
|
179
|
+
// We also delegate streaming-mode subclasses a hook (`parseStderrChunk`)
|
|
180
|
+
// so they can convert stderr-borne events into trajectory steps in
|
|
181
|
+
// real time. The default implementation is a no-op for connectors
|
|
182
|
+
// (claude-code, plain text CLIs) that don't carry events on stderr.
|
|
183
|
+
proc.stderr.on('data', (data) => {
|
|
184
|
+
const chunk = data.toString();
|
|
185
|
+
this.debug('stderr received:', chunk.length, 'bytes');
|
|
186
|
+
this.debug('stderr:', chunk);
|
|
187
|
+
stderr += chunk;
|
|
188
|
+
rawOutput.push({ type: 'stderr', data: chunk, timestamp: Date.now() });
|
|
189
|
+
onRawEvent?.({ type: 'stderr', data: chunk });
|
|
190
|
+
if (this.config.outputParser === 'streaming') {
|
|
191
|
+
this.parseStderrChunk(chunk, trajectory, onProgress);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
// Handle process exit
|
|
195
|
+
proc.on('close', (code, signal) => {
|
|
196
|
+
this.debug('Process closed with code:', code, 'signal:', signal);
|
|
197
|
+
clearTimeout(timeoutId);
|
|
198
|
+
if (settled)
|
|
199
|
+
return;
|
|
200
|
+
settled = true;
|
|
201
|
+
if (code !== 0) {
|
|
202
|
+
// Non-zero exit code - create error response but don't reject
|
|
203
|
+
this.debug('Non-zero exit code:', code);
|
|
204
|
+
this.error(`Process exited with code ${code}`);
|
|
205
|
+
this.error('stderr:', stderr);
|
|
206
|
+
}
|
|
207
|
+
// Flush subclass buffers before finalizing streaming trajectory
|
|
208
|
+
if (this.config.outputParser === 'streaming') {
|
|
209
|
+
this.onBeforeStreamEnd(trajectory, onProgress);
|
|
210
|
+
// Surface error when streaming produced no steps
|
|
211
|
+
if (code !== 0 && trajectory.length === 0) {
|
|
212
|
+
const errorContent = stderr.trim()
|
|
213
|
+
? `Error: Process exited with code ${code}. ${stderr.trim()}`
|
|
214
|
+
: `Error: Process exited with code ${code}`;
|
|
215
|
+
const errorStep = this.createStep('tool_result', errorContent, {
|
|
216
|
+
status: ToolCallStatus.FAILURE,
|
|
217
|
+
});
|
|
218
|
+
trajectory.push(errorStep);
|
|
219
|
+
onProgress?.(errorStep);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Parse final output
|
|
223
|
+
const finalTrajectory = this.config.outputParser === 'streaming'
|
|
224
|
+
? trajectory
|
|
225
|
+
: this.parseResponse({ stdout, stderr, exitCode: code });
|
|
226
|
+
// Emit steps if not already streamed
|
|
227
|
+
if (this.config.outputParser !== 'streaming') {
|
|
228
|
+
finalTrajectory.forEach(step => onProgress?.(step));
|
|
229
|
+
}
|
|
230
|
+
this.debug('Resolving with trajectory of', finalTrajectory.length, 'steps');
|
|
231
|
+
resolve({
|
|
232
|
+
trajectory: finalTrajectory,
|
|
233
|
+
runId,
|
|
234
|
+
rawEvents: rawOutput,
|
|
235
|
+
metadata: {
|
|
236
|
+
command,
|
|
237
|
+
args: finalArgs,
|
|
238
|
+
exitCode: code,
|
|
239
|
+
stderr: stderr || undefined,
|
|
240
|
+
...this.extraResultMetadata(),
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
// Handle errors
|
|
245
|
+
proc.on('error', (error) => {
|
|
246
|
+
this.debug('ERROR event:', error.message);
|
|
247
|
+
clearTimeout(timeoutId);
|
|
248
|
+
if (settled)
|
|
249
|
+
return;
|
|
250
|
+
settled = true;
|
|
251
|
+
// Provide more helpful error messages for common failures
|
|
252
|
+
let errorMsg = `Failed to spawn subprocess: ${error.message}`;
|
|
253
|
+
if (error.message.includes('ENOENT')) {
|
|
254
|
+
errorMsg = `Command '${command}' not found. Is it installed and in PATH?`;
|
|
255
|
+
console.error(`[Subprocess] ENOENT error - command '${command}' not found in PATH`);
|
|
256
|
+
}
|
|
257
|
+
else if (error.message.includes('EACCES')) {
|
|
258
|
+
errorMsg = `Permission denied executing '${command}'. Check file permissions.`;
|
|
259
|
+
console.error(`[Subprocess] EACCES error - permission denied for '${command}'`);
|
|
260
|
+
}
|
|
261
|
+
else if (error.message.includes('EPERM')) {
|
|
262
|
+
errorMsg = `Operation not permitted for '${command}'. May require elevated privileges.`;
|
|
263
|
+
console.error(`[Subprocess] EPERM error - operation not permitted`);
|
|
264
|
+
}
|
|
265
|
+
reject(new Error(errorMsg));
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
this.debug('========== execute() COMPLETED ==========');
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Parse a stderr chunk in streaming mode. Default is a no-op.
|
|
272
|
+
*
|
|
273
|
+
* Override in subclasses for CLIs that carry tool-event markers on stderr.
|
|
274
|
+
* Implementations should buffer partial lines (chunks rarely align with
|
|
275
|
+
* line boundaries) and emit steps via `onProgress` AND push them onto
|
|
276
|
+
* `trajectory` so they appear in the final response.
|
|
277
|
+
*/
|
|
278
|
+
parseStderrChunk(_chunk, _trajectory, _onProgress) {
|
|
279
|
+
// No-op by default; KiroConnector overrides this.
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Subclass hook: extra protocol-specific fields to merge into the
|
|
283
|
+
* connector result `metadata`. Default: none. Claude Code overrides this to
|
|
284
|
+
* surface the captured `sessionId` (Strategy D trace correlation).
|
|
285
|
+
*/
|
|
286
|
+
extraResultMetadata() {
|
|
287
|
+
return {};
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Parse streaming output and emit steps in real-time.
|
|
291
|
+
*
|
|
292
|
+
* For plain-text CLIs (Kiro etc.) we:
|
|
293
|
+
* 1. strip ANSI escape codes (color, cursor moves, spinner frames)
|
|
294
|
+
* 2. drop lines that are empty / pure control characters / spinner glyphs
|
|
295
|
+
* 3. emit each surviving line as an `assistant` step immediately
|
|
296
|
+
* 4. buffer the cleaned text so `onBeforeStreamEnd()` can emit a final
|
|
297
|
+
* `response` step containing the full coherent answer (good for the
|
|
298
|
+
* judge) — without losing the live stream.
|
|
299
|
+
*/
|
|
300
|
+
parseStreamingOutput(chunk, trajectory, onProgress) {
|
|
301
|
+
// Strip ANSI: CSI sequences (\x1b[...m, cursor moves, etc.) and OSC
|
|
302
|
+
const stripped = chunk
|
|
303
|
+
.replace(/\x1b\][^\x07\x1b]*(\x07|\x1b\\)/g, '') // OSC ... BEL
|
|
304
|
+
.replace(/\x1b\[[0-9;?]*[A-Za-z]/g, '') // CSI
|
|
305
|
+
.replace(/\x1b[=>NOP\\]/g, '') // single-char escapes
|
|
306
|
+
.replace(/\r/g, '\n'); // normalize CR to NL
|
|
307
|
+
const lines = stripped.split('\n');
|
|
308
|
+
for (const raw of lines) {
|
|
309
|
+
// Drop control chars, BEL, spinner braille glyphs, and trim
|
|
310
|
+
const line = raw.replace(/[\x00-\x08\x0b-\x1f\x7f]/g, '').trim();
|
|
311
|
+
if (!line)
|
|
312
|
+
continue;
|
|
313
|
+
// Skip pure-spinner lines (just braille dots / progress glyphs)
|
|
314
|
+
if (/^[⠁-⣿\s]+$/.test(line))
|
|
315
|
+
continue;
|
|
316
|
+
// Skip very short lines that are likely artifacts
|
|
317
|
+
if (line.length < 2 && !/[A-Za-z0-9]/.test(line))
|
|
318
|
+
continue;
|
|
319
|
+
this.streamBuffer.push(line);
|
|
320
|
+
const step = this.createStep('assistant', line);
|
|
321
|
+
trajectory.push(step);
|
|
322
|
+
onProgress?.(step);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* On stream end: emit a consolidated `response` step containing the full
|
|
327
|
+
* clean output. Streaming gave the user real-time visibility; this final
|
|
328
|
+
* step gives the judge a single coherent answer to grade against.
|
|
329
|
+
*/
|
|
330
|
+
onBeforeStreamEnd(trajectory, onProgress) {
|
|
331
|
+
if (this.streamBuffer.length > 0) {
|
|
332
|
+
const finalText = this.streamBuffer.join('\n').trim();
|
|
333
|
+
this.streamBuffer = [];
|
|
334
|
+
if (finalText) {
|
|
335
|
+
const step = this.createStep('response', finalText);
|
|
336
|
+
trajectory.push(step);
|
|
337
|
+
onProgress?.(step);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Parse final subprocess output
|
|
343
|
+
*/
|
|
344
|
+
parseResponse(data) {
|
|
345
|
+
const steps = [];
|
|
346
|
+
if (this.config.outputParser === 'json') {
|
|
347
|
+
// Try to parse as JSON
|
|
348
|
+
try {
|
|
349
|
+
const parsed = JSON.parse(data.stdout);
|
|
350
|
+
return this.parseJsonOutput(parsed);
|
|
351
|
+
}
|
|
352
|
+
catch {
|
|
353
|
+
// Fall back to text parsing
|
|
354
|
+
this.debug('Failed to parse JSON output, falling back to text');
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
// Text parsing - treat entire output as response (only on success)
|
|
358
|
+
if (data.stdout.trim() && data.exitCode === 0) {
|
|
359
|
+
steps.push(this.createStep('response', data.stdout.trim()));
|
|
360
|
+
}
|
|
361
|
+
// Add error if non-zero exit code
|
|
362
|
+
if (data.exitCode !== 0) {
|
|
363
|
+
const errorContent = data.stderr.trim()
|
|
364
|
+
? `Error: Process exited with code ${data.exitCode}. ${data.stderr.trim()}`
|
|
365
|
+
: data.stdout.trim()
|
|
366
|
+
? `Error: Process exited with code ${data.exitCode}. stdout: ${data.stdout.trim()}`
|
|
367
|
+
: `Error: Process exited with code ${data.exitCode} (no output)`;
|
|
368
|
+
steps.push(this.createStep('tool_result', errorContent, {
|
|
369
|
+
status: ToolCallStatus.FAILURE,
|
|
370
|
+
}));
|
|
371
|
+
}
|
|
372
|
+
return steps;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Parse JSON output into trajectory steps
|
|
376
|
+
*/
|
|
377
|
+
parseJsonOutput(data) {
|
|
378
|
+
const steps = [];
|
|
379
|
+
if (data.thinking) {
|
|
380
|
+
steps.push(this.createStep('thinking', data.thinking));
|
|
381
|
+
}
|
|
382
|
+
if (data.steps && Array.isArray(data.steps)) {
|
|
383
|
+
for (const step of data.steps) {
|
|
384
|
+
steps.push(this.createStep(step.type || 'assistant', step.content, {
|
|
385
|
+
toolName: step.toolName,
|
|
386
|
+
toolArgs: step.toolArgs,
|
|
387
|
+
}));
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
if (data.response || data.answer || data.content) {
|
|
391
|
+
steps.push(this.createStep('response', data.response || data.answer || data.content));
|
|
392
|
+
}
|
|
393
|
+
return steps;
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Health check - verify command exists
|
|
397
|
+
*/
|
|
398
|
+
async healthCheck(endpoint, auth) {
|
|
399
|
+
const command = endpoint || this.config.command;
|
|
400
|
+
if (!command)
|
|
401
|
+
return false;
|
|
402
|
+
return new Promise((resolve) => {
|
|
403
|
+
// shell: false to avoid metacharacter expansion on the command name.
|
|
404
|
+
// `which` itself is invoked from PATH; a malicious endpoint string
|
|
405
|
+
// (e.g. `kiro-cli; rm -rf ~`) would have been evaluated under shell:
|
|
406
|
+
// true, but here it's passed as a literal argv slot to `which` which
|
|
407
|
+
// will simply return non-zero for a name that doesn't exist on PATH.
|
|
408
|
+
const proc = spawn('which', [command], { shell: false });
|
|
409
|
+
proc.on('close', (code) => resolve(code === 0));
|
|
410
|
+
proc.on('error', () => resolve(false));
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Default instance for convenience
|
|
416
|
+
*/
|
|
417
|
+
export const subprocessConnector = new SubprocessConnector();
|
|
418
|
+
//# sourceMappingURL=SubprocessConnector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubprocessConnector.js","sourceRoot":"","sources":["../../../../../services/connectors/subprocess/SubprocessConnector.ts"],"names":[],"mappings":"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"}
|