@wingman-ai/gateway 0.5.3 → 0.6.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 (327) hide show
  1. package/dist/agent/backend/filtered-backend.cjs +130 -0
  2. package/dist/agent/backend/filtered-backend.d.ts +10 -0
  3. package/dist/agent/backend/filtered-backend.js +87 -0
  4. package/dist/agent/config/agentConfig.cjs +4 -0
  5. package/dist/agent/config/agentConfig.d.ts +12 -0
  6. package/dist/agent/config/agentConfig.js +4 -0
  7. package/dist/agent/config/toolRegistry.cjs +75 -1
  8. package/dist/agent/config/toolRegistry.d.ts +3 -0
  9. package/dist/agent/config/toolRegistry.js +75 -1
  10. package/dist/agent/middleware/additional-messages.cjs +4 -1
  11. package/dist/agent/middleware/additional-messages.js +4 -1
  12. package/dist/agent/middleware/large-tool-results.cjs +207 -0
  13. package/dist/agent/middleware/large-tool-results.d.ts +16 -0
  14. package/dist/agent/middleware/large-tool-results.js +173 -0
  15. package/dist/agent/tools/browser_control.cjs +9 -1231
  16. package/dist/agent/tools/browser_control.d.ts +126 -234
  17. package/dist/agent/tools/browser_control.js +7 -1226
  18. package/dist/agent/tools/browser_runtime.cjs +1358 -0
  19. package/dist/agent/tools/browser_runtime.d.ts +617 -0
  20. package/dist/agent/tools/browser_runtime.js +1288 -0
  21. package/dist/agent/tools/browser_session.cjs +189 -0
  22. package/dist/agent/tools/browser_session.d.ts +686 -0
  23. package/dist/agent/tools/browser_session.js +146 -0
  24. package/dist/agent/tools/browser_session_manager.cjs +213 -0
  25. package/dist/agent/tools/browser_session_manager.d.ts +70 -0
  26. package/dist/agent/tools/browser_session_manager.js +176 -0
  27. package/dist/cli/commands/init.cjs +80 -98
  28. package/dist/cli/commands/init.js +80 -98
  29. package/dist/cli/config/loader.cjs +0 -5
  30. package/dist/cli/config/loader.js +0 -5
  31. package/dist/cli/config/schema.cjs +3 -7
  32. package/dist/cli/config/schema.d.ts +6 -6
  33. package/dist/cli/config/schema.js +3 -7
  34. package/dist/cli/core/agentInvoker.cjs +88 -22
  35. package/dist/cli/core/agentInvoker.d.ts +10 -3
  36. package/dist/cli/core/agentInvoker.js +88 -25
  37. package/dist/cli/core/outputManager.cjs +7 -2
  38. package/dist/cli/core/outputManager.d.ts +2 -2
  39. package/dist/cli/core/outputManager.js +7 -2
  40. package/dist/cli/core/sessionManager.cjs +208 -41
  41. package/dist/cli/core/sessionManager.d.ts +20 -0
  42. package/dist/cli/core/sessionManager.js +208 -41
  43. package/dist/cli/index.cjs +16 -1
  44. package/dist/cli/index.js +16 -1
  45. package/dist/cli/services/updateCheck.cjs +212 -0
  46. package/dist/cli/services/updateCheck.d.ts +26 -0
  47. package/dist/cli/services/updateCheck.js +166 -0
  48. package/dist/cli/types.d.ts +2 -1
  49. package/dist/gateway/server.cjs +7 -0
  50. package/dist/gateway/server.js +7 -0
  51. package/dist/webui/assets/index-D3x3G75t.css +11 -0
  52. package/dist/webui/assets/index-UpMmcU1f.js +215 -0
  53. package/dist/webui/index.html +2 -2
  54. package/package.json +12 -12
  55. package/templates/agents/README.md +3 -1
  56. package/templates/agents/coding/agent.md +6 -13
  57. package/templates/agents/coding-v2/agent.md +6 -1
  58. package/templates/agents/game-dev/agent.md +9 -2
  59. package/templates/agents/game-dev/game-designer.md +4 -0
  60. package/templates/agents/game-dev/scene-engineer.md +4 -0
  61. package/templates/agents/main/agent.md +7 -2
  62. package/templates/agents/researcher/agent.md +14 -3
  63. package/templates/agents/stock-trader/agent.md +4 -0
  64. package/dist/agent/tests/agentConfig.test.cjs +0 -224
  65. package/dist/agent/tests/agentConfig.test.d.ts +0 -1
  66. package/dist/agent/tests/agentConfig.test.js +0 -218
  67. package/dist/agent/tests/agentLoader.test.cjs +0 -335
  68. package/dist/agent/tests/agentLoader.test.d.ts +0 -1
  69. package/dist/agent/tests/agentLoader.test.js +0 -329
  70. package/dist/agent/tests/backgroundTerminal.test.cjs +0 -70
  71. package/dist/agent/tests/backgroundTerminal.test.d.ts +0 -1
  72. package/dist/agent/tests/backgroundTerminal.test.js +0 -64
  73. package/dist/agent/tests/browserControlHelpers.test.cjs +0 -35
  74. package/dist/agent/tests/browserControlHelpers.test.d.ts +0 -1
  75. package/dist/agent/tests/browserControlHelpers.test.js +0 -29
  76. package/dist/agent/tests/browserControlTool.test.cjs +0 -2117
  77. package/dist/agent/tests/browserControlTool.test.d.ts +0 -1
  78. package/dist/agent/tests/browserControlTool.test.js +0 -2111
  79. package/dist/agent/tests/commandExecuteTool.test.cjs +0 -29
  80. package/dist/agent/tests/commandExecuteTool.test.d.ts +0 -1
  81. package/dist/agent/tests/commandExecuteTool.test.js +0 -23
  82. package/dist/agent/tests/internet_search.test.cjs +0 -107
  83. package/dist/agent/tests/internet_search.test.d.ts +0 -1
  84. package/dist/agent/tests/internet_search.test.js +0 -101
  85. package/dist/agent/tests/mcpClientManager.test.cjs +0 -290
  86. package/dist/agent/tests/mcpClientManager.test.d.ts +0 -1
  87. package/dist/agent/tests/mcpClientManager.test.js +0 -284
  88. package/dist/agent/tests/mcpResourceTools.test.cjs +0 -101
  89. package/dist/agent/tests/mcpResourceTools.test.d.ts +0 -1
  90. package/dist/agent/tests/mcpResourceTools.test.js +0 -95
  91. package/dist/agent/tests/modelFactory.test.cjs +0 -190
  92. package/dist/agent/tests/modelFactory.test.d.ts +0 -1
  93. package/dist/agent/tests/modelFactory.test.js +0 -184
  94. package/dist/agent/tests/terminalSessionManager.test.cjs +0 -121
  95. package/dist/agent/tests/terminalSessionManager.test.d.ts +0 -1
  96. package/dist/agent/tests/terminalSessionManager.test.js +0 -115
  97. package/dist/agent/tests/test-agent-loader.cjs +0 -33
  98. package/dist/agent/tests/test-agent-loader.d.ts +0 -1
  99. package/dist/agent/tests/test-agent-loader.js +0 -27
  100. package/dist/agent/tests/test-subagent-loading.cjs +0 -99
  101. package/dist/agent/tests/test-subagent-loading.d.ts +0 -1
  102. package/dist/agent/tests/test-subagent-loading.js +0 -93
  103. package/dist/agent/tests/toolRegistry.test.cjs +0 -147
  104. package/dist/agent/tests/toolRegistry.test.d.ts +0 -1
  105. package/dist/agent/tests/toolRegistry.test.js +0 -141
  106. package/dist/agent/tests/uiRegistryTools.test.cjs +0 -114
  107. package/dist/agent/tests/uiRegistryTools.test.d.ts +0 -1
  108. package/dist/agent/tests/uiRegistryTools.test.js +0 -105
  109. package/dist/agent/tests/xaiImageModel.test.cjs +0 -194
  110. package/dist/agent/tests/xaiImageModel.test.d.ts +0 -1
  111. package/dist/agent/tests/xaiImageModel.test.js +0 -188
  112. package/dist/tests/additionalMessageMiddleware.test.cjs +0 -216
  113. package/dist/tests/additionalMessageMiddleware.test.d.ts +0 -1
  114. package/dist/tests/additionalMessageMiddleware.test.js +0 -188
  115. package/dist/tests/agent-config-voice.test.cjs +0 -25
  116. package/dist/tests/agent-config-voice.test.d.ts +0 -1
  117. package/dist/tests/agent-config-voice.test.js +0 -19
  118. package/dist/tests/agentInvokerAttachments.test.cjs +0 -190
  119. package/dist/tests/agentInvokerAttachments.test.d.ts +0 -1
  120. package/dist/tests/agentInvokerAttachments.test.js +0 -184
  121. package/dist/tests/agentInvokerSummarization.test.cjs +0 -613
  122. package/dist/tests/agentInvokerSummarization.test.d.ts +0 -1
  123. package/dist/tests/agentInvokerSummarization.test.js +0 -607
  124. package/dist/tests/agentInvokerTokenUsage.test.cjs +0 -124
  125. package/dist/tests/agentInvokerTokenUsage.test.d.ts +0 -1
  126. package/dist/tests/agentInvokerTokenUsage.test.js +0 -118
  127. package/dist/tests/agentInvokerWorkdir.test.cjs +0 -150
  128. package/dist/tests/agentInvokerWorkdir.test.d.ts +0 -1
  129. package/dist/tests/agentInvokerWorkdir.test.js +0 -122
  130. package/dist/tests/agents-api.test.cjs +0 -324
  131. package/dist/tests/agents-api.test.d.ts +0 -1
  132. package/dist/tests/agents-api.test.js +0 -318
  133. package/dist/tests/attachments-utils.test.cjs +0 -46
  134. package/dist/tests/attachments-utils.test.d.ts +0 -1
  135. package/dist/tests/attachments-utils.test.js +0 -40
  136. package/dist/tests/browser-command.test.cjs +0 -264
  137. package/dist/tests/browser-command.test.d.ts +0 -1
  138. package/dist/tests/browser-command.test.js +0 -258
  139. package/dist/tests/browser-relay-server.test.cjs +0 -20
  140. package/dist/tests/browser-relay-server.test.d.ts +0 -1
  141. package/dist/tests/browser-relay-server.test.js +0 -14
  142. package/dist/tests/bunSqliteAdapter.test.cjs +0 -265
  143. package/dist/tests/bunSqliteAdapter.test.d.ts +0 -1
  144. package/dist/tests/bunSqliteAdapter.test.js +0 -259
  145. package/dist/tests/candleRange.test.cjs +0 -48
  146. package/dist/tests/candleRange.test.d.ts +0 -1
  147. package/dist/tests/candleRange.test.js +0 -42
  148. package/dist/tests/cli-config-loader.test.cjs +0 -532
  149. package/dist/tests/cli-config-loader.test.d.ts +0 -1
  150. package/dist/tests/cli-config-loader.test.js +0 -526
  151. package/dist/tests/cli-config-warnings.test.cjs +0 -94
  152. package/dist/tests/cli-config-warnings.test.d.ts +0 -1
  153. package/dist/tests/cli-config-warnings.test.js +0 -88
  154. package/dist/tests/cli-init.test.cjs +0 -225
  155. package/dist/tests/cli-init.test.d.ts +0 -1
  156. package/dist/tests/cli-init.test.js +0 -219
  157. package/dist/tests/cli-workspace-root.test.cjs +0 -114
  158. package/dist/tests/cli-workspace-root.test.d.ts +0 -1
  159. package/dist/tests/cli-workspace-root.test.js +0 -108
  160. package/dist/tests/codex-credentials-precedence.test.cjs +0 -94
  161. package/dist/tests/codex-credentials-precedence.test.d.ts +0 -1
  162. package/dist/tests/codex-credentials-precedence.test.js +0 -88
  163. package/dist/tests/codex-provider.test.cjs +0 -383
  164. package/dist/tests/codex-provider.test.d.ts +0 -1
  165. package/dist/tests/codex-provider.test.js +0 -377
  166. package/dist/tests/config-json-schema.test.cjs +0 -37
  167. package/dist/tests/config-json-schema.test.d.ts +0 -1
  168. package/dist/tests/config-json-schema.test.js +0 -31
  169. package/dist/tests/discord-adapter.test.cjs +0 -89
  170. package/dist/tests/discord-adapter.test.d.ts +0 -1
  171. package/dist/tests/discord-adapter.test.js +0 -83
  172. package/dist/tests/falRuntime.test.cjs +0 -78
  173. package/dist/tests/falRuntime.test.d.ts +0 -1
  174. package/dist/tests/falRuntime.test.js +0 -72
  175. package/dist/tests/falSummary.test.cjs +0 -51
  176. package/dist/tests/falSummary.test.d.ts +0 -1
  177. package/dist/tests/falSummary.test.js +0 -45
  178. package/dist/tests/fs-api.test.cjs +0 -138
  179. package/dist/tests/fs-api.test.d.ts +0 -1
  180. package/dist/tests/fs-api.test.js +0 -132
  181. package/dist/tests/gateway-command-workspace.test.cjs +0 -150
  182. package/dist/tests/gateway-command-workspace.test.d.ts +0 -1
  183. package/dist/tests/gateway-command-workspace.test.js +0 -144
  184. package/dist/tests/gateway-http-security.test.cjs +0 -318
  185. package/dist/tests/gateway-http-security.test.d.ts +0 -1
  186. package/dist/tests/gateway-http-security.test.js +0 -312
  187. package/dist/tests/gateway-node-mode.test.cjs +0 -174
  188. package/dist/tests/gateway-node-mode.test.d.ts +0 -1
  189. package/dist/tests/gateway-node-mode.test.js +0 -168
  190. package/dist/tests/gateway-origin-policy.test.cjs +0 -82
  191. package/dist/tests/gateway-origin-policy.test.d.ts +0 -1
  192. package/dist/tests/gateway-origin-policy.test.js +0 -76
  193. package/dist/tests/gateway-request-execution-overrides.test.cjs +0 -42
  194. package/dist/tests/gateway-request-execution-overrides.test.d.ts +0 -1
  195. package/dist/tests/gateway-request-execution-overrides.test.js +0 -36
  196. package/dist/tests/gateway.test.cjs +0 -700
  197. package/dist/tests/gateway.test.d.ts +0 -1
  198. package/dist/tests/gateway.test.js +0 -694
  199. package/dist/tests/hooks-matcher.test.cjs +0 -309
  200. package/dist/tests/hooks-matcher.test.d.ts +0 -1
  201. package/dist/tests/hooks-matcher.test.js +0 -303
  202. package/dist/tests/hooks-merger.test.cjs +0 -528
  203. package/dist/tests/hooks-merger.test.d.ts +0 -1
  204. package/dist/tests/hooks-merger.test.js +0 -522
  205. package/dist/tests/imagePersistence.test.cjs +0 -169
  206. package/dist/tests/imagePersistence.test.d.ts +0 -1
  207. package/dist/tests/imagePersistence.test.js +0 -163
  208. package/dist/tests/integration/agent-invocation.integration.test.cjs +0 -264
  209. package/dist/tests/integration/agent-invocation.integration.test.d.ts +0 -1
  210. package/dist/tests/integration/agent-invocation.integration.test.js +0 -258
  211. package/dist/tests/integration/finnhub-candles.integration.test.cjs +0 -98
  212. package/dist/tests/integration/finnhub-candles.integration.test.d.ts +0 -1
  213. package/dist/tests/integration/finnhub-candles.integration.test.js +0 -92
  214. package/dist/tests/integration/summarization-e2e.integration.test.cjs +0 -127
  215. package/dist/tests/integration/summarization-e2e.integration.test.d.ts +0 -1
  216. package/dist/tests/integration/summarization-e2e.integration.test.js +0 -121
  217. package/dist/tests/logger.test.cjs +0 -353
  218. package/dist/tests/logger.test.d.ts +0 -1
  219. package/dist/tests/logger.test.js +0 -347
  220. package/dist/tests/mediaCompatibilityMiddleware.test.cjs +0 -106
  221. package/dist/tests/mediaCompatibilityMiddleware.test.d.ts +0 -1
  222. package/dist/tests/mediaCompatibilityMiddleware.test.js +0 -100
  223. package/dist/tests/node-tools.test.cjs +0 -77
  224. package/dist/tests/node-tools.test.d.ts +0 -1
  225. package/dist/tests/node-tools.test.js +0 -71
  226. package/dist/tests/nodes-api.test.cjs +0 -86
  227. package/dist/tests/nodes-api.test.d.ts +0 -1
  228. package/dist/tests/nodes-api.test.js +0 -80
  229. package/dist/tests/outputManagerContextSummarized.test.cjs +0 -43
  230. package/dist/tests/outputManagerContextSummarized.test.d.ts +0 -1
  231. package/dist/tests/outputManagerContextSummarized.test.js +0 -37
  232. package/dist/tests/provider-command-codex.test.cjs +0 -57
  233. package/dist/tests/provider-command-codex.test.d.ts +0 -1
  234. package/dist/tests/provider-command-codex.test.js +0 -51
  235. package/dist/tests/routines-api.test.cjs +0 -107
  236. package/dist/tests/routines-api.test.d.ts +0 -1
  237. package/dist/tests/routines-api.test.js +0 -101
  238. package/dist/tests/run-terminal-bench-official-script.test.cjs +0 -61
  239. package/dist/tests/run-terminal-bench-official-script.test.d.ts +0 -1
  240. package/dist/tests/run-terminal-bench-official-script.test.js +0 -55
  241. package/dist/tests/sessionManager-uionly.test.cjs +0 -50
  242. package/dist/tests/sessionManager-uionly.test.d.ts +0 -1
  243. package/dist/tests/sessionManager-uionly.test.js +0 -44
  244. package/dist/tests/sessionMessageAttachments.test.cjs +0 -197
  245. package/dist/tests/sessionMessageAttachments.test.d.ts +0 -1
  246. package/dist/tests/sessionMessageAttachments.test.js +0 -191
  247. package/dist/tests/sessionMessageRole.test.cjs +0 -44
  248. package/dist/tests/sessionMessageRole.test.d.ts +0 -1
  249. package/dist/tests/sessionMessageRole.test.js +0 -38
  250. package/dist/tests/sessionStateMessages.test.cjs +0 -236
  251. package/dist/tests/sessionStateMessages.test.d.ts +0 -1
  252. package/dist/tests/sessionStateMessages.test.js +0 -230
  253. package/dist/tests/sessions-api.test.cjs +0 -250
  254. package/dist/tests/sessions-api.test.d.ts +0 -1
  255. package/dist/tests/sessions-api.test.js +0 -244
  256. package/dist/tests/skill-activation.test.cjs +0 -86
  257. package/dist/tests/skill-activation.test.d.ts +0 -1
  258. package/dist/tests/skill-activation.test.js +0 -80
  259. package/dist/tests/skill-metadata.test.cjs +0 -119
  260. package/dist/tests/skill-metadata.test.d.ts +0 -1
  261. package/dist/tests/skill-metadata.test.js +0 -113
  262. package/dist/tests/skill-repository.test.cjs +0 -469
  263. package/dist/tests/skill-repository.test.d.ts +0 -1
  264. package/dist/tests/skill-repository.test.js +0 -463
  265. package/dist/tests/skill-security-scanner.test.cjs +0 -126
  266. package/dist/tests/skill-security-scanner.test.d.ts +0 -1
  267. package/dist/tests/skill-security-scanner.test.js +0 -120
  268. package/dist/tests/sms-api.test.cjs +0 -183
  269. package/dist/tests/sms-api.test.d.ts +0 -1
  270. package/dist/tests/sms-api.test.js +0 -177
  271. package/dist/tests/sms-commands.test.cjs +0 -90
  272. package/dist/tests/sms-commands.test.d.ts +0 -1
  273. package/dist/tests/sms-commands.test.js +0 -84
  274. package/dist/tests/sms-policy-store.test.cjs +0 -69
  275. package/dist/tests/sms-policy-store.test.d.ts +0 -1
  276. package/dist/tests/sms-policy-store.test.js +0 -63
  277. package/dist/tests/teams-adapter.test.cjs +0 -58
  278. package/dist/tests/teams-adapter.test.d.ts +0 -1
  279. package/dist/tests/teams-adapter.test.js +0 -52
  280. package/dist/tests/technicalIndicators.test.cjs +0 -82
  281. package/dist/tests/technicalIndicators.test.d.ts +0 -1
  282. package/dist/tests/technicalIndicators.test.js +0 -76
  283. package/dist/tests/terminal-bench-adapters-helpers.test.cjs +0 -64
  284. package/dist/tests/terminal-bench-adapters-helpers.test.d.ts +0 -1
  285. package/dist/tests/terminal-bench-adapters-helpers.test.js +0 -58
  286. package/dist/tests/terminal-bench-cleanup.test.cjs +0 -93
  287. package/dist/tests/terminal-bench-cleanup.test.d.ts +0 -1
  288. package/dist/tests/terminal-bench-cleanup.test.js +0 -87
  289. package/dist/tests/terminal-bench-config.test.cjs +0 -62
  290. package/dist/tests/terminal-bench-config.test.d.ts +0 -1
  291. package/dist/tests/terminal-bench-config.test.js +0 -56
  292. package/dist/tests/terminal-bench-official.test.cjs +0 -194
  293. package/dist/tests/terminal-bench-official.test.d.ts +0 -1
  294. package/dist/tests/terminal-bench-official.test.js +0 -188
  295. package/dist/tests/terminal-bench-runner.test.cjs +0 -82
  296. package/dist/tests/terminal-bench-runner.test.d.ts +0 -1
  297. package/dist/tests/terminal-bench-runner.test.js +0 -76
  298. package/dist/tests/terminal-bench-scoring.test.cjs +0 -128
  299. package/dist/tests/terminal-bench-scoring.test.d.ts +0 -1
  300. package/dist/tests/terminal-bench-scoring.test.js +0 -122
  301. package/dist/tests/terminalProbe.test.cjs +0 -45
  302. package/dist/tests/terminalProbe.test.d.ts +0 -1
  303. package/dist/tests/terminalProbe.test.js +0 -39
  304. package/dist/tests/terminalProbeAuth.test.cjs +0 -85
  305. package/dist/tests/terminalProbeAuth.test.d.ts +0 -1
  306. package/dist/tests/terminalProbeAuth.test.js +0 -79
  307. package/dist/tests/toolDisplayHelpers.test.cjs +0 -46
  308. package/dist/tests/toolDisplayHelpers.test.d.ts +0 -1
  309. package/dist/tests/toolDisplayHelpers.test.js +0 -40
  310. package/dist/tests/uv.test.cjs +0 -47
  311. package/dist/tests/uv.test.d.ts +0 -1
  312. package/dist/tests/uv.test.js +0 -41
  313. package/dist/tests/voice-config.test.cjs +0 -35
  314. package/dist/tests/voice-config.test.d.ts +0 -1
  315. package/dist/tests/voice-config.test.js +0 -29
  316. package/dist/tests/websocket-transport.test.cjs +0 -31
  317. package/dist/tests/websocket-transport.test.d.ts +0 -1
  318. package/dist/tests/websocket-transport.test.js +0 -25
  319. package/dist/tests/yahooCandles.test.cjs +0 -111
  320. package/dist/tests/yahooCandles.test.d.ts +0 -1
  321. package/dist/tests/yahooCandles.test.js +0 -105
  322. package/dist/tools/finance/optionsAnalytics.test.cjs +0 -128
  323. package/dist/tools/finance/optionsAnalytics.test.d.ts +0 -1
  324. package/dist/tools/finance/optionsAnalytics.test.js +0 -122
  325. package/dist/webui/assets/index-BMf95nv5.js +0 -215
  326. package/dist/webui/assets/index-DhJQ8Mbn.css +0 -11
  327. package/dist/webui/assets/wingman_logo-Cogyt3qm.webp +0 -0
@@ -44,37 +44,19 @@ const external_node_url_namespaceObject = require("node:url");
44
44
  const prompts_namespaceObject = require("@clack/prompts");
45
45
  const external_chalk_namespaceObject = require("chalk");
46
46
  var external_chalk_default = /*#__PURE__*/ __webpack_require__.n(external_chalk_namespaceObject);
47
+ const external_js_yaml_namespaceObject = require("js-yaml");
47
48
  const modelFactory_cjs_namespaceObject = require("../../agent/config/modelFactory.cjs");
48
49
  const external_logger_cjs_namespaceObject = require("../../logger.cjs");
49
50
  const credentials_cjs_namespaceObject = require("../../providers/credentials.cjs");
50
51
  const registry_cjs_namespaceObject = require("../../providers/registry.cjs");
51
52
  const schema_cjs_namespaceObject = require("../config/schema.cjs");
52
53
  const outputManager_cjs_namespaceObject = require("../core/outputManager.cjs");
53
- const DEFAULT_AGENT_ID = "wingman";
54
- const DEFAULT_AGENT_DESCRIPTION = "General-purpose coding assistant for this workspace.";
55
- const DEFAULT_AGENT_PROMPT = "You are Wingman, a coding assistant for this repository.\nBe direct and concise. Ask clarifying questions when requirements are unclear.\nPrefer minimal diffs and safe changes. Avoid destructive actions unless asked.\nUse tools to inspect the codebase before editing.";
56
- const DEFAULT_TOOLS = [
57
- "code_search",
58
- "git_status",
59
- "command_execute",
60
- "browser_control",
61
- "internet_search",
62
- "think"
63
- ];
64
54
  const DEFAULT_FS_ROOT = ".";
65
55
  const DEFAULT_BROWSER_PROFILE_ID = "default";
66
56
  const DEFAULT_BROWSER_PROFILES_DIR = ".wingman/browser-profiles";
67
57
  const DEFAULT_BROWSER_EXTENSIONS_DIR = ".wingman/browser-extensions";
68
58
  const DEFAULT_BUNDLED_EXTENSION_ID = "wingman";
69
59
  const DEFAULT_BROWSER_TRANSPORT = "auto";
70
- const DEFAULT_MODELS = {
71
- anthropic: "anthropic:claude-sonnet-4-5",
72
- openai: "openai:gpt-4o",
73
- codex: "codex:codex-mini-latest",
74
- openrouter: "openrouter:openai/gpt-4o",
75
- copilot: "copilot:gpt-4o",
76
- xai: "xai:grok-beta"
77
- };
78
60
  const DEFAULT_INIT_MODE = "onboard";
79
61
  const DEFAULT_ONBOARD_COMPONENTS = [
80
62
  "config",
@@ -133,8 +115,20 @@ async function executeInitCommand(args, options = {}) {
133
115
  renderInitBanner(outputManager, nonInteractive, mode, components);
134
116
  const bundledAgentsPath = resolveBundledAgentsPath();
135
117
  const bundledAgents = bundledAgentsPath ? listBundledAgents(bundledAgentsPath) : [];
136
- const explicitAgent = Boolean(args.agent?.trim()) || Boolean(args.subcommand) && !isHelpCommand(args.subcommand) && !args.subcommand.startsWith("-");
137
- const defaultAgentId = resolveAgentId(args);
118
+ const requestedAgentId = resolveRequestedAgentId(args);
119
+ const explicitAgent = Boolean(requestedAgentId);
120
+ const resolvedAgentId = resolveDefaultAgentId({
121
+ requestedAgentId,
122
+ bundledAgents,
123
+ configPath
124
+ });
125
+ if (!resolvedAgentId && (runConfig || runAgents)) throw new Error("No explicit agents are available. Add an agent under .wingman/agents or pass --agent with an existing bundled agent.");
126
+ const defaultAgentId = resolvedAgentId || "main";
127
+ if (runConfig || runAgents) assertAgentIsExplicit({
128
+ agentId: defaultAgentId,
129
+ bundledAgents,
130
+ configRoot
131
+ });
138
132
  const agentPlan = runConfig || runAgents ? syncAgentsOnly ? resolveAgentSyncPlan({
139
133
  defaultAgentId,
140
134
  bundledAgents,
@@ -159,7 +153,6 @@ async function executeInitCommand(args, options = {}) {
159
153
  const model = shouldResolveModel ? await resolveModelSelection({
160
154
  nonInteractive,
161
155
  optionMap,
162
- providerName,
163
156
  outputManager
164
157
  }) : void 0;
165
158
  if (runConfig) await runStep(useClack, "Writing workspace config", async ()=>handleConfigSetup({
@@ -178,7 +171,6 @@ async function executeInitCommand(args, options = {}) {
178
171
  agentId: agentPlan.defaultAgentId,
179
172
  model,
180
173
  force,
181
- nonInteractive,
182
174
  outputManager,
183
175
  bundledAgentsPath,
184
176
  copyAgents: agentPlan.copyAgents,
@@ -245,10 +237,35 @@ function isHelpCommand(subcommand) {
245
237
  "-h"
246
238
  ].includes(subcommand);
247
239
  }
248
- function resolveAgentId(args) {
249
- if (args.agent?.trim()) return args.agent.trim();
250
- if (args.subcommand && !isHelpCommand(args.subcommand) && !args.subcommand.startsWith("-")) return args.subcommand.trim();
251
- return DEFAULT_AGENT_ID;
240
+ function resolveRequestedAgentId(args) {
241
+ if (args.agent?.trim()) return sanitizeAgentId(args.agent.trim());
242
+ if (args.subcommand && !isHelpCommand(args.subcommand) && !args.subcommand.startsWith("-")) return sanitizeAgentId(args.subcommand.trim());
243
+ }
244
+ function resolveDefaultAgentId(input) {
245
+ const { requestedAgentId, bundledAgents, configPath } = input;
246
+ if (requestedAgentId) return requestedAgentId;
247
+ const existingDefaultAgent = readConfiguredDefaultAgent(configPath);
248
+ if (existingDefaultAgent) return existingDefaultAgent;
249
+ const preferredBundledAgent = resolvePreferredBundledAgentId(bundledAgents);
250
+ if (preferredBundledAgent) return preferredBundledAgent;
251
+ }
252
+ function readConfiguredDefaultAgent(configPath) {
253
+ if (!(0, external_node_fs_namespaceObject.existsSync)(configPath)) return;
254
+ try {
255
+ const raw = (0, external_node_fs_namespaceObject.readFileSync)(configPath, "utf-8");
256
+ const parsed = JSON.parse(raw);
257
+ if ("string" == typeof parsed.defaultAgent && parsed.defaultAgent.trim()) return sanitizeAgentId(parsed.defaultAgent.trim());
258
+ } catch {}
259
+ }
260
+ function resolvePreferredBundledAgentId(bundledAgents) {
261
+ if (bundledAgents.includes("main")) return "main";
262
+ return bundledAgents[0];
263
+ }
264
+ function assertAgentIsExplicit(input) {
265
+ const { agentId, bundledAgents, configRoot } = input;
266
+ if (bundledAgents.includes(agentId)) return;
267
+ if (findAgentConfigPath(configRoot, agentId)) return;
268
+ throw new Error(`Agent "${agentId}" is not defined. Choose one of the bundled agents (${bundledAgents.join(", ")}) or create .wingman/agents/${agentId}/agent.md explicitly.`);
252
269
  }
253
270
  async function resolveAgentPlan(input) {
254
271
  const { explicitAgent, defaultAgentId, bundledAgents, nonInteractive, optionMap, outputManager, ensureDefaultAgentInSelection } = input;
@@ -508,7 +525,7 @@ function bootstrapBrowserDefaults(configRoot, config) {
508
525
  };
509
526
  }
510
527
  async function handleAgentSetup(input) {
511
- const { configRoot, agentId, model, force, nonInteractive, outputManager, bundledAgentsPath, copyAgents, ensureDefaultAgent = true } = input;
528
+ const { configRoot, agentId, model, force, outputManager, bundledAgentsPath, copyAgents, ensureDefaultAgent = true } = input;
512
529
  const copiedAgents = bundledAgentsPath ? copyBundledAgents({
513
530
  bundledAgentsPath,
514
531
  configRoot,
@@ -518,17 +535,8 @@ async function handleAgentSetup(input) {
518
535
  }) : new Set();
519
536
  if (copiedAgents.size > 0) writeLine(outputManager, `Copied ${copiedAgents.size} bundled agent(s) to ${(0, external_node_path_namespaceObject.join)(configRoot, "agents")}`);
520
537
  if (!ensureDefaultAgent) return;
521
- const expectedAgentDir = (0, external_node_path_namespaceObject.join)(configRoot, "agents", agentId);
522
- const expectedAgentPath = (0, external_node_path_namespaceObject.join)(expectedAgentDir, "agent.json");
523
- const expectedAgentExists = (0, external_node_fs_namespaceObject.existsSync)(expectedAgentPath);
524
- if (!expectedAgentExists) return void await createFallbackAgent({
525
- configRoot,
526
- agentId,
527
- model,
528
- force,
529
- nonInteractive,
530
- outputManager
531
- });
538
+ const expectedAgentPath = findAgentConfigPath(configRoot, agentId);
539
+ if (!expectedAgentPath) throw new Error(`Agent "${agentId}" was not found after init. Create .wingman/agents/${agentId}/agent.md explicitly or choose a bundled agent.`);
532
540
  if (model) applyModelToAgent(expectedAgentPath, model, outputManager);
533
541
  }
534
542
  function resolveBundledAgentsPath() {
@@ -585,35 +593,34 @@ function copyDirectory(source, target) {
585
593
  else (0, external_node_fs_namespaceObject.copyFileSync)(sourcePath, targetPath);
586
594
  }
587
595
  }
588
- async function createFallbackAgent(input) {
589
- const { configRoot, agentId, model, force, nonInteractive, outputManager } = input;
596
+ function findAgentConfigPath(configRoot, agentId) {
590
597
  const agentDir = (0, external_node_path_namespaceObject.join)(configRoot, "agents", agentId);
591
- const agentPath = (0, external_node_path_namespaceObject.join)(agentDir, "agent.json");
592
- const agentExists = (0, external_node_fs_namespaceObject.existsSync)(agentPath);
593
- if (agentExists && !force) {
594
- if (nonInteractive) return void writeLine(outputManager, `Agent "${agentId}" already exists. Use --force to overwrite.`);
595
- const shouldOverwrite = await promptConfirm(`Agent "${agentId}" exists. Overwrite? (y/N): `, false);
596
- if (!shouldOverwrite) return void writeLine(outputManager, `Keeping existing agent "${agentId}".`);
597
- }
598
- (0, external_node_fs_namespaceObject.mkdirSync)(agentDir, {
599
- recursive: true
600
- });
601
- const agentConfig = {
602
- name: agentId,
603
- description: DEFAULT_AGENT_DESCRIPTION,
604
- systemPrompt: DEFAULT_AGENT_PROMPT,
605
- tools: DEFAULT_TOOLS
606
- };
607
- if (model) agentConfig.model = model;
608
- (0, external_node_fs_namespaceObject.writeFileSync)(agentPath, JSON.stringify(agentConfig, null, 2));
609
- writeLine(outputManager, `Created starter agent at ${agentPath}`);
598
+ const jsonPath = (0, external_node_path_namespaceObject.join)(agentDir, "agent.json");
599
+ if ((0, external_node_fs_namespaceObject.existsSync)(jsonPath)) return jsonPath;
600
+ const markdownPath = (0, external_node_path_namespaceObject.join)(agentDir, "agent.md");
601
+ if ((0, external_node_fs_namespaceObject.existsSync)(markdownPath)) return markdownPath;
602
+ return null;
610
603
  }
611
604
  function applyModelToAgent(agentPath, model, outputManager) {
612
605
  try {
613
- const raw = (0, external_node_fs_namespaceObject.readFileSync)(agentPath, "utf-8");
614
- const parsed = JSON.parse(raw);
615
- parsed.model = model;
616
- (0, external_node_fs_namespaceObject.writeFileSync)(agentPath, JSON.stringify(parsed, null, 2));
606
+ if (agentPath.endsWith(".json")) {
607
+ const raw = (0, external_node_fs_namespaceObject.readFileSync)(agentPath, "utf-8");
608
+ const parsed = JSON.parse(raw);
609
+ parsed.model = model;
610
+ (0, external_node_fs_namespaceObject.writeFileSync)(agentPath, JSON.stringify(parsed, null, 2));
611
+ } else if (agentPath.endsWith(".md")) {
612
+ const raw = (0, external_node_fs_namespaceObject.readFileSync)(agentPath, "utf-8");
613
+ const frontmatterRegex = /^---\s*\n([\s\S]*?)\n---\s*\n?([\s\S]*)$/;
614
+ const match = raw.match(frontmatterRegex);
615
+ if (!match) throw new Error("Invalid agent.md format: missing frontmatter");
616
+ const [, rawFrontmatter, prompt] = match;
617
+ const metadata = external_js_yaml_namespaceObject.load(rawFrontmatter) || {};
618
+ metadata.model = model;
619
+ const serializedFrontmatter = external_js_yaml_namespaceObject.dump(metadata, {
620
+ lineWidth: 120
621
+ });
622
+ (0, external_node_fs_namespaceObject.writeFileSync)(agentPath, `---\n${serializedFrontmatter}---\n\n${prompt?.trim() || ""}\n`);
623
+ } else throw new Error("Unsupported agent config format");
617
624
  writeLine(outputManager, `Updated ${agentPath} with model ${model}`);
618
625
  } catch {
619
626
  writeLine(outputManager, `Unable to update model for ${agentPath}. Update manually.`);
@@ -653,7 +660,7 @@ async function resolveProviderSelection(input) {
653
660
  return normalized;
654
661
  }
655
662
  async function resolveModelSelection(input) {
656
- const { nonInteractive, optionMap, providerName, outputManager } = input;
663
+ const { nonInteractive, optionMap, outputManager } = input;
657
664
  const explicitModel = getStringOption(optionMap, [
658
665
  "model"
659
666
  ]);
@@ -661,22 +668,13 @@ async function resolveModelSelection(input) {
661
668
  validateModel(explicitModel);
662
669
  return explicitModel;
663
670
  }
664
- const providers = (0, registry_cjs_namespaceObject.listProviderSpecs)("model");
665
- const configuredProvider = providers.find((provider)=>"missing" !== (0, credentials_cjs_namespaceObject.resolveProviderToken)(provider.name).source);
666
- const suggestedProvider = providerName || configuredProvider?.name;
667
- const suggestedModel = suggestedProvider ? DEFAULT_MODELS[suggestedProvider] : void 0;
668
- if (nonInteractive) {
669
- if (suggestedModel) return suggestedModel;
670
- return;
671
- }
671
+ if (nonInteractive) return;
672
672
  const inputValue = await (0, prompts_namespaceObject.text)({
673
673
  message: "Model string (provider:model)",
674
- placeholder: suggestedModel ? void 0 : "anthropic:claude-sonnet-4-5",
675
- defaultValue: suggestedModel
674
+ placeholder: "anthropic:claude-sonnet-4-5"
676
675
  });
677
676
  if ((0, prompts_namespaceObject.isCancel)(inputValue)) abortSetup();
678
677
  const trimmed = String(inputValue ?? "").trim();
679
- if (!trimmed && suggestedModel) return suggestedModel;
680
678
  if (!trimmed) return void writeLine(outputManager, "Skipping model selection.");
681
679
  validateModel(trimmed);
682
680
  return trimmed;
@@ -779,29 +777,13 @@ async function promptForDefaultAgent(agents, currentDefault) {
779
777
  const defaultValue = choices.includes(currentDefault) ? currentDefault : choices[0];
780
778
  const selection = await (0, prompts_namespaceObject.select)({
781
779
  message: "Pick a default agent",
782
- options: [
783
- ...choices.map((agent)=>({
784
- value: agent,
785
- label: agent
786
- })),
787
- {
788
- value: "__custom__",
789
- label: "Custom agent name"
790
- }
791
- ],
780
+ options: choices.map((agent)=>({
781
+ value: agent,
782
+ label: agent
783
+ })),
792
784
  initialValue: defaultValue
793
785
  });
794
786
  if ((0, prompts_namespaceObject.isCancel)(selection)) abortSetup();
795
- if ("__custom__" === selection) {
796
- const input = await (0, prompts_namespaceObject.text)({
797
- message: "Default agent name",
798
- placeholder: defaultValue
799
- });
800
- if ((0, prompts_namespaceObject.isCancel)(input)) abortSetup();
801
- const trimmed = String(input ?? "").trim();
802
- if (!trimmed) return defaultValue;
803
- return sanitizeAgentId(trimmed);
804
- }
805
787
  return sanitizeAgentId(String(selection));
806
788
  }
807
789
  async function promptForAgentSelection(agents, defaultAgent) {
@@ -868,12 +850,12 @@ Usage:
868
850
  wingman init <agent-name>
869
851
 
870
852
  Options:
871
- --agent <name> Agent name (default: wingman)
853
+ --agent <name> Bundled or existing explicit agent name
872
854
  --mode <name> Init mode (onboard|sync). Default: onboard
873
855
  --only <targets> Run only selected setup targets (config,agents,provider)
874
856
  --agents <list> Copy only these bundled agents (comma-separated)
875
857
  --model <provider:model>
876
- Set model for the starter agent
858
+ Set model for the selected explicit agent
877
859
  --provider <name> Provider to configure (anthropic|openai|codex|openrouter|copilot|xai)
878
860
  --token <token> Save provider token (non-interactive)
879
861
  --api-key <key> Alias for --token
@@ -3,37 +3,19 @@ import { dirname, isAbsolute, join } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import { cancel, confirm as prompts_confirm, intro, isCancel, multiselect, note, outro, select as prompts_select, spinner, text as prompts_text } from "@clack/prompts";
5
5
  import chalk from "chalk";
6
+ import { dump, load } from "js-yaml";
6
7
  import { ModelFactory } from "../../agent/config/modelFactory.js";
7
8
  import { createLogger, getLogFilePath } from "../../logger.js";
8
9
  import { getCredentialsPath, resolveProviderToken, saveProviderToken } from "../../providers/credentials.js";
9
10
  import { listProviderSpecs, normalizeProviderName } from "../../providers/registry.js";
10
11
  import { WingmanConfigSchema } from "../config/schema.js";
11
12
  import { OutputManager } from "../core/outputManager.js";
12
- const DEFAULT_AGENT_ID = "wingman";
13
- const DEFAULT_AGENT_DESCRIPTION = "General-purpose coding assistant for this workspace.";
14
- const DEFAULT_AGENT_PROMPT = "You are Wingman, a coding assistant for this repository.\nBe direct and concise. Ask clarifying questions when requirements are unclear.\nPrefer minimal diffs and safe changes. Avoid destructive actions unless asked.\nUse tools to inspect the codebase before editing.";
15
- const DEFAULT_TOOLS = [
16
- "code_search",
17
- "git_status",
18
- "command_execute",
19
- "browser_control",
20
- "internet_search",
21
- "think"
22
- ];
23
13
  const DEFAULT_FS_ROOT = ".";
24
14
  const DEFAULT_BROWSER_PROFILE_ID = "default";
25
15
  const DEFAULT_BROWSER_PROFILES_DIR = ".wingman/browser-profiles";
26
16
  const DEFAULT_BROWSER_EXTENSIONS_DIR = ".wingman/browser-extensions";
27
17
  const DEFAULT_BUNDLED_EXTENSION_ID = "wingman";
28
18
  const DEFAULT_BROWSER_TRANSPORT = "auto";
29
- const DEFAULT_MODELS = {
30
- anthropic: "anthropic:claude-sonnet-4-5",
31
- openai: "openai:gpt-4o",
32
- codex: "codex:codex-mini-latest",
33
- openrouter: "openrouter:openai/gpt-4o",
34
- copilot: "copilot:gpt-4o",
35
- xai: "xai:grok-beta"
36
- };
37
19
  const DEFAULT_INIT_MODE = "onboard";
38
20
  const DEFAULT_ONBOARD_COMPONENTS = [
39
21
  "config",
@@ -92,8 +74,20 @@ async function executeInitCommand(args, options = {}) {
92
74
  renderInitBanner(outputManager, nonInteractive, mode, components);
93
75
  const bundledAgentsPath = resolveBundledAgentsPath();
94
76
  const bundledAgents = bundledAgentsPath ? listBundledAgents(bundledAgentsPath) : [];
95
- const explicitAgent = Boolean(args.agent?.trim()) || Boolean(args.subcommand) && !isHelpCommand(args.subcommand) && !args.subcommand.startsWith("-");
96
- const defaultAgentId = resolveAgentId(args);
77
+ const requestedAgentId = resolveRequestedAgentId(args);
78
+ const explicitAgent = Boolean(requestedAgentId);
79
+ const resolvedAgentId = resolveDefaultAgentId({
80
+ requestedAgentId,
81
+ bundledAgents,
82
+ configPath
83
+ });
84
+ if (!resolvedAgentId && (runConfig || runAgents)) throw new Error("No explicit agents are available. Add an agent under .wingman/agents or pass --agent with an existing bundled agent.");
85
+ const defaultAgentId = resolvedAgentId || "main";
86
+ if (runConfig || runAgents) assertAgentIsExplicit({
87
+ agentId: defaultAgentId,
88
+ bundledAgents,
89
+ configRoot
90
+ });
97
91
  const agentPlan = runConfig || runAgents ? syncAgentsOnly ? resolveAgentSyncPlan({
98
92
  defaultAgentId,
99
93
  bundledAgents,
@@ -118,7 +112,6 @@ async function executeInitCommand(args, options = {}) {
118
112
  const model = shouldResolveModel ? await resolveModelSelection({
119
113
  nonInteractive,
120
114
  optionMap,
121
- providerName,
122
115
  outputManager
123
116
  }) : void 0;
124
117
  if (runConfig) await runStep(useClack, "Writing workspace config", async ()=>handleConfigSetup({
@@ -137,7 +130,6 @@ async function executeInitCommand(args, options = {}) {
137
130
  agentId: agentPlan.defaultAgentId,
138
131
  model,
139
132
  force,
140
- nonInteractive,
141
133
  outputManager,
142
134
  bundledAgentsPath,
143
135
  copyAgents: agentPlan.copyAgents,
@@ -204,10 +196,35 @@ function isHelpCommand(subcommand) {
204
196
  "-h"
205
197
  ].includes(subcommand);
206
198
  }
207
- function resolveAgentId(args) {
208
- if (args.agent?.trim()) return args.agent.trim();
209
- if (args.subcommand && !isHelpCommand(args.subcommand) && !args.subcommand.startsWith("-")) return args.subcommand.trim();
210
- return DEFAULT_AGENT_ID;
199
+ function resolveRequestedAgentId(args) {
200
+ if (args.agent?.trim()) return sanitizeAgentId(args.agent.trim());
201
+ if (args.subcommand && !isHelpCommand(args.subcommand) && !args.subcommand.startsWith("-")) return sanitizeAgentId(args.subcommand.trim());
202
+ }
203
+ function resolveDefaultAgentId(input) {
204
+ const { requestedAgentId, bundledAgents, configPath } = input;
205
+ if (requestedAgentId) return requestedAgentId;
206
+ const existingDefaultAgent = readConfiguredDefaultAgent(configPath);
207
+ if (existingDefaultAgent) return existingDefaultAgent;
208
+ const preferredBundledAgent = resolvePreferredBundledAgentId(bundledAgents);
209
+ if (preferredBundledAgent) return preferredBundledAgent;
210
+ }
211
+ function readConfiguredDefaultAgent(configPath) {
212
+ if (!existsSync(configPath)) return;
213
+ try {
214
+ const raw = readFileSync(configPath, "utf-8");
215
+ const parsed = JSON.parse(raw);
216
+ if ("string" == typeof parsed.defaultAgent && parsed.defaultAgent.trim()) return sanitizeAgentId(parsed.defaultAgent.trim());
217
+ } catch {}
218
+ }
219
+ function resolvePreferredBundledAgentId(bundledAgents) {
220
+ if (bundledAgents.includes("main")) return "main";
221
+ return bundledAgents[0];
222
+ }
223
+ function assertAgentIsExplicit(input) {
224
+ const { agentId, bundledAgents, configRoot } = input;
225
+ if (bundledAgents.includes(agentId)) return;
226
+ if (findAgentConfigPath(configRoot, agentId)) return;
227
+ throw new Error(`Agent "${agentId}" is not defined. Choose one of the bundled agents (${bundledAgents.join(", ")}) or create .wingman/agents/${agentId}/agent.md explicitly.`);
211
228
  }
212
229
  async function resolveAgentPlan(input) {
213
230
  const { explicitAgent, defaultAgentId, bundledAgents, nonInteractive, optionMap, outputManager, ensureDefaultAgentInSelection } = input;
@@ -467,7 +484,7 @@ function bootstrapBrowserDefaults(configRoot, config) {
467
484
  };
468
485
  }
469
486
  async function handleAgentSetup(input) {
470
- const { configRoot, agentId, model, force, nonInteractive, outputManager, bundledAgentsPath, copyAgents, ensureDefaultAgent = true } = input;
487
+ const { configRoot, agentId, model, force, outputManager, bundledAgentsPath, copyAgents, ensureDefaultAgent = true } = input;
471
488
  const copiedAgents = bundledAgentsPath ? copyBundledAgents({
472
489
  bundledAgentsPath,
473
490
  configRoot,
@@ -477,17 +494,8 @@ async function handleAgentSetup(input) {
477
494
  }) : new Set();
478
495
  if (copiedAgents.size > 0) writeLine(outputManager, `Copied ${copiedAgents.size} bundled agent(s) to ${join(configRoot, "agents")}`);
479
496
  if (!ensureDefaultAgent) return;
480
- const expectedAgentDir = join(configRoot, "agents", agentId);
481
- const expectedAgentPath = join(expectedAgentDir, "agent.json");
482
- const expectedAgentExists = existsSync(expectedAgentPath);
483
- if (!expectedAgentExists) return void await createFallbackAgent({
484
- configRoot,
485
- agentId,
486
- model,
487
- force,
488
- nonInteractive,
489
- outputManager
490
- });
497
+ const expectedAgentPath = findAgentConfigPath(configRoot, agentId);
498
+ if (!expectedAgentPath) throw new Error(`Agent "${agentId}" was not found after init. Create .wingman/agents/${agentId}/agent.md explicitly or choose a bundled agent.`);
491
499
  if (model) applyModelToAgent(expectedAgentPath, model, outputManager);
492
500
  }
493
501
  function resolveBundledAgentsPath() {
@@ -544,35 +552,34 @@ function copyDirectory(source, target) {
544
552
  else copyFileSync(sourcePath, targetPath);
545
553
  }
546
554
  }
547
- async function createFallbackAgent(input) {
548
- const { configRoot, agentId, model, force, nonInteractive, outputManager } = input;
555
+ function findAgentConfigPath(configRoot, agentId) {
549
556
  const agentDir = join(configRoot, "agents", agentId);
550
- const agentPath = join(agentDir, "agent.json");
551
- const agentExists = existsSync(agentPath);
552
- if (agentExists && !force) {
553
- if (nonInteractive) return void writeLine(outputManager, `Agent "${agentId}" already exists. Use --force to overwrite.`);
554
- const shouldOverwrite = await promptConfirm(`Agent "${agentId}" exists. Overwrite? (y/N): `, false);
555
- if (!shouldOverwrite) return void writeLine(outputManager, `Keeping existing agent "${agentId}".`);
556
- }
557
- mkdirSync(agentDir, {
558
- recursive: true
559
- });
560
- const agentConfig = {
561
- name: agentId,
562
- description: DEFAULT_AGENT_DESCRIPTION,
563
- systemPrompt: DEFAULT_AGENT_PROMPT,
564
- tools: DEFAULT_TOOLS
565
- };
566
- if (model) agentConfig.model = model;
567
- writeFileSync(agentPath, JSON.stringify(agentConfig, null, 2));
568
- writeLine(outputManager, `Created starter agent at ${agentPath}`);
557
+ const jsonPath = join(agentDir, "agent.json");
558
+ if (existsSync(jsonPath)) return jsonPath;
559
+ const markdownPath = join(agentDir, "agent.md");
560
+ if (existsSync(markdownPath)) return markdownPath;
561
+ return null;
569
562
  }
570
563
  function applyModelToAgent(agentPath, model, outputManager) {
571
564
  try {
572
- const raw = readFileSync(agentPath, "utf-8");
573
- const parsed = JSON.parse(raw);
574
- parsed.model = model;
575
- writeFileSync(agentPath, JSON.stringify(parsed, null, 2));
565
+ if (agentPath.endsWith(".json")) {
566
+ const raw = readFileSync(agentPath, "utf-8");
567
+ const parsed = JSON.parse(raw);
568
+ parsed.model = model;
569
+ writeFileSync(agentPath, JSON.stringify(parsed, null, 2));
570
+ } else if (agentPath.endsWith(".md")) {
571
+ const raw = readFileSync(agentPath, "utf-8");
572
+ const frontmatterRegex = /^---\s*\n([\s\S]*?)\n---\s*\n?([\s\S]*)$/;
573
+ const match = raw.match(frontmatterRegex);
574
+ if (!match) throw new Error("Invalid agent.md format: missing frontmatter");
575
+ const [, rawFrontmatter, prompt] = match;
576
+ const metadata = load(rawFrontmatter) || {};
577
+ metadata.model = model;
578
+ const serializedFrontmatter = dump(metadata, {
579
+ lineWidth: 120
580
+ });
581
+ writeFileSync(agentPath, `---\n${serializedFrontmatter}---\n\n${prompt?.trim() || ""}\n`);
582
+ } else throw new Error("Unsupported agent config format");
576
583
  writeLine(outputManager, `Updated ${agentPath} with model ${model}`);
577
584
  } catch {
578
585
  writeLine(outputManager, `Unable to update model for ${agentPath}. Update manually.`);
@@ -612,7 +619,7 @@ async function resolveProviderSelection(input) {
612
619
  return normalized;
613
620
  }
614
621
  async function resolveModelSelection(input) {
615
- const { nonInteractive, optionMap, providerName, outputManager } = input;
622
+ const { nonInteractive, optionMap, outputManager } = input;
616
623
  const explicitModel = getStringOption(optionMap, [
617
624
  "model"
618
625
  ]);
@@ -620,22 +627,13 @@ async function resolveModelSelection(input) {
620
627
  validateModel(explicitModel);
621
628
  return explicitModel;
622
629
  }
623
- const providers = listProviderSpecs("model");
624
- const configuredProvider = providers.find((provider)=>"missing" !== resolveProviderToken(provider.name).source);
625
- const suggestedProvider = providerName || configuredProvider?.name;
626
- const suggestedModel = suggestedProvider ? DEFAULT_MODELS[suggestedProvider] : void 0;
627
- if (nonInteractive) {
628
- if (suggestedModel) return suggestedModel;
629
- return;
630
- }
630
+ if (nonInteractive) return;
631
631
  const inputValue = await prompts_text({
632
632
  message: "Model string (provider:model)",
633
- placeholder: suggestedModel ? void 0 : "anthropic:claude-sonnet-4-5",
634
- defaultValue: suggestedModel
633
+ placeholder: "anthropic:claude-sonnet-4-5"
635
634
  });
636
635
  if (isCancel(inputValue)) abortSetup();
637
636
  const trimmed = String(inputValue ?? "").trim();
638
- if (!trimmed && suggestedModel) return suggestedModel;
639
637
  if (!trimmed) return void writeLine(outputManager, "Skipping model selection.");
640
638
  validateModel(trimmed);
641
639
  return trimmed;
@@ -738,29 +736,13 @@ async function promptForDefaultAgent(agents, currentDefault) {
738
736
  const defaultValue = choices.includes(currentDefault) ? currentDefault : choices[0];
739
737
  const selection = await prompts_select({
740
738
  message: "Pick a default agent",
741
- options: [
742
- ...choices.map((agent)=>({
743
- value: agent,
744
- label: agent
745
- })),
746
- {
747
- value: "__custom__",
748
- label: "Custom agent name"
749
- }
750
- ],
739
+ options: choices.map((agent)=>({
740
+ value: agent,
741
+ label: agent
742
+ })),
751
743
  initialValue: defaultValue
752
744
  });
753
745
  if (isCancel(selection)) abortSetup();
754
- if ("__custom__" === selection) {
755
- const input = await prompts_text({
756
- message: "Default agent name",
757
- placeholder: defaultValue
758
- });
759
- if (isCancel(input)) abortSetup();
760
- const trimmed = String(input ?? "").trim();
761
- if (!trimmed) return defaultValue;
762
- return sanitizeAgentId(trimmed);
763
- }
764
746
  return sanitizeAgentId(String(selection));
765
747
  }
766
748
  async function promptForAgentSelection(agents, defaultAgent) {
@@ -827,12 +809,12 @@ Usage:
827
809
  wingman init <agent-name>
828
810
 
829
811
  Options:
830
- --agent <name> Agent name (default: wingman)
812
+ --agent <name> Bundled or existing explicit agent name
831
813
  --mode <name> Init mode (onboard|sync). Default: onboard
832
814
  --only <targets> Run only selected setup targets (config,agents,provider)
833
815
  --agents <list> Copy only these bundled agents (comma-separated)
834
816
  --model <provider:model>
835
- Set model for the starter agent
817
+ Set model for the selected explicit agent
836
818
  --provider <name> Provider to configure (anthropic|openai|codex|openrouter|copilot|xai)
837
819
  --token <token> Save provider token (non-interactive)
838
820
  --api-key <key> Alias for --token
@@ -91,11 +91,6 @@ class WingmanConfigLoader {
91
91
  return {
92
92
  logLevel: "info",
93
93
  recursionLimit: 5000,
94
- summarization: {
95
- enabled: true,
96
- maxTokensBeforeSummary: 12000,
97
- messagesToKeep: 8
98
- },
99
94
  modelRetry: {
100
95
  enabled: true,
101
96
  maxRetries: 2,
@@ -63,11 +63,6 @@ class WingmanConfigLoader {
63
63
  return {
64
64
  logLevel: "info",
65
65
  recursionLimit: 5000,
66
- summarization: {
67
- enabled: true,
68
- maxTokensBeforeSummary: 12000,
69
- messagesToKeep: 8
70
- },
71
66
  modelRetry: {
72
67
  enabled: true,
73
68
  maxRetries: 2,
@@ -141,8 +141,8 @@ const BrowserConfigSchema = external_zod_namespaceObject.object({
141
141
  });
142
142
  const SummarizationConfigSchema = external_zod_namespaceObject.object({
143
143
  enabled: external_zod_namespaceObject.boolean().optional().default(true).describe("Enable conversation history summarization"),
144
- maxTokensBeforeSummary: external_zod_namespaceObject.number().min(1000).max(1000000).optional().default(12000).describe("Token threshold before summarizing conversation history"),
145
- messagesToKeep: external_zod_namespaceObject.number().min(2).max(100).optional().default(8).describe("How many most recent messages to keep after summarization")
144
+ maxTokensBeforeSummary: external_zod_namespaceObject.number().min(1000).max(1000000).optional().describe("Token threshold before summarizing conversation history"),
145
+ messagesToKeep: external_zod_namespaceObject.number().min(2).max(100).optional().describe("How many most recent messages to keep after summarization")
146
146
  });
147
147
  const RetryOnFailureSchema = external_zod_namespaceObject["enum"]([
148
148
  "continue",
@@ -382,11 +382,7 @@ const WingmanConfigSchema = external_zod_namespaceObject.object({
382
382
  ]).optional().default("info"),
383
383
  defaultAgent: external_zod_namespaceObject.string().optional(),
384
384
  recursionLimit: external_zod_namespaceObject.number().min(1).max(1000000).optional().default(5000),
385
- summarization: SummarizationConfigSchema.optional().default({
386
- enabled: true,
387
- maxTokensBeforeSummary: 12000,
388
- messagesToKeep: 8
389
- }),
385
+ summarization: SummarizationConfigSchema.optional(),
390
386
  modelRetry: ModelRetryConfigSchema.optional().default({
391
387
  enabled: true,
392
388
  maxRetries: 2,
@@ -64,8 +64,8 @@ export declare const BrowserConfigSchema: z.ZodObject<{
64
64
  export type BrowserConfig = z.infer<typeof BrowserConfigSchema>;
65
65
  export declare const SummarizationConfigSchema: z.ZodObject<{
66
66
  enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
67
- maxTokensBeforeSummary: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
68
- messagesToKeep: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
67
+ maxTokensBeforeSummary: z.ZodOptional<z.ZodNumber>;
68
+ messagesToKeep: z.ZodOptional<z.ZodNumber>;
69
69
  }, z.core.$strip>;
70
70
  export type SummarizationConfig = z.infer<typeof SummarizationConfigSchema>;
71
71
  export declare const ModelRetryConfigSchema: z.ZodObject<{
@@ -218,11 +218,11 @@ export declare const WingmanConfigSchema: z.ZodObject<{
218
218
  }>>>;
219
219
  defaultAgent: z.ZodOptional<z.ZodString>;
220
220
  recursionLimit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
221
- summarization: z.ZodDefault<z.ZodOptional<z.ZodObject<{
221
+ summarization: z.ZodOptional<z.ZodObject<{
222
222
  enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
223
- maxTokensBeforeSummary: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
224
- messagesToKeep: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
225
- }, z.core.$strip>>>;
223
+ maxTokensBeforeSummary: z.ZodOptional<z.ZodNumber>;
224
+ messagesToKeep: z.ZodOptional<z.ZodNumber>;
225
+ }, z.core.$strip>>;
226
226
  modelRetry: z.ZodDefault<z.ZodOptional<z.ZodObject<{
227
227
  enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
228
228
  maxRetries: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;