@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.
Files changed (418) hide show
  1. package/.wingman/agents/README.md +161 -0
  2. package/.wingman/agents/coding/agent.md +147 -0
  3. package/.wingman/agents/coding/implementor.md +56 -0
  4. package/.wingman/agents/main/agent.md +19 -0
  5. package/.wingman/agents/researcher/agent.md +62 -0
  6. package/.wingman/agents/stock-trader/agent.md +223 -0
  7. package/.wingman/agents/stock-trader/chain-curator.md +24 -0
  8. package/.wingman/agents/stock-trader/goal-translator.md +42 -0
  9. package/.wingman/agents/stock-trader/guardrails-veto.md +11 -0
  10. package/.wingman/agents/stock-trader/path-planner.md +23 -0
  11. package/.wingman/agents/stock-trader/regime-analyst.md +15 -0
  12. package/.wingman/agents/stock-trader/risk.md +20 -0
  13. package/.wingman/agents/stock-trader/selection.md +22 -0
  14. package/.wingman/agents/stock-trader/strategy-composer.md +38 -0
  15. package/.wingman/agents/wingman/agent.json +12 -0
  16. package/bin/wingman +7 -0
  17. package/dist/agent/config/agentConfig.cjs +95 -0
  18. package/dist/agent/config/agentConfig.d.ts +187 -0
  19. package/dist/agent/config/agentConfig.js +52 -0
  20. package/dist/agent/config/agentLoader.cjs +242 -0
  21. package/dist/agent/config/agentLoader.d.ts +42 -0
  22. package/dist/agent/config/agentLoader.js +208 -0
  23. package/dist/agent/config/mcpClientManager.cjs +168 -0
  24. package/dist/agent/config/mcpClientManager.d.ts +41 -0
  25. package/dist/agent/config/mcpClientManager.js +134 -0
  26. package/dist/agent/config/modelFactory.cjs +175 -0
  27. package/dist/agent/config/modelFactory.d.ts +33 -0
  28. package/dist/agent/config/modelFactory.js +141 -0
  29. package/dist/agent/config/toolRegistry.cjs +111 -0
  30. package/dist/agent/config/toolRegistry.d.ts +25 -0
  31. package/dist/agent/config/toolRegistry.js +71 -0
  32. package/dist/agent/middleware/additional-messages.cjs +60 -0
  33. package/dist/agent/middleware/additional-messages.d.ts +7 -0
  34. package/dist/agent/middleware/additional-messages.js +26 -0
  35. package/dist/agent/middleware/hooks/executor.cjs +137 -0
  36. package/dist/agent/middleware/hooks/executor.d.ts +52 -0
  37. package/dist/agent/middleware/hooks/executor.js +103 -0
  38. package/dist/agent/middleware/hooks/input-builder.cjs +55 -0
  39. package/dist/agent/middleware/hooks/input-builder.d.ts +15 -0
  40. package/dist/agent/middleware/hooks/input-builder.js +21 -0
  41. package/dist/agent/middleware/hooks/matcher.cjs +59 -0
  42. package/dist/agent/middleware/hooks/matcher.d.ts +27 -0
  43. package/dist/agent/middleware/hooks/matcher.js +22 -0
  44. package/dist/agent/middleware/hooks/merger.cjs +54 -0
  45. package/dist/agent/middleware/hooks/merger.d.ts +18 -0
  46. package/dist/agent/middleware/hooks/merger.js +20 -0
  47. package/dist/agent/middleware/hooks/types.cjs +62 -0
  48. package/dist/agent/middleware/hooks/types.d.ts +82 -0
  49. package/dist/agent/middleware/hooks/types.js +19 -0
  50. package/dist/agent/middleware/hooks.cjs +79 -0
  51. package/dist/agent/middleware/hooks.d.ts +19 -0
  52. package/dist/agent/middleware/hooks.js +45 -0
  53. package/dist/agent/middleware/media-compat.cjs +80 -0
  54. package/dist/agent/middleware/media-compat.d.ts +7 -0
  55. package/dist/agent/middleware/media-compat.js +46 -0
  56. package/dist/agent/tests/agentConfig.test.cjs +132 -0
  57. package/dist/agent/tests/agentConfig.test.d.ts +1 -0
  58. package/dist/agent/tests/agentConfig.test.js +126 -0
  59. package/dist/agent/tests/agentLoader.test.cjs +235 -0
  60. package/dist/agent/tests/agentLoader.test.d.ts +1 -0
  61. package/dist/agent/tests/agentLoader.test.js +229 -0
  62. package/dist/agent/tests/modelFactory.test.cjs +114 -0
  63. package/dist/agent/tests/modelFactory.test.d.ts +1 -0
  64. package/dist/agent/tests/modelFactory.test.js +108 -0
  65. package/dist/agent/tests/test-agent-loader.cjs +33 -0
  66. package/dist/agent/tests/test-agent-loader.d.ts +1 -0
  67. package/dist/agent/tests/test-agent-loader.js +27 -0
  68. package/dist/agent/tests/test-subagent-loading.cjs +99 -0
  69. package/dist/agent/tests/test-subagent-loading.d.ts +1 -0
  70. package/dist/agent/tests/test-subagent-loading.js +93 -0
  71. package/dist/agent/tests/toolRegistry.test.cjs +109 -0
  72. package/dist/agent/tests/toolRegistry.test.d.ts +1 -0
  73. package/dist/agent/tests/toolRegistry.test.js +103 -0
  74. package/dist/agent/tools/code_search.cjs +108 -0
  75. package/dist/agent/tools/code_search.d.ts +24 -0
  76. package/dist/agent/tools/code_search.js +74 -0
  77. package/dist/agent/tools/command_execute.cjs +136 -0
  78. package/dist/agent/tools/command_execute.d.ts +12 -0
  79. package/dist/agent/tools/command_execute.js +99 -0
  80. package/dist/agent/tools/git_status.cjs +126 -0
  81. package/dist/agent/tools/git_status.d.ts +15 -0
  82. package/dist/agent/tools/git_status.js +92 -0
  83. package/dist/agent/tools/internet_search.cjs +93 -0
  84. package/dist/agent/tools/internet_search.d.ts +25 -0
  85. package/dist/agent/tools/internet_search.js +56 -0
  86. package/dist/agent/tools/think.cjs +53 -0
  87. package/dist/agent/tools/think.d.ts +26 -0
  88. package/dist/agent/tools/think.js +16 -0
  89. package/dist/agent/tools/web_crawler.cjs +180 -0
  90. package/dist/agent/tools/web_crawler.d.ts +31 -0
  91. package/dist/agent/tools/web_crawler.js +143 -0
  92. package/dist/agent/utils.cjs +54 -0
  93. package/dist/agent/utils.d.ts +1 -0
  94. package/dist/agent/utils.js +10 -0
  95. package/dist/cli/commands/agent.cjs +169 -0
  96. package/dist/cli/commands/agent.d.ts +15 -0
  97. package/dist/cli/commands/agent.js +125 -0
  98. package/dist/cli/commands/gateway.cjs +601 -0
  99. package/dist/cli/commands/gateway.d.ts +12 -0
  100. package/dist/cli/commands/gateway.js +567 -0
  101. package/dist/cli/commands/init.cjs +681 -0
  102. package/dist/cli/commands/init.d.ts +10 -0
  103. package/dist/cli/commands/init.js +634 -0
  104. package/dist/cli/commands/provider.cjs +208 -0
  105. package/dist/cli/commands/provider.d.ts +5 -0
  106. package/dist/cli/commands/provider.js +174 -0
  107. package/dist/cli/commands/skill.cjs +145 -0
  108. package/dist/cli/commands/skill.d.ts +10 -0
  109. package/dist/cli/commands/skill.js +111 -0
  110. package/dist/cli/config/loader.cjs +143 -0
  111. package/dist/cli/config/loader.d.ts +14 -0
  112. package/dist/cli/config/loader.js +109 -0
  113. package/dist/cli/config/schema.cjs +262 -0
  114. package/dist/cli/config/schema.d.ts +268 -0
  115. package/dist/cli/config/schema.js +213 -0
  116. package/dist/cli/core/agentInvoker.cjs +284 -0
  117. package/dist/cli/core/agentInvoker.d.ts +77 -0
  118. package/dist/cli/core/agentInvoker.js +247 -0
  119. package/dist/cli/core/commandHandler.cjs +257 -0
  120. package/dist/cli/core/commandHandler.d.ts +62 -0
  121. package/dist/cli/core/commandHandler.js +223 -0
  122. package/dist/cli/core/database/bunSqliteAdapter.cjs +87 -0
  123. package/dist/cli/core/database/bunSqliteAdapter.d.ts +34 -0
  124. package/dist/cli/core/database/bunSqliteAdapter.js +53 -0
  125. package/dist/cli/core/loggerBridge.cjs +42 -0
  126. package/dist/cli/core/loggerBridge.d.ts +8 -0
  127. package/dist/cli/core/loggerBridge.js +8 -0
  128. package/dist/cli/core/outputManager.cjs +106 -0
  129. package/dist/cli/core/outputManager.d.ts +43 -0
  130. package/dist/cli/core/outputManager.js +72 -0
  131. package/dist/cli/core/sessionManager.cjs +535 -0
  132. package/dist/cli/core/sessionManager.d.ts +111 -0
  133. package/dist/cli/core/sessionManager.js +486 -0
  134. package/dist/cli/core/streamParser.cjs +328 -0
  135. package/dist/cli/core/streamParser.d.ts +42 -0
  136. package/dist/cli/core/streamParser.js +288 -0
  137. package/dist/cli/index.cjs +211 -0
  138. package/dist/cli/index.d.ts +2 -0
  139. package/dist/cli/index.js +205 -0
  140. package/dist/cli/services/skillRepository.cjs +178 -0
  141. package/dist/cli/services/skillRepository.d.ts +35 -0
  142. package/dist/cli/services/skillRepository.js +144 -0
  143. package/dist/cli/services/skillService.cjs +336 -0
  144. package/dist/cli/services/skillService.d.ts +48 -0
  145. package/dist/cli/services/skillService.js +302 -0
  146. package/dist/cli/types/gateway.cjs +18 -0
  147. package/dist/cli/types/gateway.d.ts +18 -0
  148. package/dist/cli/types/gateway.js +0 -0
  149. package/dist/cli/types/init.cjs +18 -0
  150. package/dist/cli/types/init.d.ts +13 -0
  151. package/dist/cli/types/init.js +0 -0
  152. package/dist/cli/types/provider.cjs +18 -0
  153. package/dist/cli/types/provider.d.ts +9 -0
  154. package/dist/cli/types/provider.js +0 -0
  155. package/dist/cli/types/skill.cjs +18 -0
  156. package/dist/cli/types/skill.d.ts +71 -0
  157. package/dist/cli/types/skill.js +0 -0
  158. package/dist/cli/types.cjs +18 -0
  159. package/dist/cli/types.d.ts +175 -0
  160. package/dist/cli/types.js +0 -0
  161. package/dist/cli/ui/AgentOutput.cjs +82 -0
  162. package/dist/cli/ui/AgentOutput.d.ts +8 -0
  163. package/dist/cli/ui/AgentOutput.js +38 -0
  164. package/dist/cli/ui/App.cjs +285 -0
  165. package/dist/cli/ui/App.d.ts +6 -0
  166. package/dist/cli/ui/App.js +241 -0
  167. package/dist/cli/ui/ErrorDisplay.cjs +65 -0
  168. package/dist/cli/ui/ErrorDisplay.d.ts +8 -0
  169. package/dist/cli/ui/ErrorDisplay.js +21 -0
  170. package/dist/cli/ui/LogDisplay.cjs +74 -0
  171. package/dist/cli/ui/LogDisplay.d.ts +13 -0
  172. package/dist/cli/ui/LogDisplay.js +30 -0
  173. package/dist/cli/ui/SessionListDisplay.cjs +135 -0
  174. package/dist/cli/ui/SessionListDisplay.d.ts +9 -0
  175. package/dist/cli/ui/SessionListDisplay.js +91 -0
  176. package/dist/cli/ui/blockHelpers.cjs +80 -0
  177. package/dist/cli/ui/blockHelpers.d.ts +21 -0
  178. package/dist/cli/ui/blockHelpers.js +40 -0
  179. package/dist/cli/ui/components/ToolCallDisplay.cjs +207 -0
  180. package/dist/cli/ui/components/ToolCallDisplay.d.ts +7 -0
  181. package/dist/cli/ui/components/ToolCallDisplay.js +162 -0
  182. package/dist/cli/ui/components/ToolResultDisplay.cjs +86 -0
  183. package/dist/cli/ui/components/ToolResultDisplay.d.ts +8 -0
  184. package/dist/cli/ui/components/ToolResultDisplay.js +42 -0
  185. package/dist/cli/ui/toolDisplayHelpers.cjs +112 -0
  186. package/dist/cli/ui/toolDisplayHelpers.d.ts +3 -0
  187. package/dist/cli/ui/toolDisplayHelpers.js +72 -0
  188. package/dist/gateway/adapters/discord.cjs +298 -0
  189. package/dist/gateway/adapters/discord.d.ts +42 -0
  190. package/dist/gateway/adapters/discord.js +246 -0
  191. package/dist/gateway/auth.cjs +94 -0
  192. package/dist/gateway/auth.d.ts +36 -0
  193. package/dist/gateway/auth.js +60 -0
  194. package/dist/gateway/broadcast.cjs +131 -0
  195. package/dist/gateway/broadcast.d.ts +76 -0
  196. package/dist/gateway/broadcast.js +97 -0
  197. package/dist/gateway/client.cjs +282 -0
  198. package/dist/gateway/client.d.ts +141 -0
  199. package/dist/gateway/client.js +248 -0
  200. package/dist/gateway/daemon.cjs +195 -0
  201. package/dist/gateway/daemon.d.ts +67 -0
  202. package/dist/gateway/daemon.js +161 -0
  203. package/dist/gateway/discovery/index.cjs +72 -0
  204. package/dist/gateway/discovery/index.d.ts +3 -0
  205. package/dist/gateway/discovery/index.js +3 -0
  206. package/dist/gateway/discovery/mdns.cjs +221 -0
  207. package/dist/gateway/discovery/mdns.d.ts +37 -0
  208. package/dist/gateway/discovery/mdns.js +177 -0
  209. package/dist/gateway/discovery/tailscale.cjs +140 -0
  210. package/dist/gateway/discovery/tailscale.d.ts +31 -0
  211. package/dist/gateway/discovery/tailscale.js +106 -0
  212. package/dist/gateway/discovery/types.cjs +18 -0
  213. package/dist/gateway/discovery/types.d.ts +41 -0
  214. package/dist/gateway/discovery/types.js +0 -0
  215. package/dist/gateway/env.cjs +45 -0
  216. package/dist/gateway/env.d.ts +2 -0
  217. package/dist/gateway/env.js +8 -0
  218. package/dist/gateway/hooks/loader.cjs +137 -0
  219. package/dist/gateway/hooks/loader.d.ts +10 -0
  220. package/dist/gateway/hooks/loader.js +103 -0
  221. package/dist/gateway/hooks/registry.cjs +128 -0
  222. package/dist/gateway/hooks/registry.d.ts +13 -0
  223. package/dist/gateway/hooks/registry.js +94 -0
  224. package/dist/gateway/hooks/types.cjs +58 -0
  225. package/dist/gateway/hooks/types.d.ts +50 -0
  226. package/dist/gateway/hooks/types.js +18 -0
  227. package/dist/gateway/http/agents.cjs +280 -0
  228. package/dist/gateway/http/agents.d.ts +2 -0
  229. package/dist/gateway/http/agents.js +246 -0
  230. package/dist/gateway/http/fs.cjs +81 -0
  231. package/dist/gateway/http/fs.d.ts +2 -0
  232. package/dist/gateway/http/fs.js +47 -0
  233. package/dist/gateway/http/providers.cjs +120 -0
  234. package/dist/gateway/http/providers.d.ts +2 -0
  235. package/dist/gateway/http/providers.js +86 -0
  236. package/dist/gateway/http/routines.cjs +196 -0
  237. package/dist/gateway/http/routines.d.ts +20 -0
  238. package/dist/gateway/http/routines.js +159 -0
  239. package/dist/gateway/http/sessions.cjs +241 -0
  240. package/dist/gateway/http/sessions.d.ts +2 -0
  241. package/dist/gateway/http/sessions.js +207 -0
  242. package/dist/gateway/http/types.cjs +18 -0
  243. package/dist/gateway/http/types.d.ts +25 -0
  244. package/dist/gateway/http/types.js +0 -0
  245. package/dist/gateway/http/voice.cjs +167 -0
  246. package/dist/gateway/http/voice.d.ts +2 -0
  247. package/dist/gateway/http/voice.js +133 -0
  248. package/dist/gateway/http/webhooks.cjs +353 -0
  249. package/dist/gateway/http/webhooks.d.ts +22 -0
  250. package/dist/gateway/http/webhooks.js +313 -0
  251. package/dist/gateway/index.cjs +119 -0
  252. package/dist/gateway/index.d.ts +8 -0
  253. package/dist/gateway/index.js +9 -0
  254. package/dist/gateway/node.cjs +218 -0
  255. package/dist/gateway/node.d.ts +112 -0
  256. package/dist/gateway/node.js +184 -0
  257. package/dist/gateway/router.cjs +85 -0
  258. package/dist/gateway/router.d.ts +9 -0
  259. package/dist/gateway/router.js +51 -0
  260. package/dist/gateway/rpcClient.cjs +152 -0
  261. package/dist/gateway/rpcClient.d.ts +24 -0
  262. package/dist/gateway/rpcClient.js +118 -0
  263. package/dist/gateway/server.cjs +1175 -0
  264. package/dist/gateway/server.d.ts +185 -0
  265. package/dist/gateway/server.js +1138 -0
  266. package/dist/gateway/transport/http.cjs +153 -0
  267. package/dist/gateway/transport/http.d.ts +25 -0
  268. package/dist/gateway/transport/http.js +119 -0
  269. package/dist/gateway/transport/index.cjs +40 -0
  270. package/dist/gateway/transport/index.d.ts +3 -0
  271. package/dist/gateway/transport/index.js +3 -0
  272. package/dist/gateway/transport/types.cjs +18 -0
  273. package/dist/gateway/transport/types.d.ts +59 -0
  274. package/dist/gateway/transport/types.js +0 -0
  275. package/dist/gateway/transport/websocket.cjs +132 -0
  276. package/dist/gateway/transport/websocket.d.ts +21 -0
  277. package/dist/gateway/transport/websocket.js +98 -0
  278. package/dist/gateway/types.cjs +18 -0
  279. package/dist/gateway/types.d.ts +215 -0
  280. package/dist/gateway/types.js +0 -0
  281. package/dist/gateway/validation.cjs +225 -0
  282. package/dist/gateway/validation.d.ts +157 -0
  283. package/dist/gateway/validation.js +158 -0
  284. package/dist/index.cjs +95 -0
  285. package/dist/index.d.ts +6 -0
  286. package/dist/index.js +6 -0
  287. package/dist/logger.cjs +270 -0
  288. package/dist/logger.d.ts +54 -0
  289. package/dist/logger.js +215 -0
  290. package/dist/providers/copilot.cjs +148 -0
  291. package/dist/providers/copilot.d.ts +3 -0
  292. package/dist/providers/copilot.js +114 -0
  293. package/dist/providers/credentials.cjs +154 -0
  294. package/dist/providers/credentials.d.ts +26 -0
  295. package/dist/providers/credentials.js +99 -0
  296. package/dist/providers/oauth.cjs +279 -0
  297. package/dist/providers/oauth.d.ts +13 -0
  298. package/dist/providers/oauth.js +245 -0
  299. package/dist/providers/registry.cjs +138 -0
  300. package/dist/providers/registry.d.ts +32 -0
  301. package/dist/providers/registry.js +98 -0
  302. package/dist/tests/additionalMessageMiddleware.test.cjs +45 -0
  303. package/dist/tests/additionalMessageMiddleware.test.d.ts +1 -0
  304. package/dist/tests/additionalMessageMiddleware.test.js +39 -0
  305. package/dist/tests/agent-config-voice.test.cjs +25 -0
  306. package/dist/tests/agent-config-voice.test.d.ts +1 -0
  307. package/dist/tests/agent-config-voice.test.js +19 -0
  308. package/dist/tests/agentInvokerAttachments.test.cjs +67 -0
  309. package/dist/tests/agentInvokerAttachments.test.d.ts +1 -0
  310. package/dist/tests/agentInvokerAttachments.test.js +61 -0
  311. package/dist/tests/attachments-utils.test.cjs +46 -0
  312. package/dist/tests/attachments-utils.test.d.ts +1 -0
  313. package/dist/tests/attachments-utils.test.js +40 -0
  314. package/dist/tests/bunSqliteAdapter.test.cjs +265 -0
  315. package/dist/tests/bunSqliteAdapter.test.d.ts +1 -0
  316. package/dist/tests/bunSqliteAdapter.test.js +259 -0
  317. package/dist/tests/candleRange.test.cjs +48 -0
  318. package/dist/tests/candleRange.test.d.ts +1 -0
  319. package/dist/tests/candleRange.test.js +42 -0
  320. package/dist/tests/cli-config-loader.test.cjs +364 -0
  321. package/dist/tests/cli-config-loader.test.d.ts +1 -0
  322. package/dist/tests/cli-config-loader.test.js +358 -0
  323. package/dist/tests/cli-init.test.cjs +82 -0
  324. package/dist/tests/cli-init.test.d.ts +1 -0
  325. package/dist/tests/cli-init.test.js +76 -0
  326. package/dist/tests/discord-adapter.test.cjs +55 -0
  327. package/dist/tests/discord-adapter.test.d.ts +1 -0
  328. package/dist/tests/discord-adapter.test.js +49 -0
  329. package/dist/tests/gateway.test.cjs +319 -0
  330. package/dist/tests/gateway.test.d.ts +1 -0
  331. package/dist/tests/gateway.test.js +313 -0
  332. package/dist/tests/hooks-matcher.test.cjs +309 -0
  333. package/dist/tests/hooks-matcher.test.d.ts +1 -0
  334. package/dist/tests/hooks-matcher.test.js +303 -0
  335. package/dist/tests/hooks-merger.test.cjs +528 -0
  336. package/dist/tests/hooks-merger.test.d.ts +1 -0
  337. package/dist/tests/hooks-merger.test.js +522 -0
  338. package/dist/tests/integration/agent-invocation.integration.test.cjs +264 -0
  339. package/dist/tests/integration/agent-invocation.integration.test.d.ts +1 -0
  340. package/dist/tests/integration/agent-invocation.integration.test.js +258 -0
  341. package/dist/tests/integration/finnhub-candles.integration.test.cjs +98 -0
  342. package/dist/tests/integration/finnhub-candles.integration.test.d.ts +1 -0
  343. package/dist/tests/integration/finnhub-candles.integration.test.js +92 -0
  344. package/dist/tests/logger.test.cjs +353 -0
  345. package/dist/tests/logger.test.d.ts +1 -0
  346. package/dist/tests/logger.test.js +347 -0
  347. package/dist/tests/mediaCompatibilityMiddleware.test.cjs +106 -0
  348. package/dist/tests/mediaCompatibilityMiddleware.test.d.ts +1 -0
  349. package/dist/tests/mediaCompatibilityMiddleware.test.js +100 -0
  350. package/dist/tests/routines-api.test.cjs +107 -0
  351. package/dist/tests/routines-api.test.d.ts +1 -0
  352. package/dist/tests/routines-api.test.js +101 -0
  353. package/dist/tests/sessionMessageAttachments.test.cjs +108 -0
  354. package/dist/tests/sessionMessageAttachments.test.d.ts +1 -0
  355. package/dist/tests/sessionMessageAttachments.test.js +102 -0
  356. package/dist/tests/sessionMessageRole.test.cjs +44 -0
  357. package/dist/tests/sessionMessageRole.test.d.ts +1 -0
  358. package/dist/tests/sessionMessageRole.test.js +38 -0
  359. package/dist/tests/sessionStateMessages.test.cjs +72 -0
  360. package/dist/tests/sessionStateMessages.test.d.ts +1 -0
  361. package/dist/tests/sessionStateMessages.test.js +66 -0
  362. package/dist/tests/sessions-api.test.cjs +68 -0
  363. package/dist/tests/sessions-api.test.d.ts +1 -0
  364. package/dist/tests/sessions-api.test.js +62 -0
  365. package/dist/tests/technicalIndicators.test.cjs +82 -0
  366. package/dist/tests/technicalIndicators.test.d.ts +1 -0
  367. package/dist/tests/technicalIndicators.test.js +76 -0
  368. package/dist/tests/toolDisplayHelpers.test.cjs +43 -0
  369. package/dist/tests/toolDisplayHelpers.test.d.ts +1 -0
  370. package/dist/tests/toolDisplayHelpers.test.js +37 -0
  371. package/dist/tests/voice-config.test.cjs +35 -0
  372. package/dist/tests/voice-config.test.d.ts +1 -0
  373. package/dist/tests/voice-config.test.js +29 -0
  374. package/dist/tests/yahooCandles.test.cjs +111 -0
  375. package/dist/tests/yahooCandles.test.d.ts +1 -0
  376. package/dist/tests/yahooCandles.test.js +105 -0
  377. package/dist/tools/finance/candleRange.cjs +71 -0
  378. package/dist/tools/finance/candleRange.d.ts +21 -0
  379. package/dist/tools/finance/candleRange.js +28 -0
  380. package/dist/tools/finance/optionsAnalytics.cjs +222 -0
  381. package/dist/tools/finance/optionsAnalytics.d.ts +44 -0
  382. package/dist/tools/finance/optionsAnalytics.js +188 -0
  383. package/dist/tools/finance/optionsAnalytics.test.cjs +128 -0
  384. package/dist/tools/finance/optionsAnalytics.test.d.ts +1 -0
  385. package/dist/tools/finance/optionsAnalytics.test.js +122 -0
  386. package/dist/tools/finance/technicalIndicators.cjs +111 -0
  387. package/dist/tools/finance/technicalIndicators.d.ts +15 -0
  388. package/dist/tools/finance/technicalIndicators.js +68 -0
  389. package/dist/tools/finance/yahooCandles.cjs +125 -0
  390. package/dist/tools/finance/yahooCandles.d.ts +41 -0
  391. package/dist/tools/finance/yahooCandles.js +85 -0
  392. package/dist/tools/mcp-finance.cjs +649 -0
  393. package/dist/tools/mcp-finance.d.ts +1 -0
  394. package/dist/tools/mcp-finance.js +631 -0
  395. package/dist/types/agents.cjs +18 -0
  396. package/dist/types/agents.d.ts +11 -0
  397. package/dist/types/agents.js +0 -0
  398. package/dist/types/hooks.cjs +18 -0
  399. package/dist/types/hooks.d.ts +82 -0
  400. package/dist/types/hooks.js +0 -0
  401. package/dist/types/mcp.cjs +86 -0
  402. package/dist/types/mcp.d.ts +107 -0
  403. package/dist/types/mcp.js +40 -0
  404. package/dist/types/voice.cjs +103 -0
  405. package/dist/types/voice.d.ts +117 -0
  406. package/dist/types/voice.js +51 -0
  407. package/dist/utils/attachments.cjs +46 -0
  408. package/dist/utils/attachments.d.ts +7 -0
  409. package/dist/utils/attachments.js +12 -0
  410. package/dist/voice/config.cjs +52 -0
  411. package/dist/voice/config.d.ts +8 -0
  412. package/dist/voice/config.js +18 -0
  413. package/dist/webui/assets/index-BA0HaStz.css +1 -0
  414. package/dist/webui/assets/index-NHgTZsWN.js +112 -0
  415. package/dist/webui/assets/wingman_icon-DOy91UEF.webp +0 -0
  416. package/dist/webui/assets/wingman_logo-Cogyt3qm.webp +0 -0
  417. package/dist/webui/index.html +19 -0
  418. package/package.json +130 -0
@@ -0,0 +1,567 @@
1
+ import { GatewayClient as index_js_GatewayClient, GatewayDaemon, GatewayServer } from "../../gateway/index.js";
2
+ import { readFileSync } from "fs";
3
+ import { createLogger, getLogFilePath } from "../../logger.js";
4
+ import { WingmanConfigLoader } from "../config/loader.js";
5
+ import { getGatewayTokenFromEnv } from "../../gateway/env.js";
6
+ const logger = createLogger();
7
+ const logFile = getLogFilePath();
8
+ function reportGatewayError(context, error) {
9
+ const errorMsg = error instanceof Error ? error.message : String(error);
10
+ logger.error(context, errorMsg);
11
+ console.error(`✗ ${context}: ${errorMsg}`);
12
+ console.error(`Logs: ${logFile}`);
13
+ }
14
+ async function executeGatewayCommand(args) {
15
+ const { subcommand, options } = args;
16
+ switch(subcommand){
17
+ case "start":
18
+ await handleStart(options);
19
+ break;
20
+ case "stop":
21
+ await handleStop();
22
+ break;
23
+ case "restart":
24
+ await handleRestart();
25
+ break;
26
+ case "status":
27
+ await handleStatus();
28
+ break;
29
+ case "run":
30
+ await handleRun(options);
31
+ break;
32
+ case "join":
33
+ await handleJoin(args.args, options);
34
+ break;
35
+ case "discover":
36
+ await handleDiscover(options);
37
+ break;
38
+ case "token":
39
+ await handleToken(options);
40
+ break;
41
+ case "health":
42
+ await handleHealth(options);
43
+ break;
44
+ case "tunnel":
45
+ await handleTunnel(args.args, options);
46
+ break;
47
+ default:
48
+ showGatewayHelp();
49
+ process.exit(1);
50
+ }
51
+ }
52
+ async function handleStart(options) {
53
+ const configLoader = new WingmanConfigLoader();
54
+ const wingmanConfig = configLoader.loadConfig();
55
+ const gatewayDefaults = wingmanConfig.gateway;
56
+ const envToken = getGatewayTokenFromEnv();
57
+ const authFlag = Boolean(options.auth);
58
+ const authMode = options["auth-mode"] || options.authMode || (authFlag ? "token" : void 0);
59
+ const resolvedToken = "token" === authMode ? options.token || envToken : void 0;
60
+ const auth = authMode ? {
61
+ mode: authMode,
62
+ token: resolvedToken,
63
+ password: options.password
64
+ } : gatewayDefaults.auth;
65
+ const config = {
66
+ port: options.port || gatewayDefaults.port || 18789,
67
+ host: options.host || gatewayDefaults.host || "127.0.0.1",
68
+ requireAuth: auth?.mode !== "none",
69
+ authToken: auth?.token,
70
+ auth,
71
+ maxNodes: options.maxNodes || 1000,
72
+ pingInterval: options.pingInterval || 30000,
73
+ pingTimeout: options.pingTimeout || 60000,
74
+ logLevel: options.logLevel || "info"
75
+ };
76
+ if (options.discovery) config.discovery = {
77
+ enabled: true,
78
+ method: options.discovery,
79
+ name: options.name || `Gateway-${Date.now()}`
80
+ };
81
+ const daemon = new GatewayDaemon();
82
+ try {
83
+ await daemon.start(config);
84
+ console.log("✓ Gateway started successfully");
85
+ console.log(` URL: ws://${config.host}:${config.port}/ws`);
86
+ console.log(` Health: http://${config.host}:${config.port}/health`);
87
+ const controlUi = wingmanConfig.gateway?.controlUi;
88
+ if (controlUi?.enabled) {
89
+ const uiPort = controlUi.port || 18790;
90
+ console.log(` Control UI: http://${config.host}:${uiPort}/`);
91
+ }
92
+ console.log(` Logs: ${daemon.getLogFile()}`);
93
+ if (config.auth?.mode === "token" && !config.auth.token) {
94
+ console.log("\n⚠ Token auth is enabled but no token was provided.");
95
+ console.log(' Run "wingman gateway token --generate" to create a token.');
96
+ }
97
+ } catch (error) {
98
+ reportGatewayError("Failed to start gateway", error);
99
+ process.exit(1);
100
+ }
101
+ }
102
+ async function handleStop() {
103
+ const daemon = new GatewayDaemon();
104
+ try {
105
+ await daemon.stop();
106
+ console.log("✓ Gateway stopped successfully");
107
+ } catch (error) {
108
+ reportGatewayError("Failed to stop gateway", error);
109
+ process.exit(1);
110
+ }
111
+ }
112
+ async function handleRestart() {
113
+ const daemon = new GatewayDaemon();
114
+ try {
115
+ await daemon.restart();
116
+ console.log("✓ Gateway restarted successfully");
117
+ } catch (error) {
118
+ reportGatewayError("Failed to restart gateway", error);
119
+ process.exit(1);
120
+ }
121
+ }
122
+ async function handleStatus() {
123
+ const daemon = new GatewayDaemon();
124
+ const status = daemon.getStatus();
125
+ if (!status.running) return void console.log("Gateway Status: Not Running");
126
+ console.log("Gateway Status: Running");
127
+ console.log(` PID: ${status.pid}`);
128
+ if (status.uptime) {
129
+ const uptimeSeconds = Math.floor(status.uptime / 1000);
130
+ const hours = Math.floor(uptimeSeconds / 3600);
131
+ const minutes = Math.floor(uptimeSeconds % 3600 / 60);
132
+ const seconds = uptimeSeconds % 60;
133
+ console.log(` Uptime: ${hours}h ${minutes}m ${seconds}s`);
134
+ }
135
+ if (status.config) {
136
+ console.log(` Host: ${status.config.host}`);
137
+ console.log(` Port: ${status.config.port}`);
138
+ const authMode = status.config.auth?.mode || "none";
139
+ console.log(` Auth Mode: ${authMode}`);
140
+ console.log(` Max Nodes: ${status.config.maxNodes}`);
141
+ }
142
+ console.log(` Log File: ${daemon.getLogFile()}`);
143
+ }
144
+ async function handleRun(options) {
145
+ let config;
146
+ if (options.daemon && process.env.WINGMAN_GATEWAY_CONFIG) {
147
+ const configStr = readFileSync(process.env.WINGMAN_GATEWAY_CONFIG, "utf-8");
148
+ config = JSON.parse(configStr);
149
+ } else {
150
+ const configLoader = new WingmanConfigLoader();
151
+ const wingmanConfig = configLoader.loadConfig();
152
+ const gatewayDefaults = wingmanConfig.gateway;
153
+ const envToken = getGatewayTokenFromEnv();
154
+ const authFlag = Boolean(options.auth);
155
+ const authMode = options["auth-mode"] || options.authMode || (authFlag ? "token" : void 0);
156
+ const resolvedToken = "token" === authMode ? options.token || envToken : void 0;
157
+ const auth = authMode ? {
158
+ mode: authMode,
159
+ token: resolvedToken,
160
+ password: options.password
161
+ } : gatewayDefaults.auth;
162
+ config = {
163
+ port: options.port || gatewayDefaults.port || 18789,
164
+ host: options.host || gatewayDefaults.host || "127.0.0.1",
165
+ requireAuth: auth?.mode !== "none",
166
+ authToken: auth?.token,
167
+ auth,
168
+ maxNodes: options.maxNodes || 1000,
169
+ pingInterval: options.pingInterval || 30000,
170
+ pingTimeout: options.pingTimeout || 60000,
171
+ logLevel: options.logLevel || "info"
172
+ };
173
+ }
174
+ const server = new GatewayServer(config);
175
+ process.on("SIGTERM", async ()=>{
176
+ console.log("Received SIGTERM, shutting down gracefully...");
177
+ await server.stop();
178
+ process.exit(0);
179
+ });
180
+ process.on("SIGINT", async ()=>{
181
+ console.log("Received SIGINT, shutting down gracefully...");
182
+ await server.stop();
183
+ process.exit(0);
184
+ });
185
+ try {
186
+ await server.start();
187
+ console.log("✓ Gateway running");
188
+ console.log(` URL: ws://${config.host}:${config.port}/ws`);
189
+ console.log(` Health: http://${config.host}:${config.port}/health`);
190
+ console.log(` Logs: ${getLogFilePath()}`);
191
+ if (config.auth?.mode === "token" && config.auth.token) console.log(` Auth Token: ${config.auth.token}`);
192
+ await new Promise(()=>{});
193
+ } catch (error) {
194
+ reportGatewayError("Failed to start gateway", error);
195
+ process.exit(1);
196
+ }
197
+ }
198
+ async function handleJoin(args, options) {
199
+ const url = args[0] || "ws://localhost:18789/ws";
200
+ const name = options.name || `node-${Date.now()}`;
201
+ const token = options.token || getGatewayTokenFromEnv();
202
+ const group = options.group;
203
+ const transport = options.transport || "auto";
204
+ console.log(`Connecting to gateway: ${url}`);
205
+ console.log(`Node name: ${name}`);
206
+ if ("auto" !== transport) console.log(`Transport: ${transport}`);
207
+ const client = new index_js_GatewayClient(url, name, {
208
+ token,
209
+ transport,
210
+ events: {
211
+ connected: ()=>{
212
+ console.log("✓ Connected to gateway");
213
+ },
214
+ registered: (nodeId, nodeName)=>{
215
+ console.log(`✓ Registered as ${nodeName} (${nodeId})`);
216
+ if (group) client.joinGroup(group);
217
+ },
218
+ joinedGroup: (groupId, groupName)=>{
219
+ console.log(`✓ Joined group: ${groupName} (${groupId})`);
220
+ console.log("\nReady to receive messages. Press Ctrl+C to exit.");
221
+ },
222
+ broadcast: (message, fromNodeId, groupId)=>{
223
+ console.log(`\n[Broadcast from ${fromNodeId}]:`);
224
+ console.log(JSON.stringify(message, null, 2));
225
+ },
226
+ direct: (message, fromNodeId)=>{
227
+ console.log(`\n[Direct from ${fromNodeId}]:`);
228
+ console.log(JSON.stringify(message, null, 2));
229
+ },
230
+ error: (error)=>{
231
+ logger.error("Gateway error event", error.message);
232
+ console.error(`\n✗ Error: ${error.message}`);
233
+ console.error(`Logs: ${logFile}`);
234
+ },
235
+ disconnected: ()=>{
236
+ console.log("\n✗ Disconnected from gateway");
237
+ }
238
+ }
239
+ });
240
+ try {
241
+ await client.connect();
242
+ process.on("SIGINT", ()=>{
243
+ console.log("\nDisconnecting...");
244
+ client.disconnect();
245
+ process.exit(0);
246
+ });
247
+ await new Promise(()=>{});
248
+ } catch (error) {
249
+ reportGatewayError("Failed to connect", error);
250
+ process.exit(1);
251
+ }
252
+ }
253
+ async function handleDiscover(options) {
254
+ const timeout = options.timeout || 5000;
255
+ const verbose = options.verbose;
256
+ const tailscale = options.tailscale;
257
+ if (tailscale) {
258
+ console.log("Discovering gateways on Tailscale network...");
259
+ const { TailscaleDiscoveryService } = await import("../../gateway/discovery/tailscale.js");
260
+ const ts = new TailscaleDiscoveryService();
261
+ try {
262
+ const gateways = await ts.discover(timeout);
263
+ if (0 === gateways.length) {
264
+ console.log("\nNo gateways found on Tailscale network");
265
+ console.log("\nTo start a Tailscale-discoverable gateway:");
266
+ console.log(' wingman gateway start --discovery tailscale --name "My Gateway"');
267
+ console.log('\nNote: Ensure your gateway has the "wingman-gateway" tag in Tailscale');
268
+ return;
269
+ }
270
+ console.log(`\n✓ Found ${gateways.length} gateway(s):\n`);
271
+ for (const gw of gateways){
272
+ console.log(` ${gw.name}`);
273
+ console.log(` URL: ${gw.url}`);
274
+ console.log(` Auth: ${gw.requireAuth ? "Required" : "Optional"}`);
275
+ if (verbose) {
276
+ console.log(` Host: ${gw.host}`);
277
+ console.log(` Port: ${gw.port}`);
278
+ console.log(` Transport: ${gw.transport}`);
279
+ console.log(` Capabilities: ${gw.capabilities.join(", ")}`);
280
+ console.log(` Version: ${gw.version}`);
281
+ }
282
+ console.log();
283
+ }
284
+ console.log("To connect to a gateway:");
285
+ console.log(' wingman gateway join <url> --name "my-node"');
286
+ } catch (error) {
287
+ reportGatewayError("Discovery failed", error);
288
+ process.exit(1);
289
+ }
290
+ return;
291
+ }
292
+ console.log(`Discovering gateways on local network (${timeout}ms timeout)...`);
293
+ const { MDNSDiscoveryService } = await import("../../gateway/discovery/mdns.js");
294
+ const mdns = new MDNSDiscoveryService();
295
+ try {
296
+ const gateways = await mdns.discover(timeout);
297
+ if (0 === gateways.length) {
298
+ console.log("\nNo gateways found on local network");
299
+ console.log("\nTo start a discoverable gateway:");
300
+ console.log(' wingman gateway start --discovery mdns --name "My Gateway"');
301
+ return;
302
+ }
303
+ console.log(`\n✓ Found ${gateways.length} gateway(s):\n`);
304
+ for (const gw of gateways){
305
+ console.log(` ${gw.name}`);
306
+ console.log(` URL: ${gw.url}`);
307
+ console.log(` Auth: ${gw.requireAuth ? "Required" : "Optional"}`);
308
+ if (verbose) {
309
+ console.log(` Host: ${gw.host}`);
310
+ console.log(` Port: ${gw.port}`);
311
+ console.log(` Transport: ${gw.transport}`);
312
+ console.log(` Capabilities: ${gw.capabilities.join(", ")}`);
313
+ console.log(` Version: ${gw.version}`);
314
+ }
315
+ console.log();
316
+ }
317
+ console.log("To connect to a gateway:");
318
+ console.log(' wingman gateway join <url> --name "my-node"');
319
+ } catch (error) {
320
+ reportGatewayError("Discovery failed", error);
321
+ process.exit(1);
322
+ }
323
+ }
324
+ async function handleToken(options) {
325
+ if (options.generate) {
326
+ const { GatewayAuth } = await import("../../gateway/auth.js");
327
+ const auth = new GatewayAuth();
328
+ const token = auth.generateToken();
329
+ console.log("Generated token:");
330
+ console.log(token);
331
+ console.log('\nUse this token with: wingman gateway start --auth --token="<token>"');
332
+ } else console.log("Usage: wingman gateway token --generate");
333
+ }
334
+ async function handleHealth(options) {
335
+ const host = options.host || "localhost";
336
+ const port = options.port || 18789;
337
+ const url = `http://${host}:${port}/health`;
338
+ try {
339
+ const response = await fetch(url);
340
+ if (!response.ok) throw new Error(`HTTP ${response.status}: ${response.statusText}`);
341
+ const health = await response.json();
342
+ console.log("Gateway Health:");
343
+ console.log(JSON.stringify(health, null, 2));
344
+ } catch (error) {
345
+ reportGatewayError("Failed to check health", error);
346
+ process.exit(1);
347
+ }
348
+ }
349
+ async function handleTunnel(args, options) {
350
+ const sshHost = args[0];
351
+ if (!sshHost) {
352
+ logger.error("SSH host required");
353
+ console.error("✗ SSH host required");
354
+ console.error(`Logs: ${logFile}`);
355
+ console.log("\nUsage:");
356
+ console.log(" wingman gateway tunnel user@host [options]");
357
+ console.log("\nOptions:");
358
+ console.log(" --port <number> Gateway port on remote host (default: 3000)");
359
+ console.log(" --local-port <number> Local port for tunnel (default: random)");
360
+ console.log(" --name <string> Node name after connecting");
361
+ console.log(" --group <string> Auto-join broadcast group");
362
+ process.exit(1);
363
+ }
364
+ const remotePort = options.port || 18789;
365
+ const localPort = options.localPort || 0;
366
+ const name = options.name || `tunnel-node-${Date.now()}`;
367
+ const group = options.group;
368
+ const actualLocalPort = localPort || await findAvailablePort();
369
+ console.log("Creating SSH tunnel to gateway...");
370
+ console.log(` SSH Host: ${sshHost}`);
371
+ console.log(` Remote Port: ${remotePort}`);
372
+ console.log(` Local Port: ${actualLocalPort}`);
373
+ console.log();
374
+ const { spawn } = await import("child_process");
375
+ const sshArgs = [
376
+ "-L",
377
+ `${actualLocalPort}:localhost:${remotePort}`,
378
+ "-N",
379
+ "-o",
380
+ "ExitOnForwardFailure=yes",
381
+ sshHost
382
+ ];
383
+ const sshProcess = spawn("ssh", sshArgs, {
384
+ stdio: "inherit"
385
+ });
386
+ await new Promise((resolve)=>setTimeout(resolve, 2000));
387
+ if (null !== sshProcess.exitCode) {
388
+ logger.error("Failed to create SSH tunnel");
389
+ console.error("✗ Failed to create SSH tunnel");
390
+ console.error(`Logs: ${logFile}`);
391
+ process.exit(1);
392
+ }
393
+ console.log("✓ SSH tunnel established");
394
+ console.log();
395
+ console.log("Connecting to gateway through tunnel...");
396
+ const { GatewayClient } = await import("../../gateway/client.js");
397
+ const client = new GatewayClient(`ws://localhost:${actualLocalPort}/ws`, name, {
398
+ events: {
399
+ connected: ()=>{
400
+ console.log("✓ Connected to gateway");
401
+ },
402
+ registered: (nodeId, nodeName)=>{
403
+ console.log(`✓ Registered as ${nodeName} (${nodeId})`);
404
+ if (group) client.joinGroup(group);
405
+ },
406
+ joinedGroup: (groupId, groupName)=>{
407
+ console.log(`✓ Joined group: ${groupName} (${groupId})`);
408
+ console.log("\nReady to receive messages. Press Ctrl+C to exit.");
409
+ },
410
+ broadcast: (message, fromNodeId, groupId)=>{
411
+ console.log(`\n[Broadcast from ${fromNodeId}]:`);
412
+ console.log(JSON.stringify(message, null, 2));
413
+ },
414
+ direct: (message, fromNodeId)=>{
415
+ console.log(`\n[Direct from ${fromNodeId}]:`);
416
+ console.log(JSON.stringify(message, null, 2));
417
+ },
418
+ error: (error)=>{
419
+ logger.error("Gateway error event", error.message);
420
+ console.error(`\n✗ Error: ${error.message}`);
421
+ console.error(`Logs: ${logFile}`);
422
+ },
423
+ disconnected: ()=>{
424
+ console.log("\n✗ Disconnected from gateway");
425
+ }
426
+ }
427
+ });
428
+ try {
429
+ await client.connect();
430
+ process.on("SIGINT", ()=>{
431
+ console.log("\nClosing tunnel and disconnecting...");
432
+ client.disconnect();
433
+ sshProcess.kill();
434
+ process.exit(0);
435
+ });
436
+ sshProcess.on("exit", (code)=>{
437
+ console.log(`\n✗ SSH tunnel closed (exit code: ${code})`);
438
+ client.disconnect();
439
+ process.exit(code || 0);
440
+ });
441
+ await new Promise(()=>{});
442
+ } catch (error) {
443
+ reportGatewayError("Failed to connect", error);
444
+ sshProcess.kill();
445
+ process.exit(1);
446
+ }
447
+ }
448
+ async function findAvailablePort() {
449
+ const net = await import("net");
450
+ return new Promise((resolve, reject)=>{
451
+ const server = net.createServer();
452
+ server.listen(0, ()=>{
453
+ const address = server.address();
454
+ const port = address.port;
455
+ server.close(()=>{
456
+ resolve(port);
457
+ });
458
+ });
459
+ server.on("error", reject);
460
+ });
461
+ }
462
+ function showGatewayHelp() {
463
+ console.log(`
464
+ Wingman Gateway - AI Agent Swarming Gateway
465
+
466
+ Usage:
467
+ wingman gateway <subcommand> [options]
468
+
469
+ Subcommands:
470
+ start Start the gateway as a daemon
471
+ stop Stop the gateway daemon
472
+ restart Restart the gateway daemon
473
+ status Show gateway status
474
+ run Run the gateway in foreground
475
+ join <url> Join a gateway as a node
476
+ discover Discover gateways on local network
477
+ tunnel <ssh-host> Create SSH tunnel and connect to gateway
478
+ token Generate authentication token
479
+ health Check gateway health
480
+
481
+ Start Options:
482
+ --port <number> Port to listen on (default: 18789)
483
+ --host <string> Host to bind to (default: 127.0.0.1)
484
+ --auth Enable token authentication (legacy shortcut)
485
+ --auth-mode <mode> token | password | none
486
+ --token <string> Authentication token (token mode)
487
+ --password <string> Authentication password (password mode)
488
+ --max-nodes <number> Maximum number of nodes (default: 1000)
489
+ --log-level <level> Log level (debug|info|warn|error|silent)
490
+ --discovery <method> Discovery method: mdns, tailscale
491
+ --name <string> Gateway name for discovery
492
+
493
+ Join Options:
494
+ --name <string> Node name
495
+ --token <string> Authentication token
496
+ --group <string> Auto-join broadcast group
497
+ --transport <type> Transport type: websocket, http, auto (default: auto)
498
+
499
+ Discover Options:
500
+ --timeout <ms> Discovery timeout (default: 5000)
501
+ --verbose Show detailed gateway info
502
+ --tailscale Discover on Tailscale network instead of LAN
503
+
504
+ Tunnel Options:
505
+ --port <number> Gateway port on remote host (default: 18789)
506
+ --local-port <number> Local port for tunnel (default: random)
507
+ --name <string> Node name after connecting
508
+ --group <string> Auto-join broadcast group
509
+
510
+ Token Options:
511
+ --generate Generate a new token
512
+
513
+ Health Options:
514
+ --host <string> Gateway host (default: localhost)
515
+ --port <number> Gateway port (default: 18789)
516
+
517
+ Examples:
518
+ # Start gateway locally
519
+ wingman gateway start
520
+
521
+ # Start with mDNS discovery (LAN)
522
+ wingman gateway start --discovery mdns --name "Home Gateway"
523
+
524
+ # Start with Tailscale discovery
525
+ wingman gateway start --discovery tailscale --name "Work Gateway"
526
+
527
+ # Start with authentication
528
+ wingman gateway token --generate
529
+ wingman gateway start --auth --token="<token>"
530
+
531
+ # Start on custom port
532
+ wingman gateway start --port 8080
533
+
534
+ # Discover gateways on local network
535
+ wingman gateway discover
536
+ wingman gateway discover --verbose
537
+
538
+ # Discover gateways on Tailscale
539
+ wingman gateway discover --tailscale
540
+ wingman gateway discover --tailscale --verbose
541
+
542
+ # Join a gateway
543
+ wingman gateway join ws://localhost:18789/ws --name="agent-1" --group="swarm"
544
+
545
+ # Join via HTTP bridge (firewall traversal)
546
+ wingman gateway join http://localhost:18789 --transport http --name="agent-1"
547
+
548
+ # Auto-select transport
549
+ wingman gateway join http://localhost:18789 --transport auto --name="agent-1"
550
+
551
+ # Connect via SSH tunnel
552
+ wingman gateway tunnel user@remote-host --name="tunnel-node"
553
+ wingman gateway tunnel user@remote-host --port 18789 --group="swarm"
554
+
555
+ # Check status
556
+ wingman gateway status
557
+
558
+ # Check health
559
+ wingman gateway health
560
+
561
+ Deployment:
562
+ Local: Run on localhost or LAN
563
+ Tailscale: Accessible over Tailscale network
564
+ Cloudflare: Deploy to Cloudflare Workers (see cloudflare/README.md)
565
+ `);
566
+ }
567
+ export { executeGatewayCommand };