@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,284 @@
|
|
|
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
|
+
buildUserContent: ()=>buildUserContent,
|
|
28
|
+
AgentInvoker: ()=>AgentInvoker
|
|
29
|
+
});
|
|
30
|
+
const external_deepagents_namespaceObject = require("deepagents");
|
|
31
|
+
const external_node_path_namespaceObject = require("node:path");
|
|
32
|
+
const external_uuid_namespaceObject = require("uuid");
|
|
33
|
+
const agentLoader_cjs_namespaceObject = require("../../agent/config/agentLoader.cjs");
|
|
34
|
+
const loader_cjs_namespaceObject = require("../config/loader.cjs");
|
|
35
|
+
const additional_messages_cjs_namespaceObject = require("../../agent/middleware/additional-messages.cjs");
|
|
36
|
+
const hooks_cjs_namespaceObject = require("../../agent/middleware/hooks.cjs");
|
|
37
|
+
const merger_cjs_namespaceObject = require("../../agent/middleware/hooks/merger.cjs");
|
|
38
|
+
const media_compat_cjs_namespaceObject = require("../../agent/middleware/media-compat.cjs");
|
|
39
|
+
const mcpClientManager_cjs_namespaceObject = require("../../agent/config/mcpClientManager.cjs");
|
|
40
|
+
function _define_property(obj, key, value) {
|
|
41
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
42
|
+
value: value,
|
|
43
|
+
enumerable: true,
|
|
44
|
+
configurable: true,
|
|
45
|
+
writable: true
|
|
46
|
+
});
|
|
47
|
+
else obj[key] = value;
|
|
48
|
+
return obj;
|
|
49
|
+
}
|
|
50
|
+
class AgentInvoker {
|
|
51
|
+
findAllAgents() {
|
|
52
|
+
const agentConfigs = this.loader.loadAllAgentConfigs();
|
|
53
|
+
return agentConfigs;
|
|
54
|
+
}
|
|
55
|
+
async findAgent(name) {
|
|
56
|
+
return await this.loader.loadAgent(name);
|
|
57
|
+
}
|
|
58
|
+
async invokeAgent(agentName, prompt, sessionId, attachments) {
|
|
59
|
+
try {
|
|
60
|
+
const targetAgent = await this.findAgent(agentName);
|
|
61
|
+
if (!targetAgent) throw new Error(`Agent "${agentName}" not found`);
|
|
62
|
+
this.logger.info(`Invoking agent: ${agentName}`);
|
|
63
|
+
const preview = prompt.trim() || (attachments && attachments.length > 0 ? buildAttachmentPreview(attachments) : "");
|
|
64
|
+
this.outputManager.emitAgentStart(agentName, preview);
|
|
65
|
+
this.logger.debug(`Found ${this.wingmanConfig.toolHooks ? "global hooks" : "no global hooks"}`);
|
|
66
|
+
this.logger.debug(`Found ${targetAgent.toolHooks ? "agent-specific hooks" : "no agent-specific hooks"}`);
|
|
67
|
+
const mergedHooks = (0, merger_cjs_namespaceObject.mergeHooks)(this.wingmanConfig.toolHooks, targetAgent.toolHooks);
|
|
68
|
+
const hookSessionId = sessionId || (0, external_uuid_namespaceObject.v4)();
|
|
69
|
+
const mcpConfigs = [];
|
|
70
|
+
if (targetAgent.mcpConfig) mcpConfigs.push(targetAgent.mcpConfig);
|
|
71
|
+
if (targetAgent.mcpUseGlobal && this.wingmanConfig.mcp) mcpConfigs.push(this.wingmanConfig.mcp);
|
|
72
|
+
if (mcpConfigs.length > 0) {
|
|
73
|
+
this.logger.debug("Initializing MCP client for agent invocation");
|
|
74
|
+
this.mcpManager = new mcpClientManager_cjs_namespaceObject.MCPClientManager(mcpConfigs, this.logger);
|
|
75
|
+
await this.mcpManager.initialize();
|
|
76
|
+
const mcpTools = await this.mcpManager.getTools();
|
|
77
|
+
if (mcpTools.length > 0) {
|
|
78
|
+
const existing = new Set((targetAgent.tools || []).map((tool)=>tool.name));
|
|
79
|
+
const unique = mcpTools.filter((tool)=>!existing.has(tool.name));
|
|
80
|
+
targetAgent.tools = [
|
|
81
|
+
...targetAgent.tools || [],
|
|
82
|
+
...unique
|
|
83
|
+
];
|
|
84
|
+
this.logger.info(`Added ${unique.length} MCP tools to agent`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const middleware = [
|
|
88
|
+
(0, media_compat_cjs_namespaceObject.mediaCompatibilityMiddleware)({
|
|
89
|
+
model: targetAgent.model
|
|
90
|
+
}),
|
|
91
|
+
(0, additional_messages_cjs_namespaceObject.additionalMessageMiddleware)({
|
|
92
|
+
workdir: this.workdir,
|
|
93
|
+
defaultOutputDir: this.defaultOutputDir
|
|
94
|
+
})
|
|
95
|
+
];
|
|
96
|
+
if (mergedHooks) {
|
|
97
|
+
this.logger.debug(`Adding hooks middleware with ${mergedHooks.PreToolUse?.length || 0} PreToolUse hooks, ${mergedHooks.PostToolUse?.length || 0} PostToolUse hooks, and ${mergedHooks.Stop?.length || 0} Stop hooks`);
|
|
98
|
+
middleware.push((0, hooks_cjs_namespaceObject.createHooksMiddleware)(mergedHooks, this.workspace, hookSessionId, this.logger));
|
|
99
|
+
}
|
|
100
|
+
const checkpointer = this.sessionManager?.getCheckpointer();
|
|
101
|
+
const standaloneAgent = (0, external_deepagents_namespaceObject.createDeepAgent)({
|
|
102
|
+
systemPrompt: targetAgent.systemPrompt,
|
|
103
|
+
tools: targetAgent.tools,
|
|
104
|
+
model: targetAgent.model,
|
|
105
|
+
backend: ()=>new external_deepagents_namespaceObject.CompositeBackend(new external_deepagents_namespaceObject.FilesystemBackend({
|
|
106
|
+
rootDir: this.workspace,
|
|
107
|
+
virtualMode: true
|
|
108
|
+
}), {
|
|
109
|
+
"/memories/": new external_deepagents_namespaceObject.FilesystemBackend({
|
|
110
|
+
rootDir: (0, external_node_path_namespaceObject.join)(this.workspace, this.configDir, "memories"),
|
|
111
|
+
virtualMode: true
|
|
112
|
+
})
|
|
113
|
+
}),
|
|
114
|
+
middleware,
|
|
115
|
+
skills: [
|
|
116
|
+
"/skills/"
|
|
117
|
+
],
|
|
118
|
+
subagents: [
|
|
119
|
+
...targetAgent.subagents || []
|
|
120
|
+
],
|
|
121
|
+
checkpointer: checkpointer
|
|
122
|
+
});
|
|
123
|
+
this.logger.debug("Agent created, sending message");
|
|
124
|
+
const userContent = buildUserContent(prompt, attachments);
|
|
125
|
+
if (this.sessionManager && sessionId) {
|
|
126
|
+
this.logger.debug(`Using streaming with session: ${sessionId}`);
|
|
127
|
+
const stream = await standaloneAgent.streamEvents({
|
|
128
|
+
messages: [
|
|
129
|
+
{
|
|
130
|
+
role: "user",
|
|
131
|
+
content: userContent
|
|
132
|
+
}
|
|
133
|
+
]
|
|
134
|
+
}, {
|
|
135
|
+
recursionLimit: this.wingmanConfig.recursionLimit,
|
|
136
|
+
configurable: {
|
|
137
|
+
thread_id: sessionId
|
|
138
|
+
},
|
|
139
|
+
version: "v2"
|
|
140
|
+
});
|
|
141
|
+
for await (const chunk of stream)this.outputManager.emitAgentStream(chunk);
|
|
142
|
+
this.logger.info("Agent streaming completed successfully");
|
|
143
|
+
this.outputManager.emitAgentComplete({
|
|
144
|
+
streaming: true
|
|
145
|
+
});
|
|
146
|
+
return {
|
|
147
|
+
streaming: true
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
{
|
|
151
|
+
this.logger.debug("Using blocking invoke (no session manager)");
|
|
152
|
+
const result = await standaloneAgent.invoke({
|
|
153
|
+
messages: [
|
|
154
|
+
{
|
|
155
|
+
role: "user",
|
|
156
|
+
content: userContent
|
|
157
|
+
}
|
|
158
|
+
]
|
|
159
|
+
}, {
|
|
160
|
+
recursionLimit: this.wingmanConfig.recursionLimit
|
|
161
|
+
});
|
|
162
|
+
this.logger.info("Agent completed successfully");
|
|
163
|
+
this.outputManager.emitAgentComplete(result);
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
} catch (error) {
|
|
167
|
+
this.logger.error(`Agent invocation failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
168
|
+
this.outputManager.emitAgentError(error);
|
|
169
|
+
throw error;
|
|
170
|
+
} finally{
|
|
171
|
+
if (this.mcpManager) {
|
|
172
|
+
this.logger.debug("Cleaning up MCP client");
|
|
173
|
+
await this.mcpManager.cleanup();
|
|
174
|
+
this.mcpManager = null;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
listAgents() {
|
|
179
|
+
const agents = this.findAllAgents();
|
|
180
|
+
return agents.map((a)=>({
|
|
181
|
+
name: a.name,
|
|
182
|
+
description: a.description
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
185
|
+
constructor(options){
|
|
186
|
+
_define_property(this, "loader", void 0);
|
|
187
|
+
_define_property(this, "outputManager", void 0);
|
|
188
|
+
_define_property(this, "logger", void 0);
|
|
189
|
+
_define_property(this, "workspace", void 0);
|
|
190
|
+
_define_property(this, "configDir", void 0);
|
|
191
|
+
_define_property(this, "wingmanConfig", void 0);
|
|
192
|
+
_define_property(this, "mcpManager", null);
|
|
193
|
+
_define_property(this, "sessionManager", null);
|
|
194
|
+
_define_property(this, "workdir", null);
|
|
195
|
+
_define_property(this, "defaultOutputDir", null);
|
|
196
|
+
this.outputManager = options.outputManager;
|
|
197
|
+
this.logger = options.logger;
|
|
198
|
+
this.workspace = options.workspace || process.cwd();
|
|
199
|
+
this.configDir = options.configDir || ".wingman";
|
|
200
|
+
this.sessionManager = options.sessionManager || null;
|
|
201
|
+
this.workdir = options.workdir || null;
|
|
202
|
+
this.defaultOutputDir = options.defaultOutputDir || null;
|
|
203
|
+
const configLoader = new loader_cjs_namespaceObject.WingmanConfigLoader(this.configDir, this.workspace);
|
|
204
|
+
this.wingmanConfig = configLoader.loadConfig();
|
|
205
|
+
this.loader = new agentLoader_cjs_namespaceObject.AgentLoader(this.configDir, this.workspace, this.wingmanConfig);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
function buildUserContent(prompt, attachments) {
|
|
209
|
+
const text = prompt?.trim() ?? "";
|
|
210
|
+
if (!attachments || 0 === attachments.length) return text;
|
|
211
|
+
const parts = [];
|
|
212
|
+
if (text) parts.push({
|
|
213
|
+
type: "text",
|
|
214
|
+
text
|
|
215
|
+
});
|
|
216
|
+
for (const attachment of attachments)if (attachment?.dataUrl) {
|
|
217
|
+
if (isAudioAttachment(attachment)) {
|
|
218
|
+
const audioPart = buildAudioPart(attachment);
|
|
219
|
+
if (audioPart) parts.push(audioPart);
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
parts.push({
|
|
223
|
+
type: "image_url",
|
|
224
|
+
image_url: {
|
|
225
|
+
url: attachment.dataUrl
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
if (0 === parts.length) {
|
|
230
|
+
if (!text) throw new Error("Attachment payload is empty or invalid.");
|
|
231
|
+
return text;
|
|
232
|
+
}
|
|
233
|
+
return parts;
|
|
234
|
+
}
|
|
235
|
+
function isAudioAttachment(attachment) {
|
|
236
|
+
if ("audio" === attachment.kind) return true;
|
|
237
|
+
if (attachment.mimeType?.startsWith("audio/")) return true;
|
|
238
|
+
if (attachment.dataUrl?.startsWith("data:audio/")) return true;
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
function buildAudioPart(attachment) {
|
|
242
|
+
const parsed = parseDataUrl(attachment.dataUrl);
|
|
243
|
+
const mimeType = attachment.mimeType || parsed.mimeType;
|
|
244
|
+
if (parsed.data) return {
|
|
245
|
+
type: "audio",
|
|
246
|
+
source_type: "base64",
|
|
247
|
+
data: parsed.data,
|
|
248
|
+
mime_type: mimeType
|
|
249
|
+
};
|
|
250
|
+
return {
|
|
251
|
+
type: "audio",
|
|
252
|
+
source_type: "url",
|
|
253
|
+
url: attachment.dataUrl,
|
|
254
|
+
mime_type: mimeType
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
function parseDataUrl(dataUrl) {
|
|
258
|
+
if (!dataUrl.startsWith("data:")) return {};
|
|
259
|
+
const match = dataUrl.match(/^data:([^;]+);base64,(.+)$/);
|
|
260
|
+
if (!match) return {};
|
|
261
|
+
return {
|
|
262
|
+
mimeType: match[1],
|
|
263
|
+
data: match[2]
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
function buildAttachmentPreview(attachments) {
|
|
267
|
+
let hasAudio = false;
|
|
268
|
+
let hasImage = false;
|
|
269
|
+
for (const attachment of attachments)if (isAudioAttachment(attachment)) hasAudio = true;
|
|
270
|
+
else hasImage = true;
|
|
271
|
+
if (hasAudio && hasImage) return "[attachments]";
|
|
272
|
+
if (hasAudio) return "[audio]";
|
|
273
|
+
if (hasImage) return "[image]";
|
|
274
|
+
return "";
|
|
275
|
+
}
|
|
276
|
+
exports.AgentInvoker = __webpack_exports__.AgentInvoker;
|
|
277
|
+
exports.buildUserContent = __webpack_exports__.buildUserContent;
|
|
278
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
279
|
+
"AgentInvoker",
|
|
280
|
+
"buildUserContent"
|
|
281
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
282
|
+
Object.defineProperty(exports, '__esModule', {
|
|
283
|
+
value: true
|
|
284
|
+
});
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { OutputManager } from "./outputManager.js";
|
|
2
|
+
import type { Logger } from "../../logger.js";
|
|
3
|
+
import type { WingmanAgentConfig } from "@/agent/config/agentConfig.js";
|
|
4
|
+
import type { WingmanAgent } from "@/types/agents.js";
|
|
5
|
+
import { SessionManager } from "./sessionManager.js";
|
|
6
|
+
export interface AgentInvokerOptions {
|
|
7
|
+
workspace?: string;
|
|
8
|
+
configDir?: string;
|
|
9
|
+
outputManager: OutputManager;
|
|
10
|
+
logger: Logger;
|
|
11
|
+
sessionManager?: SessionManager;
|
|
12
|
+
workdir?: string | null;
|
|
13
|
+
defaultOutputDir?: string | null;
|
|
14
|
+
}
|
|
15
|
+
export type ImageAttachment = {
|
|
16
|
+
kind?: "image";
|
|
17
|
+
dataUrl: string;
|
|
18
|
+
mimeType?: string;
|
|
19
|
+
name?: string;
|
|
20
|
+
size?: number;
|
|
21
|
+
};
|
|
22
|
+
export type AudioAttachment = {
|
|
23
|
+
kind: "audio";
|
|
24
|
+
dataUrl: string;
|
|
25
|
+
mimeType?: string;
|
|
26
|
+
name?: string;
|
|
27
|
+
size?: number;
|
|
28
|
+
};
|
|
29
|
+
export type MediaAttachment = ImageAttachment | AudioAttachment;
|
|
30
|
+
export declare class AgentInvoker {
|
|
31
|
+
private loader;
|
|
32
|
+
private outputManager;
|
|
33
|
+
private logger;
|
|
34
|
+
private workspace;
|
|
35
|
+
private configDir;
|
|
36
|
+
private wingmanConfig;
|
|
37
|
+
private mcpManager;
|
|
38
|
+
private sessionManager;
|
|
39
|
+
private workdir;
|
|
40
|
+
private defaultOutputDir;
|
|
41
|
+
constructor(options: AgentInvokerOptions);
|
|
42
|
+
findAllAgents(): WingmanAgentConfig[];
|
|
43
|
+
/**
|
|
44
|
+
* Find an agent by name
|
|
45
|
+
*/
|
|
46
|
+
findAgent(name: string): Promise<WingmanAgent | undefined>;
|
|
47
|
+
/**
|
|
48
|
+
* Invoke a specific agent directly (bypassing main orchestration)
|
|
49
|
+
*/
|
|
50
|
+
invokeAgent(agentName: string, prompt: string, sessionId?: string, attachments?: MediaAttachment[]): Promise<any>;
|
|
51
|
+
/**
|
|
52
|
+
* List all available agents with their descriptions
|
|
53
|
+
*/
|
|
54
|
+
listAgents(): Array<{
|
|
55
|
+
name: string;
|
|
56
|
+
description: string;
|
|
57
|
+
}>;
|
|
58
|
+
}
|
|
59
|
+
export declare function buildUserContent(prompt: string, attachments?: MediaAttachment[]): string | Array<{
|
|
60
|
+
type: "text";
|
|
61
|
+
text: string;
|
|
62
|
+
} | {
|
|
63
|
+
type: "image_url";
|
|
64
|
+
image_url: {
|
|
65
|
+
url: string;
|
|
66
|
+
};
|
|
67
|
+
} | {
|
|
68
|
+
type: "audio";
|
|
69
|
+
source_type: "base64";
|
|
70
|
+
data: string;
|
|
71
|
+
mime_type?: string;
|
|
72
|
+
} | {
|
|
73
|
+
type: "audio";
|
|
74
|
+
source_type: "url";
|
|
75
|
+
url: string;
|
|
76
|
+
mime_type?: string;
|
|
77
|
+
}>;
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { CompositeBackend, FilesystemBackend, createDeepAgent } from "deepagents";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { v4 } from "uuid";
|
|
4
|
+
import { AgentLoader } from "../../agent/config/agentLoader.js";
|
|
5
|
+
import { WingmanConfigLoader } from "../config/loader.js";
|
|
6
|
+
import { additionalMessageMiddleware } from "../../agent/middleware/additional-messages.js";
|
|
7
|
+
import { createHooksMiddleware } from "../../agent/middleware/hooks.js";
|
|
8
|
+
import { mergeHooks } from "../../agent/middleware/hooks/merger.js";
|
|
9
|
+
import { mediaCompatibilityMiddleware } from "../../agent/middleware/media-compat.js";
|
|
10
|
+
import { MCPClientManager } from "../../agent/config/mcpClientManager.js";
|
|
11
|
+
function _define_property(obj, key, value) {
|
|
12
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
13
|
+
value: value,
|
|
14
|
+
enumerable: true,
|
|
15
|
+
configurable: true,
|
|
16
|
+
writable: true
|
|
17
|
+
});
|
|
18
|
+
else obj[key] = value;
|
|
19
|
+
return obj;
|
|
20
|
+
}
|
|
21
|
+
class AgentInvoker {
|
|
22
|
+
findAllAgents() {
|
|
23
|
+
const agentConfigs = this.loader.loadAllAgentConfigs();
|
|
24
|
+
return agentConfigs;
|
|
25
|
+
}
|
|
26
|
+
async findAgent(name) {
|
|
27
|
+
return await this.loader.loadAgent(name);
|
|
28
|
+
}
|
|
29
|
+
async invokeAgent(agentName, prompt, sessionId, attachments) {
|
|
30
|
+
try {
|
|
31
|
+
const targetAgent = await this.findAgent(agentName);
|
|
32
|
+
if (!targetAgent) throw new Error(`Agent "${agentName}" not found`);
|
|
33
|
+
this.logger.info(`Invoking agent: ${agentName}`);
|
|
34
|
+
const preview = prompt.trim() || (attachments && attachments.length > 0 ? buildAttachmentPreview(attachments) : "");
|
|
35
|
+
this.outputManager.emitAgentStart(agentName, preview);
|
|
36
|
+
this.logger.debug(`Found ${this.wingmanConfig.toolHooks ? "global hooks" : "no global hooks"}`);
|
|
37
|
+
this.logger.debug(`Found ${targetAgent.toolHooks ? "agent-specific hooks" : "no agent-specific hooks"}`);
|
|
38
|
+
const mergedHooks = mergeHooks(this.wingmanConfig.toolHooks, targetAgent.toolHooks);
|
|
39
|
+
const hookSessionId = sessionId || v4();
|
|
40
|
+
const mcpConfigs = [];
|
|
41
|
+
if (targetAgent.mcpConfig) mcpConfigs.push(targetAgent.mcpConfig);
|
|
42
|
+
if (targetAgent.mcpUseGlobal && this.wingmanConfig.mcp) mcpConfigs.push(this.wingmanConfig.mcp);
|
|
43
|
+
if (mcpConfigs.length > 0) {
|
|
44
|
+
this.logger.debug("Initializing MCP client for agent invocation");
|
|
45
|
+
this.mcpManager = new MCPClientManager(mcpConfigs, this.logger);
|
|
46
|
+
await this.mcpManager.initialize();
|
|
47
|
+
const mcpTools = await this.mcpManager.getTools();
|
|
48
|
+
if (mcpTools.length > 0) {
|
|
49
|
+
const existing = new Set((targetAgent.tools || []).map((tool)=>tool.name));
|
|
50
|
+
const unique = mcpTools.filter((tool)=>!existing.has(tool.name));
|
|
51
|
+
targetAgent.tools = [
|
|
52
|
+
...targetAgent.tools || [],
|
|
53
|
+
...unique
|
|
54
|
+
];
|
|
55
|
+
this.logger.info(`Added ${unique.length} MCP tools to agent`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const middleware = [
|
|
59
|
+
mediaCompatibilityMiddleware({
|
|
60
|
+
model: targetAgent.model
|
|
61
|
+
}),
|
|
62
|
+
additionalMessageMiddleware({
|
|
63
|
+
workdir: this.workdir,
|
|
64
|
+
defaultOutputDir: this.defaultOutputDir
|
|
65
|
+
})
|
|
66
|
+
];
|
|
67
|
+
if (mergedHooks) {
|
|
68
|
+
this.logger.debug(`Adding hooks middleware with ${mergedHooks.PreToolUse?.length || 0} PreToolUse hooks, ${mergedHooks.PostToolUse?.length || 0} PostToolUse hooks, and ${mergedHooks.Stop?.length || 0} Stop hooks`);
|
|
69
|
+
middleware.push(createHooksMiddleware(mergedHooks, this.workspace, hookSessionId, this.logger));
|
|
70
|
+
}
|
|
71
|
+
const checkpointer = this.sessionManager?.getCheckpointer();
|
|
72
|
+
const standaloneAgent = createDeepAgent({
|
|
73
|
+
systemPrompt: targetAgent.systemPrompt,
|
|
74
|
+
tools: targetAgent.tools,
|
|
75
|
+
model: targetAgent.model,
|
|
76
|
+
backend: ()=>new CompositeBackend(new FilesystemBackend({
|
|
77
|
+
rootDir: this.workspace,
|
|
78
|
+
virtualMode: true
|
|
79
|
+
}), {
|
|
80
|
+
"/memories/": new FilesystemBackend({
|
|
81
|
+
rootDir: join(this.workspace, this.configDir, "memories"),
|
|
82
|
+
virtualMode: true
|
|
83
|
+
})
|
|
84
|
+
}),
|
|
85
|
+
middleware,
|
|
86
|
+
skills: [
|
|
87
|
+
"/skills/"
|
|
88
|
+
],
|
|
89
|
+
subagents: [
|
|
90
|
+
...targetAgent.subagents || []
|
|
91
|
+
],
|
|
92
|
+
checkpointer: checkpointer
|
|
93
|
+
});
|
|
94
|
+
this.logger.debug("Agent created, sending message");
|
|
95
|
+
const userContent = buildUserContent(prompt, attachments);
|
|
96
|
+
if (this.sessionManager && sessionId) {
|
|
97
|
+
this.logger.debug(`Using streaming with session: ${sessionId}`);
|
|
98
|
+
const stream = await standaloneAgent.streamEvents({
|
|
99
|
+
messages: [
|
|
100
|
+
{
|
|
101
|
+
role: "user",
|
|
102
|
+
content: userContent
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
}, {
|
|
106
|
+
recursionLimit: this.wingmanConfig.recursionLimit,
|
|
107
|
+
configurable: {
|
|
108
|
+
thread_id: sessionId
|
|
109
|
+
},
|
|
110
|
+
version: "v2"
|
|
111
|
+
});
|
|
112
|
+
for await (const chunk of stream)this.outputManager.emitAgentStream(chunk);
|
|
113
|
+
this.logger.info("Agent streaming completed successfully");
|
|
114
|
+
this.outputManager.emitAgentComplete({
|
|
115
|
+
streaming: true
|
|
116
|
+
});
|
|
117
|
+
return {
|
|
118
|
+
streaming: true
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
{
|
|
122
|
+
this.logger.debug("Using blocking invoke (no session manager)");
|
|
123
|
+
const result = await standaloneAgent.invoke({
|
|
124
|
+
messages: [
|
|
125
|
+
{
|
|
126
|
+
role: "user",
|
|
127
|
+
content: userContent
|
|
128
|
+
}
|
|
129
|
+
]
|
|
130
|
+
}, {
|
|
131
|
+
recursionLimit: this.wingmanConfig.recursionLimit
|
|
132
|
+
});
|
|
133
|
+
this.logger.info("Agent completed successfully");
|
|
134
|
+
this.outputManager.emitAgentComplete(result);
|
|
135
|
+
return result;
|
|
136
|
+
}
|
|
137
|
+
} catch (error) {
|
|
138
|
+
this.logger.error(`Agent invocation failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
139
|
+
this.outputManager.emitAgentError(error);
|
|
140
|
+
throw error;
|
|
141
|
+
} finally{
|
|
142
|
+
if (this.mcpManager) {
|
|
143
|
+
this.logger.debug("Cleaning up MCP client");
|
|
144
|
+
await this.mcpManager.cleanup();
|
|
145
|
+
this.mcpManager = null;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
listAgents() {
|
|
150
|
+
const agents = this.findAllAgents();
|
|
151
|
+
return agents.map((a)=>({
|
|
152
|
+
name: a.name,
|
|
153
|
+
description: a.description
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
constructor(options){
|
|
157
|
+
_define_property(this, "loader", void 0);
|
|
158
|
+
_define_property(this, "outputManager", void 0);
|
|
159
|
+
_define_property(this, "logger", void 0);
|
|
160
|
+
_define_property(this, "workspace", void 0);
|
|
161
|
+
_define_property(this, "configDir", void 0);
|
|
162
|
+
_define_property(this, "wingmanConfig", void 0);
|
|
163
|
+
_define_property(this, "mcpManager", null);
|
|
164
|
+
_define_property(this, "sessionManager", null);
|
|
165
|
+
_define_property(this, "workdir", null);
|
|
166
|
+
_define_property(this, "defaultOutputDir", null);
|
|
167
|
+
this.outputManager = options.outputManager;
|
|
168
|
+
this.logger = options.logger;
|
|
169
|
+
this.workspace = options.workspace || process.cwd();
|
|
170
|
+
this.configDir = options.configDir || ".wingman";
|
|
171
|
+
this.sessionManager = options.sessionManager || null;
|
|
172
|
+
this.workdir = options.workdir || null;
|
|
173
|
+
this.defaultOutputDir = options.defaultOutputDir || null;
|
|
174
|
+
const configLoader = new WingmanConfigLoader(this.configDir, this.workspace);
|
|
175
|
+
this.wingmanConfig = configLoader.loadConfig();
|
|
176
|
+
this.loader = new AgentLoader(this.configDir, this.workspace, this.wingmanConfig);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function buildUserContent(prompt, attachments) {
|
|
180
|
+
const text = prompt?.trim() ?? "";
|
|
181
|
+
if (!attachments || 0 === attachments.length) return text;
|
|
182
|
+
const parts = [];
|
|
183
|
+
if (text) parts.push({
|
|
184
|
+
type: "text",
|
|
185
|
+
text
|
|
186
|
+
});
|
|
187
|
+
for (const attachment of attachments)if (attachment?.dataUrl) {
|
|
188
|
+
if (isAudioAttachment(attachment)) {
|
|
189
|
+
const audioPart = buildAudioPart(attachment);
|
|
190
|
+
if (audioPart) parts.push(audioPart);
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
parts.push({
|
|
194
|
+
type: "image_url",
|
|
195
|
+
image_url: {
|
|
196
|
+
url: attachment.dataUrl
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
if (0 === parts.length) {
|
|
201
|
+
if (!text) throw new Error("Attachment payload is empty or invalid.");
|
|
202
|
+
return text;
|
|
203
|
+
}
|
|
204
|
+
return parts;
|
|
205
|
+
}
|
|
206
|
+
function isAudioAttachment(attachment) {
|
|
207
|
+
if ("audio" === attachment.kind) return true;
|
|
208
|
+
if (attachment.mimeType?.startsWith("audio/")) return true;
|
|
209
|
+
if (attachment.dataUrl?.startsWith("data:audio/")) return true;
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
function buildAudioPart(attachment) {
|
|
213
|
+
const parsed = parseDataUrl(attachment.dataUrl);
|
|
214
|
+
const mimeType = attachment.mimeType || parsed.mimeType;
|
|
215
|
+
if (parsed.data) return {
|
|
216
|
+
type: "audio",
|
|
217
|
+
source_type: "base64",
|
|
218
|
+
data: parsed.data,
|
|
219
|
+
mime_type: mimeType
|
|
220
|
+
};
|
|
221
|
+
return {
|
|
222
|
+
type: "audio",
|
|
223
|
+
source_type: "url",
|
|
224
|
+
url: attachment.dataUrl,
|
|
225
|
+
mime_type: mimeType
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
function parseDataUrl(dataUrl) {
|
|
229
|
+
if (!dataUrl.startsWith("data:")) return {};
|
|
230
|
+
const match = dataUrl.match(/^data:([^;]+);base64,(.+)$/);
|
|
231
|
+
if (!match) return {};
|
|
232
|
+
return {
|
|
233
|
+
mimeType: match[1],
|
|
234
|
+
data: match[2]
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
function buildAttachmentPreview(attachments) {
|
|
238
|
+
let hasAudio = false;
|
|
239
|
+
let hasImage = false;
|
|
240
|
+
for (const attachment of attachments)if (isAudioAttachment(attachment)) hasAudio = true;
|
|
241
|
+
else hasImage = true;
|
|
242
|
+
if (hasAudio && hasImage) return "[attachments]";
|
|
243
|
+
if (hasAudio) return "[audio]";
|
|
244
|
+
if (hasImage) return "[image]";
|
|
245
|
+
return "";
|
|
246
|
+
}
|
|
247
|
+
export { AgentInvoker, buildUserContent };
|