@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,319 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_exports__ = {};
|
|
3
|
+
const external_vitest_namespaceObject = require("vitest");
|
|
4
|
+
const index_cjs_namespaceObject = require("../gateway/index.cjs");
|
|
5
|
+
const isBun = void 0 !== globalThis.Bun;
|
|
6
|
+
const describeIfBun = isBun ? external_vitest_namespaceObject.describe : external_vitest_namespaceObject.describe.skip;
|
|
7
|
+
external_vitest_namespaceObject.vi.mock("@/cli/core/agentInvoker.js", ()=>({
|
|
8
|
+
AgentInvoker: class {
|
|
9
|
+
async invokeAgent() {
|
|
10
|
+
return {
|
|
11
|
+
streaming: true
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}));
|
|
16
|
+
describeIfBun("Gateway", ()=>{
|
|
17
|
+
let server;
|
|
18
|
+
let port = 0;
|
|
19
|
+
(0, external_vitest_namespaceObject.beforeAll)(async ()=>{
|
|
20
|
+
const startPort = 23000;
|
|
21
|
+
const attempts = 50;
|
|
22
|
+
let lastError = null;
|
|
23
|
+
for(let i = 0; i < attempts; i += 1){
|
|
24
|
+
const candidate = startPort + i;
|
|
25
|
+
try {
|
|
26
|
+
const instance = new index_cjs_namespaceObject.GatewayServer({
|
|
27
|
+
port: candidate,
|
|
28
|
+
host: "localhost",
|
|
29
|
+
requireAuth: false,
|
|
30
|
+
logLevel: "silent"
|
|
31
|
+
});
|
|
32
|
+
await instance.start();
|
|
33
|
+
server = instance;
|
|
34
|
+
port = candidate;
|
|
35
|
+
lastError = null;
|
|
36
|
+
break;
|
|
37
|
+
} catch (error) {
|
|
38
|
+
lastError = error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (!server || !port) throw lastError ?? new Error("Unable to start gateway server for tests");
|
|
42
|
+
await new Promise((resolve)=>setTimeout(resolve, 500));
|
|
43
|
+
});
|
|
44
|
+
(0, external_vitest_namespaceObject.afterAll)(async ()=>{
|
|
45
|
+
if (server) await server.stop();
|
|
46
|
+
});
|
|
47
|
+
const connectClient = (instanceId, clientType = "test")=>new Promise((resolve, reject)=>{
|
|
48
|
+
const ws = new WebSocket(`ws://localhost:${port}/ws`);
|
|
49
|
+
const connectId = `connect-${instanceId}-${Date.now()}`;
|
|
50
|
+
const timeout = setTimeout(()=>reject(new Error("Connect timeout")), 5000);
|
|
51
|
+
ws.addEventListener("open", ()=>{
|
|
52
|
+
const message = {
|
|
53
|
+
type: "connect",
|
|
54
|
+
id: connectId,
|
|
55
|
+
client: {
|
|
56
|
+
instanceId,
|
|
57
|
+
clientType
|
|
58
|
+
},
|
|
59
|
+
timestamp: Date.now()
|
|
60
|
+
};
|
|
61
|
+
ws.send(JSON.stringify(message));
|
|
62
|
+
});
|
|
63
|
+
ws.addEventListener("message", (event)=>{
|
|
64
|
+
const msg = JSON.parse(event.data);
|
|
65
|
+
if ("res" === msg.type && msg.id === connectId && msg.ok) {
|
|
66
|
+
clearTimeout(timeout);
|
|
67
|
+
resolve(ws);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
ws.addEventListener("error", ()=>{
|
|
71
|
+
clearTimeout(timeout);
|
|
72
|
+
reject(new Error("WebSocket error"));
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
const waitForMessage = (ws, predicate, timeoutMs = 5000)=>new Promise((resolve, reject)=>{
|
|
76
|
+
const timeout = setTimeout(()=>reject(new Error("Message timeout")), timeoutMs);
|
|
77
|
+
const handler = (event)=>{
|
|
78
|
+
let msg;
|
|
79
|
+
try {
|
|
80
|
+
msg = JSON.parse(event.data);
|
|
81
|
+
} catch {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (!predicate(msg)) return;
|
|
85
|
+
clearTimeout(timeout);
|
|
86
|
+
ws.removeEventListener("message", handler);
|
|
87
|
+
resolve(msg);
|
|
88
|
+
};
|
|
89
|
+
ws.addEventListener("message", handler);
|
|
90
|
+
});
|
|
91
|
+
(0, external_vitest_namespaceObject.it)("should start the gateway server", async ()=>{
|
|
92
|
+
const response = await fetch(`http://localhost:${port}/health`);
|
|
93
|
+
(0, external_vitest_namespaceObject.expect)(response.ok).toBe(true);
|
|
94
|
+
const health = await response.json();
|
|
95
|
+
(0, external_vitest_namespaceObject.expect)(health.status).toBe("healthy");
|
|
96
|
+
});
|
|
97
|
+
(0, external_vitest_namespaceObject.it)("should connect a client", async ()=>new Promise((resolve, reject)=>{
|
|
98
|
+
const client = new index_cjs_namespaceObject.GatewayClient(`ws://localhost:${port}/ws`, "test-client", {
|
|
99
|
+
events: {
|
|
100
|
+
connected: ()=>{
|
|
101
|
+
client.disconnect();
|
|
102
|
+
resolve();
|
|
103
|
+
},
|
|
104
|
+
error: (error)=>{
|
|
105
|
+
reject(new Error(error.message));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
client.connect().catch(reject);
|
|
110
|
+
setTimeout(()=>reject(new Error("Connection timeout")), 5000);
|
|
111
|
+
}));
|
|
112
|
+
(0, external_vitest_namespaceObject.it)("should register a client and receive node ID", async ()=>new Promise((resolve, reject)=>{
|
|
113
|
+
const client = new index_cjs_namespaceObject.GatewayClient(`ws://localhost:${port}/ws`, "test-client-2", {
|
|
114
|
+
events: {
|
|
115
|
+
registered: (nodeId, name)=>{
|
|
116
|
+
(0, external_vitest_namespaceObject.expect)(nodeId).toBeTruthy();
|
|
117
|
+
(0, external_vitest_namespaceObject.expect)(name).toBe("test-client-2");
|
|
118
|
+
client.disconnect();
|
|
119
|
+
resolve();
|
|
120
|
+
},
|
|
121
|
+
error: (error)=>{
|
|
122
|
+
reject(new Error(error.message));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
client.connect().catch(reject);
|
|
127
|
+
setTimeout(()=>reject(new Error("Registration timeout")), 5000);
|
|
128
|
+
}));
|
|
129
|
+
(0, external_vitest_namespaceObject.it)("should join a broadcast group", async ()=>new Promise((resolve, reject)=>{
|
|
130
|
+
const client = new index_cjs_namespaceObject.GatewayClient(`ws://localhost:${port}/ws`, "test-client-3", {
|
|
131
|
+
events: {
|
|
132
|
+
registered: async ()=>{
|
|
133
|
+
await client.joinGroup("test-group");
|
|
134
|
+
},
|
|
135
|
+
joinedGroup: (groupId, groupName)=>{
|
|
136
|
+
(0, external_vitest_namespaceObject.expect)(groupName).toBe("test-group");
|
|
137
|
+
client.disconnect();
|
|
138
|
+
resolve();
|
|
139
|
+
},
|
|
140
|
+
error: (error)=>{
|
|
141
|
+
reject(new Error(error.message));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
client.connect().catch(reject);
|
|
146
|
+
setTimeout(()=>reject(new Error("Join group timeout")), 5000);
|
|
147
|
+
}));
|
|
148
|
+
(0, external_vitest_namespaceObject.it)("should broadcast messages to group members", async ()=>new Promise((resolve, reject)=>{
|
|
149
|
+
let client1NodeId = null;
|
|
150
|
+
let messagesReceived = 0;
|
|
151
|
+
const client1 = new index_cjs_namespaceObject.GatewayClient(`ws://localhost:${port}/ws`, "broadcaster", {
|
|
152
|
+
events: {
|
|
153
|
+
registered: async (nodeId)=>{
|
|
154
|
+
client1NodeId = nodeId;
|
|
155
|
+
await client1.joinGroup("broadcast-test");
|
|
156
|
+
},
|
|
157
|
+
joinedGroup: ()=>{
|
|
158
|
+
client2.connect().catch(reject);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
const client2 = new index_cjs_namespaceObject.GatewayClient(`ws://localhost:${port}/ws`, "receiver", {
|
|
163
|
+
events: {
|
|
164
|
+
registered: async ()=>{
|
|
165
|
+
await client2.joinGroup("broadcast-test");
|
|
166
|
+
},
|
|
167
|
+
joinedGroup: ()=>{
|
|
168
|
+
client1.broadcast("broadcast-test", {
|
|
169
|
+
message: "Hello from client 1"
|
|
170
|
+
});
|
|
171
|
+
},
|
|
172
|
+
broadcast: (message, fromNodeId)=>{
|
|
173
|
+
(0, external_vitest_namespaceObject.expect)(fromNodeId).toBe(client1NodeId);
|
|
174
|
+
(0, external_vitest_namespaceObject.expect)(message.message).toBe("Hello from client 1");
|
|
175
|
+
messagesReceived++;
|
|
176
|
+
client1.disconnect();
|
|
177
|
+
client2.disconnect();
|
|
178
|
+
resolve();
|
|
179
|
+
},
|
|
180
|
+
error: (error)=>{
|
|
181
|
+
reject(new Error(error.message));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
client1.connect().catch(reject);
|
|
186
|
+
setTimeout(()=>reject(new Error("Broadcast test timeout")), 10000);
|
|
187
|
+
}));
|
|
188
|
+
(0, external_vitest_namespaceObject.it)("should handle ping/pong", async ()=>new Promise((resolve, reject)=>{
|
|
189
|
+
const client = new index_cjs_namespaceObject.GatewayClient(`ws://localhost:${port}/ws`, "ping-test", {
|
|
190
|
+
events: {
|
|
191
|
+
registered: ()=>{
|
|
192
|
+
client.ping();
|
|
193
|
+
},
|
|
194
|
+
pong: ()=>{
|
|
195
|
+
client.disconnect();
|
|
196
|
+
resolve();
|
|
197
|
+
},
|
|
198
|
+
error: (error)=>{
|
|
199
|
+
reject(new Error(error.message));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
client.connect().catch(reject);
|
|
204
|
+
setTimeout(()=>reject(new Error("Ping/pong timeout")), 5000);
|
|
205
|
+
}));
|
|
206
|
+
(0, external_vitest_namespaceObject.it)("should stream agent events to session subscribers", async ()=>{
|
|
207
|
+
const subscriber = await connectClient("session-subscriber");
|
|
208
|
+
const sessionId = "session-test";
|
|
209
|
+
subscriber.send(JSON.stringify({
|
|
210
|
+
type: "session_subscribe",
|
|
211
|
+
payload: {
|
|
212
|
+
sessionId
|
|
213
|
+
},
|
|
214
|
+
timestamp: Date.now()
|
|
215
|
+
}));
|
|
216
|
+
await waitForMessage(subscriber, (msg)=>"ack" === msg.type && msg.payload?.action === "session_subscribe" && msg.payload?.sessionId === sessionId);
|
|
217
|
+
const eventPromise = waitForMessage(subscriber, (msg)=>"event:agent" === msg.type && "req-session" === msg.id);
|
|
218
|
+
const sent = server.broadcastSessionEvent(sessionId, {
|
|
219
|
+
type: "event:agent",
|
|
220
|
+
id: "req-session",
|
|
221
|
+
payload: {
|
|
222
|
+
type: "agent-stream",
|
|
223
|
+
sessionId,
|
|
224
|
+
agentId: "main",
|
|
225
|
+
chunk: {
|
|
226
|
+
content: "hello"
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
timestamp: Date.now()
|
|
230
|
+
});
|
|
231
|
+
(0, external_vitest_namespaceObject.expect)(sent).toBe(1);
|
|
232
|
+
const eventMsg = await eventPromise;
|
|
233
|
+
(0, external_vitest_namespaceObject.expect)(eventMsg.payload?.sessionId).toBe(sessionId);
|
|
234
|
+
subscriber.close();
|
|
235
|
+
});
|
|
236
|
+
(0, external_vitest_namespaceObject.it)("should broadcast user messages to session subscribers", async ()=>{
|
|
237
|
+
const subscriber = await connectClient("session-input-subscriber");
|
|
238
|
+
const requester = await connectClient("session-input-requester");
|
|
239
|
+
const sessionId = "session-input-test";
|
|
240
|
+
subscriber.send(JSON.stringify({
|
|
241
|
+
type: "session_subscribe",
|
|
242
|
+
payload: {
|
|
243
|
+
sessionId
|
|
244
|
+
},
|
|
245
|
+
timestamp: Date.now()
|
|
246
|
+
}));
|
|
247
|
+
await waitForMessage(subscriber, (msg)=>"ack" === msg.type && msg.payload?.action === "session_subscribe" && msg.payload?.sessionId === sessionId);
|
|
248
|
+
const eventPromise = waitForMessage(subscriber, (msg)=>"event:agent" === msg.type && msg.payload?.type === "session-message" && msg.payload?.role === "user");
|
|
249
|
+
requester.send(JSON.stringify({
|
|
250
|
+
type: "req:agent",
|
|
251
|
+
id: "req-session-input",
|
|
252
|
+
payload: {
|
|
253
|
+
agentId: "main",
|
|
254
|
+
sessionKey: sessionId,
|
|
255
|
+
content: "Hello from test"
|
|
256
|
+
},
|
|
257
|
+
timestamp: Date.now()
|
|
258
|
+
}));
|
|
259
|
+
const eventMsg = await eventPromise;
|
|
260
|
+
(0, external_vitest_namespaceObject.expect)(eventMsg.payload?.content).toBe("Hello from test");
|
|
261
|
+
(0, external_vitest_namespaceObject.expect)(eventMsg.payload?.sessionId).toBe(sessionId);
|
|
262
|
+
(0, external_vitest_namespaceObject.expect)(eventMsg.payload?.agentId).toBe("main");
|
|
263
|
+
subscriber.close();
|
|
264
|
+
requester.close();
|
|
265
|
+
});
|
|
266
|
+
(0, external_vitest_namespaceObject.it)("should broadcast user messages to webui clients without session subscribe", async ()=>{
|
|
267
|
+
const webuiClient = await connectClient("session-webui-listener", "webui");
|
|
268
|
+
const requester = await connectClient("session-webui-requester");
|
|
269
|
+
const sessionId = "session-webui-test";
|
|
270
|
+
const eventPromise = waitForMessage(webuiClient, (msg)=>"event:agent" === msg.type && msg.payload?.type === "session-message" && msg.payload?.role === "user" && msg.payload?.sessionId === sessionId);
|
|
271
|
+
requester.send(JSON.stringify({
|
|
272
|
+
type: "req:agent",
|
|
273
|
+
id: "req-session-webui",
|
|
274
|
+
payload: {
|
|
275
|
+
agentId: "main",
|
|
276
|
+
sessionKey: sessionId,
|
|
277
|
+
content: "Hello webui"
|
|
278
|
+
},
|
|
279
|
+
timestamp: Date.now()
|
|
280
|
+
}));
|
|
281
|
+
const eventMsg = await eventPromise;
|
|
282
|
+
(0, external_vitest_namespaceObject.expect)(eventMsg.payload?.content).toBe("Hello webui");
|
|
283
|
+
(0, external_vitest_namespaceObject.expect)(eventMsg.payload?.agentId).toBe("main");
|
|
284
|
+
webuiClient.close();
|
|
285
|
+
requester.close();
|
|
286
|
+
});
|
|
287
|
+
(0, external_vitest_namespaceObject.it)("should clear session messages via API", async ()=>{
|
|
288
|
+
const createRes = await fetch(`http://localhost:${port}/api/sessions`, {
|
|
289
|
+
method: "POST",
|
|
290
|
+
headers: {
|
|
291
|
+
"Content-Type": "application/json"
|
|
292
|
+
},
|
|
293
|
+
body: JSON.stringify({
|
|
294
|
+
agentId: "main",
|
|
295
|
+
name: "Clear Test"
|
|
296
|
+
})
|
|
297
|
+
});
|
|
298
|
+
(0, external_vitest_namespaceObject.expect)(createRes.ok).toBe(true);
|
|
299
|
+
const session = await createRes.json();
|
|
300
|
+
const manager = await server.getSessionManager("main");
|
|
301
|
+
manager.updateSession(session.id, {
|
|
302
|
+
messageCount: 3,
|
|
303
|
+
lastMessagePreview: "Hello"
|
|
304
|
+
});
|
|
305
|
+
const clearRes = await fetch(`http://localhost:${port}/api/sessions/${encodeURIComponent(session.id)}/messages?agentId=main`, {
|
|
306
|
+
method: "DELETE"
|
|
307
|
+
});
|
|
308
|
+
(0, external_vitest_namespaceObject.expect)(clearRes.ok).toBe(true);
|
|
309
|
+
const cleared = await clearRes.json();
|
|
310
|
+
(0, external_vitest_namespaceObject.expect)(cleared.messageCount).toBe(0);
|
|
311
|
+
const updated = manager.getSession(session.id);
|
|
312
|
+
(0, external_vitest_namespaceObject.expect)(updated?.messageCount).toBe(0);
|
|
313
|
+
(0, external_vitest_namespaceObject.expect)(updated?.lastMessagePreview).toBeNull();
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
317
|
+
Object.defineProperty(exports, '__esModule', {
|
|
318
|
+
value: true
|
|
319
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { GatewayClient, GatewayServer } from "../gateway/index.js";
|
|
3
|
+
const isBun = void 0 !== globalThis.Bun;
|
|
4
|
+
const describeIfBun = isBun ? describe : describe.skip;
|
|
5
|
+
vi.mock("@/cli/core/agentInvoker.js", ()=>({
|
|
6
|
+
AgentInvoker: class {
|
|
7
|
+
async invokeAgent() {
|
|
8
|
+
return {
|
|
9
|
+
streaming: true
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}));
|
|
14
|
+
describeIfBun("Gateway", ()=>{
|
|
15
|
+
let server;
|
|
16
|
+
let port = 0;
|
|
17
|
+
beforeAll(async ()=>{
|
|
18
|
+
const startPort = 23000;
|
|
19
|
+
const attempts = 50;
|
|
20
|
+
let lastError = null;
|
|
21
|
+
for(let i = 0; i < attempts; i += 1){
|
|
22
|
+
const candidate = startPort + i;
|
|
23
|
+
try {
|
|
24
|
+
const instance = new GatewayServer({
|
|
25
|
+
port: candidate,
|
|
26
|
+
host: "localhost",
|
|
27
|
+
requireAuth: false,
|
|
28
|
+
logLevel: "silent"
|
|
29
|
+
});
|
|
30
|
+
await instance.start();
|
|
31
|
+
server = instance;
|
|
32
|
+
port = candidate;
|
|
33
|
+
lastError = null;
|
|
34
|
+
break;
|
|
35
|
+
} catch (error) {
|
|
36
|
+
lastError = error;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (!server || !port) throw lastError ?? new Error("Unable to start gateway server for tests");
|
|
40
|
+
await new Promise((resolve)=>setTimeout(resolve, 500));
|
|
41
|
+
});
|
|
42
|
+
afterAll(async ()=>{
|
|
43
|
+
if (server) await server.stop();
|
|
44
|
+
});
|
|
45
|
+
const connectClient = (instanceId, clientType = "test")=>new Promise((resolve, reject)=>{
|
|
46
|
+
const ws = new WebSocket(`ws://localhost:${port}/ws`);
|
|
47
|
+
const connectId = `connect-${instanceId}-${Date.now()}`;
|
|
48
|
+
const timeout = setTimeout(()=>reject(new Error("Connect timeout")), 5000);
|
|
49
|
+
ws.addEventListener("open", ()=>{
|
|
50
|
+
const message = {
|
|
51
|
+
type: "connect",
|
|
52
|
+
id: connectId,
|
|
53
|
+
client: {
|
|
54
|
+
instanceId,
|
|
55
|
+
clientType
|
|
56
|
+
},
|
|
57
|
+
timestamp: Date.now()
|
|
58
|
+
};
|
|
59
|
+
ws.send(JSON.stringify(message));
|
|
60
|
+
});
|
|
61
|
+
ws.addEventListener("message", (event)=>{
|
|
62
|
+
const msg = JSON.parse(event.data);
|
|
63
|
+
if ("res" === msg.type && msg.id === connectId && msg.ok) {
|
|
64
|
+
clearTimeout(timeout);
|
|
65
|
+
resolve(ws);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
ws.addEventListener("error", ()=>{
|
|
69
|
+
clearTimeout(timeout);
|
|
70
|
+
reject(new Error("WebSocket error"));
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
const waitForMessage = (ws, predicate, timeoutMs = 5000)=>new Promise((resolve, reject)=>{
|
|
74
|
+
const timeout = setTimeout(()=>reject(new Error("Message timeout")), timeoutMs);
|
|
75
|
+
const handler = (event)=>{
|
|
76
|
+
let msg;
|
|
77
|
+
try {
|
|
78
|
+
msg = JSON.parse(event.data);
|
|
79
|
+
} catch {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (!predicate(msg)) return;
|
|
83
|
+
clearTimeout(timeout);
|
|
84
|
+
ws.removeEventListener("message", handler);
|
|
85
|
+
resolve(msg);
|
|
86
|
+
};
|
|
87
|
+
ws.addEventListener("message", handler);
|
|
88
|
+
});
|
|
89
|
+
it("should start the gateway server", async ()=>{
|
|
90
|
+
const response = await fetch(`http://localhost:${port}/health`);
|
|
91
|
+
expect(response.ok).toBe(true);
|
|
92
|
+
const health = await response.json();
|
|
93
|
+
expect(health.status).toBe("healthy");
|
|
94
|
+
});
|
|
95
|
+
it("should connect a client", async ()=>new Promise((resolve, reject)=>{
|
|
96
|
+
const client = new GatewayClient(`ws://localhost:${port}/ws`, "test-client", {
|
|
97
|
+
events: {
|
|
98
|
+
connected: ()=>{
|
|
99
|
+
client.disconnect();
|
|
100
|
+
resolve();
|
|
101
|
+
},
|
|
102
|
+
error: (error)=>{
|
|
103
|
+
reject(new Error(error.message));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
client.connect().catch(reject);
|
|
108
|
+
setTimeout(()=>reject(new Error("Connection timeout")), 5000);
|
|
109
|
+
}));
|
|
110
|
+
it("should register a client and receive node ID", async ()=>new Promise((resolve, reject)=>{
|
|
111
|
+
const client = new GatewayClient(`ws://localhost:${port}/ws`, "test-client-2", {
|
|
112
|
+
events: {
|
|
113
|
+
registered: (nodeId, name)=>{
|
|
114
|
+
expect(nodeId).toBeTruthy();
|
|
115
|
+
expect(name).toBe("test-client-2");
|
|
116
|
+
client.disconnect();
|
|
117
|
+
resolve();
|
|
118
|
+
},
|
|
119
|
+
error: (error)=>{
|
|
120
|
+
reject(new Error(error.message));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
client.connect().catch(reject);
|
|
125
|
+
setTimeout(()=>reject(new Error("Registration timeout")), 5000);
|
|
126
|
+
}));
|
|
127
|
+
it("should join a broadcast group", async ()=>new Promise((resolve, reject)=>{
|
|
128
|
+
const client = new GatewayClient(`ws://localhost:${port}/ws`, "test-client-3", {
|
|
129
|
+
events: {
|
|
130
|
+
registered: async ()=>{
|
|
131
|
+
await client.joinGroup("test-group");
|
|
132
|
+
},
|
|
133
|
+
joinedGroup: (groupId, groupName)=>{
|
|
134
|
+
expect(groupName).toBe("test-group");
|
|
135
|
+
client.disconnect();
|
|
136
|
+
resolve();
|
|
137
|
+
},
|
|
138
|
+
error: (error)=>{
|
|
139
|
+
reject(new Error(error.message));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
client.connect().catch(reject);
|
|
144
|
+
setTimeout(()=>reject(new Error("Join group timeout")), 5000);
|
|
145
|
+
}));
|
|
146
|
+
it("should broadcast messages to group members", async ()=>new Promise((resolve, reject)=>{
|
|
147
|
+
let client1NodeId = null;
|
|
148
|
+
let messagesReceived = 0;
|
|
149
|
+
const client1 = new GatewayClient(`ws://localhost:${port}/ws`, "broadcaster", {
|
|
150
|
+
events: {
|
|
151
|
+
registered: async (nodeId)=>{
|
|
152
|
+
client1NodeId = nodeId;
|
|
153
|
+
await client1.joinGroup("broadcast-test");
|
|
154
|
+
},
|
|
155
|
+
joinedGroup: ()=>{
|
|
156
|
+
client2.connect().catch(reject);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
const client2 = new GatewayClient(`ws://localhost:${port}/ws`, "receiver", {
|
|
161
|
+
events: {
|
|
162
|
+
registered: async ()=>{
|
|
163
|
+
await client2.joinGroup("broadcast-test");
|
|
164
|
+
},
|
|
165
|
+
joinedGroup: ()=>{
|
|
166
|
+
client1.broadcast("broadcast-test", {
|
|
167
|
+
message: "Hello from client 1"
|
|
168
|
+
});
|
|
169
|
+
},
|
|
170
|
+
broadcast: (message, fromNodeId)=>{
|
|
171
|
+
expect(fromNodeId).toBe(client1NodeId);
|
|
172
|
+
expect(message.message).toBe("Hello from client 1");
|
|
173
|
+
messagesReceived++;
|
|
174
|
+
client1.disconnect();
|
|
175
|
+
client2.disconnect();
|
|
176
|
+
resolve();
|
|
177
|
+
},
|
|
178
|
+
error: (error)=>{
|
|
179
|
+
reject(new Error(error.message));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
client1.connect().catch(reject);
|
|
184
|
+
setTimeout(()=>reject(new Error("Broadcast test timeout")), 10000);
|
|
185
|
+
}));
|
|
186
|
+
it("should handle ping/pong", async ()=>new Promise((resolve, reject)=>{
|
|
187
|
+
const client = new GatewayClient(`ws://localhost:${port}/ws`, "ping-test", {
|
|
188
|
+
events: {
|
|
189
|
+
registered: ()=>{
|
|
190
|
+
client.ping();
|
|
191
|
+
},
|
|
192
|
+
pong: ()=>{
|
|
193
|
+
client.disconnect();
|
|
194
|
+
resolve();
|
|
195
|
+
},
|
|
196
|
+
error: (error)=>{
|
|
197
|
+
reject(new Error(error.message));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
client.connect().catch(reject);
|
|
202
|
+
setTimeout(()=>reject(new Error("Ping/pong timeout")), 5000);
|
|
203
|
+
}));
|
|
204
|
+
it("should stream agent events to session subscribers", async ()=>{
|
|
205
|
+
const subscriber = await connectClient("session-subscriber");
|
|
206
|
+
const sessionId = "session-test";
|
|
207
|
+
subscriber.send(JSON.stringify({
|
|
208
|
+
type: "session_subscribe",
|
|
209
|
+
payload: {
|
|
210
|
+
sessionId
|
|
211
|
+
},
|
|
212
|
+
timestamp: Date.now()
|
|
213
|
+
}));
|
|
214
|
+
await waitForMessage(subscriber, (msg)=>"ack" === msg.type && msg.payload?.action === "session_subscribe" && msg.payload?.sessionId === sessionId);
|
|
215
|
+
const eventPromise = waitForMessage(subscriber, (msg)=>"event:agent" === msg.type && "req-session" === msg.id);
|
|
216
|
+
const sent = server.broadcastSessionEvent(sessionId, {
|
|
217
|
+
type: "event:agent",
|
|
218
|
+
id: "req-session",
|
|
219
|
+
payload: {
|
|
220
|
+
type: "agent-stream",
|
|
221
|
+
sessionId,
|
|
222
|
+
agentId: "main",
|
|
223
|
+
chunk: {
|
|
224
|
+
content: "hello"
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
timestamp: Date.now()
|
|
228
|
+
});
|
|
229
|
+
expect(sent).toBe(1);
|
|
230
|
+
const eventMsg = await eventPromise;
|
|
231
|
+
expect(eventMsg.payload?.sessionId).toBe(sessionId);
|
|
232
|
+
subscriber.close();
|
|
233
|
+
});
|
|
234
|
+
it("should broadcast user messages to session subscribers", async ()=>{
|
|
235
|
+
const subscriber = await connectClient("session-input-subscriber");
|
|
236
|
+
const requester = await connectClient("session-input-requester");
|
|
237
|
+
const sessionId = "session-input-test";
|
|
238
|
+
subscriber.send(JSON.stringify({
|
|
239
|
+
type: "session_subscribe",
|
|
240
|
+
payload: {
|
|
241
|
+
sessionId
|
|
242
|
+
},
|
|
243
|
+
timestamp: Date.now()
|
|
244
|
+
}));
|
|
245
|
+
await waitForMessage(subscriber, (msg)=>"ack" === msg.type && msg.payload?.action === "session_subscribe" && msg.payload?.sessionId === sessionId);
|
|
246
|
+
const eventPromise = waitForMessage(subscriber, (msg)=>"event:agent" === msg.type && msg.payload?.type === "session-message" && msg.payload?.role === "user");
|
|
247
|
+
requester.send(JSON.stringify({
|
|
248
|
+
type: "req:agent",
|
|
249
|
+
id: "req-session-input",
|
|
250
|
+
payload: {
|
|
251
|
+
agentId: "main",
|
|
252
|
+
sessionKey: sessionId,
|
|
253
|
+
content: "Hello from test"
|
|
254
|
+
},
|
|
255
|
+
timestamp: Date.now()
|
|
256
|
+
}));
|
|
257
|
+
const eventMsg = await eventPromise;
|
|
258
|
+
expect(eventMsg.payload?.content).toBe("Hello from test");
|
|
259
|
+
expect(eventMsg.payload?.sessionId).toBe(sessionId);
|
|
260
|
+
expect(eventMsg.payload?.agentId).toBe("main");
|
|
261
|
+
subscriber.close();
|
|
262
|
+
requester.close();
|
|
263
|
+
});
|
|
264
|
+
it("should broadcast user messages to webui clients without session subscribe", async ()=>{
|
|
265
|
+
const webuiClient = await connectClient("session-webui-listener", "webui");
|
|
266
|
+
const requester = await connectClient("session-webui-requester");
|
|
267
|
+
const sessionId = "session-webui-test";
|
|
268
|
+
const eventPromise = waitForMessage(webuiClient, (msg)=>"event:agent" === msg.type && msg.payload?.type === "session-message" && msg.payload?.role === "user" && msg.payload?.sessionId === sessionId);
|
|
269
|
+
requester.send(JSON.stringify({
|
|
270
|
+
type: "req:agent",
|
|
271
|
+
id: "req-session-webui",
|
|
272
|
+
payload: {
|
|
273
|
+
agentId: "main",
|
|
274
|
+
sessionKey: sessionId,
|
|
275
|
+
content: "Hello webui"
|
|
276
|
+
},
|
|
277
|
+
timestamp: Date.now()
|
|
278
|
+
}));
|
|
279
|
+
const eventMsg = await eventPromise;
|
|
280
|
+
expect(eventMsg.payload?.content).toBe("Hello webui");
|
|
281
|
+
expect(eventMsg.payload?.agentId).toBe("main");
|
|
282
|
+
webuiClient.close();
|
|
283
|
+
requester.close();
|
|
284
|
+
});
|
|
285
|
+
it("should clear session messages via API", async ()=>{
|
|
286
|
+
const createRes = await fetch(`http://localhost:${port}/api/sessions`, {
|
|
287
|
+
method: "POST",
|
|
288
|
+
headers: {
|
|
289
|
+
"Content-Type": "application/json"
|
|
290
|
+
},
|
|
291
|
+
body: JSON.stringify({
|
|
292
|
+
agentId: "main",
|
|
293
|
+
name: "Clear Test"
|
|
294
|
+
})
|
|
295
|
+
});
|
|
296
|
+
expect(createRes.ok).toBe(true);
|
|
297
|
+
const session = await createRes.json();
|
|
298
|
+
const manager = await server.getSessionManager("main");
|
|
299
|
+
manager.updateSession(session.id, {
|
|
300
|
+
messageCount: 3,
|
|
301
|
+
lastMessagePreview: "Hello"
|
|
302
|
+
});
|
|
303
|
+
const clearRes = await fetch(`http://localhost:${port}/api/sessions/${encodeURIComponent(session.id)}/messages?agentId=main`, {
|
|
304
|
+
method: "DELETE"
|
|
305
|
+
});
|
|
306
|
+
expect(clearRes.ok).toBe(true);
|
|
307
|
+
const cleared = await clearRes.json();
|
|
308
|
+
expect(cleared.messageCount).toBe(0);
|
|
309
|
+
const updated = manager.getSession(session.id);
|
|
310
|
+
expect(updated?.messageCount).toBe(0);
|
|
311
|
+
expect(updated?.lastMessagePreview).toBeNull();
|
|
312
|
+
});
|
|
313
|
+
});
|