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