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