@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,358 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
2
|
+
import { WingmanConfigLoader } from "../cli/config/loader.js";
|
|
3
|
+
import { existsSync, mkdirSync, rmSync, writeFileSync } from "fs";
|
|
4
|
+
import { join } from "path";
|
|
5
|
+
import { tmpdir } from "os";
|
|
6
|
+
describe("CLI Config Loader", ()=>{
|
|
7
|
+
let testDir;
|
|
8
|
+
let configDir;
|
|
9
|
+
let originalGatewayToken;
|
|
10
|
+
beforeEach(()=>{
|
|
11
|
+
originalGatewayToken = process.env.WINGMAN_GATEWAY_TOKEN;
|
|
12
|
+
delete process.env.WINGMAN_GATEWAY_TOKEN;
|
|
13
|
+
testDir = join(tmpdir(), `wingman-test-${Date.now()}`);
|
|
14
|
+
configDir = join(testDir, ".wingman");
|
|
15
|
+
mkdirSync(configDir, {
|
|
16
|
+
recursive: true
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
afterEach(()=>{
|
|
20
|
+
if ("string" == typeof originalGatewayToken) process.env.WINGMAN_GATEWAY_TOKEN = originalGatewayToken;
|
|
21
|
+
else delete process.env.WINGMAN_GATEWAY_TOKEN;
|
|
22
|
+
if (existsSync(testDir)) rmSync(testDir, {
|
|
23
|
+
recursive: true,
|
|
24
|
+
force: true
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe("Default config", ()=>{
|
|
28
|
+
it("should return default config when file doesn't exist", ()=>{
|
|
29
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
30
|
+
const config = loader.loadConfig();
|
|
31
|
+
expect(config).toEqual({
|
|
32
|
+
logLevel: "info",
|
|
33
|
+
recursionLimit: 5000,
|
|
34
|
+
search: {
|
|
35
|
+
provider: "duckduckgo",
|
|
36
|
+
maxResults: 5
|
|
37
|
+
},
|
|
38
|
+
voice: {
|
|
39
|
+
provider: "web_speech",
|
|
40
|
+
defaultPolicy: "off",
|
|
41
|
+
webSpeech: {},
|
|
42
|
+
elevenlabs: {}
|
|
43
|
+
},
|
|
44
|
+
cli: {
|
|
45
|
+
theme: "default",
|
|
46
|
+
outputMode: "auto"
|
|
47
|
+
},
|
|
48
|
+
skills: {
|
|
49
|
+
repositoryOwner: "anthropics",
|
|
50
|
+
repositoryName: "skills",
|
|
51
|
+
skillsDirectory: "skills"
|
|
52
|
+
},
|
|
53
|
+
gateway: {
|
|
54
|
+
host: "127.0.0.1",
|
|
55
|
+
port: 18789,
|
|
56
|
+
fsRoots: [],
|
|
57
|
+
auth: {
|
|
58
|
+
mode: "none",
|
|
59
|
+
allowTailscale: false
|
|
60
|
+
},
|
|
61
|
+
controlUi: {
|
|
62
|
+
enabled: true,
|
|
63
|
+
port: 18790,
|
|
64
|
+
pairingRequired: true,
|
|
65
|
+
allowInsecureAuth: false
|
|
66
|
+
},
|
|
67
|
+
adapters: {}
|
|
68
|
+
},
|
|
69
|
+
agents: {
|
|
70
|
+
list: [],
|
|
71
|
+
bindings: []
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
it("should have default log level of info", ()=>{
|
|
76
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
77
|
+
const config = loader.loadConfig();
|
|
78
|
+
expect(config.logLevel).toBe("info");
|
|
79
|
+
});
|
|
80
|
+
it("should have default recursion limit of 5000", ()=>{
|
|
81
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
82
|
+
const config = loader.loadConfig();
|
|
83
|
+
expect(config.recursionLimit).toBe(5000);
|
|
84
|
+
});
|
|
85
|
+
it("should have default search provider as duckduckgo", ()=>{
|
|
86
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
87
|
+
const config = loader.loadConfig();
|
|
88
|
+
expect(config.search?.provider).toBe("duckduckgo");
|
|
89
|
+
});
|
|
90
|
+
it("should have default CLI output mode as auto", ()=>{
|
|
91
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
92
|
+
const config = loader.loadConfig();
|
|
93
|
+
expect(config.cli?.outputMode).toBe("auto");
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
describe("Valid configuration", ()=>{
|
|
97
|
+
it("should load valid minimal config", ()=>{
|
|
98
|
+
const configData = {
|
|
99
|
+
logLevel: "debug"
|
|
100
|
+
};
|
|
101
|
+
writeFileSync(join(configDir, "wingman.config.json"), JSON.stringify(configData));
|
|
102
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
103
|
+
const config = loader.loadConfig();
|
|
104
|
+
expect(config.logLevel).toBe("debug");
|
|
105
|
+
});
|
|
106
|
+
it("should load complete config", ()=>{
|
|
107
|
+
const configData = {
|
|
108
|
+
logLevel: "debug",
|
|
109
|
+
defaultAgent: "coder",
|
|
110
|
+
recursionLimit: 5,
|
|
111
|
+
search: {
|
|
112
|
+
provider: "perplexity",
|
|
113
|
+
maxResults: 10
|
|
114
|
+
},
|
|
115
|
+
cli: {
|
|
116
|
+
theme: "dark",
|
|
117
|
+
outputMode: "json"
|
|
118
|
+
},
|
|
119
|
+
skills: {
|
|
120
|
+
repositoryOwner: "myorg",
|
|
121
|
+
repositoryName: "myskills",
|
|
122
|
+
skillsDirectory: "custom-skills"
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
writeFileSync(join(configDir, "wingman.config.json"), JSON.stringify(configData));
|
|
126
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
127
|
+
const config = loader.loadConfig();
|
|
128
|
+
expect(config).toMatchObject(configData);
|
|
129
|
+
});
|
|
130
|
+
it("should handle all valid log levels", ()=>{
|
|
131
|
+
const levels = [
|
|
132
|
+
"debug",
|
|
133
|
+
"info",
|
|
134
|
+
"warn",
|
|
135
|
+
"error",
|
|
136
|
+
"silent"
|
|
137
|
+
];
|
|
138
|
+
for (const level of levels){
|
|
139
|
+
const configData = {
|
|
140
|
+
logLevel: level
|
|
141
|
+
};
|
|
142
|
+
writeFileSync(join(configDir, "wingman.config.json"), JSON.stringify(configData));
|
|
143
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
144
|
+
const config = loader.loadConfig();
|
|
145
|
+
expect(config.logLevel).toBe(level);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
it("should handle all valid search providers", ()=>{
|
|
149
|
+
const providers = [
|
|
150
|
+
"duckduckgo",
|
|
151
|
+
"perplexity"
|
|
152
|
+
];
|
|
153
|
+
for (const provider of providers){
|
|
154
|
+
const configData = {
|
|
155
|
+
search: {
|
|
156
|
+
provider,
|
|
157
|
+
maxResults: 5
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
writeFileSync(join(configDir, "wingman.config.json"), JSON.stringify(configData));
|
|
161
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
162
|
+
const config = loader.loadConfig();
|
|
163
|
+
expect(config.search?.provider).toBe(provider);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
it("should handle all valid CLI output modes", ()=>{
|
|
167
|
+
const modes = [
|
|
168
|
+
"auto",
|
|
169
|
+
"interactive",
|
|
170
|
+
"json"
|
|
171
|
+
];
|
|
172
|
+
for (const mode of modes){
|
|
173
|
+
const configData = {
|
|
174
|
+
cli: {
|
|
175
|
+
outputMode: mode,
|
|
176
|
+
theme: "default"
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
writeFileSync(join(configDir, "wingman.config.json"), JSON.stringify(configData));
|
|
180
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
181
|
+
const config = loader.loadConfig();
|
|
182
|
+
expect(config.cli?.outputMode).toBe(mode);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
describe("Invalid configuration", ()=>{
|
|
187
|
+
it("should return default config for invalid JSON", ()=>{
|
|
188
|
+
writeFileSync(join(configDir, "wingman.config.json"), "{ invalid json }");
|
|
189
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
190
|
+
const config = loader.loadConfig();
|
|
191
|
+
expect(config.logLevel).toBe("info");
|
|
192
|
+
});
|
|
193
|
+
it("should return default config for invalid log level", ()=>{
|
|
194
|
+
const configData = {
|
|
195
|
+
logLevel: "invalid"
|
|
196
|
+
};
|
|
197
|
+
writeFileSync(join(configDir, "wingman.config.json"), JSON.stringify(configData));
|
|
198
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
199
|
+
const config = loader.loadConfig();
|
|
200
|
+
expect(config.logLevel).toBe("info");
|
|
201
|
+
});
|
|
202
|
+
it("should return default config for invalid recursion limit (too low)", ()=>{
|
|
203
|
+
const configData = {
|
|
204
|
+
recursionLimit: 0
|
|
205
|
+
};
|
|
206
|
+
writeFileSync(join(configDir, "wingman.config.json"), JSON.stringify(configData));
|
|
207
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
208
|
+
const config = loader.loadConfig();
|
|
209
|
+
expect(config.recursionLimit).toBe(5000);
|
|
210
|
+
});
|
|
211
|
+
it("should return default config for invalid recursion limit (too high)", ()=>{
|
|
212
|
+
const configData = {
|
|
213
|
+
recursionLimit: 1000001
|
|
214
|
+
};
|
|
215
|
+
writeFileSync(join(configDir, "wingman.config.json"), JSON.stringify(configData));
|
|
216
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
217
|
+
const config = loader.loadConfig();
|
|
218
|
+
expect(config.recursionLimit).toBe(5000);
|
|
219
|
+
});
|
|
220
|
+
it("should return default config for invalid search provider", ()=>{
|
|
221
|
+
const configData = {
|
|
222
|
+
search: {
|
|
223
|
+
provider: "invalid",
|
|
224
|
+
maxResults: 5
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
writeFileSync(join(configDir, "wingman.config.json"), JSON.stringify(configData));
|
|
228
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
229
|
+
const config = loader.loadConfig();
|
|
230
|
+
expect(config.search?.provider).toBe("duckduckgo");
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
describe("Partial configuration", ()=>{
|
|
234
|
+
it("should merge partial config with defaults", ()=>{
|
|
235
|
+
const configData = {
|
|
236
|
+
logLevel: "debug"
|
|
237
|
+
};
|
|
238
|
+
writeFileSync(join(configDir, "wingman.config.json"), JSON.stringify(configData));
|
|
239
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
240
|
+
const config = loader.loadConfig();
|
|
241
|
+
expect(config.logLevel).toBe("debug");
|
|
242
|
+
expect(config.recursionLimit).toBeDefined();
|
|
243
|
+
expect(config.search).toBeDefined();
|
|
244
|
+
});
|
|
245
|
+
it("should handle partial search config", ()=>{
|
|
246
|
+
const configData = {
|
|
247
|
+
search: {
|
|
248
|
+
provider: "perplexity"
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
writeFileSync(join(configDir, "wingman.config.json"), JSON.stringify(configData));
|
|
252
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
253
|
+
const config = loader.loadConfig();
|
|
254
|
+
expect(config.search?.provider).toBe("perplexity");
|
|
255
|
+
expect(config.search?.maxResults).toBeDefined();
|
|
256
|
+
});
|
|
257
|
+
it("should handle partial CLI config", ()=>{
|
|
258
|
+
const configData = {
|
|
259
|
+
cli: {
|
|
260
|
+
outputMode: "json"
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
writeFileSync(join(configDir, "wingman.config.json"), JSON.stringify(configData));
|
|
264
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
265
|
+
const config = loader.loadConfig();
|
|
266
|
+
expect(config.cli?.outputMode).toBe("json");
|
|
267
|
+
expect(config.cli?.theme).toBeDefined();
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
describe("Custom config directory", ()=>{
|
|
271
|
+
it("should support custom config directory name", ()=>{
|
|
272
|
+
const customDir = join(testDir, ".custom-config");
|
|
273
|
+
mkdirSync(customDir, {
|
|
274
|
+
recursive: true
|
|
275
|
+
});
|
|
276
|
+
const configData = {
|
|
277
|
+
logLevel: "debug"
|
|
278
|
+
};
|
|
279
|
+
writeFileSync(join(customDir, "wingman.config.json"), JSON.stringify(configData));
|
|
280
|
+
const loader = new WingmanConfigLoader(".custom-config", testDir);
|
|
281
|
+
const config = loader.loadConfig();
|
|
282
|
+
expect(config.logLevel).toBe("debug");
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
describe("Edge cases", ()=>{
|
|
286
|
+
it("should handle empty JSON object", ()=>{
|
|
287
|
+
writeFileSync(join(configDir, "wingman.config.json"), "{}");
|
|
288
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
289
|
+
const config = loader.loadConfig();
|
|
290
|
+
expect(config).toBeDefined();
|
|
291
|
+
expect(config.logLevel).toBeDefined();
|
|
292
|
+
});
|
|
293
|
+
it("should handle config file with extra fields", ()=>{
|
|
294
|
+
const configData = {
|
|
295
|
+
logLevel: "debug",
|
|
296
|
+
extraField: "should be ignored",
|
|
297
|
+
nested: {
|
|
298
|
+
extra: "fields"
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
writeFileSync(join(configDir, "wingman.config.json"), JSON.stringify(configData));
|
|
302
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
303
|
+
const config = loader.loadConfig();
|
|
304
|
+
expect(config.logLevel).toBe("debug");
|
|
305
|
+
});
|
|
306
|
+
it("should handle empty file", ()=>{
|
|
307
|
+
writeFileSync(join(configDir, "wingman.config.json"), "");
|
|
308
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
309
|
+
const config = loader.loadConfig();
|
|
310
|
+
expect(config.logLevel).toBe("info");
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
describe("Environment overrides", ()=>{
|
|
314
|
+
it("should apply WINGMAN_GATEWAY_TOKEN when auth mode is token", ()=>{
|
|
315
|
+
process.env.WINGMAN_GATEWAY_TOKEN = "env-token";
|
|
316
|
+
const configData = {
|
|
317
|
+
gateway: {
|
|
318
|
+
auth: {
|
|
319
|
+
mode: "token"
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
};
|
|
323
|
+
writeFileSync(join(configDir, "wingman.config.json"), JSON.stringify(configData));
|
|
324
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
325
|
+
const config = loader.loadConfig();
|
|
326
|
+
expect(config.gateway.auth.token).toBe("env-token");
|
|
327
|
+
});
|
|
328
|
+
it("should not override token when auth mode is none", ()=>{
|
|
329
|
+
process.env.WINGMAN_GATEWAY_TOKEN = "env-token";
|
|
330
|
+
const configData = {
|
|
331
|
+
gateway: {
|
|
332
|
+
auth: {
|
|
333
|
+
mode: "none"
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
writeFileSync(join(configDir, "wingman.config.json"), JSON.stringify(configData));
|
|
338
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
339
|
+
const config = loader.loadConfig();
|
|
340
|
+
expect(config.gateway.auth.token).toBeUndefined();
|
|
341
|
+
});
|
|
342
|
+
it("should prefer config token over environment token", ()=>{
|
|
343
|
+
process.env.WINGMAN_GATEWAY_TOKEN = "env-token";
|
|
344
|
+
const configData = {
|
|
345
|
+
gateway: {
|
|
346
|
+
auth: {
|
|
347
|
+
mode: "token",
|
|
348
|
+
token: "config-token"
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
};
|
|
352
|
+
writeFileSync(join(configDir, "wingman.config.json"), JSON.stringify(configData));
|
|
353
|
+
const loader = new WingmanConfigLoader(".wingman", testDir);
|
|
354
|
+
const config = loader.loadConfig();
|
|
355
|
+
expect(config.gateway.auth.token).toBe("config-token");
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
});
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_exports__ = {};
|
|
3
|
+
const external_vitest_namespaceObject = require("vitest");
|
|
4
|
+
const init_cjs_namespaceObject = require("../cli/commands/init.cjs");
|
|
5
|
+
const external_node_fs_namespaceObject = require("node:fs");
|
|
6
|
+
const external_node_path_namespaceObject = require("node:path");
|
|
7
|
+
const external_node_os_namespaceObject = require("node:os");
|
|
8
|
+
(0, external_vitest_namespaceObject.describe)("CLI init", ()=>{
|
|
9
|
+
let workspace;
|
|
10
|
+
(0, external_vitest_namespaceObject.beforeEach)(()=>{
|
|
11
|
+
workspace = (0, external_node_fs_namespaceObject.mkdtempSync)((0, external_node_path_namespaceObject.join)((0, external_node_os_namespaceObject.tmpdir)(), "wingman-init-"));
|
|
12
|
+
});
|
|
13
|
+
(0, external_vitest_namespaceObject.afterEach)(()=>{
|
|
14
|
+
if ((0, external_node_fs_namespaceObject.existsSync)(workspace)) (0, external_node_fs_namespaceObject.rmSync)(workspace, {
|
|
15
|
+
recursive: true,
|
|
16
|
+
force: true
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
(0, external_vitest_namespaceObject.it)("creates config and agent with defaults", async ()=>{
|
|
20
|
+
await (0, init_cjs_namespaceObject.executeInitCommand)({
|
|
21
|
+
subcommand: "",
|
|
22
|
+
args: [],
|
|
23
|
+
verbosity: "silent",
|
|
24
|
+
outputMode: "json",
|
|
25
|
+
options: {
|
|
26
|
+
yes: true,
|
|
27
|
+
"skip-provider": true
|
|
28
|
+
},
|
|
29
|
+
agent: "wingman"
|
|
30
|
+
}, {
|
|
31
|
+
workspace
|
|
32
|
+
});
|
|
33
|
+
const configPath = (0, external_node_path_namespaceObject.join)(workspace, ".wingman", "wingman.config.json");
|
|
34
|
+
(0, external_vitest_namespaceObject.expect)((0, external_node_fs_namespaceObject.existsSync)(configPath)).toBe(true);
|
|
35
|
+
const config = JSON.parse((0, external_node_fs_namespaceObject.readFileSync)(configPath, "utf-8"));
|
|
36
|
+
(0, external_vitest_namespaceObject.expect)(config.defaultAgent).toBe("wingman");
|
|
37
|
+
(0, external_vitest_namespaceObject.expect)(config.gateway.fsRoots).toContain(".");
|
|
38
|
+
const agentPath = (0, external_node_path_namespaceObject.join)(workspace, ".wingman", "agents", "wingman", "agent.json");
|
|
39
|
+
(0, external_vitest_namespaceObject.expect)((0, external_node_fs_namespaceObject.existsSync)(agentPath)).toBe(true);
|
|
40
|
+
const agent = JSON.parse((0, external_node_fs_namespaceObject.readFileSync)(agentPath, "utf-8"));
|
|
41
|
+
(0, external_vitest_namespaceObject.expect)(agent.name).toBe("wingman");
|
|
42
|
+
});
|
|
43
|
+
(0, external_vitest_namespaceObject.it)("merges existing config when --merge is set", async ()=>{
|
|
44
|
+
const configDir = (0, external_node_path_namespaceObject.join)(workspace, ".wingman");
|
|
45
|
+
(0, external_node_fs_namespaceObject.mkdirSync)(configDir, {
|
|
46
|
+
recursive: true
|
|
47
|
+
});
|
|
48
|
+
const configPath = (0, external_node_path_namespaceObject.join)(configDir, "wingman.config.json");
|
|
49
|
+
(0, external_node_fs_namespaceObject.writeFileSync)(configPath, JSON.stringify({
|
|
50
|
+
logLevel: "debug",
|
|
51
|
+
gateway: {
|
|
52
|
+
fsRoots: [
|
|
53
|
+
"./existing"
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
}, null, 2));
|
|
57
|
+
await (0, init_cjs_namespaceObject.executeInitCommand)({
|
|
58
|
+
subcommand: "",
|
|
59
|
+
args: [],
|
|
60
|
+
verbosity: "silent",
|
|
61
|
+
outputMode: "json",
|
|
62
|
+
options: {
|
|
63
|
+
merge: true,
|
|
64
|
+
"skip-provider": true
|
|
65
|
+
},
|
|
66
|
+
agent: "wingman"
|
|
67
|
+
}, {
|
|
68
|
+
workspace
|
|
69
|
+
});
|
|
70
|
+
const updated = JSON.parse((0, external_node_fs_namespaceObject.readFileSync)(configPath, "utf-8"));
|
|
71
|
+
(0, external_vitest_namespaceObject.expect)(updated.logLevel).toBe("debug");
|
|
72
|
+
(0, external_vitest_namespaceObject.expect)(updated.defaultAgent).toBe("wingman");
|
|
73
|
+
(0, external_vitest_namespaceObject.expect)(updated.gateway.fsRoots).toEqual(external_vitest_namespaceObject.expect.arrayContaining([
|
|
74
|
+
"./existing",
|
|
75
|
+
"."
|
|
76
|
+
]));
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
80
|
+
Object.defineProperty(exports, '__esModule', {
|
|
81
|
+
value: true
|
|
82
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
2
|
+
import { executeInitCommand } from "../cli/commands/init.js";
|
|
3
|
+
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
describe("CLI init", ()=>{
|
|
7
|
+
let workspace;
|
|
8
|
+
beforeEach(()=>{
|
|
9
|
+
workspace = mkdtempSync(join(tmpdir(), "wingman-init-"));
|
|
10
|
+
});
|
|
11
|
+
afterEach(()=>{
|
|
12
|
+
if (existsSync(workspace)) rmSync(workspace, {
|
|
13
|
+
recursive: true,
|
|
14
|
+
force: true
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
it("creates config and agent with defaults", async ()=>{
|
|
18
|
+
await executeInitCommand({
|
|
19
|
+
subcommand: "",
|
|
20
|
+
args: [],
|
|
21
|
+
verbosity: "silent",
|
|
22
|
+
outputMode: "json",
|
|
23
|
+
options: {
|
|
24
|
+
yes: true,
|
|
25
|
+
"skip-provider": true
|
|
26
|
+
},
|
|
27
|
+
agent: "wingman"
|
|
28
|
+
}, {
|
|
29
|
+
workspace
|
|
30
|
+
});
|
|
31
|
+
const configPath = join(workspace, ".wingman", "wingman.config.json");
|
|
32
|
+
expect(existsSync(configPath)).toBe(true);
|
|
33
|
+
const config = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
34
|
+
expect(config.defaultAgent).toBe("wingman");
|
|
35
|
+
expect(config.gateway.fsRoots).toContain(".");
|
|
36
|
+
const agentPath = join(workspace, ".wingman", "agents", "wingman", "agent.json");
|
|
37
|
+
expect(existsSync(agentPath)).toBe(true);
|
|
38
|
+
const agent = JSON.parse(readFileSync(agentPath, "utf-8"));
|
|
39
|
+
expect(agent.name).toBe("wingman");
|
|
40
|
+
});
|
|
41
|
+
it("merges existing config when --merge is set", async ()=>{
|
|
42
|
+
const configDir = join(workspace, ".wingman");
|
|
43
|
+
mkdirSync(configDir, {
|
|
44
|
+
recursive: true
|
|
45
|
+
});
|
|
46
|
+
const configPath = join(configDir, "wingman.config.json");
|
|
47
|
+
writeFileSync(configPath, JSON.stringify({
|
|
48
|
+
logLevel: "debug",
|
|
49
|
+
gateway: {
|
|
50
|
+
fsRoots: [
|
|
51
|
+
"./existing"
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
}, null, 2));
|
|
55
|
+
await executeInitCommand({
|
|
56
|
+
subcommand: "",
|
|
57
|
+
args: [],
|
|
58
|
+
verbosity: "silent",
|
|
59
|
+
outputMode: "json",
|
|
60
|
+
options: {
|
|
61
|
+
merge: true,
|
|
62
|
+
"skip-provider": true
|
|
63
|
+
},
|
|
64
|
+
agent: "wingman"
|
|
65
|
+
}, {
|
|
66
|
+
workspace
|
|
67
|
+
});
|
|
68
|
+
const updated = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
69
|
+
expect(updated.logLevel).toBe("debug");
|
|
70
|
+
expect(updated.defaultAgent).toBe("wingman");
|
|
71
|
+
expect(updated.gateway.fsRoots).toEqual(expect.arrayContaining([
|
|
72
|
+
"./existing",
|
|
73
|
+
"."
|
|
74
|
+
]));
|
|
75
|
+
});
|
|
76
|
+
});
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_exports__ = {};
|
|
3
|
+
const external_vitest_namespaceObject = require("vitest");
|
|
4
|
+
const discord_cjs_namespaceObject = require("../gateway/adapters/discord.cjs");
|
|
5
|
+
(0, external_vitest_namespaceObject.describe)("discord adapter helpers", ()=>{
|
|
6
|
+
(0, external_vitest_namespaceObject.it)("extracts session override when command matches", ()=>{
|
|
7
|
+
const result = (0, discord_cjs_namespaceObject.extractSessionOverride)("!session agent:main:cli hello", "!session");
|
|
8
|
+
(0, external_vitest_namespaceObject.expect)(result.matched).toBe(true);
|
|
9
|
+
(0, external_vitest_namespaceObject.expect)(result.sessionKey).toBe("agent:main:cli");
|
|
10
|
+
(0, external_vitest_namespaceObject.expect)(result.content).toBe("hello");
|
|
11
|
+
});
|
|
12
|
+
(0, external_vitest_namespaceObject.it)("returns no match when command does not match", ()=>{
|
|
13
|
+
const result = (0, discord_cjs_namespaceObject.extractSessionOverride)("hello there", "!session");
|
|
14
|
+
(0, external_vitest_namespaceObject.expect)(result.matched).toBe(false);
|
|
15
|
+
(0, external_vitest_namespaceObject.expect)(result.sessionKey).toBeUndefined();
|
|
16
|
+
(0, external_vitest_namespaceObject.expect)(result.content).toBe("hello there");
|
|
17
|
+
});
|
|
18
|
+
(0, external_vitest_namespaceObject.it)("handles session command without key", ()=>{
|
|
19
|
+
const result = (0, discord_cjs_namespaceObject.extractSessionOverride)("!session", "!session");
|
|
20
|
+
(0, external_vitest_namespaceObject.expect)(result.matched).toBe(true);
|
|
21
|
+
(0, external_vitest_namespaceObject.expect)(result.sessionKey).toBeUndefined();
|
|
22
|
+
(0, external_vitest_namespaceObject.expect)(result.content).toBe("");
|
|
23
|
+
});
|
|
24
|
+
(0, external_vitest_namespaceObject.it)("resolves channel session mapping with thread fallback", ()=>{
|
|
25
|
+
const map = {
|
|
26
|
+
123: "session-a",
|
|
27
|
+
"parent-1": "session-parent"
|
|
28
|
+
};
|
|
29
|
+
(0, external_vitest_namespaceObject.expect)((0, discord_cjs_namespaceObject.resolveDiscordChannelSessionKey)("123", map)).toBe("session-a");
|
|
30
|
+
(0, external_vitest_namespaceObject.expect)((0, discord_cjs_namespaceObject.resolveDiscordChannelSessionKey)("missing", map, "parent-1")).toBe("session-parent");
|
|
31
|
+
(0, external_vitest_namespaceObject.expect)((0, discord_cjs_namespaceObject.resolveDiscordChannelSessionKey)("missing", map)).toBeUndefined();
|
|
32
|
+
});
|
|
33
|
+
(0, external_vitest_namespaceObject.it)("parses agent id from session key", ()=>{
|
|
34
|
+
(0, external_vitest_namespaceObject.expect)((0, discord_cjs_namespaceObject.parseAgentIdFromSessionKey)("agent:main:webui:thread:abc")).toBe("main");
|
|
35
|
+
(0, external_vitest_namespaceObject.expect)((0, discord_cjs_namespaceObject.parseAgentIdFromSessionKey)("agent:stock-trader:discord:channel:1")).toBe("stock-trader");
|
|
36
|
+
(0, external_vitest_namespaceObject.expect)((0, discord_cjs_namespaceObject.parseAgentIdFromSessionKey)("session-plain")).toBeUndefined();
|
|
37
|
+
(0, external_vitest_namespaceObject.expect)((0, discord_cjs_namespaceObject.parseAgentIdFromSessionKey)(void 0)).toBeUndefined();
|
|
38
|
+
});
|
|
39
|
+
(0, external_vitest_namespaceObject.it)("strips bot mention variants", ()=>{
|
|
40
|
+
const content = "<@123> hello <@!123>";
|
|
41
|
+
(0, external_vitest_namespaceObject.expect)((0, discord_cjs_namespaceObject.stripDiscordBotMention)(content, "123")).toBe("hello");
|
|
42
|
+
});
|
|
43
|
+
(0, external_vitest_namespaceObject.it)("splits long responses into chunks", ()=>{
|
|
44
|
+
const input = "a".repeat(4500);
|
|
45
|
+
const chunks = (0, discord_cjs_namespaceObject.splitDiscordMessage)(input, 1900);
|
|
46
|
+
(0, external_vitest_namespaceObject.expect)(chunks.length).toBeGreaterThan(1);
|
|
47
|
+
for (const chunk of chunks)(0, external_vitest_namespaceObject.expect)(chunk.length).toBeLessThanOrEqual(1900);
|
|
48
|
+
const rebuilt = chunks.join("");
|
|
49
|
+
(0, external_vitest_namespaceObject.expect)(rebuilt).toBe(input);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
53
|
+
Object.defineProperty(exports, '__esModule', {
|
|
54
|
+
value: true
|
|
55
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { extractSessionOverride, parseAgentIdFromSessionKey, resolveDiscordChannelSessionKey, splitDiscordMessage, stripDiscordBotMention } from "../gateway/adapters/discord.js";
|
|
3
|
+
describe("discord adapter helpers", ()=>{
|
|
4
|
+
it("extracts session override when command matches", ()=>{
|
|
5
|
+
const result = extractSessionOverride("!session agent:main:cli hello", "!session");
|
|
6
|
+
expect(result.matched).toBe(true);
|
|
7
|
+
expect(result.sessionKey).toBe("agent:main:cli");
|
|
8
|
+
expect(result.content).toBe("hello");
|
|
9
|
+
});
|
|
10
|
+
it("returns no match when command does not match", ()=>{
|
|
11
|
+
const result = extractSessionOverride("hello there", "!session");
|
|
12
|
+
expect(result.matched).toBe(false);
|
|
13
|
+
expect(result.sessionKey).toBeUndefined();
|
|
14
|
+
expect(result.content).toBe("hello there");
|
|
15
|
+
});
|
|
16
|
+
it("handles session command without key", ()=>{
|
|
17
|
+
const result = extractSessionOverride("!session", "!session");
|
|
18
|
+
expect(result.matched).toBe(true);
|
|
19
|
+
expect(result.sessionKey).toBeUndefined();
|
|
20
|
+
expect(result.content).toBe("");
|
|
21
|
+
});
|
|
22
|
+
it("resolves channel session mapping with thread fallback", ()=>{
|
|
23
|
+
const map = {
|
|
24
|
+
123: "session-a",
|
|
25
|
+
"parent-1": "session-parent"
|
|
26
|
+
};
|
|
27
|
+
expect(resolveDiscordChannelSessionKey("123", map)).toBe("session-a");
|
|
28
|
+
expect(resolveDiscordChannelSessionKey("missing", map, "parent-1")).toBe("session-parent");
|
|
29
|
+
expect(resolveDiscordChannelSessionKey("missing", map)).toBeUndefined();
|
|
30
|
+
});
|
|
31
|
+
it("parses agent id from session key", ()=>{
|
|
32
|
+
expect(parseAgentIdFromSessionKey("agent:main:webui:thread:abc")).toBe("main");
|
|
33
|
+
expect(parseAgentIdFromSessionKey("agent:stock-trader:discord:channel:1")).toBe("stock-trader");
|
|
34
|
+
expect(parseAgentIdFromSessionKey("session-plain")).toBeUndefined();
|
|
35
|
+
expect(parseAgentIdFromSessionKey(void 0)).toBeUndefined();
|
|
36
|
+
});
|
|
37
|
+
it("strips bot mention variants", ()=>{
|
|
38
|
+
const content = "<@123> hello <@!123>";
|
|
39
|
+
expect(stripDiscordBotMention(content, "123")).toBe("hello");
|
|
40
|
+
});
|
|
41
|
+
it("splits long responses into chunks", ()=>{
|
|
42
|
+
const input = "a".repeat(4500);
|
|
43
|
+
const chunks = splitDiscordMessage(input, 1900);
|
|
44
|
+
expect(chunks.length).toBeGreaterThan(1);
|
|
45
|
+
for (const chunk of chunks)expect(chunk.length).toBeLessThanOrEqual(1900);
|
|
46
|
+
const rebuilt = chunks.join("");
|
|
47
|
+
expect(rebuilt).toBe(input);
|
|
48
|
+
});
|
|
49
|
+
});
|