@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,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_modules__ = {
|
|
3
|
+
"./mdns.js" (module) {
|
|
4
|
+
module.exports = require("./mdns.cjs");
|
|
5
|
+
},
|
|
6
|
+
"./tailscale.js" (module) {
|
|
7
|
+
module.exports = require("./tailscale.cjs");
|
|
8
|
+
},
|
|
9
|
+
"./types.js" (module) {
|
|
10
|
+
module.exports = require("./types.cjs");
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
var __webpack_module_cache__ = {};
|
|
14
|
+
function __webpack_require__(moduleId) {
|
|
15
|
+
var cachedModule = __webpack_module_cache__[moduleId];
|
|
16
|
+
if (void 0 !== cachedModule) return cachedModule.exports;
|
|
17
|
+
var module = __webpack_module_cache__[moduleId] = {
|
|
18
|
+
exports: {}
|
|
19
|
+
};
|
|
20
|
+
__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
21
|
+
return module.exports;
|
|
22
|
+
}
|
|
23
|
+
(()=>{
|
|
24
|
+
__webpack_require__.n = (module)=>{
|
|
25
|
+
var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
|
|
26
|
+
__webpack_require__.d(getter, {
|
|
27
|
+
a: getter
|
|
28
|
+
});
|
|
29
|
+
return getter;
|
|
30
|
+
};
|
|
31
|
+
})();
|
|
32
|
+
(()=>{
|
|
33
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
34
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
35
|
+
enumerable: true,
|
|
36
|
+
get: definition[key]
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
(()=>{
|
|
41
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
42
|
+
})();
|
|
43
|
+
(()=>{
|
|
44
|
+
__webpack_require__.r = (exports1)=>{
|
|
45
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
46
|
+
value: 'Module'
|
|
47
|
+
});
|
|
48
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
49
|
+
value: true
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
})();
|
|
53
|
+
var __webpack_exports__ = {};
|
|
54
|
+
(()=>{
|
|
55
|
+
__webpack_require__.r(__webpack_exports__);
|
|
56
|
+
var _types_js__rspack_import_0 = __webpack_require__("./types.js");
|
|
57
|
+
var __rspack_reexport = {};
|
|
58
|
+
for(const __rspack_import_key in _types_js__rspack_import_0)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_types_js__rspack_import_0[__rspack_import_key];
|
|
59
|
+
__webpack_require__.d(__webpack_exports__, __rspack_reexport);
|
|
60
|
+
var _mdns_js__rspack_import_1 = __webpack_require__("./mdns.js");
|
|
61
|
+
var __rspack_reexport = {};
|
|
62
|
+
for(const __rspack_import_key in _mdns_js__rspack_import_1)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_mdns_js__rspack_import_1[__rspack_import_key];
|
|
63
|
+
__webpack_require__.d(__webpack_exports__, __rspack_reexport);
|
|
64
|
+
var _tailscale_js__rspack_import_2 = __webpack_require__("./tailscale.js");
|
|
65
|
+
var __rspack_reexport = {};
|
|
66
|
+
for(const __rspack_import_key in _tailscale_js__rspack_import_2)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_tailscale_js__rspack_import_2[__rspack_import_key];
|
|
67
|
+
__webpack_require__.d(__webpack_exports__, __rspack_reexport);
|
|
68
|
+
})();
|
|
69
|
+
for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
70
|
+
Object.defineProperty(exports, '__esModule', {
|
|
71
|
+
value: true
|
|
72
|
+
});
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_modules__ = {
|
|
3
|
+
os (module) {
|
|
4
|
+
module.exports = require("os");
|
|
5
|
+
}
|
|
6
|
+
};
|
|
7
|
+
var __webpack_module_cache__ = {};
|
|
8
|
+
function __webpack_require__(moduleId) {
|
|
9
|
+
var cachedModule = __webpack_module_cache__[moduleId];
|
|
10
|
+
if (void 0 !== cachedModule) return cachedModule.exports;
|
|
11
|
+
var module = __webpack_module_cache__[moduleId] = {
|
|
12
|
+
exports: {}
|
|
13
|
+
};
|
|
14
|
+
__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
15
|
+
return module.exports;
|
|
16
|
+
}
|
|
17
|
+
(()=>{
|
|
18
|
+
__webpack_require__.n = (module)=>{
|
|
19
|
+
var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
|
|
20
|
+
__webpack_require__.d(getter, {
|
|
21
|
+
a: getter
|
|
22
|
+
});
|
|
23
|
+
return getter;
|
|
24
|
+
};
|
|
25
|
+
})();
|
|
26
|
+
(()=>{
|
|
27
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
28
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
29
|
+
enumerable: true,
|
|
30
|
+
get: definition[key]
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
})();
|
|
34
|
+
(()=>{
|
|
35
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
36
|
+
})();
|
|
37
|
+
(()=>{
|
|
38
|
+
__webpack_require__.r = (exports1)=>{
|
|
39
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
40
|
+
value: 'Module'
|
|
41
|
+
});
|
|
42
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
43
|
+
value: true
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
})();
|
|
47
|
+
var __webpack_exports__ = {};
|
|
48
|
+
(()=>{
|
|
49
|
+
__webpack_require__.r(__webpack_exports__);
|
|
50
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
51
|
+
MDNSDiscoveryService: ()=>MDNSDiscoveryService
|
|
52
|
+
});
|
|
53
|
+
const external_multicast_dns_namespaceObject = require("multicast-dns");
|
|
54
|
+
var external_multicast_dns_default = /*#__PURE__*/ __webpack_require__.n(external_multicast_dns_namespaceObject);
|
|
55
|
+
var external_os_ = __webpack_require__("os");
|
|
56
|
+
function _define_property(obj, key, value) {
|
|
57
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
58
|
+
value: value,
|
|
59
|
+
enumerable: true,
|
|
60
|
+
configurable: true,
|
|
61
|
+
writable: true
|
|
62
|
+
});
|
|
63
|
+
else obj[key] = value;
|
|
64
|
+
return obj;
|
|
65
|
+
}
|
|
66
|
+
const SERVICE_TYPE = "_wingman-gateway._tcp.local";
|
|
67
|
+
class MDNSDiscoveryService {
|
|
68
|
+
async announce(config) {
|
|
69
|
+
if (this.isAnnouncing) throw new Error("Already announcing");
|
|
70
|
+
this.config = config;
|
|
71
|
+
this.mdnsInstance = external_multicast_dns_default()();
|
|
72
|
+
this.mdnsInstance.on("query", (query)=>{
|
|
73
|
+
const isOurService = query.questions.some((q)=>q.name === SERVICE_TYPE || q.name === `${config.name}.${SERVICE_TYPE}`);
|
|
74
|
+
if (isOurService && this.mdnsInstance) {
|
|
75
|
+
const hostname = this.getLocalHostname();
|
|
76
|
+
const addresses = this.getLocalAddresses();
|
|
77
|
+
const txt = [
|
|
78
|
+
`version=${config.version}`,
|
|
79
|
+
`auth=${config.requireAuth ? "required" : "optional"}`,
|
|
80
|
+
`transport=${config.transport}`,
|
|
81
|
+
`capabilities=${config.capabilities.join(",")}`
|
|
82
|
+
];
|
|
83
|
+
this.mdnsInstance.respond({
|
|
84
|
+
answers: [
|
|
85
|
+
{
|
|
86
|
+
name: SERVICE_TYPE,
|
|
87
|
+
type: "PTR",
|
|
88
|
+
ttl: 120,
|
|
89
|
+
data: `${config.name}.${SERVICE_TYPE}`
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: `${config.name}.${SERVICE_TYPE}`,
|
|
93
|
+
type: "SRV",
|
|
94
|
+
ttl: 120,
|
|
95
|
+
data: {
|
|
96
|
+
priority: 0,
|
|
97
|
+
weight: 0,
|
|
98
|
+
port: config.port,
|
|
99
|
+
target: hostname
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: `${config.name}.${SERVICE_TYPE}`,
|
|
104
|
+
type: "TXT",
|
|
105
|
+
ttl: 120,
|
|
106
|
+
data: Buffer.from(txt.join("\n"))
|
|
107
|
+
},
|
|
108
|
+
...addresses.map((addr)=>({
|
|
109
|
+
name: hostname,
|
|
110
|
+
type: "A",
|
|
111
|
+
ttl: 120,
|
|
112
|
+
data: addr
|
|
113
|
+
}))
|
|
114
|
+
]
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
this.isAnnouncing = true;
|
|
119
|
+
}
|
|
120
|
+
async stopAnnouncing() {
|
|
121
|
+
if (this.mdnsInstance) {
|
|
122
|
+
this.mdnsInstance.destroy();
|
|
123
|
+
this.mdnsInstance = null;
|
|
124
|
+
}
|
|
125
|
+
this.isAnnouncing = false;
|
|
126
|
+
this.config = null;
|
|
127
|
+
}
|
|
128
|
+
async discover(timeout = 5000) {
|
|
129
|
+
return new Promise((resolve)=>{
|
|
130
|
+
const discovered = new Map();
|
|
131
|
+
const mdnsClient = external_multicast_dns_default()();
|
|
132
|
+
const timer = setTimeout(()=>{
|
|
133
|
+
mdnsClient.destroy();
|
|
134
|
+
resolve(Array.from(discovered.values()));
|
|
135
|
+
}, timeout);
|
|
136
|
+
mdnsClient.on("response", (response)=>{
|
|
137
|
+
try {
|
|
138
|
+
const gateway = this.parseResponse(response);
|
|
139
|
+
if (gateway) discovered.set(gateway.name, gateway);
|
|
140
|
+
} catch (error) {}
|
|
141
|
+
});
|
|
142
|
+
mdnsClient.query({
|
|
143
|
+
questions: [
|
|
144
|
+
{
|
|
145
|
+
name: SERVICE_TYPE,
|
|
146
|
+
type: "PTR"
|
|
147
|
+
}
|
|
148
|
+
]
|
|
149
|
+
});
|
|
150
|
+
const cleanup = ()=>{
|
|
151
|
+
clearTimeout(timer);
|
|
152
|
+
mdnsClient.destroy();
|
|
153
|
+
};
|
|
154
|
+
setTimeout(cleanup, timeout);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
parseResponse(response) {
|
|
158
|
+
const ptrRecords = response.answers.filter((a)=>"PTR" === a.type);
|
|
159
|
+
const srvRecords = response.answers.filter((a)=>"SRV" === a.type);
|
|
160
|
+
const txtRecords = response.answers.filter((a)=>"TXT" === a.type);
|
|
161
|
+
const aRecords = response.answers.filter((a)=>"A" === a.type);
|
|
162
|
+
if (0 === ptrRecords.length) return null;
|
|
163
|
+
const instanceName = ptrRecords[0].data.replace(`.${SERVICE_TYPE}`, "");
|
|
164
|
+
const srv = srvRecords.find((r)=>r.name === `${instanceName}.${SERVICE_TYPE}`);
|
|
165
|
+
const txt = txtRecords.find((r)=>r.name === `${instanceName}.${SERVICE_TYPE}`);
|
|
166
|
+
if (!srv || !txt) return null;
|
|
167
|
+
const txtData = this.parseTxtRecord(txt.data);
|
|
168
|
+
const aRecord = aRecords.find((r)=>r.name === srv.data.target);
|
|
169
|
+
const host = aRecord?.data || "localhost";
|
|
170
|
+
const port = srv.data.port;
|
|
171
|
+
const transport = txtData.transport || "ws";
|
|
172
|
+
const url = `${transport}://${host}:${port}/ws`;
|
|
173
|
+
return {
|
|
174
|
+
name: instanceName,
|
|
175
|
+
url,
|
|
176
|
+
host,
|
|
177
|
+
port,
|
|
178
|
+
requireAuth: "required" === txtData.auth,
|
|
179
|
+
capabilities: txtData.capabilities ? txtData.capabilities.split(",") : [],
|
|
180
|
+
version: txtData.version || "1.0.0",
|
|
181
|
+
transport: transport
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
parseTxtRecord(data) {
|
|
185
|
+
const result = {};
|
|
186
|
+
const text = data.toString();
|
|
187
|
+
const lines = text.split("\n");
|
|
188
|
+
for (const line of lines){
|
|
189
|
+
const [key, value] = line.split("=");
|
|
190
|
+
if (key && value) result[key.trim()] = value.trim();
|
|
191
|
+
}
|
|
192
|
+
return result;
|
|
193
|
+
}
|
|
194
|
+
getLocalHostname() {
|
|
195
|
+
return `${__webpack_require__("os").hostname()}.local`;
|
|
196
|
+
}
|
|
197
|
+
getLocalAddresses() {
|
|
198
|
+
const addresses = [];
|
|
199
|
+
const interfaces = (0, external_os_.networkInterfaces)();
|
|
200
|
+
for (const name of Object.keys(interfaces)){
|
|
201
|
+
const nets = interfaces[name];
|
|
202
|
+
if (nets) {
|
|
203
|
+
for (const net of nets)if ("IPv4" === net.family && !net.internal) addresses.push(net.address);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return addresses;
|
|
207
|
+
}
|
|
208
|
+
constructor(){
|
|
209
|
+
_define_property(this, "mdnsInstance", null);
|
|
210
|
+
_define_property(this, "isAnnouncing", false);
|
|
211
|
+
_define_property(this, "config", null);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
})();
|
|
215
|
+
exports.MDNSDiscoveryService = __webpack_exports__.MDNSDiscoveryService;
|
|
216
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
217
|
+
"MDNSDiscoveryService"
|
|
218
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
219
|
+
Object.defineProperty(exports, '__esModule', {
|
|
220
|
+
value: true
|
|
221
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { DiscoveryService, DiscoveryConfig, DiscoveredGateway } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* mDNS/Bonjour discovery service for local network
|
|
4
|
+
*/
|
|
5
|
+
export declare class MDNSDiscoveryService implements DiscoveryService {
|
|
6
|
+
private mdnsInstance;
|
|
7
|
+
private isAnnouncing;
|
|
8
|
+
private config;
|
|
9
|
+
/**
|
|
10
|
+
* Start announcing this gateway on the local network
|
|
11
|
+
*/
|
|
12
|
+
announce(config: DiscoveryConfig): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Stop announcing this gateway
|
|
15
|
+
*/
|
|
16
|
+
stopAnnouncing(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Discover available gateways on the local network
|
|
19
|
+
*/
|
|
20
|
+
discover(timeout?: number): Promise<DiscoveredGateway[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Parse mDNS response into DiscoveredGateway
|
|
23
|
+
*/
|
|
24
|
+
private parseResponse;
|
|
25
|
+
/**
|
|
26
|
+
* Parse TXT record data
|
|
27
|
+
*/
|
|
28
|
+
private parseTxtRecord;
|
|
29
|
+
/**
|
|
30
|
+
* Get local hostname
|
|
31
|
+
*/
|
|
32
|
+
private getLocalHostname;
|
|
33
|
+
/**
|
|
34
|
+
* Get local IP addresses
|
|
35
|
+
*/
|
|
36
|
+
private getLocalAddresses;
|
|
37
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import * as __rspack_external_os from "os";
|
|
2
|
+
import multicast_dns from "multicast-dns";
|
|
3
|
+
var __webpack_modules__ = {
|
|
4
|
+
os (module) {
|
|
5
|
+
module.exports = __rspack_external_os;
|
|
6
|
+
}
|
|
7
|
+
};
|
|
8
|
+
var __webpack_module_cache__ = {};
|
|
9
|
+
function __webpack_require__(moduleId) {
|
|
10
|
+
var cachedModule = __webpack_module_cache__[moduleId];
|
|
11
|
+
if (void 0 !== cachedModule) return cachedModule.exports;
|
|
12
|
+
var module = __webpack_module_cache__[moduleId] = {
|
|
13
|
+
exports: {}
|
|
14
|
+
};
|
|
15
|
+
__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
16
|
+
return module.exports;
|
|
17
|
+
}
|
|
18
|
+
var external_os_ = __webpack_require__("os");
|
|
19
|
+
function _define_property(obj, key, value) {
|
|
20
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
21
|
+
value: value,
|
|
22
|
+
enumerable: true,
|
|
23
|
+
configurable: true,
|
|
24
|
+
writable: true
|
|
25
|
+
});
|
|
26
|
+
else obj[key] = value;
|
|
27
|
+
return obj;
|
|
28
|
+
}
|
|
29
|
+
const SERVICE_TYPE = "_wingman-gateway._tcp.local";
|
|
30
|
+
class MDNSDiscoveryService {
|
|
31
|
+
async announce(config) {
|
|
32
|
+
if (this.isAnnouncing) throw new Error("Already announcing");
|
|
33
|
+
this.config = config;
|
|
34
|
+
this.mdnsInstance = multicast_dns();
|
|
35
|
+
this.mdnsInstance.on("query", (query)=>{
|
|
36
|
+
const isOurService = query.questions.some((q)=>q.name === SERVICE_TYPE || q.name === `${config.name}.${SERVICE_TYPE}`);
|
|
37
|
+
if (isOurService && this.mdnsInstance) {
|
|
38
|
+
const hostname = this.getLocalHostname();
|
|
39
|
+
const addresses = this.getLocalAddresses();
|
|
40
|
+
const txt = [
|
|
41
|
+
`version=${config.version}`,
|
|
42
|
+
`auth=${config.requireAuth ? "required" : "optional"}`,
|
|
43
|
+
`transport=${config.transport}`,
|
|
44
|
+
`capabilities=${config.capabilities.join(",")}`
|
|
45
|
+
];
|
|
46
|
+
this.mdnsInstance.respond({
|
|
47
|
+
answers: [
|
|
48
|
+
{
|
|
49
|
+
name: SERVICE_TYPE,
|
|
50
|
+
type: "PTR",
|
|
51
|
+
ttl: 120,
|
|
52
|
+
data: `${config.name}.${SERVICE_TYPE}`
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: `${config.name}.${SERVICE_TYPE}`,
|
|
56
|
+
type: "SRV",
|
|
57
|
+
ttl: 120,
|
|
58
|
+
data: {
|
|
59
|
+
priority: 0,
|
|
60
|
+
weight: 0,
|
|
61
|
+
port: config.port,
|
|
62
|
+
target: hostname
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: `${config.name}.${SERVICE_TYPE}`,
|
|
67
|
+
type: "TXT",
|
|
68
|
+
ttl: 120,
|
|
69
|
+
data: Buffer.from(txt.join("\n"))
|
|
70
|
+
},
|
|
71
|
+
...addresses.map((addr)=>({
|
|
72
|
+
name: hostname,
|
|
73
|
+
type: "A",
|
|
74
|
+
ttl: 120,
|
|
75
|
+
data: addr
|
|
76
|
+
}))
|
|
77
|
+
]
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
this.isAnnouncing = true;
|
|
82
|
+
}
|
|
83
|
+
async stopAnnouncing() {
|
|
84
|
+
if (this.mdnsInstance) {
|
|
85
|
+
this.mdnsInstance.destroy();
|
|
86
|
+
this.mdnsInstance = null;
|
|
87
|
+
}
|
|
88
|
+
this.isAnnouncing = false;
|
|
89
|
+
this.config = null;
|
|
90
|
+
}
|
|
91
|
+
async discover(timeout = 5000) {
|
|
92
|
+
return new Promise((resolve)=>{
|
|
93
|
+
const discovered = new Map();
|
|
94
|
+
const mdnsClient = multicast_dns();
|
|
95
|
+
const timer = setTimeout(()=>{
|
|
96
|
+
mdnsClient.destroy();
|
|
97
|
+
resolve(Array.from(discovered.values()));
|
|
98
|
+
}, timeout);
|
|
99
|
+
mdnsClient.on("response", (response)=>{
|
|
100
|
+
try {
|
|
101
|
+
const gateway = this.parseResponse(response);
|
|
102
|
+
if (gateway) discovered.set(gateway.name, gateway);
|
|
103
|
+
} catch (error) {}
|
|
104
|
+
});
|
|
105
|
+
mdnsClient.query({
|
|
106
|
+
questions: [
|
|
107
|
+
{
|
|
108
|
+
name: SERVICE_TYPE,
|
|
109
|
+
type: "PTR"
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
});
|
|
113
|
+
const cleanup = ()=>{
|
|
114
|
+
clearTimeout(timer);
|
|
115
|
+
mdnsClient.destroy();
|
|
116
|
+
};
|
|
117
|
+
setTimeout(cleanup, timeout);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
parseResponse(response) {
|
|
121
|
+
const ptrRecords = response.answers.filter((a)=>"PTR" === a.type);
|
|
122
|
+
const srvRecords = response.answers.filter((a)=>"SRV" === a.type);
|
|
123
|
+
const txtRecords = response.answers.filter((a)=>"TXT" === a.type);
|
|
124
|
+
const aRecords = response.answers.filter((a)=>"A" === a.type);
|
|
125
|
+
if (0 === ptrRecords.length) return null;
|
|
126
|
+
const instanceName = ptrRecords[0].data.replace(`.${SERVICE_TYPE}`, "");
|
|
127
|
+
const srv = srvRecords.find((r)=>r.name === `${instanceName}.${SERVICE_TYPE}`);
|
|
128
|
+
const txt = txtRecords.find((r)=>r.name === `${instanceName}.${SERVICE_TYPE}`);
|
|
129
|
+
if (!srv || !txt) return null;
|
|
130
|
+
const txtData = this.parseTxtRecord(txt.data);
|
|
131
|
+
const aRecord = aRecords.find((r)=>r.name === srv.data.target);
|
|
132
|
+
const host = aRecord?.data || "localhost";
|
|
133
|
+
const port = srv.data.port;
|
|
134
|
+
const transport = txtData.transport || "ws";
|
|
135
|
+
const url = `${transport}://${host}:${port}/ws`;
|
|
136
|
+
return {
|
|
137
|
+
name: instanceName,
|
|
138
|
+
url,
|
|
139
|
+
host,
|
|
140
|
+
port,
|
|
141
|
+
requireAuth: "required" === txtData.auth,
|
|
142
|
+
capabilities: txtData.capabilities ? txtData.capabilities.split(",") : [],
|
|
143
|
+
version: txtData.version || "1.0.0",
|
|
144
|
+
transport: transport
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
parseTxtRecord(data) {
|
|
148
|
+
const result = {};
|
|
149
|
+
const text = data.toString();
|
|
150
|
+
const lines = text.split("\n");
|
|
151
|
+
for (const line of lines){
|
|
152
|
+
const [key, value] = line.split("=");
|
|
153
|
+
if (key && value) result[key.trim()] = value.trim();
|
|
154
|
+
}
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
getLocalHostname() {
|
|
158
|
+
return `${__webpack_require__("os").hostname()}.local`;
|
|
159
|
+
}
|
|
160
|
+
getLocalAddresses() {
|
|
161
|
+
const addresses = [];
|
|
162
|
+
const interfaces = (0, external_os_.networkInterfaces)();
|
|
163
|
+
for (const name of Object.keys(interfaces)){
|
|
164
|
+
const nets = interfaces[name];
|
|
165
|
+
if (nets) {
|
|
166
|
+
for (const net of nets)if ("IPv4" === net.family && !net.internal) addresses.push(net.address);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return addresses;
|
|
170
|
+
}
|
|
171
|
+
constructor(){
|
|
172
|
+
_define_property(this, "mdnsInstance", null);
|
|
173
|
+
_define_property(this, "isAnnouncing", false);
|
|
174
|
+
_define_property(this, "config", null);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
export { MDNSDiscoveryService };
|
|
@@ -0,0 +1,140 @@
|
|
|
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
|
+
TailscaleDiscoveryService: ()=>TailscaleDiscoveryService
|
|
28
|
+
});
|
|
29
|
+
const external_child_process_namespaceObject = require("child_process");
|
|
30
|
+
const external_util_namespaceObject = require("util");
|
|
31
|
+
const external_logger_cjs_namespaceObject = require("../../logger.cjs");
|
|
32
|
+
function _define_property(obj, key, value) {
|
|
33
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
34
|
+
value: value,
|
|
35
|
+
enumerable: true,
|
|
36
|
+
configurable: true,
|
|
37
|
+
writable: true
|
|
38
|
+
});
|
|
39
|
+
else obj[key] = value;
|
|
40
|
+
return obj;
|
|
41
|
+
}
|
|
42
|
+
const execAsync = (0, external_util_namespaceObject.promisify)(external_child_process_namespaceObject.exec);
|
|
43
|
+
const logger = (0, external_logger_cjs_namespaceObject.createLogger)();
|
|
44
|
+
class TailscaleDiscoveryService {
|
|
45
|
+
async announce(config) {
|
|
46
|
+
this.isAnnouncing = true;
|
|
47
|
+
this.config = config;
|
|
48
|
+
}
|
|
49
|
+
async stopAnnouncing() {
|
|
50
|
+
this.isAnnouncing = false;
|
|
51
|
+
this.config = null;
|
|
52
|
+
}
|
|
53
|
+
async discover(timeout = 5000) {
|
|
54
|
+
try {
|
|
55
|
+
const devices = await this.getTailscaleDevices();
|
|
56
|
+
const gateways = [];
|
|
57
|
+
for (const device of devices){
|
|
58
|
+
if (!device.online) continue;
|
|
59
|
+
const isGateway = device.tags?.some((tag)=>tag.toLowerCase().includes("wingman-gateway")) || device.hostname.toLowerCase().includes("gateway");
|
|
60
|
+
if (!isGateway) continue;
|
|
61
|
+
const gatewayInfo = await this.probeGateway(device.ip, 3000);
|
|
62
|
+
if (gatewayInfo) gateways.push(gatewayInfo);
|
|
63
|
+
}
|
|
64
|
+
return gateways;
|
|
65
|
+
} catch (error) {
|
|
66
|
+
logger.error("Tailscale discovery failed", error);
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async getTailscaleDevices() {
|
|
71
|
+
try {
|
|
72
|
+
const { stdout } = await execAsync("tailscale status --json");
|
|
73
|
+
const status = JSON.parse(stdout);
|
|
74
|
+
const devices = [];
|
|
75
|
+
if (status.Peer) for (const [id, peerData] of Object.entries(status.Peer)){
|
|
76
|
+
const peer = peerData;
|
|
77
|
+
devices.push({
|
|
78
|
+
id,
|
|
79
|
+
hostname: peer.HostName || peer.DNSName?.split(".")[0] || id,
|
|
80
|
+
ip: peer.TailscaleIPs?.[0] || peer.Addrs?.[0]?.split(":")[0] || "",
|
|
81
|
+
online: peer.Online ?? false,
|
|
82
|
+
tags: peer.Tags || []
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return devices;
|
|
86
|
+
} catch (error) {
|
|
87
|
+
logger.error("Failed to get Tailscale devices", error);
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async probeGateway(ip, port) {
|
|
92
|
+
try {
|
|
93
|
+
const response = await fetch(`http://${ip}:${port}/health`, {
|
|
94
|
+
signal: AbortSignal.timeout(2000)
|
|
95
|
+
});
|
|
96
|
+
if (!response.ok) return null;
|
|
97
|
+
const health = await response.json();
|
|
98
|
+
if ("wingman-gateway" !== health.service) return null;
|
|
99
|
+
let capabilities = [
|
|
100
|
+
"broadcast",
|
|
101
|
+
"direct",
|
|
102
|
+
"groups"
|
|
103
|
+
];
|
|
104
|
+
let version = "1.0.0";
|
|
105
|
+
try {
|
|
106
|
+
const statsResponse = await fetch(`http://${ip}:${port}/stats`, {
|
|
107
|
+
signal: AbortSignal.timeout(2000)
|
|
108
|
+
});
|
|
109
|
+
if (statsResponse.ok) {
|
|
110
|
+
const stats = await statsResponse.json();
|
|
111
|
+
if (stats.capabilities) capabilities = stats.capabilities;
|
|
112
|
+
if (stats.version) version = stats.version;
|
|
113
|
+
}
|
|
114
|
+
} catch {}
|
|
115
|
+
return {
|
|
116
|
+
name: health.name || `Gateway-${ip}`,
|
|
117
|
+
url: `ws://${ip}:${port}/ws`,
|
|
118
|
+
host: ip,
|
|
119
|
+
port,
|
|
120
|
+
requireAuth: health.requireAuth ?? false,
|
|
121
|
+
capabilities,
|
|
122
|
+
version,
|
|
123
|
+
transport: "ws"
|
|
124
|
+
};
|
|
125
|
+
} catch (error) {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
constructor(){
|
|
130
|
+
_define_property(this, "isAnnouncing", false);
|
|
131
|
+
_define_property(this, "config", null);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
exports.TailscaleDiscoveryService = __webpack_exports__.TailscaleDiscoveryService;
|
|
135
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
136
|
+
"TailscaleDiscoveryService"
|
|
137
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
138
|
+
Object.defineProperty(exports, '__esModule', {
|
|
139
|
+
value: true
|
|
140
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { DiscoveryService, DiscoveryConfig, DiscoveredGateway } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Tailscale discovery service
|
|
4
|
+
* Uses Tailscale CLI to discover gateways on the Tailnet
|
|
5
|
+
*/
|
|
6
|
+
export declare class TailscaleDiscoveryService implements DiscoveryService {
|
|
7
|
+
private isAnnouncing;
|
|
8
|
+
private config;
|
|
9
|
+
/**
|
|
10
|
+
* Announce this gateway on Tailscale
|
|
11
|
+
* Note: Tailscale announcement is done via tags set in Tailscale admin console
|
|
12
|
+
* This method is a no-op but maintains interface compatibility
|
|
13
|
+
*/
|
|
14
|
+
announce(config: DiscoveryConfig): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Stop announcing this gateway
|
|
17
|
+
*/
|
|
18
|
+
stopAnnouncing(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Discover gateways on the Tailscale network
|
|
21
|
+
*/
|
|
22
|
+
discover(timeout?: number): Promise<DiscoveredGateway[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Get list of Tailscale devices on the network
|
|
25
|
+
*/
|
|
26
|
+
private getTailscaleDevices;
|
|
27
|
+
/**
|
|
28
|
+
* Probe a device to check if it's running a Wingman gateway
|
|
29
|
+
*/
|
|
30
|
+
private probeGateway;
|
|
31
|
+
}
|