@wingman-ai/gateway 0.1.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/.wingman/agents/README.md +161 -0
- package/.wingman/agents/coding/agent.md +147 -0
- package/.wingman/agents/coding/implementor.md +56 -0
- package/.wingman/agents/main/agent.md +19 -0
- package/.wingman/agents/researcher/agent.md +62 -0
- package/.wingman/agents/stock-trader/agent.md +223 -0
- package/.wingman/agents/stock-trader/chain-curator.md +24 -0
- package/.wingman/agents/stock-trader/goal-translator.md +42 -0
- package/.wingman/agents/stock-trader/guardrails-veto.md +11 -0
- package/.wingman/agents/stock-trader/path-planner.md +23 -0
- package/.wingman/agents/stock-trader/regime-analyst.md +15 -0
- package/.wingman/agents/stock-trader/risk.md +20 -0
- package/.wingman/agents/stock-trader/selection.md +22 -0
- package/.wingman/agents/stock-trader/strategy-composer.md +38 -0
- package/.wingman/agents/wingman/agent.json +12 -0
- package/bin/wingman +7 -0
- package/dist/agent/config/agentConfig.cjs +95 -0
- package/dist/agent/config/agentConfig.d.ts +187 -0
- package/dist/agent/config/agentConfig.js +52 -0
- package/dist/agent/config/agentLoader.cjs +242 -0
- package/dist/agent/config/agentLoader.d.ts +42 -0
- package/dist/agent/config/agentLoader.js +208 -0
- package/dist/agent/config/mcpClientManager.cjs +168 -0
- package/dist/agent/config/mcpClientManager.d.ts +41 -0
- package/dist/agent/config/mcpClientManager.js +134 -0
- package/dist/agent/config/modelFactory.cjs +175 -0
- package/dist/agent/config/modelFactory.d.ts +33 -0
- package/dist/agent/config/modelFactory.js +141 -0
- package/dist/agent/config/toolRegistry.cjs +111 -0
- package/dist/agent/config/toolRegistry.d.ts +25 -0
- package/dist/agent/config/toolRegistry.js +71 -0
- package/dist/agent/middleware/additional-messages.cjs +60 -0
- package/dist/agent/middleware/additional-messages.d.ts +7 -0
- package/dist/agent/middleware/additional-messages.js +26 -0
- package/dist/agent/middleware/hooks/executor.cjs +137 -0
- package/dist/agent/middleware/hooks/executor.d.ts +52 -0
- package/dist/agent/middleware/hooks/executor.js +103 -0
- package/dist/agent/middleware/hooks/input-builder.cjs +55 -0
- package/dist/agent/middleware/hooks/input-builder.d.ts +15 -0
- package/dist/agent/middleware/hooks/input-builder.js +21 -0
- package/dist/agent/middleware/hooks/matcher.cjs +59 -0
- package/dist/agent/middleware/hooks/matcher.d.ts +27 -0
- package/dist/agent/middleware/hooks/matcher.js +22 -0
- package/dist/agent/middleware/hooks/merger.cjs +54 -0
- package/dist/agent/middleware/hooks/merger.d.ts +18 -0
- package/dist/agent/middleware/hooks/merger.js +20 -0
- package/dist/agent/middleware/hooks/types.cjs +62 -0
- package/dist/agent/middleware/hooks/types.d.ts +82 -0
- package/dist/agent/middleware/hooks/types.js +19 -0
- package/dist/agent/middleware/hooks.cjs +79 -0
- package/dist/agent/middleware/hooks.d.ts +19 -0
- package/dist/agent/middleware/hooks.js +45 -0
- package/dist/agent/middleware/media-compat.cjs +80 -0
- package/dist/agent/middleware/media-compat.d.ts +7 -0
- package/dist/agent/middleware/media-compat.js +46 -0
- package/dist/agent/tests/agentConfig.test.cjs +132 -0
- package/dist/agent/tests/agentConfig.test.d.ts +1 -0
- package/dist/agent/tests/agentConfig.test.js +126 -0
- package/dist/agent/tests/agentLoader.test.cjs +235 -0
- package/dist/agent/tests/agentLoader.test.d.ts +1 -0
- package/dist/agent/tests/agentLoader.test.js +229 -0
- package/dist/agent/tests/modelFactory.test.cjs +114 -0
- package/dist/agent/tests/modelFactory.test.d.ts +1 -0
- package/dist/agent/tests/modelFactory.test.js +108 -0
- package/dist/agent/tests/test-agent-loader.cjs +33 -0
- package/dist/agent/tests/test-agent-loader.d.ts +1 -0
- package/dist/agent/tests/test-agent-loader.js +27 -0
- package/dist/agent/tests/test-subagent-loading.cjs +99 -0
- package/dist/agent/tests/test-subagent-loading.d.ts +1 -0
- package/dist/agent/tests/test-subagent-loading.js +93 -0
- package/dist/agent/tests/toolRegistry.test.cjs +109 -0
- package/dist/agent/tests/toolRegistry.test.d.ts +1 -0
- package/dist/agent/tests/toolRegistry.test.js +103 -0
- package/dist/agent/tools/code_search.cjs +108 -0
- package/dist/agent/tools/code_search.d.ts +24 -0
- package/dist/agent/tools/code_search.js +74 -0
- package/dist/agent/tools/command_execute.cjs +136 -0
- package/dist/agent/tools/command_execute.d.ts +12 -0
- package/dist/agent/tools/command_execute.js +99 -0
- package/dist/agent/tools/git_status.cjs +126 -0
- package/dist/agent/tools/git_status.d.ts +15 -0
- package/dist/agent/tools/git_status.js +92 -0
- package/dist/agent/tools/internet_search.cjs +93 -0
- package/dist/agent/tools/internet_search.d.ts +25 -0
- package/dist/agent/tools/internet_search.js +56 -0
- package/dist/agent/tools/think.cjs +53 -0
- package/dist/agent/tools/think.d.ts +26 -0
- package/dist/agent/tools/think.js +16 -0
- package/dist/agent/tools/web_crawler.cjs +180 -0
- package/dist/agent/tools/web_crawler.d.ts +31 -0
- package/dist/agent/tools/web_crawler.js +143 -0
- package/dist/agent/utils.cjs +54 -0
- package/dist/agent/utils.d.ts +1 -0
- package/dist/agent/utils.js +10 -0
- package/dist/cli/commands/agent.cjs +169 -0
- package/dist/cli/commands/agent.d.ts +15 -0
- package/dist/cli/commands/agent.js +125 -0
- package/dist/cli/commands/gateway.cjs +601 -0
- package/dist/cli/commands/gateway.d.ts +12 -0
- package/dist/cli/commands/gateway.js +567 -0
- package/dist/cli/commands/init.cjs +681 -0
- package/dist/cli/commands/init.d.ts +10 -0
- package/dist/cli/commands/init.js +634 -0
- package/dist/cli/commands/provider.cjs +208 -0
- package/dist/cli/commands/provider.d.ts +5 -0
- package/dist/cli/commands/provider.js +174 -0
- package/dist/cli/commands/skill.cjs +145 -0
- package/dist/cli/commands/skill.d.ts +10 -0
- package/dist/cli/commands/skill.js +111 -0
- package/dist/cli/config/loader.cjs +143 -0
- package/dist/cli/config/loader.d.ts +14 -0
- package/dist/cli/config/loader.js +109 -0
- package/dist/cli/config/schema.cjs +262 -0
- package/dist/cli/config/schema.d.ts +268 -0
- package/dist/cli/config/schema.js +213 -0
- package/dist/cli/core/agentInvoker.cjs +284 -0
- package/dist/cli/core/agentInvoker.d.ts +77 -0
- package/dist/cli/core/agentInvoker.js +247 -0
- package/dist/cli/core/commandHandler.cjs +257 -0
- package/dist/cli/core/commandHandler.d.ts +62 -0
- package/dist/cli/core/commandHandler.js +223 -0
- package/dist/cli/core/database/bunSqliteAdapter.cjs +87 -0
- package/dist/cli/core/database/bunSqliteAdapter.d.ts +34 -0
- package/dist/cli/core/database/bunSqliteAdapter.js +53 -0
- package/dist/cli/core/loggerBridge.cjs +42 -0
- package/dist/cli/core/loggerBridge.d.ts +8 -0
- package/dist/cli/core/loggerBridge.js +8 -0
- package/dist/cli/core/outputManager.cjs +106 -0
- package/dist/cli/core/outputManager.d.ts +43 -0
- package/dist/cli/core/outputManager.js +72 -0
- package/dist/cli/core/sessionManager.cjs +535 -0
- package/dist/cli/core/sessionManager.d.ts +111 -0
- package/dist/cli/core/sessionManager.js +486 -0
- package/dist/cli/core/streamParser.cjs +328 -0
- package/dist/cli/core/streamParser.d.ts +42 -0
- package/dist/cli/core/streamParser.js +288 -0
- package/dist/cli/index.cjs +211 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +205 -0
- package/dist/cli/services/skillRepository.cjs +178 -0
- package/dist/cli/services/skillRepository.d.ts +35 -0
- package/dist/cli/services/skillRepository.js +144 -0
- package/dist/cli/services/skillService.cjs +336 -0
- package/dist/cli/services/skillService.d.ts +48 -0
- package/dist/cli/services/skillService.js +302 -0
- package/dist/cli/types/gateway.cjs +18 -0
- package/dist/cli/types/gateway.d.ts +18 -0
- package/dist/cli/types/gateway.js +0 -0
- package/dist/cli/types/init.cjs +18 -0
- package/dist/cli/types/init.d.ts +13 -0
- package/dist/cli/types/init.js +0 -0
- package/dist/cli/types/provider.cjs +18 -0
- package/dist/cli/types/provider.d.ts +9 -0
- package/dist/cli/types/provider.js +0 -0
- package/dist/cli/types/skill.cjs +18 -0
- package/dist/cli/types/skill.d.ts +71 -0
- package/dist/cli/types/skill.js +0 -0
- package/dist/cli/types.cjs +18 -0
- package/dist/cli/types.d.ts +175 -0
- package/dist/cli/types.js +0 -0
- package/dist/cli/ui/AgentOutput.cjs +82 -0
- package/dist/cli/ui/AgentOutput.d.ts +8 -0
- package/dist/cli/ui/AgentOutput.js +38 -0
- package/dist/cli/ui/App.cjs +285 -0
- package/dist/cli/ui/App.d.ts +6 -0
- package/dist/cli/ui/App.js +241 -0
- package/dist/cli/ui/ErrorDisplay.cjs +65 -0
- package/dist/cli/ui/ErrorDisplay.d.ts +8 -0
- package/dist/cli/ui/ErrorDisplay.js +21 -0
- package/dist/cli/ui/LogDisplay.cjs +74 -0
- package/dist/cli/ui/LogDisplay.d.ts +13 -0
- package/dist/cli/ui/LogDisplay.js +30 -0
- package/dist/cli/ui/SessionListDisplay.cjs +135 -0
- package/dist/cli/ui/SessionListDisplay.d.ts +9 -0
- package/dist/cli/ui/SessionListDisplay.js +91 -0
- package/dist/cli/ui/blockHelpers.cjs +80 -0
- package/dist/cli/ui/blockHelpers.d.ts +21 -0
- package/dist/cli/ui/blockHelpers.js +40 -0
- package/dist/cli/ui/components/ToolCallDisplay.cjs +207 -0
- package/dist/cli/ui/components/ToolCallDisplay.d.ts +7 -0
- package/dist/cli/ui/components/ToolCallDisplay.js +162 -0
- package/dist/cli/ui/components/ToolResultDisplay.cjs +86 -0
- package/dist/cli/ui/components/ToolResultDisplay.d.ts +8 -0
- package/dist/cli/ui/components/ToolResultDisplay.js +42 -0
- package/dist/cli/ui/toolDisplayHelpers.cjs +112 -0
- package/dist/cli/ui/toolDisplayHelpers.d.ts +3 -0
- package/dist/cli/ui/toolDisplayHelpers.js +72 -0
- package/dist/gateway/adapters/discord.cjs +298 -0
- package/dist/gateway/adapters/discord.d.ts +42 -0
- package/dist/gateway/adapters/discord.js +246 -0
- package/dist/gateway/auth.cjs +94 -0
- package/dist/gateway/auth.d.ts +36 -0
- package/dist/gateway/auth.js +60 -0
- package/dist/gateway/broadcast.cjs +131 -0
- package/dist/gateway/broadcast.d.ts +76 -0
- package/dist/gateway/broadcast.js +97 -0
- package/dist/gateway/client.cjs +282 -0
- package/dist/gateway/client.d.ts +141 -0
- package/dist/gateway/client.js +248 -0
- package/dist/gateway/daemon.cjs +195 -0
- package/dist/gateway/daemon.d.ts +67 -0
- package/dist/gateway/daemon.js +161 -0
- package/dist/gateway/discovery/index.cjs +72 -0
- package/dist/gateway/discovery/index.d.ts +3 -0
- package/dist/gateway/discovery/index.js +3 -0
- package/dist/gateway/discovery/mdns.cjs +221 -0
- package/dist/gateway/discovery/mdns.d.ts +37 -0
- package/dist/gateway/discovery/mdns.js +177 -0
- package/dist/gateway/discovery/tailscale.cjs +140 -0
- package/dist/gateway/discovery/tailscale.d.ts +31 -0
- package/dist/gateway/discovery/tailscale.js +106 -0
- package/dist/gateway/discovery/types.cjs +18 -0
- package/dist/gateway/discovery/types.d.ts +41 -0
- package/dist/gateway/discovery/types.js +0 -0
- package/dist/gateway/env.cjs +45 -0
- package/dist/gateway/env.d.ts +2 -0
- package/dist/gateway/env.js +8 -0
- package/dist/gateway/hooks/loader.cjs +137 -0
- package/dist/gateway/hooks/loader.d.ts +10 -0
- package/dist/gateway/hooks/loader.js +103 -0
- package/dist/gateway/hooks/registry.cjs +128 -0
- package/dist/gateway/hooks/registry.d.ts +13 -0
- package/dist/gateway/hooks/registry.js +94 -0
- package/dist/gateway/hooks/types.cjs +58 -0
- package/dist/gateway/hooks/types.d.ts +50 -0
- package/dist/gateway/hooks/types.js +18 -0
- package/dist/gateway/http/agents.cjs +280 -0
- package/dist/gateway/http/agents.d.ts +2 -0
- package/dist/gateway/http/agents.js +246 -0
- package/dist/gateway/http/fs.cjs +81 -0
- package/dist/gateway/http/fs.d.ts +2 -0
- package/dist/gateway/http/fs.js +47 -0
- package/dist/gateway/http/providers.cjs +120 -0
- package/dist/gateway/http/providers.d.ts +2 -0
- package/dist/gateway/http/providers.js +86 -0
- package/dist/gateway/http/routines.cjs +196 -0
- package/dist/gateway/http/routines.d.ts +20 -0
- package/dist/gateway/http/routines.js +159 -0
- package/dist/gateway/http/sessions.cjs +241 -0
- package/dist/gateway/http/sessions.d.ts +2 -0
- package/dist/gateway/http/sessions.js +207 -0
- package/dist/gateway/http/types.cjs +18 -0
- package/dist/gateway/http/types.d.ts +25 -0
- package/dist/gateway/http/types.js +0 -0
- package/dist/gateway/http/voice.cjs +167 -0
- package/dist/gateway/http/voice.d.ts +2 -0
- package/dist/gateway/http/voice.js +133 -0
- package/dist/gateway/http/webhooks.cjs +353 -0
- package/dist/gateway/http/webhooks.d.ts +22 -0
- package/dist/gateway/http/webhooks.js +313 -0
- package/dist/gateway/index.cjs +119 -0
- package/dist/gateway/index.d.ts +8 -0
- package/dist/gateway/index.js +9 -0
- package/dist/gateway/node.cjs +218 -0
- package/dist/gateway/node.d.ts +112 -0
- package/dist/gateway/node.js +184 -0
- package/dist/gateway/router.cjs +85 -0
- package/dist/gateway/router.d.ts +9 -0
- package/dist/gateway/router.js +51 -0
- package/dist/gateway/rpcClient.cjs +152 -0
- package/dist/gateway/rpcClient.d.ts +24 -0
- package/dist/gateway/rpcClient.js +118 -0
- package/dist/gateway/server.cjs +1175 -0
- package/dist/gateway/server.d.ts +185 -0
- package/dist/gateway/server.js +1138 -0
- package/dist/gateway/transport/http.cjs +153 -0
- package/dist/gateway/transport/http.d.ts +25 -0
- package/dist/gateway/transport/http.js +119 -0
- package/dist/gateway/transport/index.cjs +40 -0
- package/dist/gateway/transport/index.d.ts +3 -0
- package/dist/gateway/transport/index.js +3 -0
- package/dist/gateway/transport/types.cjs +18 -0
- package/dist/gateway/transport/types.d.ts +59 -0
- package/dist/gateway/transport/types.js +0 -0
- package/dist/gateway/transport/websocket.cjs +132 -0
- package/dist/gateway/transport/websocket.d.ts +21 -0
- package/dist/gateway/transport/websocket.js +98 -0
- package/dist/gateway/types.cjs +18 -0
- package/dist/gateway/types.d.ts +215 -0
- package/dist/gateway/types.js +0 -0
- package/dist/gateway/validation.cjs +225 -0
- package/dist/gateway/validation.d.ts +157 -0
- package/dist/gateway/validation.js +158 -0
- package/dist/index.cjs +95 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/logger.cjs +270 -0
- package/dist/logger.d.ts +54 -0
- package/dist/logger.js +215 -0
- package/dist/providers/copilot.cjs +148 -0
- package/dist/providers/copilot.d.ts +3 -0
- package/dist/providers/copilot.js +114 -0
- package/dist/providers/credentials.cjs +154 -0
- package/dist/providers/credentials.d.ts +26 -0
- package/dist/providers/credentials.js +99 -0
- package/dist/providers/oauth.cjs +279 -0
- package/dist/providers/oauth.d.ts +13 -0
- package/dist/providers/oauth.js +245 -0
- package/dist/providers/registry.cjs +138 -0
- package/dist/providers/registry.d.ts +32 -0
- package/dist/providers/registry.js +98 -0
- package/dist/tests/additionalMessageMiddleware.test.cjs +45 -0
- package/dist/tests/additionalMessageMiddleware.test.d.ts +1 -0
- package/dist/tests/additionalMessageMiddleware.test.js +39 -0
- package/dist/tests/agent-config-voice.test.cjs +25 -0
- package/dist/tests/agent-config-voice.test.d.ts +1 -0
- package/dist/tests/agent-config-voice.test.js +19 -0
- package/dist/tests/agentInvokerAttachments.test.cjs +67 -0
- package/dist/tests/agentInvokerAttachments.test.d.ts +1 -0
- package/dist/tests/agentInvokerAttachments.test.js +61 -0
- package/dist/tests/attachments-utils.test.cjs +46 -0
- package/dist/tests/attachments-utils.test.d.ts +1 -0
- package/dist/tests/attachments-utils.test.js +40 -0
- package/dist/tests/bunSqliteAdapter.test.cjs +265 -0
- package/dist/tests/bunSqliteAdapter.test.d.ts +1 -0
- package/dist/tests/bunSqliteAdapter.test.js +259 -0
- package/dist/tests/candleRange.test.cjs +48 -0
- package/dist/tests/candleRange.test.d.ts +1 -0
- package/dist/tests/candleRange.test.js +42 -0
- package/dist/tests/cli-config-loader.test.cjs +364 -0
- package/dist/tests/cli-config-loader.test.d.ts +1 -0
- package/dist/tests/cli-config-loader.test.js +358 -0
- package/dist/tests/cli-init.test.cjs +82 -0
- package/dist/tests/cli-init.test.d.ts +1 -0
- package/dist/tests/cli-init.test.js +76 -0
- package/dist/tests/discord-adapter.test.cjs +55 -0
- package/dist/tests/discord-adapter.test.d.ts +1 -0
- package/dist/tests/discord-adapter.test.js +49 -0
- package/dist/tests/gateway.test.cjs +319 -0
- package/dist/tests/gateway.test.d.ts +1 -0
- package/dist/tests/gateway.test.js +313 -0
- package/dist/tests/hooks-matcher.test.cjs +309 -0
- package/dist/tests/hooks-matcher.test.d.ts +1 -0
- package/dist/tests/hooks-matcher.test.js +303 -0
- package/dist/tests/hooks-merger.test.cjs +528 -0
- package/dist/tests/hooks-merger.test.d.ts +1 -0
- package/dist/tests/hooks-merger.test.js +522 -0
- package/dist/tests/integration/agent-invocation.integration.test.cjs +264 -0
- package/dist/tests/integration/agent-invocation.integration.test.d.ts +1 -0
- package/dist/tests/integration/agent-invocation.integration.test.js +258 -0
- package/dist/tests/integration/finnhub-candles.integration.test.cjs +98 -0
- package/dist/tests/integration/finnhub-candles.integration.test.d.ts +1 -0
- package/dist/tests/integration/finnhub-candles.integration.test.js +92 -0
- package/dist/tests/logger.test.cjs +353 -0
- package/dist/tests/logger.test.d.ts +1 -0
- package/dist/tests/logger.test.js +347 -0
- package/dist/tests/mediaCompatibilityMiddleware.test.cjs +106 -0
- package/dist/tests/mediaCompatibilityMiddleware.test.d.ts +1 -0
- package/dist/tests/mediaCompatibilityMiddleware.test.js +100 -0
- package/dist/tests/routines-api.test.cjs +107 -0
- package/dist/tests/routines-api.test.d.ts +1 -0
- package/dist/tests/routines-api.test.js +101 -0
- package/dist/tests/sessionMessageAttachments.test.cjs +108 -0
- package/dist/tests/sessionMessageAttachments.test.d.ts +1 -0
- package/dist/tests/sessionMessageAttachments.test.js +102 -0
- package/dist/tests/sessionMessageRole.test.cjs +44 -0
- package/dist/tests/sessionMessageRole.test.d.ts +1 -0
- package/dist/tests/sessionMessageRole.test.js +38 -0
- package/dist/tests/sessionStateMessages.test.cjs +72 -0
- package/dist/tests/sessionStateMessages.test.d.ts +1 -0
- package/dist/tests/sessionStateMessages.test.js +66 -0
- package/dist/tests/sessions-api.test.cjs +68 -0
- package/dist/tests/sessions-api.test.d.ts +1 -0
- package/dist/tests/sessions-api.test.js +62 -0
- package/dist/tests/technicalIndicators.test.cjs +82 -0
- package/dist/tests/technicalIndicators.test.d.ts +1 -0
- package/dist/tests/technicalIndicators.test.js +76 -0
- package/dist/tests/toolDisplayHelpers.test.cjs +43 -0
- package/dist/tests/toolDisplayHelpers.test.d.ts +1 -0
- package/dist/tests/toolDisplayHelpers.test.js +37 -0
- package/dist/tests/voice-config.test.cjs +35 -0
- package/dist/tests/voice-config.test.d.ts +1 -0
- package/dist/tests/voice-config.test.js +29 -0
- package/dist/tests/yahooCandles.test.cjs +111 -0
- package/dist/tests/yahooCandles.test.d.ts +1 -0
- package/dist/tests/yahooCandles.test.js +105 -0
- package/dist/tools/finance/candleRange.cjs +71 -0
- package/dist/tools/finance/candleRange.d.ts +21 -0
- package/dist/tools/finance/candleRange.js +28 -0
- package/dist/tools/finance/optionsAnalytics.cjs +222 -0
- package/dist/tools/finance/optionsAnalytics.d.ts +44 -0
- package/dist/tools/finance/optionsAnalytics.js +188 -0
- package/dist/tools/finance/optionsAnalytics.test.cjs +128 -0
- package/dist/tools/finance/optionsAnalytics.test.d.ts +1 -0
- package/dist/tools/finance/optionsAnalytics.test.js +122 -0
- package/dist/tools/finance/technicalIndicators.cjs +111 -0
- package/dist/tools/finance/technicalIndicators.d.ts +15 -0
- package/dist/tools/finance/technicalIndicators.js +68 -0
- package/dist/tools/finance/yahooCandles.cjs +125 -0
- package/dist/tools/finance/yahooCandles.d.ts +41 -0
- package/dist/tools/finance/yahooCandles.js +85 -0
- package/dist/tools/mcp-finance.cjs +649 -0
- package/dist/tools/mcp-finance.d.ts +1 -0
- package/dist/tools/mcp-finance.js +631 -0
- package/dist/types/agents.cjs +18 -0
- package/dist/types/agents.d.ts +11 -0
- package/dist/types/agents.js +0 -0
- package/dist/types/hooks.cjs +18 -0
- package/dist/types/hooks.d.ts +82 -0
- package/dist/types/hooks.js +0 -0
- package/dist/types/mcp.cjs +86 -0
- package/dist/types/mcp.d.ts +107 -0
- package/dist/types/mcp.js +40 -0
- package/dist/types/voice.cjs +103 -0
- package/dist/types/voice.d.ts +117 -0
- package/dist/types/voice.js +51 -0
- package/dist/utils/attachments.cjs +46 -0
- package/dist/utils/attachments.d.ts +7 -0
- package/dist/utils/attachments.js +12 -0
- package/dist/voice/config.cjs +52 -0
- package/dist/voice/config.d.ts +8 -0
- package/dist/voice/config.js +18 -0
- package/dist/webui/assets/index-BA0HaStz.css +1 -0
- package/dist/webui/assets/index-NHgTZsWN.js +112 -0
- package/dist/webui/assets/wingman_icon-DOy91UEF.webp +0 -0
- package/dist/webui/assets/wingman_logo-Cogyt3qm.webp +0 -0
- package/dist/webui/index.html +19 -0
- package/package.json +130 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { createTool, createTools, getAvailableTools } from "../config/toolRegistry.js";
|
|
3
|
+
describe("Tool Registry", ()=>{
|
|
4
|
+
describe("createTool", ()=>{
|
|
5
|
+
it("should create internet_search tool", ()=>{
|
|
6
|
+
const tool = createTool("internet_search");
|
|
7
|
+
expect(tool).not.toBeNull();
|
|
8
|
+
expect(tool?.name).toBe("internet_search");
|
|
9
|
+
});
|
|
10
|
+
it("should create web_crawler tool", ()=>{
|
|
11
|
+
const tool = createTool("web_crawler");
|
|
12
|
+
expect(tool).not.toBeNull();
|
|
13
|
+
expect(tool?.name).toBe("web_crawler");
|
|
14
|
+
});
|
|
15
|
+
it("should create command_execute tool with default options", ()=>{
|
|
16
|
+
const tool = createTool("command_execute");
|
|
17
|
+
expect(tool).not.toBeNull();
|
|
18
|
+
expect(tool?.name).toBe("command_execute");
|
|
19
|
+
});
|
|
20
|
+
it("should create command_execute tool with custom options", ()=>{
|
|
21
|
+
const tool = createTool("command_execute", {
|
|
22
|
+
workspace: "/custom/path",
|
|
23
|
+
blockedCommands: [
|
|
24
|
+
"rm",
|
|
25
|
+
"mv"
|
|
26
|
+
],
|
|
27
|
+
allowScriptExecution: false,
|
|
28
|
+
timeout: 60000
|
|
29
|
+
});
|
|
30
|
+
expect(tool).not.toBeNull();
|
|
31
|
+
expect(tool?.name).toBe("command_execute");
|
|
32
|
+
});
|
|
33
|
+
it("should create think tool", ()=>{
|
|
34
|
+
const tool = createTool("think");
|
|
35
|
+
expect(tool).not.toBeNull();
|
|
36
|
+
expect(tool?.name).toBe("think");
|
|
37
|
+
});
|
|
38
|
+
it("should return null for unknown tool name", ()=>{
|
|
39
|
+
const tool = createTool("unknown_tool");
|
|
40
|
+
expect(tool).toBeNull();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe("createTools", ()=>{
|
|
44
|
+
it("should create multiple tools from array", async ()=>{
|
|
45
|
+
const tools = await createTools([
|
|
46
|
+
"internet_search",
|
|
47
|
+
"web_crawler",
|
|
48
|
+
"think"
|
|
49
|
+
]);
|
|
50
|
+
expect(tools).toHaveLength(3);
|
|
51
|
+
expect(tools[0].name).toBe("internet_search");
|
|
52
|
+
expect(tools[1].name).toBe("web_crawler");
|
|
53
|
+
expect(tools[2].name).toBe("think");
|
|
54
|
+
});
|
|
55
|
+
it("should create empty array for empty input", async ()=>{
|
|
56
|
+
const tools = await createTools([]);
|
|
57
|
+
expect(tools).toHaveLength(0);
|
|
58
|
+
});
|
|
59
|
+
it("should skip unknown tool names", async ()=>{
|
|
60
|
+
const tools = await createTools([
|
|
61
|
+
"internet_search",
|
|
62
|
+
"unknown_tool",
|
|
63
|
+
"think"
|
|
64
|
+
]);
|
|
65
|
+
expect(tools).toHaveLength(2);
|
|
66
|
+
expect(tools[0].name).toBe("internet_search");
|
|
67
|
+
expect(tools[1].name).toBe("think");
|
|
68
|
+
});
|
|
69
|
+
it("should pass options to all tools", async ()=>{
|
|
70
|
+
const tools = await createTools([
|
|
71
|
+
"command_execute"
|
|
72
|
+
], {
|
|
73
|
+
workspace: "/test/path",
|
|
74
|
+
timeout: 30000
|
|
75
|
+
});
|
|
76
|
+
expect(tools).toHaveLength(1);
|
|
77
|
+
expect(tools[0].name).toBe("command_execute");
|
|
78
|
+
});
|
|
79
|
+
it("should create all available tools", async ()=>{
|
|
80
|
+
const availableTools = getAvailableTools();
|
|
81
|
+
const tools = await createTools(availableTools);
|
|
82
|
+
expect(tools).toHaveLength(availableTools.length);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe("getAvailableTools", ()=>{
|
|
86
|
+
it("should return all available tool names", ()=>{
|
|
87
|
+
const tools = getAvailableTools();
|
|
88
|
+
expect(tools).toEqual([
|
|
89
|
+
"internet_search",
|
|
90
|
+
"web_crawler",
|
|
91
|
+
"command_execute",
|
|
92
|
+
"think",
|
|
93
|
+
"code_search",
|
|
94
|
+
"git_status"
|
|
95
|
+
]);
|
|
96
|
+
});
|
|
97
|
+
it("should return a consistent list", ()=>{
|
|
98
|
+
const tools1 = getAvailableTools();
|
|
99
|
+
const tools2 = getAvailableTools();
|
|
100
|
+
expect(tools1).toEqual(tools2);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
});
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
createCodeSearchTool: ()=>createCodeSearchTool
|
|
28
|
+
});
|
|
29
|
+
const external_langchain_namespaceObject = require("langchain");
|
|
30
|
+
const external_zod_namespaceObject = require("zod");
|
|
31
|
+
const external_node_child_process_namespaceObject = require("node:child_process");
|
|
32
|
+
function isRipgrepAvailable() {
|
|
33
|
+
try {
|
|
34
|
+
(0, external_node_child_process_namespaceObject.execSync)("rg --version", {
|
|
35
|
+
stdio: "ignore"
|
|
36
|
+
});
|
|
37
|
+
return true;
|
|
38
|
+
} catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const createCodeSearchTool = (workspace)=>{
|
|
43
|
+
const useRipgrep = isRipgrepAvailable();
|
|
44
|
+
return (0, external_langchain_namespaceObject.tool)(async ({ pattern, path, type, context = 2, caseSensitive = false })=>new Promise((resolve)=>{
|
|
45
|
+
try {
|
|
46
|
+
let command;
|
|
47
|
+
let args = [];
|
|
48
|
+
if (useRipgrep) {
|
|
49
|
+
command = "rg";
|
|
50
|
+
if (context > 0) args.push("-C", String(context));
|
|
51
|
+
if (!caseSensitive) args.push("-i");
|
|
52
|
+
args.push("-n");
|
|
53
|
+
if (type) args.push("-t", type);
|
|
54
|
+
args.push(pattern);
|
|
55
|
+
if (path) args.push(path);
|
|
56
|
+
else args.push(".");
|
|
57
|
+
} else {
|
|
58
|
+
command = "grep";
|
|
59
|
+
args.push("-r");
|
|
60
|
+
args.push("-n");
|
|
61
|
+
if (context > 0) args.push("-C", String(context));
|
|
62
|
+
if (!caseSensitive) args.push("-i");
|
|
63
|
+
if (type) args.push("--include", `*.${type}`);
|
|
64
|
+
args.push(pattern);
|
|
65
|
+
if (path) args.push(path);
|
|
66
|
+
else args.push(".");
|
|
67
|
+
}
|
|
68
|
+
const proc = (0, external_node_child_process_namespaceObject.spawn)(command, args, {
|
|
69
|
+
cwd: workspace,
|
|
70
|
+
shell: false
|
|
71
|
+
});
|
|
72
|
+
let output = "";
|
|
73
|
+
let errorOutput = "";
|
|
74
|
+
proc.stdout.on("data", (data)=>{
|
|
75
|
+
output += data.toString();
|
|
76
|
+
});
|
|
77
|
+
proc.stderr.on("data", (data)=>{
|
|
78
|
+
errorOutput += data.toString();
|
|
79
|
+
});
|
|
80
|
+
proc.on("close", (code)=>{
|
|
81
|
+
if (0 === code) resolve(output || "No matches found");
|
|
82
|
+
else 1 === code ? resolve("No matches found") : resolve(`Error searching code: ${errorOutput || "Unknown error"}`);
|
|
83
|
+
});
|
|
84
|
+
proc.on("error", (err)=>{
|
|
85
|
+
resolve(`Failed to execute ${command}: ${err.message}`);
|
|
86
|
+
});
|
|
87
|
+
} catch (error) {
|
|
88
|
+
resolve(`Error in code search: ${error}`);
|
|
89
|
+
}
|
|
90
|
+
}), {
|
|
91
|
+
name: "code_search",
|
|
92
|
+
description: "Search code patterns across the codebase using ripgrep (or grep as fallback). Fast and efficient for finding function definitions, variables, imports, or any text pattern. Returns file paths with line numbers and context.",
|
|
93
|
+
schema: external_zod_namespaceObject.z.object({
|
|
94
|
+
pattern: external_zod_namespaceObject.z.string().describe("The pattern to search for (regex or literal string). Examples: 'function.*processData', 'import.*React', 'TODO'"),
|
|
95
|
+
path: external_zod_namespaceObject.z.string().optional().describe("Optional: Directory or file to search in (e.g., 'src/', 'src/utils.ts'). Defaults to entire workspace."),
|
|
96
|
+
type: external_zod_namespaceObject.z.string().optional().describe("Optional: File type filter (e.g., 'ts', 'js', 'py', 'go'). Searches only files of this type."),
|
|
97
|
+
context: external_zod_namespaceObject.z.number().optional().default(2).describe("Optional: Number of context lines to show around matches. Default is 2."),
|
|
98
|
+
caseSensitive: external_zod_namespaceObject.z.boolean().optional().default(false).describe("Optional: Whether search should be case-sensitive.")
|
|
99
|
+
})
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
exports.createCodeSearchTool = __webpack_exports__.createCodeSearchTool;
|
|
103
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
104
|
+
"createCodeSearchTool"
|
|
105
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
106
|
+
Object.defineProperty(exports, '__esModule', {
|
|
107
|
+
value: true
|
|
108
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a tool that searches code using ripgrep (or grep as fallback)
|
|
4
|
+
* This provides fast, structured code search across the codebase
|
|
5
|
+
*/
|
|
6
|
+
export declare const createCodeSearchTool: (workspace: string) => import("langchain").DynamicStructuredTool<z.ZodObject<{
|
|
7
|
+
pattern: z.ZodString;
|
|
8
|
+
path: z.ZodOptional<z.ZodString>;
|
|
9
|
+
type: z.ZodOptional<z.ZodString>;
|
|
10
|
+
context: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
11
|
+
caseSensitive: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
12
|
+
}, z.core.$strip>, {
|
|
13
|
+
pattern: string;
|
|
14
|
+
path?: string;
|
|
15
|
+
type?: string;
|
|
16
|
+
context?: number;
|
|
17
|
+
caseSensitive?: boolean;
|
|
18
|
+
}, {
|
|
19
|
+
pattern: string;
|
|
20
|
+
path?: string | undefined;
|
|
21
|
+
type?: string | undefined;
|
|
22
|
+
context?: number | undefined;
|
|
23
|
+
caseSensitive?: boolean | undefined;
|
|
24
|
+
}, string, "code_search">;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { tool } from "langchain";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { execSync, spawn } from "node:child_process";
|
|
4
|
+
function isRipgrepAvailable() {
|
|
5
|
+
try {
|
|
6
|
+
execSync("rg --version", {
|
|
7
|
+
stdio: "ignore"
|
|
8
|
+
});
|
|
9
|
+
return true;
|
|
10
|
+
} catch {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const createCodeSearchTool = (workspace)=>{
|
|
15
|
+
const useRipgrep = isRipgrepAvailable();
|
|
16
|
+
return tool(async ({ pattern, path, type, context = 2, caseSensitive = false })=>new Promise((resolve)=>{
|
|
17
|
+
try {
|
|
18
|
+
let command;
|
|
19
|
+
let args = [];
|
|
20
|
+
if (useRipgrep) {
|
|
21
|
+
command = "rg";
|
|
22
|
+
if (context > 0) args.push("-C", String(context));
|
|
23
|
+
if (!caseSensitive) args.push("-i");
|
|
24
|
+
args.push("-n");
|
|
25
|
+
if (type) args.push("-t", type);
|
|
26
|
+
args.push(pattern);
|
|
27
|
+
if (path) args.push(path);
|
|
28
|
+
else args.push(".");
|
|
29
|
+
} else {
|
|
30
|
+
command = "grep";
|
|
31
|
+
args.push("-r");
|
|
32
|
+
args.push("-n");
|
|
33
|
+
if (context > 0) args.push("-C", String(context));
|
|
34
|
+
if (!caseSensitive) args.push("-i");
|
|
35
|
+
if (type) args.push("--include", `*.${type}`);
|
|
36
|
+
args.push(pattern);
|
|
37
|
+
if (path) args.push(path);
|
|
38
|
+
else args.push(".");
|
|
39
|
+
}
|
|
40
|
+
const proc = spawn(command, args, {
|
|
41
|
+
cwd: workspace,
|
|
42
|
+
shell: false
|
|
43
|
+
});
|
|
44
|
+
let output = "";
|
|
45
|
+
let errorOutput = "";
|
|
46
|
+
proc.stdout.on("data", (data)=>{
|
|
47
|
+
output += data.toString();
|
|
48
|
+
});
|
|
49
|
+
proc.stderr.on("data", (data)=>{
|
|
50
|
+
errorOutput += data.toString();
|
|
51
|
+
});
|
|
52
|
+
proc.on("close", (code)=>{
|
|
53
|
+
if (0 === code) resolve(output || "No matches found");
|
|
54
|
+
else 1 === code ? resolve("No matches found") : resolve(`Error searching code: ${errorOutput || "Unknown error"}`);
|
|
55
|
+
});
|
|
56
|
+
proc.on("error", (err)=>{
|
|
57
|
+
resolve(`Failed to execute ${command}: ${err.message}`);
|
|
58
|
+
});
|
|
59
|
+
} catch (error) {
|
|
60
|
+
resolve(`Error in code search: ${error}`);
|
|
61
|
+
}
|
|
62
|
+
}), {
|
|
63
|
+
name: "code_search",
|
|
64
|
+
description: "Search code patterns across the codebase using ripgrep (or grep as fallback). Fast and efficient for finding function definitions, variables, imports, or any text pattern. Returns file paths with line numbers and context.",
|
|
65
|
+
schema: z.object({
|
|
66
|
+
pattern: z.string().describe("The pattern to search for (regex or literal string). Examples: 'function.*processData', 'import.*React', 'TODO'"),
|
|
67
|
+
path: z.string().optional().describe("Optional: Directory or file to search in (e.g., 'src/', 'src/utils.ts'). Defaults to entire workspace."),
|
|
68
|
+
type: z.string().optional().describe("Optional: File type filter (e.g., 'ts', 'js', 'py', 'go'). Searches only files of this type."),
|
|
69
|
+
context: z.number().optional().default(2).describe("Optional: Number of context lines to show around matches. Default is 2."),
|
|
70
|
+
caseSensitive: z.boolean().optional().default(false).describe("Optional: Whether search should be case-sensitive.")
|
|
71
|
+
})
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
export { createCodeSearchTool };
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
createCommandExecuteTool: ()=>createCommandExecuteTool,
|
|
28
|
+
DEFAULT_BLOCKED_COMMANDS: ()=>DEFAULT_BLOCKED_COMMANDS
|
|
29
|
+
});
|
|
30
|
+
const external_langchain_namespaceObject = require("langchain");
|
|
31
|
+
const external_zod_namespaceObject = require("zod");
|
|
32
|
+
const external_node_child_process_namespaceObject = require("node:child_process");
|
|
33
|
+
const DEFAULT_BLOCKED_COMMANDS = [
|
|
34
|
+
"rm",
|
|
35
|
+
"remove",
|
|
36
|
+
"del",
|
|
37
|
+
"delete",
|
|
38
|
+
"rmdir",
|
|
39
|
+
"rd",
|
|
40
|
+
"mv",
|
|
41
|
+
"move",
|
|
42
|
+
"format",
|
|
43
|
+
">",
|
|
44
|
+
">>",
|
|
45
|
+
"chmod",
|
|
46
|
+
"chown",
|
|
47
|
+
":>",
|
|
48
|
+
"sudo",
|
|
49
|
+
"su"
|
|
50
|
+
];
|
|
51
|
+
const createCommandExecuteTool = (workspace, envVariables, blockedCommands = DEFAULT_BLOCKED_COMMANDS, allowScriptExecution = true, timeoutInMilliseconds = 300000)=>(0, external_langchain_namespaceObject.tool)(async ({ command })=>new Promise((resolve)=>{
|
|
52
|
+
try {
|
|
53
|
+
const commandParts = command.trim().split(/\s+/);
|
|
54
|
+
const commandName = (commandParts[0] || "").toLowerCase();
|
|
55
|
+
const baseCommand = commandName.split(/[\\/]/).pop() || "";
|
|
56
|
+
if (blockedCommands.includes(baseCommand)) {
|
|
57
|
+
const result = `Command: "${command}" rejected, contains potentially destructive operations`;
|
|
58
|
+
resolve(result);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (!allowScriptExecution && (commandName.endsWith(".sh") || commandName.endsWith(".bash") || commandName.endsWith(".zsh") || commandName.endsWith(".ps1") || commandName.endsWith(".cmd") || commandName.endsWith(".bat"))) {
|
|
62
|
+
const result = `Command: "${command}" rejected, script execution not allowed`;
|
|
63
|
+
resolve(result);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
let output = "";
|
|
67
|
+
let hasExited = false;
|
|
68
|
+
const { NODE_OPTIONS, NODE_DEBUG, VSCODE_INSPECTOR_OPTIONS, ...cleanEnv } = process.env;
|
|
69
|
+
const safeEnv = {
|
|
70
|
+
...cleanEnv,
|
|
71
|
+
FORCE_COLOR: "0",
|
|
72
|
+
NO_COLOR: "1",
|
|
73
|
+
GIT_PAGER: "cat",
|
|
74
|
+
...envVariables ?? {}
|
|
75
|
+
};
|
|
76
|
+
const terminalProcess = (0, external_node_child_process_namespaceObject.spawn)(command, [], {
|
|
77
|
+
cwd: workspace,
|
|
78
|
+
shell: true,
|
|
79
|
+
stdio: [
|
|
80
|
+
"ignore",
|
|
81
|
+
"pipe",
|
|
82
|
+
"pipe"
|
|
83
|
+
],
|
|
84
|
+
env: safeEnv,
|
|
85
|
+
windowsHide: true
|
|
86
|
+
});
|
|
87
|
+
const timeout = setTimeout(()=>{
|
|
88
|
+
if (!hasExited) {
|
|
89
|
+
hasExited = true;
|
|
90
|
+
try {
|
|
91
|
+
terminalProcess.kill();
|
|
92
|
+
} catch (e) {}
|
|
93
|
+
const result = `Command: "${command}" timed out after ${timeoutInMilliseconds / 1000} seconds`;
|
|
94
|
+
resolve(result);
|
|
95
|
+
}
|
|
96
|
+
}, timeoutInMilliseconds);
|
|
97
|
+
const resolveResponse = (result, failed)=>{
|
|
98
|
+
if (!hasExited) {
|
|
99
|
+
hasExited = true;
|
|
100
|
+
clearTimeout(timeout);
|
|
101
|
+
const prefix = failed ? `Command: "${command}" failed with output:` : `Command: "${command}" completed successfully with output:`;
|
|
102
|
+
resolve(result ? `${prefix}\n${result}` : prefix);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
terminalProcess.stdout?.on("data", (data)=>{
|
|
106
|
+
output += data.toString();
|
|
107
|
+
});
|
|
108
|
+
terminalProcess.stderr?.on("data", (data)=>{
|
|
109
|
+
output += data.toString();
|
|
110
|
+
});
|
|
111
|
+
terminalProcess.on("error", (err)=>{
|
|
112
|
+
resolveResponse(err.message, true);
|
|
113
|
+
});
|
|
114
|
+
terminalProcess.on("exit", (code)=>{
|
|
115
|
+
resolveResponse(output, 0 !== code);
|
|
116
|
+
});
|
|
117
|
+
} catch (error) {
|
|
118
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
119
|
+
resolve(`Error: ${errorMessage}`);
|
|
120
|
+
}
|
|
121
|
+
}), {
|
|
122
|
+
name: "command_execute",
|
|
123
|
+
description: "Executes a command in a terminal and reports the output. Cannot execute potentially destructive commands like rm, mv, chmod, sudo, etc. Use for safe operations like running tests, builds, or other validation commands. Do not run long-running commands like dev servers. Commands run with a timeout in the workspace context.",
|
|
124
|
+
schema: external_zod_namespaceObject.z.object({
|
|
125
|
+
command: external_zod_namespaceObject.z.string().describe("The command to execute in the terminal")
|
|
126
|
+
})
|
|
127
|
+
});
|
|
128
|
+
exports.DEFAULT_BLOCKED_COMMANDS = __webpack_exports__.DEFAULT_BLOCKED_COMMANDS;
|
|
129
|
+
exports.createCommandExecuteTool = __webpack_exports__.createCommandExecuteTool;
|
|
130
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
131
|
+
"DEFAULT_BLOCKED_COMMANDS",
|
|
132
|
+
"createCommandExecuteTool"
|
|
133
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
134
|
+
Object.defineProperty(exports, '__esModule', {
|
|
135
|
+
value: true
|
|
136
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const DEFAULT_BLOCKED_COMMANDS: string[];
|
|
3
|
+
/**
|
|
4
|
+
* Creates a tool that executes terminal commands safely
|
|
5
|
+
*/
|
|
6
|
+
export declare const createCommandExecuteTool: (workspace: string, envVariables?: Record<string, string>, blockedCommands?: string[], allowScriptExecution?: boolean, timeoutInMilliseconds?: number) => import("langchain").DynamicStructuredTool<z.ZodObject<{
|
|
7
|
+
command: z.ZodString;
|
|
8
|
+
}, z.core.$strip>, {
|
|
9
|
+
command: string;
|
|
10
|
+
}, {
|
|
11
|
+
command: string;
|
|
12
|
+
}, string, "command_execute">;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { tool } from "langchain";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { spawn } from "node:child_process";
|
|
4
|
+
const DEFAULT_BLOCKED_COMMANDS = [
|
|
5
|
+
"rm",
|
|
6
|
+
"remove",
|
|
7
|
+
"del",
|
|
8
|
+
"delete",
|
|
9
|
+
"rmdir",
|
|
10
|
+
"rd",
|
|
11
|
+
"mv",
|
|
12
|
+
"move",
|
|
13
|
+
"format",
|
|
14
|
+
">",
|
|
15
|
+
">>",
|
|
16
|
+
"chmod",
|
|
17
|
+
"chown",
|
|
18
|
+
":>",
|
|
19
|
+
"sudo",
|
|
20
|
+
"su"
|
|
21
|
+
];
|
|
22
|
+
const createCommandExecuteTool = (workspace, envVariables, blockedCommands = DEFAULT_BLOCKED_COMMANDS, allowScriptExecution = true, timeoutInMilliseconds = 300000)=>tool(async ({ command })=>new Promise((resolve)=>{
|
|
23
|
+
try {
|
|
24
|
+
const commandParts = command.trim().split(/\s+/);
|
|
25
|
+
const commandName = (commandParts[0] || "").toLowerCase();
|
|
26
|
+
const baseCommand = commandName.split(/[\\/]/).pop() || "";
|
|
27
|
+
if (blockedCommands.includes(baseCommand)) {
|
|
28
|
+
const result = `Command: "${command}" rejected, contains potentially destructive operations`;
|
|
29
|
+
resolve(result);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (!allowScriptExecution && (commandName.endsWith(".sh") || commandName.endsWith(".bash") || commandName.endsWith(".zsh") || commandName.endsWith(".ps1") || commandName.endsWith(".cmd") || commandName.endsWith(".bat"))) {
|
|
33
|
+
const result = `Command: "${command}" rejected, script execution not allowed`;
|
|
34
|
+
resolve(result);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
let output = "";
|
|
38
|
+
let hasExited = false;
|
|
39
|
+
const { NODE_OPTIONS, NODE_DEBUG, VSCODE_INSPECTOR_OPTIONS, ...cleanEnv } = process.env;
|
|
40
|
+
const safeEnv = {
|
|
41
|
+
...cleanEnv,
|
|
42
|
+
FORCE_COLOR: "0",
|
|
43
|
+
NO_COLOR: "1",
|
|
44
|
+
GIT_PAGER: "cat",
|
|
45
|
+
...envVariables ?? {}
|
|
46
|
+
};
|
|
47
|
+
const terminalProcess = spawn(command, [], {
|
|
48
|
+
cwd: workspace,
|
|
49
|
+
shell: true,
|
|
50
|
+
stdio: [
|
|
51
|
+
"ignore",
|
|
52
|
+
"pipe",
|
|
53
|
+
"pipe"
|
|
54
|
+
],
|
|
55
|
+
env: safeEnv,
|
|
56
|
+
windowsHide: true
|
|
57
|
+
});
|
|
58
|
+
const timeout = setTimeout(()=>{
|
|
59
|
+
if (!hasExited) {
|
|
60
|
+
hasExited = true;
|
|
61
|
+
try {
|
|
62
|
+
terminalProcess.kill();
|
|
63
|
+
} catch (e) {}
|
|
64
|
+
const result = `Command: "${command}" timed out after ${timeoutInMilliseconds / 1000} seconds`;
|
|
65
|
+
resolve(result);
|
|
66
|
+
}
|
|
67
|
+
}, timeoutInMilliseconds);
|
|
68
|
+
const resolveResponse = (result, failed)=>{
|
|
69
|
+
if (!hasExited) {
|
|
70
|
+
hasExited = true;
|
|
71
|
+
clearTimeout(timeout);
|
|
72
|
+
const prefix = failed ? `Command: "${command}" failed with output:` : `Command: "${command}" completed successfully with output:`;
|
|
73
|
+
resolve(result ? `${prefix}\n${result}` : prefix);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
terminalProcess.stdout?.on("data", (data)=>{
|
|
77
|
+
output += data.toString();
|
|
78
|
+
});
|
|
79
|
+
terminalProcess.stderr?.on("data", (data)=>{
|
|
80
|
+
output += data.toString();
|
|
81
|
+
});
|
|
82
|
+
terminalProcess.on("error", (err)=>{
|
|
83
|
+
resolveResponse(err.message, true);
|
|
84
|
+
});
|
|
85
|
+
terminalProcess.on("exit", (code)=>{
|
|
86
|
+
resolveResponse(output, 0 !== code);
|
|
87
|
+
});
|
|
88
|
+
} catch (error) {
|
|
89
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
90
|
+
resolve(`Error: ${errorMessage}`);
|
|
91
|
+
}
|
|
92
|
+
}), {
|
|
93
|
+
name: "command_execute",
|
|
94
|
+
description: "Executes a command in a terminal and reports the output. Cannot execute potentially destructive commands like rm, mv, chmod, sudo, etc. Use for safe operations like running tests, builds, or other validation commands. Do not run long-running commands like dev servers. Commands run with a timeout in the workspace context.",
|
|
95
|
+
schema: z.object({
|
|
96
|
+
command: z.string().describe("The command to execute in the terminal")
|
|
97
|
+
})
|
|
98
|
+
});
|
|
99
|
+
export { DEFAULT_BLOCKED_COMMANDS, createCommandExecuteTool };
|