whale-code 6.5.4 → 6.5.6

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 (853) hide show
  1. package/README.md +39 -31
  2. package/bin/{swagmanager-mcp.js → whale-code.js} +17 -2
  3. package/dist/cli/app.js +148 -72
  4. package/dist/cli/app.js.map +1 -0
  5. package/dist/cli/chat/AgentSelector.js +105 -10
  6. package/dist/cli/chat/AgentSelector.js.map +1 -0
  7. package/dist/cli/chat/ChatApp.d.ts +31 -0
  8. package/dist/cli/chat/ChatApp.js +539 -286
  9. package/dist/cli/chat/ChatApp.js.map +1 -0
  10. package/dist/cli/chat/ChatInput.js +1088 -770
  11. package/dist/cli/chat/ChatInput.js.map +1 -0
  12. package/dist/cli/chat/MarkdownText.js +39 -14
  13. package/dist/cli/chat/MarkdownText.js.map +1 -0
  14. package/dist/cli/chat/MemoryManager.js +181 -46
  15. package/dist/cli/chat/MemoryManager.js.map +1 -0
  16. package/dist/cli/chat/MessageList.d.ts +2 -3
  17. package/dist/cli/chat/MessageList.js +186 -45
  18. package/dist/cli/chat/MessageList.js.map +1 -0
  19. package/dist/cli/chat/ModelSelector.js +282 -63
  20. package/dist/cli/chat/ModelSelector.js.map +1 -0
  21. package/dist/cli/chat/NodeManager.js +165 -75
  22. package/dist/cli/chat/NodeManager.js.map +1 -0
  23. package/dist/cli/chat/NodeSelector.js +171 -30
  24. package/dist/cli/chat/NodeSelector.js.map +1 -0
  25. package/dist/cli/chat/PlanApproval.js +281 -57
  26. package/dist/cli/chat/PlanApproval.js.map +1 -0
  27. package/dist/cli/chat/RewindViewer.js +559 -144
  28. package/dist/cli/chat/RewindViewer.js.map +1 -0
  29. package/dist/cli/chat/SessionManager.js +137 -30
  30. package/dist/cli/chat/SessionManager.js.map +1 -0
  31. package/dist/cli/chat/SlashMenu.js +293 -164
  32. package/dist/cli/chat/SlashMenu.js.map +1 -0
  33. package/dist/cli/chat/StatusBar.js +172 -9
  34. package/dist/cli/chat/StatusBar.js.map +1 -0
  35. package/dist/cli/chat/StoreSelector.js +147 -18
  36. package/dist/cli/chat/StoreSelector.js.map +1 -0
  37. package/dist/cli/chat/StreamingText.d.ts +1 -5
  38. package/dist/cli/chat/StreamingText.js +22 -7
  39. package/dist/cli/chat/StreamingText.js.map +1 -0
  40. package/dist/cli/chat/SubagentPanel.d.ts +1 -2
  41. package/dist/cli/chat/SubagentPanel.js +612 -72
  42. package/dist/cli/chat/SubagentPanel.js.map +1 -0
  43. package/dist/cli/chat/TeamPanel.d.ts +1 -0
  44. package/dist/cli/chat/TeamPanel.js +230 -30
  45. package/dist/cli/chat/TeamPanel.js.map +1 -0
  46. package/dist/cli/chat/ThemeSelector.js +84 -24
  47. package/dist/cli/chat/ThemeSelector.js.map +1 -0
  48. package/dist/cli/chat/ToolIndicator.js +1476 -371
  49. package/dist/cli/chat/ToolIndicator.js.map +1 -0
  50. package/dist/cli/chat/hooks/useAgentLoop.d.ts +1 -0
  51. package/dist/cli/chat/hooks/useAgentLoop.js +481 -367
  52. package/dist/cli/chat/hooks/useAgentLoop.js.map +1 -0
  53. package/dist/cli/chat/hooks/useSlashCommands.d.ts +3 -14
  54. package/dist/cli/chat/hooks/useSlashCommands.js +744 -572
  55. package/dist/cli/chat/hooks/useSlashCommands.js.map +1 -0
  56. package/dist/cli/commands/config-cmd.js +56 -57
  57. package/dist/cli/commands/config-cmd.js.map +1 -0
  58. package/dist/cli/commands/db.js +184 -169
  59. package/dist/cli/commands/db.js.map +1 -0
  60. package/dist/cli/commands/doctor.js +212 -122
  61. package/dist/cli/commands/doctor.js.map +1 -0
  62. package/dist/cli/commands/init.js +211 -244
  63. package/dist/cli/commands/init.js.map +1 -0
  64. package/dist/cli/commands/mcp.js +127 -122
  65. package/dist/cli/commands/mcp.js.map +1 -0
  66. package/dist/cli/login/LoginApp.js +355 -141
  67. package/dist/cli/login/LoginApp.js.map +1 -0
  68. package/dist/cli/print-mode.js +196 -177
  69. package/dist/cli/print-mode.js.map +1 -0
  70. package/dist/cli/serve-mode.js +615 -530
  71. package/dist/cli/serve-mode.js.map +1 -0
  72. package/dist/cli/services/agent-config.d.ts +29 -0
  73. package/dist/cli/services/agent-config.js +91 -0
  74. package/dist/cli/services/agent-config.js.map +1 -0
  75. package/dist/cli/services/agent-definitions.d.ts +4 -1
  76. package/dist/cli/services/agent-definitions.js +97 -56
  77. package/dist/cli/services/agent-definitions.js.map +1 -0
  78. package/dist/cli/services/agent-events.js +225 -162
  79. package/dist/cli/services/agent-events.js.map +1 -0
  80. package/dist/cli/services/agent-loop.js +978 -669
  81. package/dist/cli/services/agent-loop.js.map +1 -0
  82. package/dist/cli/services/agent-worker-base.d.ts +35 -5
  83. package/dist/cli/services/agent-worker-base.js +337 -153
  84. package/dist/cli/services/agent-worker-base.js.map +1 -0
  85. package/dist/cli/services/api-retry.js +69 -64
  86. package/dist/cli/services/api-retry.js.map +1 -0
  87. package/dist/cli/services/auth-service.d.ts +3 -3
  88. package/dist/cli/services/auth-service.js +209 -132
  89. package/dist/cli/services/auth-service.js.map +1 -0
  90. package/dist/cli/services/background-processes.js +343 -267
  91. package/dist/cli/services/background-processes.js.map +1 -0
  92. package/dist/cli/services/browser-auth.d.ts +2 -2
  93. package/dist/cli/services/browser-auth.js +159 -118
  94. package/dist/cli/services/browser-auth.js.map +1 -0
  95. package/dist/cli/services/claude-md-loader.js +40 -36
  96. package/dist/cli/services/claude-md-loader.js.map +1 -0
  97. package/dist/cli/services/config-store.d.ts +9 -4
  98. package/dist/cli/services/config-store.js +164 -117
  99. package/dist/cli/services/config-store.js.map +1 -0
  100. package/dist/cli/services/debug-log.d.ts +1 -1
  101. package/dist/cli/services/debug-log.js +34 -35
  102. package/dist/cli/services/debug-log.js.map +1 -0
  103. package/dist/cli/services/env-detect.d.ts +7 -0
  104. package/dist/cli/services/env-detect.js +9 -0
  105. package/dist/cli/services/env-detect.js.map +1 -0
  106. package/dist/cli/services/error-logger.d.ts +2 -3
  107. package/dist/cli/services/error-logger.js +189 -180
  108. package/dist/cli/services/error-logger.js.map +1 -0
  109. package/dist/cli/services/file-history.d.ts +1 -1
  110. package/dist/cli/services/file-history.js +50 -54
  111. package/dist/cli/services/file-history.js.map +1 -0
  112. package/dist/cli/services/format-server-response.js +332 -372
  113. package/dist/cli/services/format-server-response.js.map +1 -0
  114. package/dist/cli/services/git-context.js +61 -45
  115. package/dist/cli/services/git-context.js.map +1 -0
  116. package/dist/cli/services/hooks.d.ts +2 -2
  117. package/dist/cli/services/hooks.js +195 -180
  118. package/dist/cli/services/hooks.js.map +1 -0
  119. package/dist/cli/services/ink-incremental.d.ts +19 -0
  120. package/dist/cli/services/ink-incremental.js +59 -0
  121. package/dist/cli/services/ink-incremental.js.map +1 -0
  122. package/dist/cli/services/ink-resize-fix.js +54 -44
  123. package/dist/cli/services/ink-resize-fix.js.map +1 -0
  124. package/dist/cli/services/ink-sync-output.d.ts +12 -0
  125. package/dist/cli/services/ink-sync-output.js +16 -0
  126. package/dist/cli/services/ink-sync-output.js.map +1 -0
  127. package/dist/cli/services/interactive-tools.js +268 -212
  128. package/dist/cli/services/interactive-tools.js.map +1 -0
  129. package/dist/cli/services/keybinding-manager.d.ts +11 -1
  130. package/dist/cli/services/keybinding-manager.js +126 -63
  131. package/dist/cli/services/keybinding-manager.js.map +1 -0
  132. package/dist/cli/services/local-tools.d.ts +1 -1
  133. package/dist/cli/services/local-tools.js +939 -656
  134. package/dist/cli/services/local-tools.js.map +1 -0
  135. package/dist/cli/services/lsp-manager.js +757 -594
  136. package/dist/cli/services/lsp-manager.js.map +1 -0
  137. package/dist/cli/services/mcp-client.d.ts +1 -1
  138. package/dist/cli/services/mcp-client.js +173 -134
  139. package/dist/cli/services/mcp-client.js.map +1 -0
  140. package/dist/cli/services/memory-manager.js +53 -40
  141. package/dist/cli/services/memory-manager.js.map +1 -0
  142. package/dist/cli/services/model-manager.js +55 -40
  143. package/dist/cli/services/model-manager.js.map +1 -0
  144. package/dist/cli/services/model-router.js +115 -85
  145. package/dist/cli/services/model-router.js.map +1 -0
  146. package/dist/cli/services/paths.d.ts +30 -0
  147. package/dist/cli/services/paths.js +81 -0
  148. package/dist/cli/services/paths.js.map +1 -0
  149. package/dist/cli/services/permission-modes.js +32 -25
  150. package/dist/cli/services/permission-modes.js.map +1 -0
  151. package/dist/cli/services/rewind.js +182 -168
  152. package/dist/cli/services/rewind.js.map +1 -0
  153. package/dist/cli/services/ripgrep.js +115 -115
  154. package/dist/cli/services/ripgrep.js.map +1 -0
  155. package/dist/cli/services/sandbox.d.ts +1 -1
  156. package/dist/cli/services/sandbox.js +58 -37
  157. package/dist/cli/services/sandbox.js.map +1 -0
  158. package/dist/cli/services/server-tools.js +738 -565
  159. package/dist/cli/services/server-tools.js.map +1 -0
  160. package/dist/cli/services/session-persistence.js +69 -74
  161. package/dist/cli/services/session-persistence.js.map +1 -0
  162. package/dist/cli/services/subagent-worker.js +42 -27
  163. package/dist/cli/services/subagent-worker.js.map +1 -0
  164. package/dist/cli/services/subagent.d.ts +2 -0
  165. package/dist/cli/services/subagent.js +606 -430
  166. package/dist/cli/services/subagent.js.map +1 -0
  167. package/dist/cli/services/system-prompt.js +86 -78
  168. package/dist/cli/services/system-prompt.js.map +1 -0
  169. package/dist/cli/services/task-decomposer.d.ts +1 -1
  170. package/dist/cli/services/task-decomposer.js +172 -139
  171. package/dist/cli/services/task-decomposer.js.map +1 -0
  172. package/dist/cli/services/team-lead.d.ts +2 -2
  173. package/dist/cli/services/team-lead.js +727 -529
  174. package/dist/cli/services/team-lead.js.map +1 -0
  175. package/dist/cli/services/team-state.js +319 -319
  176. package/dist/cli/services/team-state.js.map +1 -0
  177. package/dist/cli/services/teammate.d.ts +8 -2
  178. package/dist/cli/services/teammate.js +862 -560
  179. package/dist/cli/services/teammate.js.map +1 -0
  180. package/dist/cli/services/telemetry.d.ts +6 -1
  181. package/dist/cli/services/telemetry.js +180 -157
  182. package/dist/cli/services/telemetry.js.map +1 -0
  183. package/dist/cli/services/tools/agent-tools.d.ts +3 -3
  184. package/dist/cli/services/tools/agent-tools.js +480 -322
  185. package/dist/cli/services/tools/agent-tools.js.map +1 -0
  186. package/dist/cli/services/tools/file-ops.js +563 -450
  187. package/dist/cli/services/tools/file-ops.js.map +1 -0
  188. package/dist/cli/services/tools/search-tools.js +231 -162
  189. package/dist/cli/services/tools/search-tools.js.map +1 -0
  190. package/dist/cli/services/tools/shell-exec.js +197 -151
  191. package/dist/cli/services/tools/shell-exec.js.map +1 -0
  192. package/dist/cli/services/tools/task-manager.js +206 -173
  193. package/dist/cli/services/tools/task-manager.js.map +1 -0
  194. package/dist/cli/services/tools/web-tools.js +388 -341
  195. package/dist/cli/services/tools/web-tools.js.map +1 -0
  196. package/dist/cli/setup/SetupApp.d.ts +2 -2
  197. package/dist/cli/setup/SetupApp.js +608 -160
  198. package/dist/cli/setup/SetupApp.js.map +1 -0
  199. package/dist/cli/shared/ErrorBoundary.d.ts +22 -0
  200. package/dist/cli/shared/ErrorBoundary.js +73 -0
  201. package/dist/cli/shared/ErrorBoundary.js.map +1 -0
  202. package/dist/cli/shared/MatrixIntro.js +66 -69
  203. package/dist/cli/shared/MatrixIntro.js.map +1 -0
  204. package/dist/cli/shared/SpinnerSlot.d.ts +14 -0
  205. package/dist/cli/shared/SpinnerSlot.js +63 -0
  206. package/dist/cli/shared/SpinnerSlot.js.map +1 -0
  207. package/dist/cli/shared/Theme.d.ts +1 -1
  208. package/dist/cli/shared/Theme.js +136 -92
  209. package/dist/cli/shared/Theme.js.map +1 -0
  210. package/dist/cli/shared/WhaleBanner.js +99 -11
  211. package/dist/cli/shared/WhaleBanner.js.map +1 -0
  212. package/dist/cli/shared/markdown.d.ts +3 -1
  213. package/dist/cli/shared/markdown.js +736 -674
  214. package/dist/cli/shared/markdown.js.map +1 -0
  215. package/dist/cli/shared/marked-terminal.d.js +2 -0
  216. package/dist/cli/shared/marked-terminal.d.js.map +1 -0
  217. package/dist/cli/shared/theme-manager.js +99 -90
  218. package/dist/cli/shared/theme-manager.js.map +1 -0
  219. package/dist/cli/shared/theme-presets.js +256 -254
  220. package/dist/cli/shared/theme-presets.js.map +1 -0
  221. package/dist/cli/status/StatusApp.js +235 -86
  222. package/dist/cli/status/StatusApp.js.map +1 -0
  223. package/dist/cli/stores/StoreApp.js +275 -65
  224. package/dist/cli/stores/StoreApp.js.map +1 -0
  225. package/dist/index.d.ts +2 -2
  226. package/dist/index.js +509 -396
  227. package/dist/index.js.map +1 -0
  228. package/dist/local-agent/connection.d.ts +2 -2
  229. package/dist/local-agent/connection.js +352 -293
  230. package/dist/local-agent/connection.js.map +1 -0
  231. package/dist/local-agent/discovery.js +259 -122
  232. package/dist/local-agent/discovery.js.map +1 -0
  233. package/dist/local-agent/executor.js +216 -193
  234. package/dist/local-agent/executor.js.map +1 -0
  235. package/dist/local-agent/index.d.ts +2 -2
  236. package/dist/local-agent/index.js +156 -156
  237. package/dist/local-agent/index.js.map +1 -0
  238. package/dist/node/adapters/base.js +18 -8
  239. package/dist/node/adapters/base.js.map +1 -0
  240. package/dist/node/adapters/discord.js +286 -275
  241. package/dist/node/adapters/discord.js.map +1 -0
  242. package/dist/node/adapters/email.js +189 -202
  243. package/dist/node/adapters/email.js.map +1 -0
  244. package/dist/node/adapters/imessage.js +145 -142
  245. package/dist/node/adapters/imessage.js.map +1 -0
  246. package/dist/node/adapters/slack.js +237 -236
  247. package/dist/node/adapters/slack.js.map +1 -0
  248. package/dist/node/adapters/sms.js +149 -151
  249. package/dist/node/adapters/sms.js.map +1 -0
  250. package/dist/node/adapters/telegram.js +88 -92
  251. package/dist/node/adapters/telegram.js.map +1 -0
  252. package/dist/node/adapters/webchat.js +160 -136
  253. package/dist/node/adapters/webchat.js.map +1 -0
  254. package/dist/node/adapters/whatsapp.js +212 -215
  255. package/dist/node/adapters/whatsapp.js.map +1 -0
  256. package/dist/node/cli.js +884 -653
  257. package/dist/node/cli.js.map +1 -0
  258. package/dist/node/config.js +20 -18
  259. package/dist/node/config.js.map +1 -0
  260. package/dist/node/gateway-client.js +191 -181
  261. package/dist/node/gateway-client.js.map +1 -0
  262. package/dist/node/portal/clipboard.js +161 -130
  263. package/dist/node/portal/clipboard.js.map +1 -0
  264. package/dist/node/portal/discovery.js +51 -45
  265. package/dist/node/portal/discovery.js.map +1 -0
  266. package/dist/node/portal/forward.js +64 -58
  267. package/dist/node/portal/forward.js.map +1 -0
  268. package/dist/node/portal/index.js +246 -221
  269. package/dist/node/portal/index.js.map +1 -0
  270. package/dist/node/portal/multiplexer.js +192 -182
  271. package/dist/node/portal/multiplexer.js.map +1 -0
  272. package/dist/node/portal/permissions.js +102 -70
  273. package/dist/node/portal/permissions.js.map +1 -0
  274. package/dist/node/portal/protocol.js +153 -116
  275. package/dist/node/portal/protocol.js.map +1 -0
  276. package/dist/node/portal/screen.js +80 -69
  277. package/dist/node/portal/screen.js.map +1 -0
  278. package/dist/node/portal/session.js +124 -117
  279. package/dist/node/portal/session.js.map +1 -0
  280. package/dist/node/portal/shell.js +140 -113
  281. package/dist/node/portal/shell.js.map +1 -0
  282. package/dist/node/portal/stream.js +77 -75
  283. package/dist/node/portal/stream.js.map +1 -0
  284. package/dist/node/portal/transfer.js +190 -167
  285. package/dist/node/portal/transfer.js.map +1 -0
  286. package/dist/node/portal/ui.js +124 -99
  287. package/dist/node/portal/ui.js.map +1 -0
  288. package/dist/node/remote-desktop/compile-helper.js +50 -45
  289. package/dist/node/remote-desktop/compile-helper.js.map +1 -0
  290. package/dist/node/remote-desktop/index.js +215 -187
  291. package/dist/node/remote-desktop/index.js.map +1 -0
  292. package/dist/node/remote-desktop/protocol.js +45 -29
  293. package/dist/node/remote-desktop/protocol.js.map +1 -0
  294. package/dist/node/runtime.js +493 -410
  295. package/dist/node/runtime.js.map +1 -0
  296. package/dist/server/handlers/__test-utils__/test-db.js +39 -89
  297. package/dist/server/handlers/__test-utils__/test-db.js.map +1 -0
  298. package/dist/server/handlers/analytics.js +467 -261
  299. package/dist/server/handlers/analytics.js.map +1 -0
  300. package/dist/server/handlers/api-docs.d.ts +6 -0
  301. package/dist/server/handlers/api-docs.js +1613 -0
  302. package/dist/server/handlers/api-docs.js.map +1 -0
  303. package/dist/server/handlers/api-keys.js +295 -232
  304. package/dist/server/handlers/api-keys.js.map +1 -0
  305. package/dist/server/handlers/billing.js +330 -239
  306. package/dist/server/handlers/billing.js.map +1 -0
  307. package/dist/server/handlers/browser.js +468 -395
  308. package/dist/server/handlers/browser.js.map +1 -0
  309. package/dist/server/handlers/catalog.js +1377 -978
  310. package/dist/server/handlers/catalog.js.map +1 -0
  311. package/dist/server/handlers/clickhouse.js +157 -109
  312. package/dist/server/handlers/clickhouse.js.map +1 -0
  313. package/dist/server/handlers/comms.d.ts +0 -53
  314. package/dist/server/handlers/comms.js +1443 -970
  315. package/dist/server/handlers/comms.js.map +1 -0
  316. package/dist/server/handlers/creations.js +461 -394
  317. package/dist/server/handlers/creations.js.map +1 -0
  318. package/dist/server/handlers/crm.js +1082 -791
  319. package/dist/server/handlers/crm.js.map +1 -0
  320. package/dist/server/handlers/discovery.js +251 -232
  321. package/dist/server/handlers/discovery.js.map +1 -0
  322. package/dist/server/handlers/embeddings.js +241 -164
  323. package/dist/server/handlers/embeddings.js.map +1 -0
  324. package/dist/server/handlers/enrichment.js +887 -718
  325. package/dist/server/handlers/enrichment.js.map +1 -0
  326. package/dist/server/handlers/image-gen.js +467 -376
  327. package/dist/server/handlers/image-gen.js.map +1 -0
  328. package/dist/server/handlers/inventory.js +797 -424
  329. package/dist/server/handlers/inventory.js.map +1 -0
  330. package/dist/server/handlers/kali.js +272 -230
  331. package/dist/server/handlers/kali.js.map +1 -0
  332. package/dist/server/handlers/llm-providers.js +803 -580
  333. package/dist/server/handlers/llm-providers.js.map +1 -0
  334. package/dist/server/handlers/local-agent.js +133 -105
  335. package/dist/server/handlers/local-agent.js.map +1 -0
  336. package/dist/server/handlers/media.js +1179 -857
  337. package/dist/server/handlers/media.js.map +1 -0
  338. package/dist/server/handlers/meta-ads.js +2669 -2093
  339. package/dist/server/handlers/meta-ads.js.map +1 -0
  340. package/dist/server/handlers/nodes.js +1321 -913
  341. package/dist/server/handlers/nodes.js.map +1 -0
  342. package/dist/server/handlers/operations.js +183 -157
  343. package/dist/server/handlers/operations.js.map +1 -0
  344. package/dist/server/handlers/platform.js +346 -210
  345. package/dist/server/handlers/platform.js.map +1 -0
  346. package/dist/server/handlers/remove-bg.js +118 -86
  347. package/dist/server/handlers/remove-bg.js.map +1 -0
  348. package/dist/server/handlers/storefront.js +586 -446
  349. package/dist/server/handlers/storefront.js.map +1 -0
  350. package/dist/server/handlers/supply-chain.js +546 -326
  351. package/dist/server/handlers/supply-chain.js.map +1 -0
  352. package/dist/server/handlers/transcription.js +106 -97
  353. package/dist/server/handlers/transcription.js.map +1 -0
  354. package/dist/server/handlers/video-gen.js +593 -424
  355. package/dist/server/handlers/video-gen.js.map +1 -0
  356. package/dist/server/handlers/voice.js +1458 -1017
  357. package/dist/server/handlers/voice.js.map +1 -0
  358. package/dist/server/handlers/workflow-steps.js +2837 -2116
  359. package/dist/server/handlers/workflow-steps.js.map +1 -0
  360. package/dist/server/handlers/workflows.js +1630 -933
  361. package/dist/server/handlers/workflows.js.map +1 -0
  362. package/dist/server/index.js +3166 -2390
  363. package/dist/server/index.js.map +1 -0
  364. package/dist/server/lib/batch-client.js +471 -409
  365. package/dist/server/lib/batch-client.js.map +1 -0
  366. package/dist/server/lib/clickhouse-buffer.js +118 -104
  367. package/dist/server/lib/clickhouse-buffer.js.map +1 -0
  368. package/dist/server/lib/clickhouse-client.js +107 -107
  369. package/dist/server/lib/clickhouse-client.js.map +1 -0
  370. package/dist/server/lib/coa-renderer.js +1786 -356
  371. package/dist/server/lib/coa-renderer.js.map +1 -0
  372. package/dist/server/lib/code-worker-pool.js +227 -177
  373. package/dist/server/lib/code-worker-pool.js.map +1 -0
  374. package/dist/server/lib/code-worker.js +174 -164
  375. package/dist/server/lib/code-worker.js.map +1 -0
  376. package/dist/server/lib/compaction-service.d.ts +2 -12
  377. package/dist/server/lib/compaction-service.js +74 -184
  378. package/dist/server/lib/compaction-service.js.map +1 -0
  379. package/dist/server/lib/logger.js +36 -24
  380. package/dist/server/lib/logger.js.map +1 -0
  381. package/dist/server/lib/otel.js +101 -80
  382. package/dist/server/lib/otel.js.map +1 -0
  383. package/dist/server/lib/pdf-renderer.d.ts +1 -1
  384. package/dist/server/lib/pdf-renderer.js +954 -776
  385. package/dist/server/lib/pdf-renderer.js.map +1 -0
  386. package/dist/server/lib/prompt-sanitizer.js +188 -108
  387. package/dist/server/lib/prompt-sanitizer.js.map +1 -0
  388. package/dist/server/lib/provider-capabilities.js +136 -138
  389. package/dist/server/lib/provider-capabilities.js.map +1 -0
  390. package/dist/server/lib/provider-failover.js +190 -168
  391. package/dist/server/lib/provider-failover.js.map +1 -0
  392. package/dist/server/lib/rate-limiter.js +186 -117
  393. package/dist/server/lib/rate-limiter.js.map +1 -0
  394. package/dist/server/lib/react-pdf-layout.js +551 -382
  395. package/dist/server/lib/react-pdf-layout.js.map +1 -0
  396. package/dist/server/lib/server-agent-loop.d.ts +9 -0
  397. package/dist/server/lib/server-agent-loop.js +906 -624
  398. package/dist/server/lib/server-agent-loop.js.map +1 -0
  399. package/dist/server/lib/server-subagent.d.ts +2 -0
  400. package/dist/server/lib/server-subagent.js +260 -162
  401. package/dist/server/lib/server-subagent.js.map +1 -0
  402. package/dist/server/lib/session-checkpoint.js +105 -96
  403. package/dist/server/lib/session-checkpoint.js.map +1 -0
  404. package/dist/server/lib/ssrf-guard.js +193 -184
  405. package/dist/server/lib/ssrf-guard.js.map +1 -0
  406. package/dist/server/lib/supabase-client.js +94 -82
  407. package/dist/server/lib/supabase-client.js.map +1 -0
  408. package/dist/server/lib/template-resolver.js +154 -176
  409. package/dist/server/lib/template-resolver.js.map +1 -0
  410. package/dist/server/lib/utils.js +242 -133
  411. package/dist/server/lib/utils.js.map +1 -0
  412. package/dist/server/local-agent-gateway.d.ts +2 -2
  413. package/dist/server/local-agent-gateway.js +785 -627
  414. package/dist/server/local-agent-gateway.js.map +1 -0
  415. package/dist/server/providers/anthropic.js +254 -176
  416. package/dist/server/providers/anthropic.js.map +1 -0
  417. package/dist/server/providers/bedrock.js +221 -162
  418. package/dist/server/providers/bedrock.js.map +1 -0
  419. package/dist/server/providers/gemini.js +548 -418
  420. package/dist/server/providers/gemini.js.map +1 -0
  421. package/dist/server/providers/openai.js +571 -437
  422. package/dist/server/providers/openai.js.map +1 -0
  423. package/dist/server/providers/registry.js +23 -18
  424. package/dist/server/providers/registry.js.map +1 -0
  425. package/dist/server/providers/shared.js +123 -95
  426. package/dist/server/providers/shared.js.map +1 -0
  427. package/dist/server/providers/types.js +1 -11
  428. package/dist/server/providers/types.js.map +1 -0
  429. package/dist/server/proxy-handlers.js +209 -165
  430. package/dist/server/proxy-handlers.js.map +1 -0
  431. package/dist/server/tool-router.d.ts +13 -0
  432. package/dist/server/tool-router.js +960 -598
  433. package/dist/server/tool-router.js.map +1 -0
  434. package/dist/server/validation.js +248 -188
  435. package/dist/server/validation.js.map +1 -0
  436. package/dist/server/worker.js +202 -133
  437. package/dist/server/worker.js.map +1 -0
  438. package/dist/setup.d.ts +2 -2
  439. package/dist/setup.js +151 -147
  440. package/dist/setup.js.map +1 -0
  441. package/dist/shared/agent-core.d.ts +191 -24
  442. package/dist/shared/agent-core.js +971 -462
  443. package/dist/shared/agent-core.js.map +1 -0
  444. package/dist/shared/anthropic-types.js +1 -6
  445. package/dist/shared/anthropic-types.js.map +1 -0
  446. package/dist/shared/api-client.d.ts +17 -9
  447. package/dist/shared/api-client.js +419 -327
  448. package/dist/shared/api-client.js.map +1 -0
  449. package/dist/shared/compaction.d.ts +36 -0
  450. package/dist/shared/compaction.js +138 -0
  451. package/dist/shared/compaction.js.map +1 -0
  452. package/dist/shared/constants.js +67 -64
  453. package/dist/shared/constants.js.map +1 -0
  454. package/dist/shared/sse-parser.js +221 -219
  455. package/dist/shared/sse-parser.js.map +1 -0
  456. package/dist/shared/tool-dispatch.d.ts +4 -2
  457. package/dist/shared/tool-dispatch.js +226 -165
  458. package/dist/shared/tool-dispatch.js.map +1 -0
  459. package/dist/shared/types.js +1 -6
  460. package/dist/shared/types.js.map +1 -0
  461. package/dist/types/cli-highlight.d.js +2 -0
  462. package/dist/types/cli-highlight.d.js.map +1 -0
  463. package/dist/types/diff.d.js +2 -0
  464. package/dist/types/diff.d.js.map +1 -0
  465. package/dist/types/pdf-parse.d.js +2 -0
  466. package/dist/types/pdf-parse.d.js.map +1 -0
  467. package/dist/updater.d.ts +1 -1
  468. package/dist/updater.js +118 -92
  469. package/dist/updater.js.map +1 -0
  470. package/dist/webchat/widget.js +227 -380
  471. package/dist/webchat/widget.js.map +1 -0
  472. package/package.json +22 -10
  473. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  474. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  475. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  476. package/vendor/ink/build/apply-styles.js +175 -0
  477. package/vendor/ink/build/build-layout.js +77 -0
  478. package/vendor/ink/build/calculate-wrapped-text.js +53 -0
  479. package/vendor/ink/build/colorize.d.ts +3 -0
  480. package/vendor/ink/build/colorize.js +48 -0
  481. package/vendor/ink/build/colorize.js.map +1 -0
  482. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  483. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  484. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  485. package/vendor/ink/build/components/App.d.ts +18 -0
  486. package/vendor/ink/build/components/App.js +351 -0
  487. package/vendor/ink/build/components/App.js.map +1 -0
  488. package/vendor/ink/build/components/AppContext.d.ts +15 -0
  489. package/vendor/ink/build/components/AppContext.js +11 -0
  490. package/vendor/ink/build/components/AppContext.js.map +1 -0
  491. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  492. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  493. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  494. package/vendor/ink/build/components/Box.d.ts +117 -0
  495. package/vendor/ink/build/components/Box.js +34 -0
  496. package/vendor/ink/build/components/Box.js.map +1 -0
  497. package/vendor/ink/build/components/Color.js +62 -0
  498. package/vendor/ink/build/components/Cursor.d.ts +83 -0
  499. package/vendor/ink/build/components/Cursor.js +53 -0
  500. package/vendor/ink/build/components/Cursor.js.map +1 -0
  501. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  502. package/vendor/ink/build/components/CursorContext.js +8 -0
  503. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  504. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  505. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  506. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  507. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  508. package/vendor/ink/build/components/ErrorOverview.js +84 -0
  509. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  510. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  511. package/vendor/ink/build/components/FocusContext.js +17 -0
  512. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  513. package/vendor/ink/build/components/Newline.d.ts +13 -0
  514. package/vendor/ink/build/components/Newline.js +8 -0
  515. package/vendor/ink/build/components/Newline.js.map +1 -0
  516. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  517. package/vendor/ink/build/components/Spacer.js +11 -0
  518. package/vendor/ink/build/components/Spacer.js.map +1 -0
  519. package/vendor/ink/build/components/Static.d.ts +24 -0
  520. package/vendor/ink/build/components/Static.js +28 -0
  521. package/vendor/ink/build/components/Static.js.map +1 -0
  522. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  523. package/vendor/ink/build/components/StderrContext.js +13 -0
  524. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  525. package/vendor/ink/build/components/StdinContext.d.ts +22 -0
  526. package/vendor/ink/build/components/StdinContext.js +19 -0
  527. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  528. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  529. package/vendor/ink/build/components/StdoutContext.js +13 -0
  530. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  531. package/vendor/ink/build/components/Text.d.ts +55 -0
  532. package/vendor/ink/build/components/Text.js +50 -0
  533. package/vendor/ink/build/components/Text.js.map +1 -0
  534. package/vendor/ink/build/components/Transform.d.ts +16 -0
  535. package/vendor/ink/build/components/Transform.js +15 -0
  536. package/vendor/ink/build/components/Transform.js.map +1 -0
  537. package/vendor/ink/build/cursor-helpers.d.ts +38 -0
  538. package/vendor/ink/build/cursor-helpers.js +56 -0
  539. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  540. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  541. package/vendor/ink/build/devtools-window-polyfill.js +65 -0
  542. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  543. package/vendor/ink/build/devtools.d.ts +1 -0
  544. package/vendor/ink/build/devtools.js +11 -0
  545. package/vendor/ink/build/devtools.js.map +1 -0
  546. package/vendor/ink/build/dom.d.ts +56 -0
  547. package/vendor/ink/build/dom.js +124 -0
  548. package/vendor/ink/build/dom.js.map +1 -0
  549. package/vendor/ink/build/experimental/apply-style.js +140 -0
  550. package/vendor/ink/build/experimental/dom.js +123 -0
  551. package/vendor/ink/build/experimental/output.js +91 -0
  552. package/vendor/ink/build/experimental/reconciler.js +141 -0
  553. package/vendor/ink/build/experimental/renderer.js +81 -0
  554. package/vendor/ink/build/get-max-width.d.ts +3 -0
  555. package/vendor/ink/build/get-max-width.js +10 -0
  556. package/vendor/ink/build/get-max-width.js.map +1 -0
  557. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  558. package/vendor/ink/build/hooks/use-app.js +8 -0
  559. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  560. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  561. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  562. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  563. package/vendor/ink/build/hooks/use-focus-manager.d.ts +28 -0
  564. package/vendor/ink/build/hooks/use-focus-manager.js +17 -0
  565. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  566. package/vendor/ink/build/hooks/use-focus.d.ts +29 -0
  567. package/vendor/ink/build/hooks/use-focus.js +42 -0
  568. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  569. package/vendor/ink/build/hooks/use-input.d.ts +131 -0
  570. package/vendor/ink/build/hooks/use-input.js +124 -0
  571. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  572. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +5 -0
  573. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +11 -0
  574. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  575. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  576. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  577. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  578. package/vendor/ink/build/hooks/use-stdin.d.ts +5 -0
  579. package/vendor/ink/build/hooks/use-stdin.js +8 -0
  580. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  581. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  582. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  583. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  584. package/vendor/ink/build/hooks/useInput.js +38 -0
  585. package/vendor/ink/build/index.d.ts +34 -0
  586. package/vendor/ink/build/index.js +20 -0
  587. package/vendor/ink/build/index.js.map +1 -0
  588. package/vendor/ink/build/ink.d.ts +90 -0
  589. package/vendor/ink/build/ink.js +654 -0
  590. package/vendor/ink/build/ink.js.map +1 -0
  591. package/vendor/ink/build/input-parser.d.ts +7 -0
  592. package/vendor/ink/build/input-parser.js +154 -0
  593. package/vendor/ink/build/input-parser.js.map +1 -0
  594. package/vendor/ink/build/instance.js +205 -0
  595. package/vendor/ink/build/instances.d.ts +3 -0
  596. package/vendor/ink/build/instances.js +8 -0
  597. package/vendor/ink/build/instances.js.map +1 -0
  598. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  599. package/vendor/ink/build/kitty-keyboard.js +32 -0
  600. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  601. package/vendor/ink/build/layout.d.ts +7 -0
  602. package/vendor/ink/build/layout.js +33 -0
  603. package/vendor/ink/build/layout.js.map +1 -0
  604. package/vendor/ink/build/log-update.d.ts +19 -0
  605. package/vendor/ink/build/log-update.js +243 -0
  606. package/vendor/ink/build/log-update.js.map +1 -0
  607. package/vendor/ink/build/measure-element.d.ts +16 -0
  608. package/vendor/ink/build/measure-element.js +9 -0
  609. package/vendor/ink/build/measure-element.js.map +1 -0
  610. package/vendor/ink/build/measure-text.d.ts +6 -0
  611. package/vendor/ink/build/measure-text.js +21 -0
  612. package/vendor/ink/build/measure-text.js.map +1 -0
  613. package/vendor/ink/build/options.d.ts +52 -0
  614. package/vendor/ink/build/options.js +2 -0
  615. package/vendor/ink/build/options.js.map +1 -0
  616. package/vendor/ink/build/output.d.ts +35 -0
  617. package/vendor/ink/build/output.js +183 -0
  618. package/vendor/ink/build/output.js.map +1 -0
  619. package/vendor/ink/build/parse-keypress.d.ts +22 -0
  620. package/vendor/ink/build/parse-keypress.js +493 -0
  621. package/vendor/ink/build/parse-keypress.js.map +1 -0
  622. package/vendor/ink/build/reconciler.d.ts +4 -0
  623. package/vendor/ink/build/reconciler.js +274 -0
  624. package/vendor/ink/build/reconciler.js.map +1 -0
  625. package/vendor/ink/build/render-background.d.ts +4 -0
  626. package/vendor/ink/build/render-background.js +25 -0
  627. package/vendor/ink/build/render-background.js.map +1 -0
  628. package/vendor/ink/build/render-border.d.ts +4 -0
  629. package/vendor/ink/build/render-border.js +73 -0
  630. package/vendor/ink/build/render-border.js.map +1 -0
  631. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  632. package/vendor/ink/build/render-node-to-output.js +147 -0
  633. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  634. package/vendor/ink/build/render-to-string.d.ts +38 -0
  635. package/vendor/ink/build/render-to-string.js +115 -0
  636. package/vendor/ink/build/render-to-string.js.map +1 -0
  637. package/vendor/ink/build/render.d.ts +121 -0
  638. package/vendor/ink/build/render.js +55 -0
  639. package/vendor/ink/build/render.js.map +1 -0
  640. package/vendor/ink/build/renderer.d.ts +8 -0
  641. package/vendor/ink/build/renderer.js +55 -0
  642. package/vendor/ink/build/renderer.js.map +1 -0
  643. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  644. package/vendor/ink/build/sanitize-ansi.js +27 -0
  645. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  646. package/vendor/ink/build/screen-reader-update.d.ts +13 -0
  647. package/vendor/ink/build/screen-reader-update.js +38 -0
  648. package/vendor/ink/build/screen-reader-update.js.map +1 -0
  649. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  650. package/vendor/ink/build/squash-text-nodes.js +36 -0
  651. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  652. package/vendor/ink/build/styles.d.ts +240 -0
  653. package/vendor/ink/build/styles.js +232 -0
  654. package/vendor/ink/build/styles.js.map +1 -0
  655. package/vendor/ink/build/utils.d.ts +2 -0
  656. package/vendor/ink/build/utils.js +4 -0
  657. package/vendor/ink/build/utils.js.map +1 -0
  658. package/vendor/ink/build/wrap-text.d.ts +3 -0
  659. package/vendor/ink/build/wrap-text.js +31 -0
  660. package/vendor/ink/build/wrap-text.js.map +1 -0
  661. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  662. package/vendor/ink/build/write-synchronized.js +7 -0
  663. package/vendor/ink/build/write-synchronized.js.map +1 -0
  664. package/vendor/ink/license +10 -0
  665. package/vendor/ink/node_modules/@types/node/LICENSE +21 -0
  666. package/vendor/ink/node_modules/@types/node/README.md +15 -0
  667. package/vendor/ink/node_modules/@types/node/assert/strict.d.ts +105 -0
  668. package/vendor/ink/node_modules/@types/node/assert.d.ts +955 -0
  669. package/vendor/ink/node_modules/@types/node/async_hooks.d.ts +623 -0
  670. package/vendor/ink/node_modules/@types/node/buffer.buffer.d.ts +466 -0
  671. package/vendor/ink/node_modules/@types/node/buffer.d.ts +1810 -0
  672. package/vendor/ink/node_modules/@types/node/child_process.d.ts +1428 -0
  673. package/vendor/ink/node_modules/@types/node/cluster.d.ts +486 -0
  674. package/vendor/ink/node_modules/@types/node/compatibility/iterators.d.ts +21 -0
  675. package/vendor/ink/node_modules/@types/node/console.d.ts +151 -0
  676. package/vendor/ink/node_modules/@types/node/constants.d.ts +20 -0
  677. package/vendor/ink/node_modules/@types/node/crypto.d.ts +4065 -0
  678. package/vendor/ink/node_modules/@types/node/dgram.d.ts +564 -0
  679. package/vendor/ink/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
  680. package/vendor/ink/node_modules/@types/node/dns/promises.d.ts +503 -0
  681. package/vendor/ink/node_modules/@types/node/dns.d.ts +922 -0
  682. package/vendor/ink/node_modules/@types/node/domain.d.ts +166 -0
  683. package/vendor/ink/node_modules/@types/node/events.d.ts +1054 -0
  684. package/vendor/ink/node_modules/@types/node/fs/promises.d.ts +1329 -0
  685. package/vendor/ink/node_modules/@types/node/fs.d.ts +4676 -0
  686. package/vendor/ink/node_modules/@types/node/globals.d.ts +150 -0
  687. package/vendor/ink/node_modules/@types/node/globals.typedarray.d.ts +101 -0
  688. package/vendor/ink/node_modules/@types/node/http.d.ts +2167 -0
  689. package/vendor/ink/node_modules/@types/node/http2.d.ts +2480 -0
  690. package/vendor/ink/node_modules/@types/node/https.d.ts +405 -0
  691. package/vendor/ink/node_modules/@types/node/index.d.ts +115 -0
  692. package/vendor/ink/node_modules/@types/node/inspector/promises.d.ts +41 -0
  693. package/vendor/ink/node_modules/@types/node/inspector.d.ts +224 -0
  694. package/vendor/ink/node_modules/@types/node/inspector.generated.d.ts +4226 -0
  695. package/vendor/ink/node_modules/@types/node/module.d.ts +819 -0
  696. package/vendor/ink/node_modules/@types/node/net.d.ts +933 -0
  697. package/vendor/ink/node_modules/@types/node/os.d.ts +507 -0
  698. package/vendor/ink/node_modules/@types/node/package.json +155 -0
  699. package/vendor/ink/node_modules/@types/node/path/posix.d.ts +8 -0
  700. package/vendor/ink/node_modules/@types/node/path/win32.d.ts +8 -0
  701. package/vendor/ink/node_modules/@types/node/path.d.ts +187 -0
  702. package/vendor/ink/node_modules/@types/node/perf_hooks.d.ts +643 -0
  703. package/vendor/ink/node_modules/@types/node/process.d.ts +2156 -0
  704. package/vendor/ink/node_modules/@types/node/punycode.d.ts +117 -0
  705. package/vendor/ink/node_modules/@types/node/querystring.d.ts +152 -0
  706. package/vendor/ink/node_modules/@types/node/quic.d.ts +910 -0
  707. package/vendor/ink/node_modules/@types/node/readline/promises.d.ts +161 -0
  708. package/vendor/ink/node_modules/@types/node/readline.d.ts +541 -0
  709. package/vendor/ink/node_modules/@types/node/repl.d.ts +415 -0
  710. package/vendor/ink/node_modules/@types/node/sea.d.ts +162 -0
  711. package/vendor/ink/node_modules/@types/node/sqlite.d.ts +955 -0
  712. package/vendor/ink/node_modules/@types/node/stream/consumers.d.ts +38 -0
  713. package/vendor/ink/node_modules/@types/node/stream/promises.d.ts +211 -0
  714. package/vendor/ink/node_modules/@types/node/stream/web.d.ts +296 -0
  715. package/vendor/ink/node_modules/@types/node/stream.d.ts +1760 -0
  716. package/vendor/ink/node_modules/@types/node/string_decoder.d.ts +67 -0
  717. package/vendor/ink/node_modules/@types/node/test/reporters.d.ts +96 -0
  718. package/vendor/ink/node_modules/@types/node/test.d.ts +2240 -0
  719. package/vendor/ink/node_modules/@types/node/timers/promises.d.ts +108 -0
  720. package/vendor/ink/node_modules/@types/node/timers.d.ts +159 -0
  721. package/vendor/ink/node_modules/@types/node/tls.d.ts +1198 -0
  722. package/vendor/ink/node_modules/@types/node/trace_events.d.ts +197 -0
  723. package/vendor/ink/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +462 -0
  724. package/vendor/ink/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
  725. package/vendor/ink/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +36 -0
  726. package/vendor/ink/node_modules/@types/node/ts5.6/index.d.ts +117 -0
  727. package/vendor/ink/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
  728. package/vendor/ink/node_modules/@types/node/ts5.7/index.d.ts +117 -0
  729. package/vendor/ink/node_modules/@types/node/tty.d.ts +250 -0
  730. package/vendor/ink/node_modules/@types/node/url.d.ts +519 -0
  731. package/vendor/ink/node_modules/@types/node/util/types.d.ts +558 -0
  732. package/vendor/ink/node_modules/@types/node/util.d.ts +1662 -0
  733. package/vendor/ink/node_modules/@types/node/v8.d.ts +983 -0
  734. package/vendor/ink/node_modules/@types/node/vm.d.ts +1208 -0
  735. package/vendor/ink/node_modules/@types/node/wasi.d.ts +202 -0
  736. package/vendor/ink/node_modules/@types/node/web-globals/abortcontroller.d.ts +59 -0
  737. package/vendor/ink/node_modules/@types/node/web-globals/blob.d.ts +23 -0
  738. package/vendor/ink/node_modules/@types/node/web-globals/console.d.ts +9 -0
  739. package/vendor/ink/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
  740. package/vendor/ink/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  741. package/vendor/ink/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
  742. package/vendor/ink/node_modules/@types/node/web-globals/events.d.ts +106 -0
  743. package/vendor/ink/node_modules/@types/node/web-globals/fetch.d.ts +69 -0
  744. package/vendor/ink/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
  745. package/vendor/ink/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
  746. package/vendor/ink/node_modules/@types/node/web-globals/navigator.d.ts +25 -0
  747. package/vendor/ink/node_modules/@types/node/web-globals/performance.d.ts +45 -0
  748. package/vendor/ink/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  749. package/vendor/ink/node_modules/@types/node/web-globals/streams.d.ts +115 -0
  750. package/vendor/ink/node_modules/@types/node/web-globals/timers.d.ts +44 -0
  751. package/vendor/ink/node_modules/@types/node/web-globals/url.d.ts +24 -0
  752. package/vendor/ink/node_modules/@types/node/worker_threads.d.ts +717 -0
  753. package/vendor/ink/node_modules/@types/node/zlib.d.ts +618 -0
  754. package/vendor/ink/node_modules/node-pty/LICENSE +69 -0
  755. package/vendor/ink/node_modules/node-pty/README.md +164 -0
  756. package/vendor/ink/node_modules/node-pty/binding.gyp +150 -0
  757. package/vendor/ink/node_modules/node-pty/lib/conpty_console_list_agent.js +25 -0
  758. package/vendor/ink/node_modules/node-pty/lib/eventEmitter2.js +47 -0
  759. package/vendor/ink/node_modules/node-pty/lib/index.js +52 -0
  760. package/vendor/ink/node_modules/node-pty/lib/interfaces.js +7 -0
  761. package/vendor/ink/node_modules/node-pty/lib/shared/conout.js +11 -0
  762. package/vendor/ink/node_modules/node-pty/lib/terminal.js +190 -0
  763. package/vendor/ink/node_modules/node-pty/lib/types.js +7 -0
  764. package/vendor/ink/node_modules/node-pty/lib/unixTerminal.js +349 -0
  765. package/vendor/ink/node_modules/node-pty/lib/utils.js +39 -0
  766. package/vendor/ink/node_modules/node-pty/lib/windowsConoutConnection.js +125 -0
  767. package/vendor/ink/node_modules/node-pty/lib/windowsPtyAgent.js +287 -0
  768. package/vendor/ink/node_modules/node-pty/lib/windowsTerminal.js +201 -0
  769. package/vendor/ink/node_modules/node-pty/lib/worker/conoutSocketWorker.js +22 -0
  770. package/vendor/ink/node_modules/node-pty/package.json +65 -0
  771. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
  772. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
  773. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/pty.node +0 -0
  774. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
  775. package/vendor/ink/node_modules/node-pty/prebuilds/linux-arm64/pty.node +0 -0
  776. package/vendor/ink/node_modules/node-pty/prebuilds/linux-x64/pty.node +0 -0
  777. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  778. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  779. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  780. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.pdb +0 -0
  781. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  782. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
  783. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  784. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  785. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  786. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.pdb +0 -0
  787. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  788. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
  789. package/vendor/ink/node_modules/node-pty/scripts/post-install.js +76 -0
  790. package/vendor/ink/node_modules/node-pty/scripts/prebuild.js +34 -0
  791. package/vendor/ink/node_modules/node-pty/src/unix/pty.cc +875 -0
  792. package/vendor/ink/node_modules/node-pty/src/unix/spawn-helper.cc +23 -0
  793. package/vendor/ink/node_modules/node-pty/src/win/conpty.cc +582 -0
  794. package/vendor/ink/node_modules/node-pty/src/win/conpty.h +41 -0
  795. package/vendor/ink/node_modules/node-pty/src/win/conpty_console_list.cc +44 -0
  796. package/vendor/ink/node_modules/node-pty/src/win/path_util.cc +95 -0
  797. package/vendor/ink/node_modules/node-pty/src/win/path_util.h +26 -0
  798. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/OpenConsole.exe +0 -0
  799. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/conpty.dll +0 -0
  800. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/OpenConsole.exe +0 -0
  801. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/conpty.dll +0 -0
  802. package/vendor/ink/node_modules/node-pty/typings/node-pty.d.ts +215 -0
  803. package/vendor/ink/node_modules/undici-types/LICENSE +21 -0
  804. package/vendor/ink/node_modules/undici-types/README.md +6 -0
  805. package/vendor/ink/node_modules/undici-types/agent.d.ts +32 -0
  806. package/vendor/ink/node_modules/undici-types/api.d.ts +43 -0
  807. package/vendor/ink/node_modules/undici-types/balanced-pool.d.ts +30 -0
  808. package/vendor/ink/node_modules/undici-types/cache-interceptor.d.ts +173 -0
  809. package/vendor/ink/node_modules/undici-types/cache.d.ts +36 -0
  810. package/vendor/ink/node_modules/undici-types/client-stats.d.ts +15 -0
  811. package/vendor/ink/node_modules/undici-types/client.d.ts +108 -0
  812. package/vendor/ink/node_modules/undici-types/connector.d.ts +34 -0
  813. package/vendor/ink/node_modules/undici-types/content-type.d.ts +21 -0
  814. package/vendor/ink/node_modules/undici-types/cookies.d.ts +30 -0
  815. package/vendor/ink/node_modules/undici-types/diagnostics-channel.d.ts +74 -0
  816. package/vendor/ink/node_modules/undici-types/dispatcher.d.ts +276 -0
  817. package/vendor/ink/node_modules/undici-types/env-http-proxy-agent.d.ts +22 -0
  818. package/vendor/ink/node_modules/undici-types/errors.d.ts +161 -0
  819. package/vendor/ink/node_modules/undici-types/eventsource.d.ts +66 -0
  820. package/vendor/ink/node_modules/undici-types/fetch.d.ts +211 -0
  821. package/vendor/ink/node_modules/undici-types/formdata.d.ts +108 -0
  822. package/vendor/ink/node_modules/undici-types/global-dispatcher.d.ts +9 -0
  823. package/vendor/ink/node_modules/undici-types/global-origin.d.ts +7 -0
  824. package/vendor/ink/node_modules/undici-types/h2c-client.d.ts +73 -0
  825. package/vendor/ink/node_modules/undici-types/handlers.d.ts +15 -0
  826. package/vendor/ink/node_modules/undici-types/header.d.ts +160 -0
  827. package/vendor/ink/node_modules/undici-types/index.d.ts +88 -0
  828. package/vendor/ink/node_modules/undici-types/interceptors.d.ts +73 -0
  829. package/vendor/ink/node_modules/undici-types/mock-agent.d.ts +68 -0
  830. package/vendor/ink/node_modules/undici-types/mock-call-history.d.ts +111 -0
  831. package/vendor/ink/node_modules/undici-types/mock-client.d.ts +27 -0
  832. package/vendor/ink/node_modules/undici-types/mock-errors.d.ts +12 -0
  833. package/vendor/ink/node_modules/undici-types/mock-interceptor.d.ts +94 -0
  834. package/vendor/ink/node_modules/undici-types/mock-pool.d.ts +27 -0
  835. package/vendor/ink/node_modules/undici-types/package.json +55 -0
  836. package/vendor/ink/node_modules/undici-types/patch.d.ts +29 -0
  837. package/vendor/ink/node_modules/undici-types/pool-stats.d.ts +19 -0
  838. package/vendor/ink/node_modules/undici-types/pool.d.ts +41 -0
  839. package/vendor/ink/node_modules/undici-types/proxy-agent.d.ts +29 -0
  840. package/vendor/ink/node_modules/undici-types/readable.d.ts +68 -0
  841. package/vendor/ink/node_modules/undici-types/retry-agent.d.ts +8 -0
  842. package/vendor/ink/node_modules/undici-types/retry-handler.d.ts +125 -0
  843. package/vendor/ink/node_modules/undici-types/round-robin-pool.d.ts +41 -0
  844. package/vendor/ink/node_modules/undici-types/snapshot-agent.d.ts +109 -0
  845. package/vendor/ink/node_modules/undici-types/util.d.ts +18 -0
  846. package/vendor/ink/node_modules/undici-types/utility.d.ts +7 -0
  847. package/vendor/ink/node_modules/undici-types/webidl.d.ts +341 -0
  848. package/vendor/ink/node_modules/undici-types/websocket.d.ts +186 -0
  849. package/vendor/ink/package.json +201 -0
  850. package/vendor/ink/readme.md +2636 -0
  851. package/bin/swag-agent.js +0 -9
  852. package/dist/server/lib/pg-rate-limiter.d.ts +0 -21
  853. package/dist/server/lib/pg-rate-limiter.js +0 -86
@@ -7,511 +7,645 @@
7
7
  * - Monitors progress
8
8
  * - Synthesizes results
9
9
  */
10
+
10
11
  import { EventEmitter } from "events";
11
- import { createTeam, loadTeam, saveTeam, addTeammate, addTask, getTeamProgress, setTeamStatus, sendMessage, getUnreadMessages, markMessagesRead, failTask, updateTeammate, } from "./team-state.js";
12
+ import { createTeam, loadTeam, saveTeam, addTeammate, addTask, getTeamProgress, setTeamStatus, sendMessage, getUnreadMessages, markMessagesRead, failTask, updateTeammate } from "./team-state.js";
12
13
  import { spawnTeammate } from "./teammate.js";
13
- import { logSpan, generateTraceId, generateSpanId, getConversationId } from "./telemetry.js";
14
+ import { logSpan, generateTraceId, generateSpanId, getConversationId, PKG_VERSION } from "./telemetry.js";
14
15
  import { resolveConfig } from "./config-store.js";
15
16
  import { getGlobalEmitter } from "./agent-events.js";
17
+ import { AGENT_DEFAULTS } from "../../shared/agent-core.js";
18
+ import { loadCLIAgentConfig } from "./agent-config.js";
19
+ import { MODELS } from "../../shared/constants.js";
16
20
  import { getModelShortName } from "./agent-loop.js";
17
21
  import { decomposeTask, sanitizePrompts } from "./task-decomposer.js";
18
- import { callWithRetry } from "./api-retry.js";
22
+ import { loadServerToolDefinitions } from "./server-tools.js";
23
+
24
+ // ============================================================================
25
+ // TYPES
26
+ // ============================================================================
27
+
19
28
  // ============================================================================
20
29
  // TEAM LEAD CLASS
21
30
  // ============================================================================
22
- const TEAM_TIMEOUT_MS = 5 * 60 * 1000; // 5 min total
23
- const WORKER_STALL_MS = 2 * 60 * 1000; // 2 min no messages
31
+
32
+ let TEAM_TIMEOUT_MS = AGENT_DEFAULTS.teamTimeoutMs;
33
+ let WORKER_STALL_MS = AGENT_DEFAULTS.workerStallMs;
34
+ let TEAM_REVIEW_MAX_TOKENS = AGENT_DEFAULTS.teamReviewMaxTokens;
24
35
  export class TeamLead extends EventEmitter {
25
- teamId = null;
26
- workers = new Map();
27
- lastMessageTime = new Map();
28
- teamTimer = null;
29
- stallInterval = null;
30
- resolveTeam = null;
31
- traceId;
32
- spanId;
33
- startTime = 0;
34
- constructor() {
35
- super();
36
- this.traceId = generateTraceId();
37
- this.spanId = generateSpanId();
38
- }
39
- /**
40
- * Generate meaningful teammate names from task descriptions
41
- * Extracts key action words to create role-based names
42
- */
43
- generateTeammateNames(tasks, count) {
44
- const roles = [
45
- "Researcher", "Analyst", "Writer", "Reviewer",
46
- "Coordinator", "Specialist", "Explorer", "Synthesizer"
47
- ];
48
- // Extract keywords from task descriptions
49
- const names = [];
50
- const usedRoles = new Set();
51
- for (let i = 0; i < count; i++) {
52
- if (i < tasks.length) {
53
- const desc = tasks[i].description.toLowerCase();
54
- // Match task keywords to roles
55
- let role;
56
- if (desc.includes("research") || desc.includes("search") || desc.includes("find")) {
57
- role = "Researcher";
58
- }
59
- else if (desc.includes("analyze") || desc.includes("analysis") || desc.includes("review")) {
60
- role = "Analyst";
61
- }
62
- else if (desc.includes("write") || desc.includes("create") || desc.includes("draft")) {
63
- role = "Writer";
64
- }
65
- else if (desc.includes("compile") || desc.includes("combine") || desc.includes("synthesize")) {
66
- role = "Synthesizer";
67
- }
68
- else if (desc.includes("explore") || desc.includes("investigate")) {
69
- role = "Explorer";
70
- }
71
- else {
72
- // Use a generic role
73
- role = roles[i % roles.length];
74
- }
75
- // Avoid duplicate names by adding number if needed
76
- if (usedRoles.has(role)) {
77
- let suffix = 2;
78
- while (usedRoles.has(`${role} ${suffix}`))
79
- suffix++;
80
- role = `${role} ${suffix}`;
81
- }
82
- usedRoles.add(role);
83
- names.push(role);
84
- }
85
- else {
86
- // More teammates than tasks - use generic names
87
- names.push(roles[i % roles.length]);
88
- }
36
+ teamId = null;
37
+ workers = new Map();
38
+ lastMessageTime = new Map();
39
+ teamTimer = null;
40
+ stallInterval = null;
41
+ resolveTeam = null;
42
+ startTime = 0;
43
+ constructor() {
44
+ super();
45
+ this.traceId = generateTraceId();
46
+ this.spanId = generateSpanId();
47
+ }
48
+
49
+ /**
50
+ * Generate meaningful teammate names from task descriptions
51
+ * Extracts key action words to create role-based names
52
+ */
53
+ generateTeammateNames(tasks, count) {
54
+ const roles = ["Researcher", "Analyst", "Writer", "Reviewer", "Coordinator", "Specialist", "Explorer", "Synthesizer"];
55
+
56
+ // Extract keywords from task descriptions
57
+ const names = [];
58
+ const usedRoles = new Set();
59
+ for (let i = 0; i < count; i++) {
60
+ if (i < tasks.length) {
61
+ const desc = tasks[i].description.toLowerCase();
62
+
63
+ // Match task keywords to roles
64
+ let role;
65
+ if (desc.includes("research") || desc.includes("search") || desc.includes("find")) {
66
+ role = "Researcher";
67
+ } else if (desc.includes("analyze") || desc.includes("analysis") || desc.includes("review")) {
68
+ role = "Analyst";
69
+ } else if (desc.includes("write") || desc.includes("create") || desc.includes("draft")) {
70
+ role = "Writer";
71
+ } else if (desc.includes("compile") || desc.includes("combine") || desc.includes("synthesize")) {
72
+ role = "Synthesizer";
73
+ } else if (desc.includes("explore") || desc.includes("investigate")) {
74
+ role = "Explorer";
75
+ } else {
76
+ // Use a generic role
77
+ role = roles[i % roles.length];
89
78
  }
90
- return names;
79
+
80
+ // Avoid duplicate names by adding number if needed
81
+ if (usedRoles.has(role)) {
82
+ let suffix = 2;
83
+ while (usedRoles.has(`${role} ${suffix}`)) suffix++;
84
+ role = `${role} ${suffix}`;
85
+ }
86
+ usedRoles.add(role);
87
+ names.push(role);
88
+ } else {
89
+ // More teammates than tasks - use generic names
90
+ names.push(roles[i % roles.length]);
91
+ }
91
92
  }
92
- // ============================================================================
93
- // TEAM CREATION
94
- // ============================================================================
95
- async createTeam(config) {
96
- this.startTime = Date.now();
97
- // Create team
98
- const team = createTeam(config.name, "lead");
99
- this.teamId = team.id;
100
- this.emit("team_created", { teamId: team.id, name: config.name });
101
- // Emit to global emitter for UI
102
- const emitter = getGlobalEmitter();
103
- emitter.emitTeamStart(team.id, config.name, config.teammateCount, config.tasks.length);
104
- // Log team creation
105
- logSpan({
106
- action: "team.create",
107
- durationMs: 0,
108
- context: {
109
- traceId: this.traceId,
110
- spanId: this.spanId,
111
- conversationId: getConversationId(),
112
- source: "claude_code",
113
- serviceName: "whale-cli",
114
- serviceVersion: "2.1.0",
115
- },
116
- storeId: resolveConfig().storeId || undefined,
117
- details: {
118
- // Team identification (for blackops detection)
119
- is_team: true,
120
- is_team_coordinator: true,
121
- team_id: team.id,
122
- team_name: config.name,
123
- teammate_count: config.teammateCount,
124
- task_count: config.tasks.length,
125
- model: config.model || getModelShortName(),
126
- // Display metadata
127
- display_name: `Team: ${config.name}`,
128
- display_icon: "person.3.fill",
129
- display_color: "#10B981",
130
- },
93
+ return names;
94
+ }
95
+
96
+ // ============================================================================
97
+ // TEAM CREATION
98
+ // ============================================================================
99
+
100
+ async createTeam(config) {
101
+ this.startTime = Date.now();
102
+
103
+ // Create team
104
+ const team = createTeam(config.name, "lead");
105
+ this.teamId = team.id;
106
+ this.emit("team_created", {
107
+ teamId: team.id,
108
+ name: config.name
109
+ });
110
+
111
+ // Emit to global emitter for UI
112
+ const emitter = getGlobalEmitter();
113
+ emitter.emitTeamStart(team.id, config.name, config.teammateCount, config.tasks.length);
114
+
115
+ // Log team creation
116
+ logSpan({
117
+ action: "team.create",
118
+ durationMs: 0,
119
+ context: {
120
+ traceId: this.traceId,
121
+ spanId: this.spanId,
122
+ conversationId: getConversationId(),
123
+ source: "claude_code",
124
+ serviceName: "whale-cli",
125
+ serviceVersion: PKG_VERSION
126
+ },
127
+ storeId: resolveConfig().storeId || undefined,
128
+ details: {
129
+ // Team identification (for blackops detection)
130
+ is_team: true,
131
+ is_team_coordinator: true,
132
+ team_id: team.id,
133
+ team_name: config.name,
134
+ teammate_count: config.teammateCount,
135
+ task_count: config.tasks.length,
136
+ model: config.model || getModelShortName(),
137
+ // Display metadata
138
+ display_name: `Team: ${config.name}`,
139
+ display_icon: "person.3.fill",
140
+ display_color: "#10B981"
141
+ }
142
+ });
143
+
144
+ // Create tasks
145
+ const taskIdMap = new Map(); // description -> id
146
+ for (const taskConfig of config.tasks) {
147
+ const task = await addTask(team.id, {
148
+ description: taskConfig.description,
149
+ files: taskConfig.files,
150
+ model: taskConfig.model
151
+ });
152
+ if (task) {
153
+ taskIdMap.set(taskConfig.description, task.id);
154
+ this.emit("task_created", {
155
+ taskId: task.id,
156
+ description: taskConfig.description
131
157
  });
132
- // Create tasks
133
- const taskIdMap = new Map(); // description -> id
134
- for (const taskConfig of config.tasks) {
135
- const task = await addTask(team.id, {
136
- description: taskConfig.description,
137
- files: taskConfig.files,
138
- model: taskConfig.model,
139
- });
140
- if (task) {
141
- taskIdMap.set(taskConfig.description, task.id);
142
- this.emit("task_created", { taskId: task.id, description: taskConfig.description });
143
- }
144
- }
145
- // Set up dependencies (now that we have IDs)
146
- const freshTeam = loadTeam(team.id);
147
- for (const taskConfig of config.tasks) {
148
- if (taskConfig.dependencies?.length) {
149
- const task = freshTeam.tasks.find(t => t.description === taskConfig.description);
150
- if (task) {
151
- task.dependencies = taskConfig.dependencies
152
- .map(dep => taskIdMap.get(dep))
153
- .filter(Boolean);
154
- }
155
- }
158
+ }
159
+ }
160
+
161
+ // Set up dependencies (now that we have IDs)
162
+ const freshTeam = loadTeam(team.id);
163
+ for (const taskConfig of config.tasks) {
164
+ if (taskConfig.dependencies?.length) {
165
+ const task = freshTeam.tasks.find(t => t.description === taskConfig.description);
166
+ if (task) {
167
+ task.dependencies = taskConfig.dependencies.map(dep => taskIdMap.get(dep)).filter(Boolean);
156
168
  }
157
- saveTeam(freshTeam);
158
- // Create teammates with meaningful names
159
- const model = config.model || getModelShortName();
160
- // Generate teammate names from tasks if not provided
161
- const teammateNames = config.teammateNames || this.generateTeammateNames(config.tasks, config.teammateCount);
162
- for (let i = 0; i < config.teammateCount; i++) {
163
- const name = teammateNames[i] || `Agent ${i + 1}`;
164
- const id = `teammate-${i + 1}-${Date.now()}`;
165
- await addTeammate(team.id, {
166
- id,
167
- name,
168
- model,
169
- status: "idle",
170
- });
171
- this.emit("teammate_created", { teammateId: id, name });
169
+ }
170
+ }
171
+ saveTeam(freshTeam);
172
+
173
+ // Create teammates with meaningful names
174
+ const model = config.model || getModelShortName();
175
+
176
+ // Generate teammate names from tasks if not provided
177
+ const teammateNames = config.teammateNames || this.generateTeammateNames(config.tasks, config.teammateCount);
178
+ for (let i = 0; i < config.teammateCount; i++) {
179
+ const name = teammateNames[i] || `Agent ${i + 1}`;
180
+ const id = `teammate-${i + 1}-${Date.now()}`;
181
+ await addTeammate(team.id, {
182
+ id,
183
+ name,
184
+ model,
185
+ status: "idle"
186
+ });
187
+ this.emit("teammate_created", {
188
+ teammateId: id,
189
+ name
190
+ });
191
+ }
192
+ return team.id;
193
+ }
194
+
195
+ // ============================================================================
196
+ // TEAM EXECUTION
197
+ // ============================================================================
198
+
199
+ async runTeam() {
200
+ if (!this.teamId) {
201
+ throw new Error("No team created. Call createTeam first.");
202
+ }
203
+
204
+ // Resolve config from DB (single source of truth) before starting
205
+ const dbAgent = await loadCLIAgentConfig();
206
+ if (dbAgent?.context_config) {
207
+ const cc = dbAgent.context_config;
208
+ TEAM_TIMEOUT_MS = cc.team_timeout_ms ?? TEAM_TIMEOUT_MS;
209
+ WORKER_STALL_MS = cc.worker_stall_ms ?? WORKER_STALL_MS;
210
+ TEAM_REVIEW_MAX_TOKENS = cc.team_review_max_tokens ?? TEAM_REVIEW_MAX_TOKENS;
211
+ }
212
+ const team = loadTeam(this.teamId);
213
+ const cwd = process.cwd();
214
+ this.emit("team_started", {
215
+ teamId: this.teamId,
216
+ teammateCount: team.teammates.length
217
+ });
218
+
219
+ // Pre-load config and server tools ONCE — avoids N redundant DB/API calls from children.
220
+ // This is the main optimization for team launch speed (was 2-3 min, now seconds).
221
+ const [preloadedConfig, preloadedServerTools] = await Promise.all([loadCLIAgentConfig(), loadServerToolDefinitions().catch(() => [])]);
222
+
223
+ // Spawn ALL child processes in parallel (fork is fast, sequential await was wasteful)
224
+ const parentConversationId = getConversationId();
225
+ const spawned = await Promise.all(team.teammates.map(async teammate => ({
226
+ teammate,
227
+ child: await spawnTeammate(this.teamId, teammate.id, teammate.name, teammate.model, cwd, parentConversationId, team.name, preloadedConfig, preloadedServerTools)
228
+ })));
229
+
230
+ // Wire up IPC handlers after all processes are spawned
231
+ for (const {
232
+ teammate,
233
+ child
234
+ } of spawned) {
235
+ this.lastMessageTime.set(teammate.id, Date.now());
236
+
237
+ // Handle messages from child process via IPC
238
+ child.on("message", msg => {
239
+ this.lastMessageTime.set(msg.teammateId, Date.now());
240
+ this.handleTeammateMessage(msg);
241
+ });
242
+ child.on("error", err => {
243
+ this.emit("teammate_error", {
244
+ teammateId: teammate.id,
245
+ error: err.message
246
+ });
247
+ // Fail any in-progress task when child crashes
248
+ this.handleTeammateFailure(teammate.id, err.message);
249
+ });
250
+ child.on("exit", (code, signal) => {
251
+ if (code !== 0 && code !== null) {
252
+ this.emit("teammate_exit", {
253
+ teammateId: teammate.id,
254
+ code
255
+ });
256
+ // Fail any in-progress task on non-zero exit
257
+ this.handleTeammateFailure(teammate.id, `Process exited with code ${code}`);
258
+ } else if (signal) {
259
+ this.emit("teammate_exit", {
260
+ teammateId: teammate.id,
261
+ signal
262
+ });
263
+ this.handleTeammateFailure(teammate.id, `Process killed by signal ${signal}`);
172
264
  }
173
- return team.id;
265
+ this.workers.delete(teammate.id);
266
+ this.checkCompletion();
267
+ });
268
+ this.workers.set(teammate.id, child);
174
269
  }
175
- // ============================================================================
176
- // TEAM EXECUTION
177
- // ============================================================================
178
- async runTeam() {
179
- if (!this.teamId) {
180
- throw new Error("No team created. Call createTeam first.");
270
+
271
+ // Wait for all workers to complete — with adaptive timeout and stall detection
272
+ return new Promise(resolve => {
273
+ this.resolveTeam = resolve;
274
+ const cleanup = () => {
275
+ if (this.teamTimer) {
276
+ clearTimeout(this.teamTimer);
277
+ this.teamTimer = null;
181
278
  }
182
- const team = loadTeam(this.teamId);
183
- const cwd = process.cwd();
184
- this.emit("team_started", { teamId: this.teamId, teammateCount: team.teammates.length });
185
- // Spawn worker threads for each teammate
186
- const parentConversationId = getConversationId();
187
- for (const teammate of team.teammates) {
188
- const worker = await spawnTeammate(this.teamId, teammate.id, teammate.name, teammate.model, cwd, parentConversationId, team.name);
189
- this.lastMessageTime.set(teammate.id, Date.now());
190
- // Handle messages from worker
191
- worker.on("message", (msg) => {
192
- this.lastMessageTime.set(msg.teammateId, Date.now());
193
- this.handleTeammateMessage(msg);
194
- });
195
- worker.on("error", (err) => {
196
- this.emit("teammate_error", { teammateId: teammate.id, error: err.message });
197
- // Fail any in-progress task when worker crashes
198
- this.handleTeammateFailure(teammate.id, err.message);
199
- });
200
- worker.on("exit", (code) => {
201
- if (code !== 0) {
202
- this.emit("teammate_exit", { teammateId: teammate.id, code });
203
- // Fail any in-progress task on non-zero exit
204
- this.handleTeammateFailure(teammate.id, `Worker exited with code ${code}`);
205
- }
206
- this.workers.delete(teammate.id);
207
- this.checkCompletion();
208
- });
209
- this.workers.set(teammate.id, worker);
279
+ if (this.stallInterval) {
280
+ clearInterval(this.stallInterval);
281
+ this.stallInterval = null;
210
282
  }
211
- // Wait for all workers to complete — with timeout and stall detection
212
- return new Promise((resolve) => {
213
- this.resolveTeam = resolve;
214
- const cleanup = () => {
215
- if (this.teamTimer) {
216
- clearTimeout(this.teamTimer);
217
- this.teamTimer = null;
218
- }
219
- if (this.stallInterval) {
220
- clearInterval(this.stallInterval);
221
- this.stallInterval = null;
222
- }
223
- };
224
- const forceComplete = (reason) => {
225
- cleanup();
226
- this.resolveTeam = null; // Prevent double-resolve from checkCompletion
227
- // Terminate all remaining workers
228
- for (const [id, worker] of this.workers) {
229
- this.emit("teammate_timeout", { teammateId: id, reason });
230
- this.handleTeammateFailure(id, `Terminated: ${reason}`);
231
- worker.terminate();
232
- }
233
- this.workers.clear();
234
- if (this.teamId)
235
- setTeamStatus(this.teamId, "completed");
236
- resolve(this.buildResult());
237
- };
238
- // Global team timeout
239
- this.teamTimer = setTimeout(() => {
240
- if (this.workers.size > 0) {
241
- forceComplete(`Team timeout after ${TEAM_TIMEOUT_MS / 1000}s`);
242
- }
243
- }, TEAM_TIMEOUT_MS);
244
- // Stall detection — check every 15s for stalled workers
245
- this.stallInterval = setInterval(() => {
246
- if (this.workers.size === 0) {
247
- cleanup();
248
- return;
249
- }
250
- const now = Date.now();
251
- for (const [id, worker] of this.workers) {
252
- const lastMsg = this.lastMessageTime.get(id) || 0;
253
- if (now - lastMsg > WORKER_STALL_MS) {
254
- this.emit("teammate_timeout", { teammateId: id, reason: "stall" });
255
- this.handleTeammateFailure(id, `Worker stalled (no messages for ${WORKER_STALL_MS / 1000}s)`);
256
- worker.terminate();
257
- this.workers.delete(id);
258
- }
259
- }
260
- }, 15_000);
261
- });
262
- }
263
- // ============================================================================
264
- // MESSAGE HANDLING
265
- // ============================================================================
266
- handleTeammateMessage(msg) {
267
- const emitter = getGlobalEmitter();
268
- const team = this.teamId ? loadTeam(this.teamId) : null;
269
- const teammate = team?.teammates.find(t => t.id === msg.teammateId);
270
- const teammateName = teammate?.name || msg.teammateId;
271
- switch (msg.type) {
272
- case "progress":
273
- this.emit("teammate_progress", {
274
- teammateId: msg.teammateId,
275
- taskId: msg.taskId,
276
- content: msg.content,
277
- });
278
- // Emit to global emitter for UI
279
- if (this.teamId) {
280
- emitter.emitTeamProgress(this.teamId, msg.teammateId, teammateName, msg.content, msg.taskId);
281
- }
282
- break;
283
- case "task_started":
284
- this.emit("task_started", {
285
- teammateId: msg.teammateId,
286
- taskId: msg.taskId,
287
- content: msg.content,
288
- });
289
- // Emit to global emitter for UI
290
- if (this.teamId && msg.taskId) {
291
- emitter.emitTeamTask(this.teamId, msg.teammateId, msg.taskId, msg.content, "started");
292
- }
293
- break;
294
- case "task_completed":
295
- this.emit("task_completed", {
296
- teammateId: msg.teammateId,
297
- taskId: msg.taskId,
298
- content: msg.content,
299
- });
300
- // Emit to global emitter for UI
301
- if (this.teamId && msg.taskId) {
302
- emitter.emitTeamTask(this.teamId, msg.teammateId, msg.taskId, msg.content, "completed", msg.content);
303
- }
304
- break;
305
- case "message_sent":
306
- this.emit("message_sent", {
307
- teammateId: msg.teammateId,
308
- content: msg.content,
309
- });
310
- break;
311
- case "done": {
312
- this.emit("teammate_done", {
313
- teammateId: msg.teammateId,
314
- content: msg.content,
315
- tokensUsed: msg.tokensUsed,
316
- });
317
- // Emit UI event so TeamPanel shows "done" (overrides any prior "failed" from task errors)
318
- const teammateName = this.teamId
319
- ? loadTeam(this.teamId)?.teammates.find(t => t.id === msg.teammateId)?.name
320
- : undefined;
321
- emitter.emitTeamProgress(this.teamId, msg.teammateId, teammateName || msg.teammateId, "done");
322
- break;
283
+ };
284
+ const forceComplete = reason => {
285
+ cleanup();
286
+ this.resolveTeam = null; // Prevent double-resolve from checkCompletion
287
+ // Kill all remaining child processes
288
+ for (const [id, child] of this.workers) {
289
+ this.emit("teammate_timeout", {
290
+ teammateId: id,
291
+ reason
292
+ });
293
+ this.handleTeammateFailure(id, `Terminated: ${reason}`);
294
+ child.kill();
295
+ }
296
+ this.workers.clear();
297
+ if (this.teamId) setTeamStatus(this.teamId, "completed");
298
+ resolve(this.buildResult());
299
+ };
300
+
301
+ // No global team timeout (Claude Code parity) teams run until done.
302
+ // Per-worker stall detection (below) is the safety guard for hung processes.
303
+ // TEAM_TIMEOUT_MS > 0 enables optional adaptive timeout for server/workflow paths.
304
+ if (TEAM_TIMEOUT_MS > 0) {
305
+ const resetTeamTimer = () => {
306
+ if (this.teamTimer) clearTimeout(this.teamTimer);
307
+ this.teamTimer = setTimeout(() => {
308
+ if (this.workers.size > 0) {
309
+ forceComplete(`Team timeout (no progress for ${TEAM_TIMEOUT_MS / 1000}s)`);
323
310
  }
324
- case "error":
325
- this.emit("teammate_error", {
326
- teammateId: msg.teammateId,
327
- content: msg.content,
328
- });
329
- // Fail any in-progress task when teammate reports error
330
- this.handleTeammateFailure(msg.teammateId, msg.content);
331
- break;
311
+ }, TEAM_TIMEOUT_MS);
312
+ };
313
+ this.on("teammate_progress", () => resetTeamTimer());
314
+ this.on("task_started", () => resetTeamTimer());
315
+ this.on("task_completed", () => resetTeamTimer());
316
+ resetTeamTimer();
317
+ }
318
+
319
+ // Stall detection — check every 5s for stalled workers (was 15s, added up to 195s worst-case detection)
320
+ this.stallInterval = setInterval(() => {
321
+ if (this.workers.size === 0) {
322
+ cleanup();
323
+ return;
332
324
  }
333
- }
334
- // ============================================================================
335
- // FAILURE HANDLING
336
- // ============================================================================
337
- async handleTeammateFailure(teammateId, errorMessage) {
338
- if (!this.teamId)
339
- return;
340
- const team = loadTeam(this.teamId);
341
- if (!team)
342
- return;
343
- const teammate = team.teammates.find(t => t.id === teammateId);
344
- if (!teammate)
345
- return;
346
- // Find and fail the task this teammate was working on
347
- const inProgressTask = team.tasks.find(t => t.status === "in_progress" && t.assignedTo === teammateId);
348
- if (inProgressTask) {
349
- await failTask(this.teamId, inProgressTask.id, errorMessage);
350
- this.emit("task_failed", {
351
- teammateId,
352
- taskId: inProgressTask.id,
353
- error: errorMessage,
325
+ const now = Date.now();
326
+ for (const [id, child] of this.workers) {
327
+ const lastMsg = this.lastMessageTime.get(id) || 0;
328
+ if (now - lastMsg > WORKER_STALL_MS) {
329
+ this.emit("teammate_timeout", {
330
+ teammateId: id,
331
+ reason: "stall"
354
332
  });
355
- // Emit to global emitter for UI
356
- const emitter = getGlobalEmitter();
357
- emitter.emitTeamTask(this.teamId, teammateId, inProgressTask.id, inProgressTask.description, "failed", errorMessage);
333
+ this.handleTeammateFailure(id, `Process stalled (no messages for ${WORKER_STALL_MS / 1000}s)`);
334
+ child.kill();
335
+ this.workers.delete(id);
336
+ }
358
337
  }
359
- // Update teammate status (use "done" since "error" isn't a valid status)
360
- await updateTeammate(this.teamId, teammateId, {
361
- status: "done",
362
- currentTask: undefined,
338
+ }, 5_000);
339
+ });
340
+ }
341
+
342
+ // ============================================================================
343
+ // MESSAGE HANDLING
344
+ // ============================================================================
345
+
346
+ handleTeammateMessage(msg) {
347
+ const emitter = getGlobalEmitter();
348
+ const team = this.teamId ? loadTeam(this.teamId) : null;
349
+ const teammate = team?.teammates.find(t => t.id === msg.teammateId);
350
+ const teammateName = teammate?.name || msg.teammateId;
351
+ switch (msg.type) {
352
+ case "progress":
353
+ this.emit("teammate_progress", {
354
+ teammateId: msg.teammateId,
355
+ taskId: msg.taskId,
356
+ content: msg.content
363
357
  });
364
- }
365
- // ============================================================================
366
- // COMPLETION
367
- // ============================================================================
368
- checkCompletion() {
369
- if (this.workers.size === 0 && this.teamId) {
370
- // Clean up timers
371
- if (this.teamTimer) {
372
- clearTimeout(this.teamTimer);
373
- this.teamTimer = null;
374
- }
375
- if (this.stallInterval) {
376
- clearInterval(this.stallInterval);
377
- this.stallInterval = null;
378
- }
379
- setTeamStatus(this.teamId, "completed");
380
- this.emit("team_completed", { teamId: this.teamId });
381
- // Resolve the runTeam() promise
382
- if (this.resolveTeam) {
383
- this.resolveTeam(this.buildResult());
384
- this.resolveTeam = null;
385
- }
358
+ // Emit to global emitter for UI
359
+ if (this.teamId) {
360
+ emitter.emitTeamProgress(this.teamId, msg.teammateId, teammateName, msg.content, msg.taskId);
386
361
  }
387
- }
388
- buildResult() {
389
- if (!this.teamId) {
390
- return {
391
- success: false,
392
- teamId: "",
393
- summary: "No team created",
394
- taskResults: [],
395
- tokensUsed: { input: 0, output: 0 },
396
- durationMs: Date.now() - this.startTime,
397
- };
362
+ break;
363
+ case "task_started":
364
+ this.emit("task_started", {
365
+ teammateId: msg.teammateId,
366
+ taskId: msg.taskId,
367
+ content: msg.content
368
+ });
369
+ // Emit to global emitter for UI
370
+ if (this.teamId && msg.taskId) {
371
+ emitter.emitTeamTask(this.teamId, msg.teammateId, msg.taskId, msg.content, "started");
372
+ }
373
+ break;
374
+ case "task_completed":
375
+ this.emit("task_completed", {
376
+ teammateId: msg.teammateId,
377
+ taskId: msg.taskId,
378
+ content: msg.content
379
+ });
380
+ // Emit to global emitter for UI
381
+ if (this.teamId && msg.taskId) {
382
+ emitter.emitTeamTask(this.teamId, msg.teammateId, msg.taskId, msg.content, "completed", msg.content);
398
383
  }
399
- const team = loadTeam(this.teamId);
400
- const progress = getTeamProgress(team);
401
- // Calculate total tokens
402
- let totalIn = 0;
403
- let totalOut = 0;
404
- for (const teammate of team.teammates) {
405
- totalIn += teammate.tokensUsed.input;
406
- totalOut += teammate.tokensUsed.output;
384
+ break;
385
+ case "message_sent":
386
+ this.emit("message_sent", {
387
+ teammateId: msg.teammateId,
388
+ content: msg.content
389
+ });
390
+ break;
391
+ case "done":
392
+ {
393
+ this.emit("teammate_done", {
394
+ teammateId: msg.teammateId,
395
+ content: msg.content,
396
+ tokensUsed: msg.tokensUsed
397
+ });
398
+ // Emit UI event so TeamPanel shows "done" (overrides any prior "failed" from task errors)
399
+ const teammateName = this.teamId ? loadTeam(this.teamId)?.teammates.find(t => t.id === msg.teammateId)?.name : undefined;
400
+ emitter.emitTeamProgress(this.teamId, msg.teammateId, teammateName || msg.teammateId, "done");
401
+ break;
407
402
  }
408
- // Build task results
409
- const taskResults = team.tasks.map(t => ({
410
- description: t.description,
411
- result: t.result || t.error || "Not completed",
412
- status: t.status === "completed" ? "completed" : "failed",
413
- }));
414
- const durationMs = Date.now() - this.startTime;
415
- const success = progress.blocked === 0 && progress.completed === progress.total;
416
- // Log team completion
417
- logSpan({
418
- action: "team.complete",
419
- durationMs,
420
- context: {
421
- traceId: this.traceId,
422
- spanId: generateSpanId(),
423
- parentSpanId: this.spanId,
424
- source: "claude_code",
425
- serviceName: "whale-cli",
426
- serviceVersion: "2.1.0",
427
- inputTokens: totalIn,
428
- outputTokens: totalOut,
429
- },
430
- storeId: resolveConfig().storeId || undefined,
431
- details: {
432
- // Team identification (for blackops detection)
433
- is_team: true,
434
- is_team_coordinator: true,
435
- team_id: this.teamId,
436
- team_name: team.name,
437
- // Metrics
438
- tasks_total: progress.total,
439
- tasks_completed: progress.completed,
440
- tasks_failed: progress.blocked,
441
- teammates: team.teammates.length,
442
- percent_complete: progress.percentComplete,
443
- // Display metadata
444
- display_name: `Team Complete: ${team.name}`,
445
- display_icon: "checkmark.circle.fill",
446
- display_color: success ? "#10B981" : "#EF4444",
447
- },
403
+ case "error":
404
+ this.emit("teammate_error", {
405
+ teammateId: msg.teammateId,
406
+ content: msg.content
448
407
  });
449
- // Emit team done to global emitter for UI
450
- const emitter = getGlobalEmitter();
451
- emitter.emitTeamDone(this.teamId, success, `${progress.completed}/${progress.total} tasks completed`, progress.completed, progress.total, { input: totalIn, output: totalOut }, durationMs);
452
- return {
453
- success,
454
- teamId: this.teamId,
455
- summary: `${progress.completed}/${progress.total} tasks completed (${progress.percentComplete}%)`,
456
- taskResults,
457
- tokensUsed: { input: totalIn, output: totalOut },
458
- durationMs,
459
- };
408
+ // Fail any in-progress task when teammate reports error
409
+ this.handleTeammateFailure(msg.teammateId, msg.content);
410
+ break;
460
411
  }
461
- // ============================================================================
462
- // CONTROL METHODS
463
- // ============================================================================
464
- async sendToTeammate(teammateId, message) {
465
- if (!this.teamId)
466
- return false;
467
- const result = await sendMessage(this.teamId, "lead", teammateId, message);
468
- return !!result;
412
+ }
413
+
414
+ // ============================================================================
415
+ // FAILURE HANDLING
416
+ // ============================================================================
417
+
418
+ async handleTeammateFailure(teammateId, errorMessage) {
419
+ if (!this.teamId) return;
420
+ const team = loadTeam(this.teamId);
421
+ if (!team) return;
422
+ const teammate = team.teammates.find(t => t.id === teammateId);
423
+ if (!teammate) return;
424
+
425
+ // Find and fail the task this teammate was working on
426
+ const inProgressTask = team.tasks.find(t => t.status === "in_progress" && t.assignedTo === teammateId);
427
+ if (inProgressTask) {
428
+ await failTask(this.teamId, inProgressTask.id, errorMessage);
429
+ this.emit("task_failed", {
430
+ teammateId,
431
+ taskId: inProgressTask.id,
432
+ error: errorMessage
433
+ });
434
+
435
+ // Emit to global emitter for UI
436
+ const emitter = getGlobalEmitter();
437
+ emitter.emitTeamTask(this.teamId, teammateId, inProgressTask.id, inProgressTask.description, "failed", errorMessage);
469
438
  }
470
- async broadcast(message) {
471
- if (!this.teamId)
472
- return false;
473
- const result = await sendMessage(this.teamId, "lead", "all", message);
474
- return !!result;
439
+
440
+ // Update teammate status (use "done" since "error" isn't a valid status)
441
+ await updateTeammate(this.teamId, teammateId, {
442
+ status: "done",
443
+ currentTask: undefined
444
+ });
445
+ }
446
+
447
+ // ============================================================================
448
+ // COMPLETION
449
+ // ============================================================================
450
+
451
+ checkCompletion() {
452
+ if (this.workers.size === 0 && this.teamId) {
453
+ // Clean up timers
454
+ if (this.teamTimer) {
455
+ clearTimeout(this.teamTimer);
456
+ this.teamTimer = null;
457
+ }
458
+ if (this.stallInterval) {
459
+ clearInterval(this.stallInterval);
460
+ this.stallInterval = null;
461
+ }
462
+ setTeamStatus(this.teamId, "completed");
463
+ this.emit("team_completed", {
464
+ teamId: this.teamId
465
+ });
466
+ // Resolve the runTeam() promise
467
+ if (this.resolveTeam) {
468
+ this.resolveTeam(this.buildResult());
469
+ this.resolveTeam = null;
470
+ }
475
471
  }
476
- async getMessages() {
477
- if (!this.teamId)
478
- return [];
479
- const messages = await getUnreadMessages(this.teamId, "lead");
480
- if (messages.length > 0) {
481
- await markMessagesRead(this.teamId, messages.map(m => m.id));
482
- }
483
- return messages.map(m => ({ from: m.from, content: m.content }));
472
+ }
473
+ buildResult() {
474
+ if (!this.teamId) {
475
+ return {
476
+ success: false,
477
+ teamId: "",
478
+ summary: "No team created",
479
+ taskResults: [],
480
+ tokensUsed: {
481
+ input: 0,
482
+ output: 0
483
+ },
484
+ durationMs: Date.now() - this.startTime
485
+ };
484
486
  }
485
- getProgress() {
486
- if (!this.teamId)
487
- return null;
488
- const team = loadTeam(this.teamId);
489
- if (!team)
490
- return null;
491
- return getTeamProgress(team);
487
+ const team = loadTeam(this.teamId);
488
+ const progress = getTeamProgress(team);
489
+
490
+ // Calculate total tokens
491
+ let totalIn = 0;
492
+ let totalOut = 0;
493
+ for (const teammate of team.teammates) {
494
+ totalIn += teammate.tokensUsed.input;
495
+ totalOut += teammate.tokensUsed.output;
492
496
  }
493
- stop() {
494
- // Terminate all workers
495
- for (const [id, worker] of this.workers) {
496
- worker.terminate();
497
- this.emit("teammate_stopped", { teammateId: id });
498
- }
499
- this.workers.clear();
500
- if (this.teamId) {
501
- setTeamStatus(this.teamId, "failed");
502
- }
497
+
498
+ // Build task results
499
+ const taskResults = team.tasks.map(t => ({
500
+ description: t.description,
501
+ result: t.result || t.error || "Not completed",
502
+ status: t.status === "completed" ? "completed" : "failed"
503
+ }));
504
+ const durationMs = Date.now() - this.startTime;
505
+ const success = progress.blocked === 0 && progress.completed === progress.total;
506
+
507
+ // Log team completion
508
+ logSpan({
509
+ action: "team.complete",
510
+ durationMs,
511
+ context: {
512
+ traceId: this.traceId,
513
+ spanId: generateSpanId(),
514
+ parentSpanId: this.spanId,
515
+ source: "claude_code",
516
+ serviceName: "whale-cli",
517
+ serviceVersion: PKG_VERSION,
518
+ inputTokens: totalIn,
519
+ outputTokens: totalOut
520
+ },
521
+ storeId: resolveConfig().storeId || undefined,
522
+ details: {
523
+ // Team identification (for blackops detection)
524
+ is_team: true,
525
+ is_team_coordinator: true,
526
+ team_id: this.teamId,
527
+ team_name: team.name,
528
+ // Metrics
529
+ tasks_total: progress.total,
530
+ tasks_completed: progress.completed,
531
+ tasks_failed: progress.blocked,
532
+ teammates: team.teammates.length,
533
+ percent_complete: progress.percentComplete,
534
+ // Display metadata
535
+ display_name: `Team Complete: ${team.name}`,
536
+ display_icon: "checkmark.circle.fill",
537
+ display_color: success ? "#10B981" : "#EF4444"
538
+ }
539
+ });
540
+
541
+ // Emit team done to global emitter for UI
542
+ const emitter = getGlobalEmitter();
543
+ emitter.emitTeamDone(this.teamId, success, `${progress.completed}/${progress.total} tasks completed`, progress.completed, progress.total, {
544
+ input: totalIn,
545
+ output: totalOut
546
+ }, durationMs);
547
+ return {
548
+ success,
549
+ teamId: this.teamId,
550
+ summary: `${progress.completed}/${progress.total} tasks completed (${progress.percentComplete}%)`,
551
+ taskResults,
552
+ tokensUsed: {
553
+ input: totalIn,
554
+ output: totalOut
555
+ },
556
+ durationMs
557
+ };
558
+ }
559
+
560
+ // ============================================================================
561
+ // CONTROL METHODS
562
+ // ============================================================================
563
+
564
+ async sendToTeammate(teammateId, message) {
565
+ if (!this.teamId) return false;
566
+ const result = await sendMessage(this.teamId, "lead", teammateId, message);
567
+ return !!result;
568
+ }
569
+ async broadcast(message) {
570
+ if (!this.teamId) return false;
571
+ const result = await sendMessage(this.teamId, "lead", "all", message);
572
+ return !!result;
573
+ }
574
+ async getMessages() {
575
+ if (!this.teamId) return [];
576
+ const messages = await getUnreadMessages(this.teamId, "lead");
577
+ if (messages.length > 0) {
578
+ await markMessagesRead(this.teamId, messages.map(m => m.id));
503
579
  }
580
+ return messages.map(m => ({
581
+ from: m.from,
582
+ content: m.content
583
+ }));
584
+ }
585
+ getProgress() {
586
+ if (!this.teamId) return null;
587
+ const team = loadTeam(this.teamId);
588
+ if (!team) return null;
589
+ return getTeamProgress(team);
590
+ }
591
+ stop() {
592
+ // Kill all child processes
593
+ for (const [id, child] of this.workers) {
594
+ child.kill();
595
+ this.emit("teammate_stopped", {
596
+ teammateId: id
597
+ });
598
+ }
599
+ this.workers.clear();
600
+ if (this.teamId) {
601
+ setTeamStatus(this.teamId, "failed");
602
+ }
603
+
604
+ // Clean up timers
605
+ if (this.teamTimer) {
606
+ clearTimeout(this.teamTimer);
607
+ this.teamTimer = null;
608
+ }
609
+ if (this.stallInterval) {
610
+ clearInterval(this.stallInterval);
611
+ this.stallInterval = null;
612
+ }
613
+
614
+ // Resolve the runTeam() promise to prevent hang
615
+ if (this.resolveTeam) {
616
+ this.resolveTeam(this.buildResult());
617
+ this.resolveTeam = null;
618
+ }
619
+ }
504
620
  }
621
+
505
622
  // ============================================================================
506
623
  // CONVENIENCE FUNCTION
507
624
  // ============================================================================
508
- export async function runAgentTeam(config) {
509
- const lead = new TeamLead();
510
- // Events are handled via global emitter -> ChatApp UI
511
- // No stderr writes here to avoid interfering with Ink rendering
512
- await lead.createTeam(config);
513
- return lead.runTeam();
625
+
626
+ export async function runAgentTeam(config, signal) {
627
+ const lead = new TeamLead();
628
+ // Events are handled via global emitter -> ChatApp UI
629
+ // No stderr writes here to avoid interfering with Ink rendering
630
+ await lead.createTeam(config);
631
+
632
+ // Wire signal to stop the team on abort (ESC)
633
+ if (signal) {
634
+ if (signal.aborted) {
635
+ lead.stop();
636
+ return lead["buildResult"]();
637
+ }
638
+ signal.addEventListener("abort", () => lead.stop(), {
639
+ once: true
640
+ });
641
+ }
642
+ return lead.runTeam();
514
643
  }
644
+
645
+ // ============================================================================
646
+ // AUTO-DECOMPOSE + REVIEW
647
+ // ============================================================================
648
+
515
649
  /**
516
650
  * Auto-decompose a task into sub-tasks and run them as a team.
517
651
  *
@@ -520,73 +654,137 @@ export async function runAgentTeam(config) {
520
654
  * a lightweight review pass to summarize results and flag issues.
521
655
  */
522
656
  export async function runAutoTeam(task, opts = {}) {
523
- const maxTeammates = opts.maxTeammates ?? 4;
524
- const model = opts.model || "sonnet";
525
- const workingDirectory = opts.workingDirectory || process.cwd();
526
- const shouldReview = opts.review !== false;
527
- // 1. Decompose
528
- const decomposition = await decomposeTask(task, {
529
- maxCells: maxTeammates,
530
- apiKey: opts.apiKey,
531
- workingDirectory,
532
- });
533
- // 2. Sanitize prompts
534
- const warnings = sanitizePrompts(decomposition.sub_tasks);
535
- if (warnings.length > 0) {
536
- console.warn(`[team] Sanitization warnings:\n${warnings.join("\n")}`);
537
- }
538
- // 3. Map sub-tasks to TeamConfig
539
- const tasks = decomposition.sub_tasks.map(st => ({
540
- description: st.prompt,
541
- files: extractFiles(st.prompt),
542
- }));
543
- const config = {
544
- name: decomposition.summary.slice(0, 60) || "Auto Team",
545
- teammateCount: tasks.length,
546
- model,
547
- tasks,
657
+ const maxTeammates = opts.maxTeammates ?? 4;
658
+ const model = opts.model || "sonnet";
659
+ const workingDirectory = opts.workingDirectory || process.cwd();
660
+ const shouldReview = opts.review !== false;
661
+
662
+ // 1. Decompose
663
+ const decomposition = await decomposeTask(task, {
664
+ maxCells: maxTeammates,
665
+ workingDirectory
666
+ });
667
+
668
+ // 2. Sanitize prompts
669
+ const warnings = sanitizePrompts(decomposition.sub_tasks);
670
+ if (warnings.length > 0) {
671
+ console.warn(`[team] Sanitization warnings:\n${warnings.join("\n")}`);
672
+ }
673
+
674
+ // 3. Map sub-tasks to TeamConfig (pre-embed reference file content)
675
+ const tasks = await Promise.all(decomposition.sub_tasks.map(async st => {
676
+ const files = extractFiles(st.prompt);
677
+ const embedded = await preReadFiles(files, workingDirectory);
678
+ return {
679
+ description: st.prompt + embedded,
680
+ files
548
681
  };
549
- // 4. Run team
550
- const result = await runAgentTeam(config);
551
- // 5. Optional review
552
- let review;
553
- if (shouldReview && result.taskResults.length > 0) {
554
- review = await reviewResults(task, result, opts.apiKey);
555
- }
556
- return { ...result, review, warnings: warnings.length > 0 ? warnings : undefined };
682
+ }));
683
+ const config = {
684
+ name: decomposition.summary.slice(0, 60) || "Auto Team",
685
+ teammateCount: tasks.length,
686
+ model,
687
+ tasks
688
+ };
689
+
690
+ // 4. Run team
691
+ const result = await runAgentTeam(config, opts.signal);
692
+
693
+ // 5. Optional review
694
+ let review;
695
+ if (shouldReview && result.taskResults.length > 0) {
696
+ review = await reviewResults(task, result);
697
+ }
698
+ return {
699
+ ...result,
700
+ review,
701
+ warnings: warnings.length > 0 ? warnings : undefined
702
+ };
557
703
  }
704
+
558
705
  /** Extract file paths mentioned in a sub-task prompt. */
559
706
  function extractFiles(prompt) {
560
- const matches = prompt.match(/(?:^|\s)((?:src|lib|app|pages|components|test|spec|public)\/[\w./-]+)/gm);
561
- return matches ? [...new Set(matches.map(m => m.trim()))] : [];
707
+ const matches = prompt.match(/(?:^|\s)((?:src|lib|app|pages|components|test|spec|public)\/[\w./-]+)/gm);
708
+ return matches ? [...new Set(matches.map(m => m.trim()))] : [];
562
709
  }
563
- /** Lightweight review of team results using Claude haiku. */
564
- async function reviewResults(originalTask, result, apiKey) {
565
- const key = apiKey || process.env.ANTHROPIC_API_KEY;
566
- if (!key)
567
- return undefined;
710
+ const MAX_FILE_PREVIEW_CHARS = 2000; // Per file
711
+ const MAX_TOTAL_EMBED_CHARS = 8000; // Per task
712
+
713
+ /** Pre-read files mentioned in task prompts and return their content for embedding. */
714
+ async function preReadFiles(files, cwd) {
715
+ if (files.length === 0) return "";
716
+ const {
717
+ readFileSync,
718
+ statSync
719
+ } = await import("fs");
720
+ const {
721
+ join
722
+ } = await import("path");
723
+ const sections = [];
724
+ let totalChars = 0;
725
+ for (const file of files) {
726
+ if (totalChars >= MAX_TOTAL_EMBED_CHARS) break;
727
+ const fullPath = file.startsWith("/") ? file : join(cwd, file);
568
728
  try {
569
- const Anthropic = (await import("@anthropic-ai/sdk")).default;
570
- const client = new Anthropic({ apiKey: key });
571
- const taskSummaries = result.taskResults
572
- .map((t, i) => `Task ${i + 1} [${t.status}]: ${t.description.slice(0, 100)}\nResult: ${t.result.slice(0, 200)}`)
573
- .join("\n\n");
574
- const response = await callWithRetry(() => client.messages.create({
575
- model: "claude-haiku-4-5-20251001",
576
- max_tokens: 1024,
577
- system: "You are a code review assistant. Given the original task and the results from parallel agents, provide a brief (2-4 sentence) assessment: were the goals met? Any conflicts or gaps between agents' work? Any follow-up needed?",
578
- messages: [{
579
- role: "user",
580
- content: `Original task: ${originalTask}\n\nTeam results (${result.taskResults.length} agents):\n${taskSummaries}`,
581
- }],
582
- }), { label: "team-review", maxRetries: 1 });
583
- const text = response.content
584
- .filter((b) => b.type === "text")
585
- .map((b) => b.text)
586
- .join("");
587
- return text || undefined;
588
- }
589
- catch {
590
- return undefined;
729
+ const stat = statSync(fullPath);
730
+ if (!stat.isFile() || stat.size > 50_000) continue; // Skip dirs and huge files
731
+ const content = readFileSync(fullPath, "utf-8");
732
+ const preview = content.slice(0, MAX_FILE_PREVIEW_CHARS);
733
+ const truncated = preview.length < content.length ? "\n... (truncated)" : "";
734
+ sections.push(`### ${file}\n\`\`\`\n${preview}${truncated}\n\`\`\``);
735
+ totalChars += preview.length;
736
+ } catch {
737
+ // File doesn't exist or can't be read skip silently
591
738
  }
739
+ }
740
+ if (sections.length === 0) return "";
741
+ return `\n\n## Reference Files (pre-loaded — no need to re-read these)\n${sections.join("\n\n")}`;
742
+ }
743
+
744
+ /** Lightweight review of team results using Claude haiku via proxy. */
745
+ async function reviewResults(originalTask, result) {
746
+ const {
747
+ getValidToken
748
+ } = await import("./auth-service.js");
749
+ const {
750
+ getProxyUrl
751
+ } = await import("./config-store.js");
752
+ const {
753
+ callServerProxy,
754
+ buildAPIRequest
755
+ } = await import("../../shared/api-client.js");
756
+ const {
757
+ parseSSEStream,
758
+ collectStreamResult
759
+ } = await import("../../shared/sse-parser.js");
760
+ const token = await getValidToken();
761
+ if (!token) return undefined;
762
+ try {
763
+ const taskSummaries = result.taskResults.map((t, i) => `Task ${i + 1} [${t.status}]: ${t.description.slice(0, 100)}\nResult: ${t.result.slice(0, 200)}`).join("\n\n");
764
+ const apiConfig = buildAPIRequest({
765
+ model: MODELS.HAIKU,
766
+ contextProfile: "subagent"
767
+ });
768
+ const stream = await callServerProxy({
769
+ proxyUrl: getProxyUrl(),
770
+ token,
771
+ model: MODELS.HAIKU,
772
+ system: [{
773
+ type: "text",
774
+ text: "You are a code review assistant. Given the original task and the results from parallel agents, provide a brief (2-4 sentence) assessment: were the goals met? Any conflicts or gaps between agents' work? Any follow-up needed?"
775
+ }],
776
+ messages: [{
777
+ role: "user",
778
+ content: `Original task: ${originalTask}\n\nTeam results (${result.taskResults.length} agents):\n${taskSummaries}`
779
+ }],
780
+ tools: [],
781
+ apiConfig,
782
+ timeoutMs: 15_000
783
+ });
784
+ const collected = await collectStreamResult(parseSSEStream(stream));
785
+ return collected.text || undefined;
786
+ } catch {
787
+ return undefined;
788
+ }
592
789
  }
790
+ //# sourceMappingURL=team-lead.js.map