@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 @@
1
+ export {};
@@ -0,0 +1,126 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { AgentConfigSchema, validateAgentConfig } from "../config/agentConfig.js";
3
+ describe("Agent Configuration Schema", ()=>{
4
+ describe("validateAgentConfig", ()=>{
5
+ it("should validate a valid minimal agent config", ()=>{
6
+ const config = {
7
+ name: "test-agent",
8
+ description: "A test agent",
9
+ systemPrompt: "You are a test agent"
10
+ };
11
+ const result = validateAgentConfig(config);
12
+ expect(result.success).toBe(true);
13
+ if (result.success) {
14
+ expect(result.data.name).toBe("test-agent");
15
+ expect(result.data.description).toBe("A test agent");
16
+ expect(result.data.systemPrompt).toBe("You are a test agent");
17
+ }
18
+ });
19
+ it("should validate a complete agent config with all fields", ()=>{
20
+ const config = {
21
+ name: "data-analyst",
22
+ description: "Analyzes data",
23
+ systemPrompt: "You are a data analyst",
24
+ tools: [
25
+ "command_execute",
26
+ "think"
27
+ ],
28
+ model: "anthropic:claude-opus-4-5",
29
+ blockedCommands: [
30
+ "rm",
31
+ "mv"
32
+ ],
33
+ allowScriptExecution: true,
34
+ commandTimeout: 300000
35
+ };
36
+ const result = validateAgentConfig(config);
37
+ expect(result.success).toBe(true);
38
+ if (result.success) {
39
+ expect(result.data.tools).toEqual([
40
+ "command_execute",
41
+ "think"
42
+ ]);
43
+ expect(result.data.model).toBe("anthropic:claude-opus-4-5");
44
+ expect(result.data.blockedCommands).toEqual([
45
+ "rm",
46
+ "mv"
47
+ ]);
48
+ expect(result.data.allowScriptExecution).toBe(true);
49
+ expect(result.data.commandTimeout).toBe(300000);
50
+ }
51
+ });
52
+ it("should allow subagents to override models", ()=>{
53
+ const config = {
54
+ name: "parent-agent",
55
+ description: "Parent agent",
56
+ systemPrompt: "You are the parent agent",
57
+ subAgents: [
58
+ {
59
+ name: "research-agent",
60
+ description: "Researches topics",
61
+ systemPrompt: "You are a researcher",
62
+ model: "openai:gpt-4o"
63
+ }
64
+ ]
65
+ };
66
+ const result = validateAgentConfig(config);
67
+ expect(result.success).toBe(true);
68
+ if (result.success) expect(result.data.subAgents?.[0].model).toBe("openai:gpt-4o");
69
+ });
70
+ it("should fail validation for missing required fields", ()=>{
71
+ const config = {
72
+ name: "test-agent"
73
+ };
74
+ const result = validateAgentConfig(config);
75
+ expect(result.success).toBe(false);
76
+ if (!result.success) {
77
+ expect(result.error).toContain("description");
78
+ expect(result.error).toContain("systemPrompt");
79
+ }
80
+ });
81
+ it("should fail validation for invalid tool names", ()=>{
82
+ const config = {
83
+ name: "test-agent",
84
+ description: "Test",
85
+ systemPrompt: "Test",
86
+ tools: [
87
+ "invalid_tool"
88
+ ]
89
+ };
90
+ const result = validateAgentConfig(config);
91
+ expect(result.success).toBe(false);
92
+ });
93
+ it("should apply default values for optional fields", ()=>{
94
+ const config = {
95
+ name: "test-agent",
96
+ description: "Test",
97
+ systemPrompt: "Test"
98
+ };
99
+ const parsed = AgentConfigSchema.parse(config);
100
+ expect(parsed.allowScriptExecution).toBe(true);
101
+ expect(parsed.commandTimeout).toBe(300000);
102
+ });
103
+ });
104
+ describe("Tool names enum", ()=>{
105
+ it("should accept all valid tool names", ()=>{
106
+ const validTools = [
107
+ "internet_search",
108
+ "web_crawler",
109
+ "command_execute",
110
+ "think"
111
+ ];
112
+ for (const tool of validTools){
113
+ const config = {
114
+ name: "test",
115
+ description: "test",
116
+ systemPrompt: "test",
117
+ tools: [
118
+ tool
119
+ ]
120
+ };
121
+ const result = validateAgentConfig(config);
122
+ expect(result.success).toBe(true);
123
+ }
124
+ });
125
+ });
126
+ });
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ var __webpack_exports__ = {};
3
+ const external_vitest_namespaceObject = require("vitest");
4
+ const external_node_fs_namespaceObject = require("node:fs");
5
+ const external_node_path_namespaceObject = require("node:path");
6
+ const agentLoader_cjs_namespaceObject = require("../config/agentLoader.cjs");
7
+ const TEST_CONFIG_DIR = ".wingman-test";
8
+ (0, external_vitest_namespaceObject.describe)("AgentConfigLoader", ()=>{
9
+ (0, external_vitest_namespaceObject.beforeEach)(()=>{
10
+ if ((0, external_node_fs_namespaceObject.existsSync)(TEST_CONFIG_DIR)) (0, external_node_fs_namespaceObject.rmSync)(TEST_CONFIG_DIR, {
11
+ recursive: true,
12
+ force: true
13
+ });
14
+ });
15
+ (0, external_vitest_namespaceObject.afterEach)(()=>{
16
+ if ((0, external_node_fs_namespaceObject.existsSync)(TEST_CONFIG_DIR)) (0, external_node_fs_namespaceObject.rmSync)(TEST_CONFIG_DIR, {
17
+ recursive: true,
18
+ force: true
19
+ });
20
+ });
21
+ (0, external_vitest_namespaceObject.describe)("loadAllAgentConfigs", ()=>{
22
+ (0, external_vitest_namespaceObject.it)("should return empty array when no config exists", ()=>{
23
+ const loader = new agentLoader_cjs_namespaceObject.AgentLoader(TEST_CONFIG_DIR);
24
+ const agents = loader.loadAllAgentConfigs();
25
+ (0, external_vitest_namespaceObject.expect)(agents).toEqual([]);
26
+ });
27
+ (0, external_vitest_namespaceObject.it)("should load agent from a single agent directory", ()=>{
28
+ const agentDir = (0, external_node_path_namespaceObject.join)(TEST_CONFIG_DIR, "agents", "test-agent");
29
+ (0, external_node_fs_namespaceObject.mkdirSync)(agentDir, {
30
+ recursive: true
31
+ });
32
+ const config = {
33
+ name: "test-agent",
34
+ description: "A test agent",
35
+ systemPrompt: "You are a test agent",
36
+ tools: [
37
+ "think"
38
+ ]
39
+ };
40
+ (0, external_node_fs_namespaceObject.writeFileSync)((0, external_node_path_namespaceObject.join)(agentDir, "agent.json"), JSON.stringify(config));
41
+ const loader = new agentLoader_cjs_namespaceObject.AgentLoader(TEST_CONFIG_DIR);
42
+ const agents = loader.loadAllAgentConfigs();
43
+ (0, external_vitest_namespaceObject.expect)(agents).toHaveLength(1);
44
+ (0, external_vitest_namespaceObject.expect)(agents[0].name).toBe("test-agent");
45
+ (0, external_vitest_namespaceObject.expect)(agents[0].description).toBe("A test agent");
46
+ (0, external_vitest_namespaceObject.expect)(agents[0].systemPrompt).toBe("You are a test agent");
47
+ (0, external_vitest_namespaceObject.expect)(agents[0].tools).toHaveLength(1);
48
+ });
49
+ (0, external_vitest_namespaceObject.it)("should load agents from a directory of agent.json files", ()=>{
50
+ const agent1Dir = (0, external_node_path_namespaceObject.join)(TEST_CONFIG_DIR, "agents", "agent-1");
51
+ const agent2Dir = (0, external_node_path_namespaceObject.join)(TEST_CONFIG_DIR, "agents", "agent-2");
52
+ (0, external_node_fs_namespaceObject.mkdirSync)(agent1Dir, {
53
+ recursive: true
54
+ });
55
+ (0, external_node_fs_namespaceObject.mkdirSync)(agent2Dir, {
56
+ recursive: true
57
+ });
58
+ const agent1 = {
59
+ name: "agent-1",
60
+ description: "First agent",
61
+ systemPrompt: "You are agent 1"
62
+ };
63
+ const agent2 = {
64
+ name: "agent-2",
65
+ description: "Second agent",
66
+ systemPrompt: "You are agent 2",
67
+ tools: [
68
+ "web_crawler"
69
+ ]
70
+ };
71
+ (0, external_node_fs_namespaceObject.writeFileSync)((0, external_node_path_namespaceObject.join)(agent1Dir, "agent.json"), JSON.stringify(agent1));
72
+ (0, external_node_fs_namespaceObject.writeFileSync)((0, external_node_path_namespaceObject.join)(agent2Dir, "agent.json"), JSON.stringify(agent2));
73
+ const loader = new agentLoader_cjs_namespaceObject.AgentLoader(TEST_CONFIG_DIR);
74
+ const agents = loader.loadAllAgentConfigs();
75
+ (0, external_vitest_namespaceObject.expect)(agents).toHaveLength(2);
76
+ (0, external_vitest_namespaceObject.expect)(agents.map((agent)=>agent.name)).toContain("agent-1");
77
+ (0, external_vitest_namespaceObject.expect)(agents.map((agent)=>agent.name)).toContain("agent-2");
78
+ const agentWithTools = agents.find((agent)=>"agent-2" === agent.name);
79
+ (0, external_vitest_namespaceObject.expect)(agentWithTools?.tools).toHaveLength(1);
80
+ });
81
+ (0, external_vitest_namespaceObject.it)("should prioritize agent.json over agent.md", ()=>{
82
+ const agentDir = (0, external_node_path_namespaceObject.join)(TEST_CONFIG_DIR, "agents", "mixed-agent");
83
+ (0, external_node_fs_namespaceObject.mkdirSync)(agentDir, {
84
+ recursive: true
85
+ });
86
+ const jsonConfig = {
87
+ name: "from-json",
88
+ description: "From JSON",
89
+ systemPrompt: "JSON agent"
90
+ };
91
+ const markdownConfig = `---
92
+ name: from-markdown
93
+ description: From Markdown
94
+ ---
95
+ Markdown agent`;
96
+ (0, external_node_fs_namespaceObject.writeFileSync)((0, external_node_path_namespaceObject.join)(agentDir, "agent.json"), JSON.stringify(jsonConfig));
97
+ (0, external_node_fs_namespaceObject.writeFileSync)((0, external_node_path_namespaceObject.join)(agentDir, "agent.md"), markdownConfig);
98
+ const loader = new agentLoader_cjs_namespaceObject.AgentLoader(TEST_CONFIG_DIR);
99
+ const agents = loader.loadAllAgentConfigs();
100
+ (0, external_vitest_namespaceObject.expect)(agents).toHaveLength(1);
101
+ (0, external_vitest_namespaceObject.expect)(agents[0].name).toBe("from-json");
102
+ });
103
+ (0, external_vitest_namespaceObject.it)("should handle malformed JSON gracefully", ()=>{
104
+ const agentDir = (0, external_node_path_namespaceObject.join)(TEST_CONFIG_DIR, "agents", "bad-agent");
105
+ (0, external_node_fs_namespaceObject.mkdirSync)(agentDir, {
106
+ recursive: true
107
+ });
108
+ (0, external_node_fs_namespaceObject.writeFileSync)((0, external_node_path_namespaceObject.join)(agentDir, "agent.json"), "{ invalid json");
109
+ const loader = new agentLoader_cjs_namespaceObject.AgentLoader(TEST_CONFIG_DIR);
110
+ const agents = loader.loadAllAgentConfigs();
111
+ (0, external_vitest_namespaceObject.expect)(agents).toEqual([]);
112
+ });
113
+ (0, external_vitest_namespaceObject.it)("should skip invalid agent configs in directory", ()=>{
114
+ const validDir = (0, external_node_path_namespaceObject.join)(TEST_CONFIG_DIR, "agents", "valid-agent");
115
+ const invalidDir = (0, external_node_path_namespaceObject.join)(TEST_CONFIG_DIR, "agents", "invalid-agent");
116
+ (0, external_node_fs_namespaceObject.mkdirSync)(validDir, {
117
+ recursive: true
118
+ });
119
+ (0, external_node_fs_namespaceObject.mkdirSync)(invalidDir, {
120
+ recursive: true
121
+ });
122
+ const validAgent = {
123
+ name: "valid-agent",
124
+ description: "Valid agent",
125
+ systemPrompt: "Valid"
126
+ };
127
+ const invalidAgent = {
128
+ name: "invalid-agent"
129
+ };
130
+ (0, external_node_fs_namespaceObject.writeFileSync)((0, external_node_path_namespaceObject.join)(validDir, "agent.json"), JSON.stringify(validAgent));
131
+ (0, external_node_fs_namespaceObject.writeFileSync)((0, external_node_path_namespaceObject.join)(invalidDir, "agent.json"), JSON.stringify(invalidAgent));
132
+ const loader = new agentLoader_cjs_namespaceObject.AgentLoader(TEST_CONFIG_DIR);
133
+ const agents = loader.loadAllAgentConfigs();
134
+ (0, external_vitest_namespaceObject.expect)(agents).toHaveLength(1);
135
+ (0, external_vitest_namespaceObject.expect)(agents[0].name).toBe("valid-agent");
136
+ });
137
+ (0, external_vitest_namespaceObject.it)("should create agent with model override", ()=>{
138
+ const config = {
139
+ name: "custom-model-agent",
140
+ description: "Agent with custom model",
141
+ systemPrompt: "You are a custom agent",
142
+ model: "anthropic:claude-opus-4-5"
143
+ };
144
+ const agentDir = (0, external_node_path_namespaceObject.join)(TEST_CONFIG_DIR, "agents", "custom-model-agent");
145
+ (0, external_node_fs_namespaceObject.mkdirSync)(agentDir, {
146
+ recursive: true
147
+ });
148
+ (0, external_node_fs_namespaceObject.writeFileSync)((0, external_node_path_namespaceObject.join)(agentDir, "agent.json"), JSON.stringify(config));
149
+ const loader = new agentLoader_cjs_namespaceObject.AgentLoader(TEST_CONFIG_DIR);
150
+ const agents = loader.loadAllAgentConfigs();
151
+ (0, external_vitest_namespaceObject.expect)(agents).toHaveLength(1);
152
+ (0, external_vitest_namespaceObject.expect)(agents[0].model).toBeDefined();
153
+ });
154
+ (0, external_vitest_namespaceObject.it)("should create agent with command_execute tool and custom options", ()=>{
155
+ const config = {
156
+ name: "executor-agent",
157
+ description: "Executes commands",
158
+ systemPrompt: "You execute commands",
159
+ tools: [
160
+ "command_execute"
161
+ ],
162
+ blockedCommands: [
163
+ "rm",
164
+ "mv"
165
+ ],
166
+ allowScriptExecution: false,
167
+ commandTimeout: 60000
168
+ };
169
+ const agentDir = (0, external_node_path_namespaceObject.join)(TEST_CONFIG_DIR, "agents", "executor-agent");
170
+ (0, external_node_fs_namespaceObject.mkdirSync)(agentDir, {
171
+ recursive: true
172
+ });
173
+ (0, external_node_fs_namespaceObject.writeFileSync)((0, external_node_path_namespaceObject.join)(agentDir, "agent.json"), JSON.stringify(config));
174
+ const loader = new agentLoader_cjs_namespaceObject.AgentLoader(TEST_CONFIG_DIR);
175
+ const agents = loader.loadAllAgentConfigs();
176
+ (0, external_vitest_namespaceObject.expect)(agents).toHaveLength(1);
177
+ (0, external_vitest_namespaceObject.expect)(agents[0].tools).toHaveLength(1);
178
+ (0, external_vitest_namespaceObject.expect)(agents[0].tools?.[0]).toBe("command_execute");
179
+ });
180
+ (0, external_vitest_namespaceObject.it)("should ignore non-JSON files in directory", ()=>{
181
+ const agentDir = (0, external_node_path_namespaceObject.join)(TEST_CONFIG_DIR, "agents", "valid-agent");
182
+ (0, external_node_fs_namespaceObject.mkdirSync)(agentDir, {
183
+ recursive: true
184
+ });
185
+ const validAgent = {
186
+ name: "valid-agent",
187
+ description: "Valid",
188
+ systemPrompt: "Valid"
189
+ };
190
+ (0, external_node_fs_namespaceObject.writeFileSync)((0, external_node_path_namespaceObject.join)(agentDir, "agent.json"), JSON.stringify(validAgent));
191
+ (0, external_node_fs_namespaceObject.writeFileSync)((0, external_node_path_namespaceObject.join)(agentDir, "readme.md"), "# README");
192
+ (0, external_node_fs_namespaceObject.writeFileSync)((0, external_node_path_namespaceObject.join)(agentDir, "notes.txt"), "Some notes");
193
+ const loader = new agentLoader_cjs_namespaceObject.AgentLoader(TEST_CONFIG_DIR);
194
+ const agents = loader.loadAllAgentConfigs();
195
+ (0, external_vitest_namespaceObject.expect)(agents).toHaveLength(1);
196
+ (0, external_vitest_namespaceObject.expect)(agents[0].name).toBe("valid-agent");
197
+ });
198
+ });
199
+ (0, external_vitest_namespaceObject.describe)("loadAgent", ()=>{
200
+ (0, external_vitest_namespaceObject.it)("should hydrate subagent tools for runtime use", async ()=>{
201
+ const agentDir = (0, external_node_path_namespaceObject.join)(TEST_CONFIG_DIR, "agents", "parent-agent");
202
+ (0, external_node_fs_namespaceObject.mkdirSync)(agentDir, {
203
+ recursive: true
204
+ });
205
+ const config = {
206
+ name: "parent-agent",
207
+ description: "Parent agent",
208
+ systemPrompt: "You are the parent",
209
+ subAgents: [
210
+ {
211
+ name: "researcher",
212
+ description: "Research subagent",
213
+ systemPrompt: "You research things",
214
+ tools: [
215
+ "think"
216
+ ]
217
+ }
218
+ ]
219
+ };
220
+ (0, external_node_fs_namespaceObject.writeFileSync)((0, external_node_path_namespaceObject.join)(agentDir, "agent.json"), JSON.stringify(config));
221
+ const loader = new agentLoader_cjs_namespaceObject.AgentLoader(TEST_CONFIG_DIR);
222
+ const agent = await loader.loadAgent("parent-agent");
223
+ (0, external_vitest_namespaceObject.expect)(agent).toBeDefined();
224
+ (0, external_vitest_namespaceObject.expect)(agent?.subagents).toBeDefined();
225
+ (0, external_vitest_namespaceObject.expect)(agent?.subagents?.length).toBe(1);
226
+ const sub = agent?.subagents?.[0];
227
+ (0, external_vitest_namespaceObject.expect)(Array.isArray(sub.tools)).toBe(true);
228
+ (0, external_vitest_namespaceObject.expect)(sub.tools?.[0]).toHaveProperty("name", "think");
229
+ });
230
+ });
231
+ });
232
+ for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
233
+ Object.defineProperty(exports, '__esModule', {
234
+ value: true
235
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,229 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
2
+ import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { AgentLoader } from "../config/agentLoader.js";
5
+ const TEST_CONFIG_DIR = ".wingman-test";
6
+ describe("AgentConfigLoader", ()=>{
7
+ beforeEach(()=>{
8
+ if (existsSync(TEST_CONFIG_DIR)) rmSync(TEST_CONFIG_DIR, {
9
+ recursive: true,
10
+ force: true
11
+ });
12
+ });
13
+ afterEach(()=>{
14
+ if (existsSync(TEST_CONFIG_DIR)) rmSync(TEST_CONFIG_DIR, {
15
+ recursive: true,
16
+ force: true
17
+ });
18
+ });
19
+ describe("loadAllAgentConfigs", ()=>{
20
+ it("should return empty array when no config exists", ()=>{
21
+ const loader = new AgentLoader(TEST_CONFIG_DIR);
22
+ const agents = loader.loadAllAgentConfigs();
23
+ expect(agents).toEqual([]);
24
+ });
25
+ it("should load agent from a single agent directory", ()=>{
26
+ const agentDir = join(TEST_CONFIG_DIR, "agents", "test-agent");
27
+ mkdirSync(agentDir, {
28
+ recursive: true
29
+ });
30
+ const config = {
31
+ name: "test-agent",
32
+ description: "A test agent",
33
+ systemPrompt: "You are a test agent",
34
+ tools: [
35
+ "think"
36
+ ]
37
+ };
38
+ writeFileSync(join(agentDir, "agent.json"), JSON.stringify(config));
39
+ const loader = new AgentLoader(TEST_CONFIG_DIR);
40
+ const agents = loader.loadAllAgentConfigs();
41
+ expect(agents).toHaveLength(1);
42
+ expect(agents[0].name).toBe("test-agent");
43
+ expect(agents[0].description).toBe("A test agent");
44
+ expect(agents[0].systemPrompt).toBe("You are a test agent");
45
+ expect(agents[0].tools).toHaveLength(1);
46
+ });
47
+ it("should load agents from a directory of agent.json files", ()=>{
48
+ const agent1Dir = join(TEST_CONFIG_DIR, "agents", "agent-1");
49
+ const agent2Dir = join(TEST_CONFIG_DIR, "agents", "agent-2");
50
+ mkdirSync(agent1Dir, {
51
+ recursive: true
52
+ });
53
+ mkdirSync(agent2Dir, {
54
+ recursive: true
55
+ });
56
+ const agent1 = {
57
+ name: "agent-1",
58
+ description: "First agent",
59
+ systemPrompt: "You are agent 1"
60
+ };
61
+ const agent2 = {
62
+ name: "agent-2",
63
+ description: "Second agent",
64
+ systemPrompt: "You are agent 2",
65
+ tools: [
66
+ "web_crawler"
67
+ ]
68
+ };
69
+ writeFileSync(join(agent1Dir, "agent.json"), JSON.stringify(agent1));
70
+ writeFileSync(join(agent2Dir, "agent.json"), JSON.stringify(agent2));
71
+ const loader = new AgentLoader(TEST_CONFIG_DIR);
72
+ const agents = loader.loadAllAgentConfigs();
73
+ expect(agents).toHaveLength(2);
74
+ expect(agents.map((agent)=>agent.name)).toContain("agent-1");
75
+ expect(agents.map((agent)=>agent.name)).toContain("agent-2");
76
+ const agentWithTools = agents.find((agent)=>"agent-2" === agent.name);
77
+ expect(agentWithTools?.tools).toHaveLength(1);
78
+ });
79
+ it("should prioritize agent.json over agent.md", ()=>{
80
+ const agentDir = join(TEST_CONFIG_DIR, "agents", "mixed-agent");
81
+ mkdirSync(agentDir, {
82
+ recursive: true
83
+ });
84
+ const jsonConfig = {
85
+ name: "from-json",
86
+ description: "From JSON",
87
+ systemPrompt: "JSON agent"
88
+ };
89
+ const markdownConfig = `---
90
+ name: from-markdown
91
+ description: From Markdown
92
+ ---
93
+ Markdown agent`;
94
+ writeFileSync(join(agentDir, "agent.json"), JSON.stringify(jsonConfig));
95
+ writeFileSync(join(agentDir, "agent.md"), markdownConfig);
96
+ const loader = new AgentLoader(TEST_CONFIG_DIR);
97
+ const agents = loader.loadAllAgentConfigs();
98
+ expect(agents).toHaveLength(1);
99
+ expect(agents[0].name).toBe("from-json");
100
+ });
101
+ it("should handle malformed JSON gracefully", ()=>{
102
+ const agentDir = join(TEST_CONFIG_DIR, "agents", "bad-agent");
103
+ mkdirSync(agentDir, {
104
+ recursive: true
105
+ });
106
+ writeFileSync(join(agentDir, "agent.json"), "{ invalid json");
107
+ const loader = new AgentLoader(TEST_CONFIG_DIR);
108
+ const agents = loader.loadAllAgentConfigs();
109
+ expect(agents).toEqual([]);
110
+ });
111
+ it("should skip invalid agent configs in directory", ()=>{
112
+ const validDir = join(TEST_CONFIG_DIR, "agents", "valid-agent");
113
+ const invalidDir = join(TEST_CONFIG_DIR, "agents", "invalid-agent");
114
+ mkdirSync(validDir, {
115
+ recursive: true
116
+ });
117
+ mkdirSync(invalidDir, {
118
+ recursive: true
119
+ });
120
+ const validAgent = {
121
+ name: "valid-agent",
122
+ description: "Valid agent",
123
+ systemPrompt: "Valid"
124
+ };
125
+ const invalidAgent = {
126
+ name: "invalid-agent"
127
+ };
128
+ writeFileSync(join(validDir, "agent.json"), JSON.stringify(validAgent));
129
+ writeFileSync(join(invalidDir, "agent.json"), JSON.stringify(invalidAgent));
130
+ const loader = new AgentLoader(TEST_CONFIG_DIR);
131
+ const agents = loader.loadAllAgentConfigs();
132
+ expect(agents).toHaveLength(1);
133
+ expect(agents[0].name).toBe("valid-agent");
134
+ });
135
+ it("should create agent with model override", ()=>{
136
+ const config = {
137
+ name: "custom-model-agent",
138
+ description: "Agent with custom model",
139
+ systemPrompt: "You are a custom agent",
140
+ model: "anthropic:claude-opus-4-5"
141
+ };
142
+ const agentDir = join(TEST_CONFIG_DIR, "agents", "custom-model-agent");
143
+ mkdirSync(agentDir, {
144
+ recursive: true
145
+ });
146
+ writeFileSync(join(agentDir, "agent.json"), JSON.stringify(config));
147
+ const loader = new AgentLoader(TEST_CONFIG_DIR);
148
+ const agents = loader.loadAllAgentConfigs();
149
+ expect(agents).toHaveLength(1);
150
+ expect(agents[0].model).toBeDefined();
151
+ });
152
+ it("should create agent with command_execute tool and custom options", ()=>{
153
+ const config = {
154
+ name: "executor-agent",
155
+ description: "Executes commands",
156
+ systemPrompt: "You execute commands",
157
+ tools: [
158
+ "command_execute"
159
+ ],
160
+ blockedCommands: [
161
+ "rm",
162
+ "mv"
163
+ ],
164
+ allowScriptExecution: false,
165
+ commandTimeout: 60000
166
+ };
167
+ const agentDir = join(TEST_CONFIG_DIR, "agents", "executor-agent");
168
+ mkdirSync(agentDir, {
169
+ recursive: true
170
+ });
171
+ writeFileSync(join(agentDir, "agent.json"), JSON.stringify(config));
172
+ const loader = new AgentLoader(TEST_CONFIG_DIR);
173
+ const agents = loader.loadAllAgentConfigs();
174
+ expect(agents).toHaveLength(1);
175
+ expect(agents[0].tools).toHaveLength(1);
176
+ expect(agents[0].tools?.[0]).toBe("command_execute");
177
+ });
178
+ it("should ignore non-JSON files in directory", ()=>{
179
+ const agentDir = join(TEST_CONFIG_DIR, "agents", "valid-agent");
180
+ mkdirSync(agentDir, {
181
+ recursive: true
182
+ });
183
+ const validAgent = {
184
+ name: "valid-agent",
185
+ description: "Valid",
186
+ systemPrompt: "Valid"
187
+ };
188
+ writeFileSync(join(agentDir, "agent.json"), JSON.stringify(validAgent));
189
+ writeFileSync(join(agentDir, "readme.md"), "# README");
190
+ writeFileSync(join(agentDir, "notes.txt"), "Some notes");
191
+ const loader = new AgentLoader(TEST_CONFIG_DIR);
192
+ const agents = loader.loadAllAgentConfigs();
193
+ expect(agents).toHaveLength(1);
194
+ expect(agents[0].name).toBe("valid-agent");
195
+ });
196
+ });
197
+ describe("loadAgent", ()=>{
198
+ it("should hydrate subagent tools for runtime use", async ()=>{
199
+ const agentDir = join(TEST_CONFIG_DIR, "agents", "parent-agent");
200
+ mkdirSync(agentDir, {
201
+ recursive: true
202
+ });
203
+ const config = {
204
+ name: "parent-agent",
205
+ description: "Parent agent",
206
+ systemPrompt: "You are the parent",
207
+ subAgents: [
208
+ {
209
+ name: "researcher",
210
+ description: "Research subagent",
211
+ systemPrompt: "You research things",
212
+ tools: [
213
+ "think"
214
+ ]
215
+ }
216
+ ]
217
+ };
218
+ writeFileSync(join(agentDir, "agent.json"), JSON.stringify(config));
219
+ const loader = new AgentLoader(TEST_CONFIG_DIR);
220
+ const agent = await loader.loadAgent("parent-agent");
221
+ expect(agent).toBeDefined();
222
+ expect(agent?.subagents).toBeDefined();
223
+ expect(agent?.subagents?.length).toBe(1);
224
+ const sub = agent?.subagents?.[0];
225
+ expect(Array.isArray(sub.tools)).toBe(true);
226
+ expect(sub.tools?.[0]).toHaveProperty("name", "think");
227
+ });
228
+ });
229
+ });