@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,207 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { existsSync, statSync } from "node:fs";
|
|
3
|
+
const handleSessionsApi = async (ctx, req, url)=>{
|
|
4
|
+
if ("/api/sessions" === url.pathname) {
|
|
5
|
+
if ("GET" === req.method) {
|
|
6
|
+
const limit = Number(url.searchParams.get("limit") || "100");
|
|
7
|
+
const status = url.searchParams.get("status") || "active";
|
|
8
|
+
const agentId = url.searchParams.get("agentId") || void 0;
|
|
9
|
+
const agents = agentId ? [
|
|
10
|
+
agentId
|
|
11
|
+
] : ctx.getWingmanConfig().agents?.list?.map((agent)=>agent.id) || [
|
|
12
|
+
"main"
|
|
13
|
+
];
|
|
14
|
+
const sessions = [];
|
|
15
|
+
for (const agent of agents){
|
|
16
|
+
const manager = await ctx.getSessionManager(agent);
|
|
17
|
+
const list = manager.listSessions({
|
|
18
|
+
status,
|
|
19
|
+
limit,
|
|
20
|
+
agentName: agent
|
|
21
|
+
});
|
|
22
|
+
for (const session of list)sessions.push({
|
|
23
|
+
id: session.id,
|
|
24
|
+
name: session.name,
|
|
25
|
+
agentId: session.agentName,
|
|
26
|
+
createdAt: session.createdAt.getTime(),
|
|
27
|
+
updatedAt: session.updatedAt.getTime(),
|
|
28
|
+
messageCount: session.messageCount,
|
|
29
|
+
lastMessagePreview: session.lastMessagePreview,
|
|
30
|
+
workdir: session.metadata?.workdir ?? null
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
const sorted = sessions.sort((a, b)=>{
|
|
34
|
+
const aUpdated = "number" == typeof a.updatedAt ? a.updatedAt : 0;
|
|
35
|
+
const bUpdated = "number" == typeof b.updatedAt ? b.updatedAt : 0;
|
|
36
|
+
return bUpdated - aUpdated;
|
|
37
|
+
});
|
|
38
|
+
return new Response(JSON.stringify(sorted.slice(0, limit), null, 2), {
|
|
39
|
+
headers: {
|
|
40
|
+
"Content-Type": "application/json"
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
if ("POST" === req.method) {
|
|
45
|
+
const body = await req.json();
|
|
46
|
+
const selectedAgent = ctx.router.selectAgent(body.agentId);
|
|
47
|
+
if (!selectedAgent) return new Response("Invalid agent", {
|
|
48
|
+
status: 400
|
|
49
|
+
});
|
|
50
|
+
const sessionId = body.sessionId || `agent:${selectedAgent}:webui:thread:${randomUUID()}`;
|
|
51
|
+
const manager = await ctx.getSessionManager(selectedAgent);
|
|
52
|
+
const session = manager.getOrCreateSession(sessionId, selectedAgent, body.name);
|
|
53
|
+
return new Response(JSON.stringify({
|
|
54
|
+
id: session.id,
|
|
55
|
+
name: session.name,
|
|
56
|
+
agentId: session.agentName,
|
|
57
|
+
createdAt: session.createdAt.getTime(),
|
|
58
|
+
updatedAt: session.updatedAt.getTime(),
|
|
59
|
+
messageCount: session.messageCount,
|
|
60
|
+
lastMessagePreview: session.lastMessagePreview,
|
|
61
|
+
workdir: session.metadata?.workdir ?? null
|
|
62
|
+
}, null, 2), {
|
|
63
|
+
headers: {
|
|
64
|
+
"Content-Type": "application/json"
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return new Response("Method Not Allowed", {
|
|
69
|
+
status: 405
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
const sessionMessagesMatch = url.pathname.match(/^\/api\/sessions\/(.+)\/messages$/);
|
|
73
|
+
if (sessionMessagesMatch) {
|
|
74
|
+
const sessionId = decodeURIComponent(sessionMessagesMatch[1]);
|
|
75
|
+
const agentId = url.searchParams.get("agentId");
|
|
76
|
+
if (!agentId) return new Response("agentId required", {
|
|
77
|
+
status: 400
|
|
78
|
+
});
|
|
79
|
+
const manager = await ctx.getSessionManager(agentId);
|
|
80
|
+
if ("GET" === req.method) {
|
|
81
|
+
const messages = await manager.listMessages(sessionId);
|
|
82
|
+
return new Response(JSON.stringify(messages, null, 2), {
|
|
83
|
+
headers: {
|
|
84
|
+
"Content-Type": "application/json"
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
if ("DELETE" === req.method) {
|
|
89
|
+
const session = manager.getSession(sessionId);
|
|
90
|
+
if (!session) return new Response("session not found", {
|
|
91
|
+
status: 404
|
|
92
|
+
});
|
|
93
|
+
manager.clearSessionMessages(sessionId);
|
|
94
|
+
const updated = manager.getSession(sessionId);
|
|
95
|
+
return new Response(JSON.stringify({
|
|
96
|
+
id: sessionId,
|
|
97
|
+
messageCount: updated?.messageCount ?? 0,
|
|
98
|
+
lastMessagePreview: updated?.lastMessagePreview ?? null
|
|
99
|
+
}, null, 2), {
|
|
100
|
+
headers: {
|
|
101
|
+
"Content-Type": "application/json"
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const sessionWorkdirMatch = url.pathname.match(/^\/api\/sessions\/(.+)\/workdir$/);
|
|
107
|
+
if (sessionWorkdirMatch && "POST" === req.method) {
|
|
108
|
+
const sessionId = decodeURIComponent(sessionWorkdirMatch[1]);
|
|
109
|
+
const agentId = url.searchParams.get("agentId");
|
|
110
|
+
if (!agentId) return new Response("agentId required", {
|
|
111
|
+
status: 400
|
|
112
|
+
});
|
|
113
|
+
const body = await req.json();
|
|
114
|
+
const manager = await ctx.getSessionManager(agentId);
|
|
115
|
+
const session = manager.getSession(sessionId);
|
|
116
|
+
if (!session) return new Response("session not found", {
|
|
117
|
+
status: 404
|
|
118
|
+
});
|
|
119
|
+
const rawWorkdir = body?.workdir;
|
|
120
|
+
if (!rawWorkdir) {
|
|
121
|
+
manager.updateSessionMetadata(sessionId, {
|
|
122
|
+
workdir: null
|
|
123
|
+
});
|
|
124
|
+
return new Response(JSON.stringify({
|
|
125
|
+
id: session.id,
|
|
126
|
+
workdir: null
|
|
127
|
+
}, null, 2), {
|
|
128
|
+
headers: {
|
|
129
|
+
"Content-Type": "application/json"
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
const resolved = ctx.resolveFsPath(rawWorkdir);
|
|
134
|
+
const roots = ctx.resolveFsRoots();
|
|
135
|
+
if (!ctx.isPathWithinRoots(resolved, roots)) return new Response("workdir not allowed", {
|
|
136
|
+
status: 403
|
|
137
|
+
});
|
|
138
|
+
if (!existsSync(resolved) || !statSync(resolved).isDirectory()) return new Response("workdir not found", {
|
|
139
|
+
status: 404
|
|
140
|
+
});
|
|
141
|
+
manager.updateSessionMetadata(sessionId, {
|
|
142
|
+
workdir: resolved
|
|
143
|
+
});
|
|
144
|
+
return new Response(JSON.stringify({
|
|
145
|
+
id: session.id,
|
|
146
|
+
workdir: resolved
|
|
147
|
+
}, null, 2), {
|
|
148
|
+
headers: {
|
|
149
|
+
"Content-Type": "application/json"
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
const sessionDeleteMatch = url.pathname.match(/^\/api\/sessions\/(.+)$/);
|
|
154
|
+
if (sessionDeleteMatch && "PUT" === req.method) {
|
|
155
|
+
const sessionId = decodeURIComponent(sessionDeleteMatch[1]);
|
|
156
|
+
const agentId = url.searchParams.get("agentId");
|
|
157
|
+
if (!agentId) return new Response("agentId required", {
|
|
158
|
+
status: 400
|
|
159
|
+
});
|
|
160
|
+
const body = await req.json();
|
|
161
|
+
const name = body?.name?.trim();
|
|
162
|
+
if (!name) return new Response("name required", {
|
|
163
|
+
status: 400
|
|
164
|
+
});
|
|
165
|
+
const manager = await ctx.getSessionManager(agentId);
|
|
166
|
+
const session = manager.getSession(sessionId);
|
|
167
|
+
if (!session) return new Response("session not found", {
|
|
168
|
+
status: 404
|
|
169
|
+
});
|
|
170
|
+
manager.updateSession(sessionId, {
|
|
171
|
+
name
|
|
172
|
+
});
|
|
173
|
+
const updated = manager.getSession(sessionId);
|
|
174
|
+
return new Response(JSON.stringify({
|
|
175
|
+
id: updated?.id || sessionId,
|
|
176
|
+
name: updated?.name || name,
|
|
177
|
+
agentId: updated?.agentName || agentId,
|
|
178
|
+
createdAt: updated?.createdAt.getTime() || session.createdAt.getTime(),
|
|
179
|
+
updatedAt: updated?.updatedAt.getTime() || Date.now(),
|
|
180
|
+
messageCount: updated?.messageCount ?? session.messageCount,
|
|
181
|
+
lastMessagePreview: updated?.lastMessagePreview ?? session.lastMessagePreview,
|
|
182
|
+
workdir: updated?.metadata?.workdir ?? session.metadata?.workdir ?? null
|
|
183
|
+
}, null, 2), {
|
|
184
|
+
headers: {
|
|
185
|
+
"Content-Type": "application/json"
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
if (sessionDeleteMatch && "DELETE" === req.method) {
|
|
190
|
+
const sessionId = decodeURIComponent(sessionDeleteMatch[1]);
|
|
191
|
+
const agentId = url.searchParams.get("agentId");
|
|
192
|
+
if (!agentId) return new Response("agentId required", {
|
|
193
|
+
status: 400
|
|
194
|
+
});
|
|
195
|
+
const manager = await ctx.getSessionManager(agentId);
|
|
196
|
+
manager.deleteSession(sessionId);
|
|
197
|
+
return new Response(JSON.stringify({
|
|
198
|
+
ok: true
|
|
199
|
+
}), {
|
|
200
|
+
headers: {
|
|
201
|
+
"Content-Type": "application/json"
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
return null;
|
|
206
|
+
};
|
|
207
|
+
export { handleSessionsApi };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.r = (exports1)=>{
|
|
5
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
6
|
+
value: 'Module'
|
|
7
|
+
});
|
|
8
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
9
|
+
value: true
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
})();
|
|
13
|
+
var __webpack_exports__ = {};
|
|
14
|
+
__webpack_require__.r(__webpack_exports__);
|
|
15
|
+
for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
16
|
+
Object.defineProperty(exports, '__esModule', {
|
|
17
|
+
value: true
|
|
18
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { GatewayRouter } from "../router.js";
|
|
2
|
+
import type { GatewayAuth } from "../auth.js";
|
|
3
|
+
import type { Logger } from "@/logger.js";
|
|
4
|
+
import type { WingmanConfigType } from "@/cli/config/schema.js";
|
|
5
|
+
import type { SessionManager } from "@/cli/core/sessionManager.js";
|
|
6
|
+
export type GatewayHttpContext = {
|
|
7
|
+
workspace: string;
|
|
8
|
+
configDir: string;
|
|
9
|
+
getWingmanConfig: () => WingmanConfigType;
|
|
10
|
+
setWingmanConfig: (config: WingmanConfigType) => void;
|
|
11
|
+
persistWingmanConfig: () => void;
|
|
12
|
+
router: GatewayRouter;
|
|
13
|
+
setRouter: (router: GatewayRouter) => void;
|
|
14
|
+
auth: GatewayAuth;
|
|
15
|
+
logger: Logger;
|
|
16
|
+
getSessionManager: (agentId: string) => Promise<SessionManager>;
|
|
17
|
+
resolveConfigDirPath: () => string;
|
|
18
|
+
resolveOutputRoot: () => string;
|
|
19
|
+
resolveDefaultOutputDir: (agentId: string) => string;
|
|
20
|
+
resolveAgentWorkspace: (agentId: string) => string;
|
|
21
|
+
resolveFsRoots: () => string[];
|
|
22
|
+
resolveFsPath: (path: string) => string;
|
|
23
|
+
isPathWithinRoots: (path: string, roots: string[]) => boolean;
|
|
24
|
+
getBuiltInTools: () => string[];
|
|
25
|
+
};
|
|
File without changes
|
|
@@ -0,0 +1,167 @@
|
|
|
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
|
+
handleVoiceApi: ()=>handleVoiceApi
|
|
28
|
+
});
|
|
29
|
+
const agentLoader_cjs_namespaceObject = require("../../agent/config/agentLoader.cjs");
|
|
30
|
+
const credentials_cjs_namespaceObject = require("../../providers/credentials.cjs");
|
|
31
|
+
const config_cjs_namespaceObject = require("../../voice/config.cjs");
|
|
32
|
+
const voice_cjs_namespaceObject = require("../../types/voice.cjs");
|
|
33
|
+
const schema_cjs_namespaceObject = require("../../cli/config/schema.cjs");
|
|
34
|
+
const ELEVENLABS_BASE_URL = "https://api.elevenlabs.io/v1";
|
|
35
|
+
const buildElevenLabsPayload = (text, options)=>{
|
|
36
|
+
const payload = {
|
|
37
|
+
text
|
|
38
|
+
};
|
|
39
|
+
if (options.modelId) payload.model_id = options.modelId;
|
|
40
|
+
const voiceSettings = {};
|
|
41
|
+
if ("number" == typeof options.stability) voiceSettings.stability = options.stability;
|
|
42
|
+
if ("number" == typeof options.similarityBoost) voiceSettings.similarity_boost = options.similarityBoost;
|
|
43
|
+
if ("number" == typeof options.style) voiceSettings.style = options.style;
|
|
44
|
+
if ("boolean" == typeof options.speakerBoost) voiceSettings.use_speaker_boost = options.speakerBoost;
|
|
45
|
+
if ("number" == typeof options.speed) voiceSettings.speed = options.speed;
|
|
46
|
+
if (Object.keys(voiceSettings).length > 0) payload.voice_settings = voiceSettings;
|
|
47
|
+
return payload;
|
|
48
|
+
};
|
|
49
|
+
const resolveAgentVoiceConfig = (ctx, agentId)=>{
|
|
50
|
+
if (!agentId) return;
|
|
51
|
+
const loader = new agentLoader_cjs_namespaceObject.AgentLoader(ctx.configDir, ctx.workspace, ctx.getWingmanConfig());
|
|
52
|
+
const configs = loader.loadAllAgentConfigs();
|
|
53
|
+
const match = configs.find((agent)=>agent.name === agentId);
|
|
54
|
+
return match?.voice;
|
|
55
|
+
};
|
|
56
|
+
const handleVoiceApi = async (ctx, req, url)=>{
|
|
57
|
+
if ("/api/voice" === url.pathname) {
|
|
58
|
+
if ("GET" === req.method) {
|
|
59
|
+
const config = ctx.getWingmanConfig();
|
|
60
|
+
return new Response(JSON.stringify({
|
|
61
|
+
voice: config.voice
|
|
62
|
+
}, null, 2), {
|
|
63
|
+
headers: {
|
|
64
|
+
"Content-Type": "application/json"
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
if ("PUT" === req.method) {
|
|
69
|
+
const payload = await req.json();
|
|
70
|
+
const updateResult = voice_cjs_namespaceObject.VoiceConfigUpdateSchema.safeParse(payload);
|
|
71
|
+
if (!updateResult.success) return new Response("Invalid voice configuration", {
|
|
72
|
+
status: 400
|
|
73
|
+
});
|
|
74
|
+
const update = updateResult.data;
|
|
75
|
+
const current = ctx.getWingmanConfig();
|
|
76
|
+
const nextVoice = {
|
|
77
|
+
...current.voice || {},
|
|
78
|
+
...update,
|
|
79
|
+
webSpeech: {
|
|
80
|
+
...current.voice?.webSpeech || {},
|
|
81
|
+
...update.webSpeech || {}
|
|
82
|
+
},
|
|
83
|
+
elevenlabs: {
|
|
84
|
+
...current.voice?.elevenlabs || {},
|
|
85
|
+
...update.elevenlabs || {}
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
const nextConfig = schema_cjs_namespaceObject.WingmanConfigSchema.parse({
|
|
89
|
+
...current,
|
|
90
|
+
voice: nextVoice
|
|
91
|
+
});
|
|
92
|
+
ctx.setWingmanConfig(nextConfig);
|
|
93
|
+
ctx.persistWingmanConfig();
|
|
94
|
+
return new Response(JSON.stringify({
|
|
95
|
+
voice: nextConfig.voice
|
|
96
|
+
}, null, 2), {
|
|
97
|
+
headers: {
|
|
98
|
+
"Content-Type": "application/json"
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return new Response("Method Not Allowed", {
|
|
103
|
+
status: 405
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
if ("/api/voice/speak" === url.pathname) {
|
|
107
|
+
if ("POST" !== req.method) return new Response("Method Not Allowed", {
|
|
108
|
+
status: 405
|
|
109
|
+
});
|
|
110
|
+
const body = await req.json();
|
|
111
|
+
const text = String(body?.text ?? "").trim();
|
|
112
|
+
if (!text) return new Response("Text is required", {
|
|
113
|
+
status: 400
|
|
114
|
+
});
|
|
115
|
+
const agentId = "string" == typeof body?.agentId && body.agentId.trim() ? body.agentId.trim() : void 0;
|
|
116
|
+
const config = ctx.getWingmanConfig();
|
|
117
|
+
const agentVoice = resolveAgentVoiceConfig(ctx, agentId);
|
|
118
|
+
const resolved = (0, config_cjs_namespaceObject.resolveVoiceConfig)(config.voice, agentVoice);
|
|
119
|
+
if ("elevenlabs" !== resolved.provider) return new Response("Voice provider is not supported by the gateway", {
|
|
120
|
+
status: 400
|
|
121
|
+
});
|
|
122
|
+
const token = (0, credentials_cjs_namespaceObject.resolveProviderToken)("elevenlabs").token;
|
|
123
|
+
if (!token) return new Response("ElevenLabs API key is not configured", {
|
|
124
|
+
status: 400
|
|
125
|
+
});
|
|
126
|
+
const voiceId = resolved.elevenlabs.voiceId;
|
|
127
|
+
if (!voiceId) return new Response("ElevenLabs voiceId is required", {
|
|
128
|
+
status: 400
|
|
129
|
+
});
|
|
130
|
+
const query = new URLSearchParams();
|
|
131
|
+
if (resolved.elevenlabs.outputFormat) query.set("output_format", resolved.elevenlabs.outputFormat);
|
|
132
|
+
if ("number" == typeof resolved.elevenlabs.optimizeStreamingLatency) query.set("optimize_streaming_latency", String(resolved.elevenlabs.optimizeStreamingLatency));
|
|
133
|
+
const endpoint = `${ELEVENLABS_BASE_URL}/text-to-speech/${voiceId}${query.toString() ? `?${query.toString()}` : ""}`;
|
|
134
|
+
const elevenPayload = buildElevenLabsPayload(text, resolved.elevenlabs);
|
|
135
|
+
const response = await fetch(endpoint, {
|
|
136
|
+
method: "POST",
|
|
137
|
+
headers: {
|
|
138
|
+
"Content-Type": "application/json",
|
|
139
|
+
"xi-api-key": token,
|
|
140
|
+
Accept: "audio/mpeg"
|
|
141
|
+
},
|
|
142
|
+
body: JSON.stringify(elevenPayload)
|
|
143
|
+
});
|
|
144
|
+
if (!response.ok) {
|
|
145
|
+
const errorText = await response.text();
|
|
146
|
+
return new Response(errorText || "ElevenLabs request failed", {
|
|
147
|
+
status: response.status
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
const audioBuffer = await response.arrayBuffer();
|
|
151
|
+
const contentType = response.headers.get("content-type") || "audio/mpeg";
|
|
152
|
+
return new Response(audioBuffer, {
|
|
153
|
+
headers: {
|
|
154
|
+
"Content-Type": contentType,
|
|
155
|
+
"Cache-Control": "no-store"
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
};
|
|
161
|
+
exports.handleVoiceApi = __webpack_exports__.handleVoiceApi;
|
|
162
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
163
|
+
"handleVoiceApi"
|
|
164
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
165
|
+
Object.defineProperty(exports, '__esModule', {
|
|
166
|
+
value: true
|
|
167
|
+
});
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { AgentLoader } from "../../agent/config/agentLoader.js";
|
|
2
|
+
import { resolveProviderToken } from "../../providers/credentials.js";
|
|
3
|
+
import { resolveVoiceConfig } from "../../voice/config.js";
|
|
4
|
+
import { VoiceConfigUpdateSchema } from "../../types/voice.js";
|
|
5
|
+
import { WingmanConfigSchema } from "../../cli/config/schema.js";
|
|
6
|
+
const ELEVENLABS_BASE_URL = "https://api.elevenlabs.io/v1";
|
|
7
|
+
const buildElevenLabsPayload = (text, options)=>{
|
|
8
|
+
const payload = {
|
|
9
|
+
text
|
|
10
|
+
};
|
|
11
|
+
if (options.modelId) payload.model_id = options.modelId;
|
|
12
|
+
const voiceSettings = {};
|
|
13
|
+
if ("number" == typeof options.stability) voiceSettings.stability = options.stability;
|
|
14
|
+
if ("number" == typeof options.similarityBoost) voiceSettings.similarity_boost = options.similarityBoost;
|
|
15
|
+
if ("number" == typeof options.style) voiceSettings.style = options.style;
|
|
16
|
+
if ("boolean" == typeof options.speakerBoost) voiceSettings.use_speaker_boost = options.speakerBoost;
|
|
17
|
+
if ("number" == typeof options.speed) voiceSettings.speed = options.speed;
|
|
18
|
+
if (Object.keys(voiceSettings).length > 0) payload.voice_settings = voiceSettings;
|
|
19
|
+
return payload;
|
|
20
|
+
};
|
|
21
|
+
const resolveAgentVoiceConfig = (ctx, agentId)=>{
|
|
22
|
+
if (!agentId) return;
|
|
23
|
+
const loader = new AgentLoader(ctx.configDir, ctx.workspace, ctx.getWingmanConfig());
|
|
24
|
+
const configs = loader.loadAllAgentConfigs();
|
|
25
|
+
const match = configs.find((agent)=>agent.name === agentId);
|
|
26
|
+
return match?.voice;
|
|
27
|
+
};
|
|
28
|
+
const handleVoiceApi = async (ctx, req, url)=>{
|
|
29
|
+
if ("/api/voice" === url.pathname) {
|
|
30
|
+
if ("GET" === req.method) {
|
|
31
|
+
const config = ctx.getWingmanConfig();
|
|
32
|
+
return new Response(JSON.stringify({
|
|
33
|
+
voice: config.voice
|
|
34
|
+
}, null, 2), {
|
|
35
|
+
headers: {
|
|
36
|
+
"Content-Type": "application/json"
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
if ("PUT" === req.method) {
|
|
41
|
+
const payload = await req.json();
|
|
42
|
+
const updateResult = VoiceConfigUpdateSchema.safeParse(payload);
|
|
43
|
+
if (!updateResult.success) return new Response("Invalid voice configuration", {
|
|
44
|
+
status: 400
|
|
45
|
+
});
|
|
46
|
+
const update = updateResult.data;
|
|
47
|
+
const current = ctx.getWingmanConfig();
|
|
48
|
+
const nextVoice = {
|
|
49
|
+
...current.voice || {},
|
|
50
|
+
...update,
|
|
51
|
+
webSpeech: {
|
|
52
|
+
...current.voice?.webSpeech || {},
|
|
53
|
+
...update.webSpeech || {}
|
|
54
|
+
},
|
|
55
|
+
elevenlabs: {
|
|
56
|
+
...current.voice?.elevenlabs || {},
|
|
57
|
+
...update.elevenlabs || {}
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const nextConfig = WingmanConfigSchema.parse({
|
|
61
|
+
...current,
|
|
62
|
+
voice: nextVoice
|
|
63
|
+
});
|
|
64
|
+
ctx.setWingmanConfig(nextConfig);
|
|
65
|
+
ctx.persistWingmanConfig();
|
|
66
|
+
return new Response(JSON.stringify({
|
|
67
|
+
voice: nextConfig.voice
|
|
68
|
+
}, null, 2), {
|
|
69
|
+
headers: {
|
|
70
|
+
"Content-Type": "application/json"
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return new Response("Method Not Allowed", {
|
|
75
|
+
status: 405
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
if ("/api/voice/speak" === url.pathname) {
|
|
79
|
+
if ("POST" !== req.method) return new Response("Method Not Allowed", {
|
|
80
|
+
status: 405
|
|
81
|
+
});
|
|
82
|
+
const body = await req.json();
|
|
83
|
+
const text = String(body?.text ?? "").trim();
|
|
84
|
+
if (!text) return new Response("Text is required", {
|
|
85
|
+
status: 400
|
|
86
|
+
});
|
|
87
|
+
const agentId = "string" == typeof body?.agentId && body.agentId.trim() ? body.agentId.trim() : void 0;
|
|
88
|
+
const config = ctx.getWingmanConfig();
|
|
89
|
+
const agentVoice = resolveAgentVoiceConfig(ctx, agentId);
|
|
90
|
+
const resolved = resolveVoiceConfig(config.voice, agentVoice);
|
|
91
|
+
if ("elevenlabs" !== resolved.provider) return new Response("Voice provider is not supported by the gateway", {
|
|
92
|
+
status: 400
|
|
93
|
+
});
|
|
94
|
+
const token = resolveProviderToken("elevenlabs").token;
|
|
95
|
+
if (!token) return new Response("ElevenLabs API key is not configured", {
|
|
96
|
+
status: 400
|
|
97
|
+
});
|
|
98
|
+
const voiceId = resolved.elevenlabs.voiceId;
|
|
99
|
+
if (!voiceId) return new Response("ElevenLabs voiceId is required", {
|
|
100
|
+
status: 400
|
|
101
|
+
});
|
|
102
|
+
const query = new URLSearchParams();
|
|
103
|
+
if (resolved.elevenlabs.outputFormat) query.set("output_format", resolved.elevenlabs.outputFormat);
|
|
104
|
+
if ("number" == typeof resolved.elevenlabs.optimizeStreamingLatency) query.set("optimize_streaming_latency", String(resolved.elevenlabs.optimizeStreamingLatency));
|
|
105
|
+
const endpoint = `${ELEVENLABS_BASE_URL}/text-to-speech/${voiceId}${query.toString() ? `?${query.toString()}` : ""}`;
|
|
106
|
+
const elevenPayload = buildElevenLabsPayload(text, resolved.elevenlabs);
|
|
107
|
+
const response = await fetch(endpoint, {
|
|
108
|
+
method: "POST",
|
|
109
|
+
headers: {
|
|
110
|
+
"Content-Type": "application/json",
|
|
111
|
+
"xi-api-key": token,
|
|
112
|
+
Accept: "audio/mpeg"
|
|
113
|
+
},
|
|
114
|
+
body: JSON.stringify(elevenPayload)
|
|
115
|
+
});
|
|
116
|
+
if (!response.ok) {
|
|
117
|
+
const errorText = await response.text();
|
|
118
|
+
return new Response(errorText || "ElevenLabs request failed", {
|
|
119
|
+
status: response.status
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
const audioBuffer = await response.arrayBuffer();
|
|
123
|
+
const contentType = response.headers.get("content-type") || "audio/mpeg";
|
|
124
|
+
return new Response(audioBuffer, {
|
|
125
|
+
headers: {
|
|
126
|
+
"Content-Type": contentType,
|
|
127
|
+
"Cache-Control": "no-store"
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
};
|
|
133
|
+
export { handleVoiceApi };
|