whale-code 6.5.5 → 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 (847) 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 +5 -1
  73. package/dist/cli/services/agent-config.js +66 -36
  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 +976 -688
  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.js +187 -169
  107. package/dist/cli/services/error-logger.js.map +1 -0
  108. package/dist/cli/services/file-history.d.ts +1 -1
  109. package/dist/cli/services/file-history.js +50 -54
  110. package/dist/cli/services/file-history.js.map +1 -0
  111. package/dist/cli/services/format-server-response.js +332 -372
  112. package/dist/cli/services/format-server-response.js.map +1 -0
  113. package/dist/cli/services/git-context.js +61 -45
  114. package/dist/cli/services/git-context.js.map +1 -0
  115. package/dist/cli/services/hooks.d.ts +2 -2
  116. package/dist/cli/services/hooks.js +195 -180
  117. package/dist/cli/services/hooks.js.map +1 -0
  118. package/dist/cli/services/ink-incremental.d.ts +19 -0
  119. package/dist/cli/services/ink-incremental.js +59 -0
  120. package/dist/cli/services/ink-incremental.js.map +1 -0
  121. package/dist/cli/services/ink-resize-fix.js +54 -44
  122. package/dist/cli/services/ink-resize-fix.js.map +1 -0
  123. package/dist/cli/services/ink-sync-output.d.ts +12 -0
  124. package/dist/cli/services/ink-sync-output.js +16 -0
  125. package/dist/cli/services/ink-sync-output.js.map +1 -0
  126. package/dist/cli/services/interactive-tools.js +268 -212
  127. package/dist/cli/services/interactive-tools.js.map +1 -0
  128. package/dist/cli/services/keybinding-manager.d.ts +11 -1
  129. package/dist/cli/services/keybinding-manager.js +126 -63
  130. package/dist/cli/services/keybinding-manager.js.map +1 -0
  131. package/dist/cli/services/local-tools.d.ts +1 -1
  132. package/dist/cli/services/local-tools.js +939 -656
  133. package/dist/cli/services/local-tools.js.map +1 -0
  134. package/dist/cli/services/lsp-manager.js +757 -594
  135. package/dist/cli/services/lsp-manager.js.map +1 -0
  136. package/dist/cli/services/mcp-client.d.ts +1 -1
  137. package/dist/cli/services/mcp-client.js +173 -134
  138. package/dist/cli/services/mcp-client.js.map +1 -0
  139. package/dist/cli/services/memory-manager.js +53 -40
  140. package/dist/cli/services/memory-manager.js.map +1 -0
  141. package/dist/cli/services/model-manager.js +55 -40
  142. package/dist/cli/services/model-manager.js.map +1 -0
  143. package/dist/cli/services/model-router.js +115 -85
  144. package/dist/cli/services/model-router.js.map +1 -0
  145. package/dist/cli/services/paths.d.ts +30 -0
  146. package/dist/cli/services/paths.js +81 -0
  147. package/dist/cli/services/paths.js.map +1 -0
  148. package/dist/cli/services/permission-modes.js +32 -25
  149. package/dist/cli/services/permission-modes.js.map +1 -0
  150. package/dist/cli/services/rewind.js +182 -168
  151. package/dist/cli/services/rewind.js.map +1 -0
  152. package/dist/cli/services/ripgrep.js +115 -115
  153. package/dist/cli/services/ripgrep.js.map +1 -0
  154. package/dist/cli/services/sandbox.d.ts +1 -1
  155. package/dist/cli/services/sandbox.js +58 -37
  156. package/dist/cli/services/sandbox.js.map +1 -0
  157. package/dist/cli/services/server-tools.js +738 -565
  158. package/dist/cli/services/server-tools.js.map +1 -0
  159. package/dist/cli/services/session-persistence.js +69 -74
  160. package/dist/cli/services/session-persistence.js.map +1 -0
  161. package/dist/cli/services/subagent-worker.js +42 -27
  162. package/dist/cli/services/subagent-worker.js.map +1 -0
  163. package/dist/cli/services/subagent.d.ts +2 -0
  164. package/dist/cli/services/subagent.js +605 -433
  165. package/dist/cli/services/subagent.js.map +1 -0
  166. package/dist/cli/services/system-prompt.js +86 -78
  167. package/dist/cli/services/system-prompt.js.map +1 -0
  168. package/dist/cli/services/task-decomposer.d.ts +1 -1
  169. package/dist/cli/services/task-decomposer.js +172 -139
  170. package/dist/cli/services/task-decomposer.js.map +1 -0
  171. package/dist/cli/services/team-lead.d.ts +2 -2
  172. package/dist/cli/services/team-lead.js +727 -529
  173. package/dist/cli/services/team-lead.js.map +1 -0
  174. package/dist/cli/services/team-state.js +319 -319
  175. package/dist/cli/services/team-state.js.map +1 -0
  176. package/dist/cli/services/teammate.d.ts +8 -2
  177. package/dist/cli/services/teammate.js +857 -569
  178. package/dist/cli/services/teammate.js.map +1 -0
  179. package/dist/cli/services/telemetry.d.ts +6 -1
  180. package/dist/cli/services/telemetry.js +180 -157
  181. package/dist/cli/services/telemetry.js.map +1 -0
  182. package/dist/cli/services/tools/agent-tools.d.ts +3 -3
  183. package/dist/cli/services/tools/agent-tools.js +480 -322
  184. package/dist/cli/services/tools/agent-tools.js.map +1 -0
  185. package/dist/cli/services/tools/file-ops.js +563 -450
  186. package/dist/cli/services/tools/file-ops.js.map +1 -0
  187. package/dist/cli/services/tools/search-tools.js +231 -162
  188. package/dist/cli/services/tools/search-tools.js.map +1 -0
  189. package/dist/cli/services/tools/shell-exec.js +197 -151
  190. package/dist/cli/services/tools/shell-exec.js.map +1 -0
  191. package/dist/cli/services/tools/task-manager.js +206 -173
  192. package/dist/cli/services/tools/task-manager.js.map +1 -0
  193. package/dist/cli/services/tools/web-tools.js +388 -341
  194. package/dist/cli/services/tools/web-tools.js.map +1 -0
  195. package/dist/cli/setup/SetupApp.d.ts +2 -2
  196. package/dist/cli/setup/SetupApp.js +608 -160
  197. package/dist/cli/setup/SetupApp.js.map +1 -0
  198. package/dist/cli/shared/ErrorBoundary.d.ts +22 -0
  199. package/dist/cli/shared/ErrorBoundary.js +73 -0
  200. package/dist/cli/shared/ErrorBoundary.js.map +1 -0
  201. package/dist/cli/shared/MatrixIntro.js +66 -69
  202. package/dist/cli/shared/MatrixIntro.js.map +1 -0
  203. package/dist/cli/shared/SpinnerSlot.d.ts +14 -0
  204. package/dist/cli/shared/SpinnerSlot.js +63 -0
  205. package/dist/cli/shared/SpinnerSlot.js.map +1 -0
  206. package/dist/cli/shared/Theme.d.ts +1 -1
  207. package/dist/cli/shared/Theme.js +136 -92
  208. package/dist/cli/shared/Theme.js.map +1 -0
  209. package/dist/cli/shared/WhaleBanner.js +99 -11
  210. package/dist/cli/shared/WhaleBanner.js.map +1 -0
  211. package/dist/cli/shared/markdown.d.ts +3 -1
  212. package/dist/cli/shared/markdown.js +736 -674
  213. package/dist/cli/shared/markdown.js.map +1 -0
  214. package/dist/cli/shared/marked-terminal.d.js +2 -0
  215. package/dist/cli/shared/marked-terminal.d.js.map +1 -0
  216. package/dist/cli/shared/theme-manager.js +99 -90
  217. package/dist/cli/shared/theme-manager.js.map +1 -0
  218. package/dist/cli/shared/theme-presets.js +256 -254
  219. package/dist/cli/shared/theme-presets.js.map +1 -0
  220. package/dist/cli/status/StatusApp.js +235 -86
  221. package/dist/cli/status/StatusApp.js.map +1 -0
  222. package/dist/cli/stores/StoreApp.js +275 -65
  223. package/dist/cli/stores/StoreApp.js.map +1 -0
  224. package/dist/index.d.ts +2 -2
  225. package/dist/index.js +509 -396
  226. package/dist/index.js.map +1 -0
  227. package/dist/local-agent/connection.d.ts +2 -2
  228. package/dist/local-agent/connection.js +352 -293
  229. package/dist/local-agent/connection.js.map +1 -0
  230. package/dist/local-agent/discovery.js +259 -122
  231. package/dist/local-agent/discovery.js.map +1 -0
  232. package/dist/local-agent/executor.js +216 -193
  233. package/dist/local-agent/executor.js.map +1 -0
  234. package/dist/local-agent/index.d.ts +2 -2
  235. package/dist/local-agent/index.js +156 -156
  236. package/dist/local-agent/index.js.map +1 -0
  237. package/dist/node/adapters/base.js +18 -8
  238. package/dist/node/adapters/base.js.map +1 -0
  239. package/dist/node/adapters/discord.js +286 -275
  240. package/dist/node/adapters/discord.js.map +1 -0
  241. package/dist/node/adapters/email.js +189 -202
  242. package/dist/node/adapters/email.js.map +1 -0
  243. package/dist/node/adapters/imessage.js +145 -142
  244. package/dist/node/adapters/imessage.js.map +1 -0
  245. package/dist/node/adapters/slack.js +237 -236
  246. package/dist/node/adapters/slack.js.map +1 -0
  247. package/dist/node/adapters/sms.js +149 -151
  248. package/dist/node/adapters/sms.js.map +1 -0
  249. package/dist/node/adapters/telegram.js +88 -92
  250. package/dist/node/adapters/telegram.js.map +1 -0
  251. package/dist/node/adapters/webchat.js +160 -136
  252. package/dist/node/adapters/webchat.js.map +1 -0
  253. package/dist/node/adapters/whatsapp.js +212 -215
  254. package/dist/node/adapters/whatsapp.js.map +1 -0
  255. package/dist/node/cli.js +884 -653
  256. package/dist/node/cli.js.map +1 -0
  257. package/dist/node/config.js +20 -18
  258. package/dist/node/config.js.map +1 -0
  259. package/dist/node/gateway-client.js +191 -181
  260. package/dist/node/gateway-client.js.map +1 -0
  261. package/dist/node/portal/clipboard.js +161 -130
  262. package/dist/node/portal/clipboard.js.map +1 -0
  263. package/dist/node/portal/discovery.js +51 -45
  264. package/dist/node/portal/discovery.js.map +1 -0
  265. package/dist/node/portal/forward.js +64 -58
  266. package/dist/node/portal/forward.js.map +1 -0
  267. package/dist/node/portal/index.js +246 -221
  268. package/dist/node/portal/index.js.map +1 -0
  269. package/dist/node/portal/multiplexer.js +192 -182
  270. package/dist/node/portal/multiplexer.js.map +1 -0
  271. package/dist/node/portal/permissions.js +102 -70
  272. package/dist/node/portal/permissions.js.map +1 -0
  273. package/dist/node/portal/protocol.js +153 -116
  274. package/dist/node/portal/protocol.js.map +1 -0
  275. package/dist/node/portal/screen.js +80 -69
  276. package/dist/node/portal/screen.js.map +1 -0
  277. package/dist/node/portal/session.js +124 -117
  278. package/dist/node/portal/session.js.map +1 -0
  279. package/dist/node/portal/shell.js +140 -113
  280. package/dist/node/portal/shell.js.map +1 -0
  281. package/dist/node/portal/stream.js +77 -75
  282. package/dist/node/portal/stream.js.map +1 -0
  283. package/dist/node/portal/transfer.js +190 -167
  284. package/dist/node/portal/transfer.js.map +1 -0
  285. package/dist/node/portal/ui.js +124 -99
  286. package/dist/node/portal/ui.js.map +1 -0
  287. package/dist/node/remote-desktop/compile-helper.js +50 -45
  288. package/dist/node/remote-desktop/compile-helper.js.map +1 -0
  289. package/dist/node/remote-desktop/index.js +215 -187
  290. package/dist/node/remote-desktop/index.js.map +1 -0
  291. package/dist/node/remote-desktop/protocol.js +45 -29
  292. package/dist/node/remote-desktop/protocol.js.map +1 -0
  293. package/dist/node/runtime.js +493 -410
  294. package/dist/node/runtime.js.map +1 -0
  295. package/dist/server/handlers/__test-utils__/test-db.js +39 -89
  296. package/dist/server/handlers/__test-utils__/test-db.js.map +1 -0
  297. package/dist/server/handlers/analytics.js +467 -261
  298. package/dist/server/handlers/analytics.js.map +1 -0
  299. package/dist/server/handlers/api-docs.js +1030 -895
  300. package/dist/server/handlers/api-docs.js.map +1 -0
  301. package/dist/server/handlers/api-keys.js +291 -242
  302. package/dist/server/handlers/api-keys.js.map +1 -0
  303. package/dist/server/handlers/billing.js +330 -239
  304. package/dist/server/handlers/billing.js.map +1 -0
  305. package/dist/server/handlers/browser.js +468 -395
  306. package/dist/server/handlers/browser.js.map +1 -0
  307. package/dist/server/handlers/catalog.js +1377 -978
  308. package/dist/server/handlers/catalog.js.map +1 -0
  309. package/dist/server/handlers/clickhouse.js +157 -109
  310. package/dist/server/handlers/clickhouse.js.map +1 -0
  311. package/dist/server/handlers/comms.js +1439 -984
  312. package/dist/server/handlers/comms.js.map +1 -0
  313. package/dist/server/handlers/creations.js +461 -394
  314. package/dist/server/handlers/creations.js.map +1 -0
  315. package/dist/server/handlers/crm.js +1082 -791
  316. package/dist/server/handlers/crm.js.map +1 -0
  317. package/dist/server/handlers/discovery.js +251 -232
  318. package/dist/server/handlers/discovery.js.map +1 -0
  319. package/dist/server/handlers/embeddings.js +241 -164
  320. package/dist/server/handlers/embeddings.js.map +1 -0
  321. package/dist/server/handlers/enrichment.js +887 -718
  322. package/dist/server/handlers/enrichment.js.map +1 -0
  323. package/dist/server/handlers/image-gen.js +467 -376
  324. package/dist/server/handlers/image-gen.js.map +1 -0
  325. package/dist/server/handlers/inventory.js +797 -424
  326. package/dist/server/handlers/inventory.js.map +1 -0
  327. package/dist/server/handlers/kali.js +272 -230
  328. package/dist/server/handlers/kali.js.map +1 -0
  329. package/dist/server/handlers/llm-providers.js +803 -580
  330. package/dist/server/handlers/llm-providers.js.map +1 -0
  331. package/dist/server/handlers/local-agent.js +133 -105
  332. package/dist/server/handlers/local-agent.js.map +1 -0
  333. package/dist/server/handlers/media.js +1179 -857
  334. package/dist/server/handlers/media.js.map +1 -0
  335. package/dist/server/handlers/meta-ads.js +2669 -2093
  336. package/dist/server/handlers/meta-ads.js.map +1 -0
  337. package/dist/server/handlers/nodes.js +1321 -913
  338. package/dist/server/handlers/nodes.js.map +1 -0
  339. package/dist/server/handlers/operations.js +183 -157
  340. package/dist/server/handlers/operations.js.map +1 -0
  341. package/dist/server/handlers/platform.js +346 -210
  342. package/dist/server/handlers/platform.js.map +1 -0
  343. package/dist/server/handlers/remove-bg.js +118 -86
  344. package/dist/server/handlers/remove-bg.js.map +1 -0
  345. package/dist/server/handlers/storefront.js +586 -446
  346. package/dist/server/handlers/storefront.js.map +1 -0
  347. package/dist/server/handlers/supply-chain.js +546 -326
  348. package/dist/server/handlers/supply-chain.js.map +1 -0
  349. package/dist/server/handlers/transcription.js +106 -97
  350. package/dist/server/handlers/transcription.js.map +1 -0
  351. package/dist/server/handlers/video-gen.js +593 -424
  352. package/dist/server/handlers/video-gen.js.map +1 -0
  353. package/dist/server/handlers/voice.js +1458 -1039
  354. package/dist/server/handlers/voice.js.map +1 -0
  355. package/dist/server/handlers/workflow-steps.js +2837 -2116
  356. package/dist/server/handlers/workflow-steps.js.map +1 -0
  357. package/dist/server/handlers/workflows.js +1630 -933
  358. package/dist/server/handlers/workflows.js.map +1 -0
  359. package/dist/server/index.js +3167 -2422
  360. package/dist/server/index.js.map +1 -0
  361. package/dist/server/lib/batch-client.js +471 -409
  362. package/dist/server/lib/batch-client.js.map +1 -0
  363. package/dist/server/lib/clickhouse-buffer.js +118 -104
  364. package/dist/server/lib/clickhouse-buffer.js.map +1 -0
  365. package/dist/server/lib/clickhouse-client.js +107 -107
  366. package/dist/server/lib/clickhouse-client.js.map +1 -0
  367. package/dist/server/lib/coa-renderer.js +1786 -356
  368. package/dist/server/lib/coa-renderer.js.map +1 -0
  369. package/dist/server/lib/code-worker-pool.js +227 -177
  370. package/dist/server/lib/code-worker-pool.js.map +1 -0
  371. package/dist/server/lib/code-worker.js +174 -164
  372. package/dist/server/lib/code-worker.js.map +1 -0
  373. package/dist/server/lib/compaction-service.d.ts +2 -12
  374. package/dist/server/lib/compaction-service.js +74 -184
  375. package/dist/server/lib/compaction-service.js.map +1 -0
  376. package/dist/server/lib/logger.js +36 -24
  377. package/dist/server/lib/logger.js.map +1 -0
  378. package/dist/server/lib/otel.js +101 -80
  379. package/dist/server/lib/otel.js.map +1 -0
  380. package/dist/server/lib/pdf-renderer.js +952 -788
  381. package/dist/server/lib/pdf-renderer.js.map +1 -0
  382. package/dist/server/lib/prompt-sanitizer.js +188 -108
  383. package/dist/server/lib/prompt-sanitizer.js.map +1 -0
  384. package/dist/server/lib/provider-capabilities.js +136 -138
  385. package/dist/server/lib/provider-capabilities.js.map +1 -0
  386. package/dist/server/lib/provider-failover.js +190 -168
  387. package/dist/server/lib/provider-failover.js.map +1 -0
  388. package/dist/server/lib/rate-limiter.js +186 -117
  389. package/dist/server/lib/rate-limiter.js.map +1 -0
  390. package/dist/server/lib/react-pdf-layout.js +551 -382
  391. package/dist/server/lib/react-pdf-layout.js.map +1 -0
  392. package/dist/server/lib/server-agent-loop.d.ts +4 -1
  393. package/dist/server/lib/server-agent-loop.js +906 -634
  394. package/dist/server/lib/server-agent-loop.js.map +1 -0
  395. package/dist/server/lib/server-subagent.js +260 -164
  396. package/dist/server/lib/server-subagent.js.map +1 -0
  397. package/dist/server/lib/session-checkpoint.js +105 -96
  398. package/dist/server/lib/session-checkpoint.js.map +1 -0
  399. package/dist/server/lib/ssrf-guard.js +193 -184
  400. package/dist/server/lib/ssrf-guard.js.map +1 -0
  401. package/dist/server/lib/supabase-client.js +94 -82
  402. package/dist/server/lib/supabase-client.js.map +1 -0
  403. package/dist/server/lib/template-resolver.js +154 -176
  404. package/dist/server/lib/template-resolver.js.map +1 -0
  405. package/dist/server/lib/utils.js +242 -133
  406. package/dist/server/lib/utils.js.map +1 -0
  407. package/dist/server/local-agent-gateway.d.ts +2 -2
  408. package/dist/server/local-agent-gateway.js +785 -627
  409. package/dist/server/local-agent-gateway.js.map +1 -0
  410. package/dist/server/providers/anthropic.js +250 -172
  411. package/dist/server/providers/anthropic.js.map +1 -0
  412. package/dist/server/providers/bedrock.js +217 -158
  413. package/dist/server/providers/bedrock.js.map +1 -0
  414. package/dist/server/providers/gemini.js +548 -418
  415. package/dist/server/providers/gemini.js.map +1 -0
  416. package/dist/server/providers/openai.js +571 -437
  417. package/dist/server/providers/openai.js.map +1 -0
  418. package/dist/server/providers/registry.js +23 -18
  419. package/dist/server/providers/registry.js.map +1 -0
  420. package/dist/server/providers/shared.js +123 -95
  421. package/dist/server/providers/shared.js.map +1 -0
  422. package/dist/server/providers/types.js +1 -11
  423. package/dist/server/providers/types.js.map +1 -0
  424. package/dist/server/proxy-handlers.js +209 -165
  425. package/dist/server/proxy-handlers.js.map +1 -0
  426. package/dist/server/tool-router.js +959 -599
  427. package/dist/server/tool-router.js.map +1 -0
  428. package/dist/server/validation.js +248 -188
  429. package/dist/server/validation.js.map +1 -0
  430. package/dist/server/worker.js +202 -133
  431. package/dist/server/worker.js.map +1 -0
  432. package/dist/setup.d.ts +2 -2
  433. package/dist/setup.js +151 -147
  434. package/dist/setup.js.map +1 -0
  435. package/dist/shared/agent-core.d.ts +115 -26
  436. package/dist/shared/agent-core.js +956 -522
  437. package/dist/shared/agent-core.js.map +1 -0
  438. package/dist/shared/anthropic-types.js +1 -6
  439. package/dist/shared/anthropic-types.js.map +1 -0
  440. package/dist/shared/api-client.d.ts +16 -9
  441. package/dist/shared/api-client.js +419 -327
  442. package/dist/shared/api-client.js.map +1 -0
  443. package/dist/shared/compaction.d.ts +36 -0
  444. package/dist/shared/compaction.js +138 -0
  445. package/dist/shared/compaction.js.map +1 -0
  446. package/dist/shared/constants.js +67 -64
  447. package/dist/shared/constants.js.map +1 -0
  448. package/dist/shared/sse-parser.js +221 -219
  449. package/dist/shared/sse-parser.js.map +1 -0
  450. package/dist/shared/tool-dispatch.d.ts +4 -0
  451. package/dist/shared/tool-dispatch.js +226 -165
  452. package/dist/shared/tool-dispatch.js.map +1 -0
  453. package/dist/shared/types.js +1 -6
  454. package/dist/shared/types.js.map +1 -0
  455. package/dist/types/cli-highlight.d.js +2 -0
  456. package/dist/types/cli-highlight.d.js.map +1 -0
  457. package/dist/types/diff.d.js +2 -0
  458. package/dist/types/diff.d.js.map +1 -0
  459. package/dist/types/pdf-parse.d.js +2 -0
  460. package/dist/types/pdf-parse.d.js.map +1 -0
  461. package/dist/updater.d.ts +1 -1
  462. package/dist/updater.js +118 -92
  463. package/dist/updater.js.map +1 -0
  464. package/dist/webchat/widget.js +227 -380
  465. package/dist/webchat/widget.js.map +1 -0
  466. package/package.json +22 -10
  467. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  468. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  469. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  470. package/vendor/ink/build/apply-styles.js +175 -0
  471. package/vendor/ink/build/build-layout.js +77 -0
  472. package/vendor/ink/build/calculate-wrapped-text.js +53 -0
  473. package/vendor/ink/build/colorize.d.ts +3 -0
  474. package/vendor/ink/build/colorize.js +48 -0
  475. package/vendor/ink/build/colorize.js.map +1 -0
  476. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  477. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  478. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  479. package/vendor/ink/build/components/App.d.ts +18 -0
  480. package/vendor/ink/build/components/App.js +351 -0
  481. package/vendor/ink/build/components/App.js.map +1 -0
  482. package/vendor/ink/build/components/AppContext.d.ts +15 -0
  483. package/vendor/ink/build/components/AppContext.js +11 -0
  484. package/vendor/ink/build/components/AppContext.js.map +1 -0
  485. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  486. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  487. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  488. package/vendor/ink/build/components/Box.d.ts +117 -0
  489. package/vendor/ink/build/components/Box.js +34 -0
  490. package/vendor/ink/build/components/Box.js.map +1 -0
  491. package/vendor/ink/build/components/Color.js +62 -0
  492. package/vendor/ink/build/components/Cursor.d.ts +83 -0
  493. package/vendor/ink/build/components/Cursor.js +53 -0
  494. package/vendor/ink/build/components/Cursor.js.map +1 -0
  495. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  496. package/vendor/ink/build/components/CursorContext.js +8 -0
  497. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  498. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  499. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  500. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  501. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  502. package/vendor/ink/build/components/ErrorOverview.js +84 -0
  503. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  504. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  505. package/vendor/ink/build/components/FocusContext.js +17 -0
  506. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  507. package/vendor/ink/build/components/Newline.d.ts +13 -0
  508. package/vendor/ink/build/components/Newline.js +8 -0
  509. package/vendor/ink/build/components/Newline.js.map +1 -0
  510. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  511. package/vendor/ink/build/components/Spacer.js +11 -0
  512. package/vendor/ink/build/components/Spacer.js.map +1 -0
  513. package/vendor/ink/build/components/Static.d.ts +24 -0
  514. package/vendor/ink/build/components/Static.js +28 -0
  515. package/vendor/ink/build/components/Static.js.map +1 -0
  516. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  517. package/vendor/ink/build/components/StderrContext.js +13 -0
  518. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  519. package/vendor/ink/build/components/StdinContext.d.ts +22 -0
  520. package/vendor/ink/build/components/StdinContext.js +19 -0
  521. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  522. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  523. package/vendor/ink/build/components/StdoutContext.js +13 -0
  524. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  525. package/vendor/ink/build/components/Text.d.ts +55 -0
  526. package/vendor/ink/build/components/Text.js +50 -0
  527. package/vendor/ink/build/components/Text.js.map +1 -0
  528. package/vendor/ink/build/components/Transform.d.ts +16 -0
  529. package/vendor/ink/build/components/Transform.js +15 -0
  530. package/vendor/ink/build/components/Transform.js.map +1 -0
  531. package/vendor/ink/build/cursor-helpers.d.ts +38 -0
  532. package/vendor/ink/build/cursor-helpers.js +56 -0
  533. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  534. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  535. package/vendor/ink/build/devtools-window-polyfill.js +65 -0
  536. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  537. package/vendor/ink/build/devtools.d.ts +1 -0
  538. package/vendor/ink/build/devtools.js +11 -0
  539. package/vendor/ink/build/devtools.js.map +1 -0
  540. package/vendor/ink/build/dom.d.ts +56 -0
  541. package/vendor/ink/build/dom.js +124 -0
  542. package/vendor/ink/build/dom.js.map +1 -0
  543. package/vendor/ink/build/experimental/apply-style.js +140 -0
  544. package/vendor/ink/build/experimental/dom.js +123 -0
  545. package/vendor/ink/build/experimental/output.js +91 -0
  546. package/vendor/ink/build/experimental/reconciler.js +141 -0
  547. package/vendor/ink/build/experimental/renderer.js +81 -0
  548. package/vendor/ink/build/get-max-width.d.ts +3 -0
  549. package/vendor/ink/build/get-max-width.js +10 -0
  550. package/vendor/ink/build/get-max-width.js.map +1 -0
  551. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  552. package/vendor/ink/build/hooks/use-app.js +8 -0
  553. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  554. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  555. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  556. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  557. package/vendor/ink/build/hooks/use-focus-manager.d.ts +28 -0
  558. package/vendor/ink/build/hooks/use-focus-manager.js +17 -0
  559. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  560. package/vendor/ink/build/hooks/use-focus.d.ts +29 -0
  561. package/vendor/ink/build/hooks/use-focus.js +42 -0
  562. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  563. package/vendor/ink/build/hooks/use-input.d.ts +131 -0
  564. package/vendor/ink/build/hooks/use-input.js +124 -0
  565. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  566. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +5 -0
  567. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +11 -0
  568. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  569. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  570. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  571. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  572. package/vendor/ink/build/hooks/use-stdin.d.ts +5 -0
  573. package/vendor/ink/build/hooks/use-stdin.js +8 -0
  574. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  575. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  576. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  577. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  578. package/vendor/ink/build/hooks/useInput.js +38 -0
  579. package/vendor/ink/build/index.d.ts +34 -0
  580. package/vendor/ink/build/index.js +20 -0
  581. package/vendor/ink/build/index.js.map +1 -0
  582. package/vendor/ink/build/ink.d.ts +90 -0
  583. package/vendor/ink/build/ink.js +654 -0
  584. package/vendor/ink/build/ink.js.map +1 -0
  585. package/vendor/ink/build/input-parser.d.ts +7 -0
  586. package/vendor/ink/build/input-parser.js +154 -0
  587. package/vendor/ink/build/input-parser.js.map +1 -0
  588. package/vendor/ink/build/instance.js +205 -0
  589. package/vendor/ink/build/instances.d.ts +3 -0
  590. package/vendor/ink/build/instances.js +8 -0
  591. package/vendor/ink/build/instances.js.map +1 -0
  592. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  593. package/vendor/ink/build/kitty-keyboard.js +32 -0
  594. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  595. package/vendor/ink/build/layout.d.ts +7 -0
  596. package/vendor/ink/build/layout.js +33 -0
  597. package/vendor/ink/build/layout.js.map +1 -0
  598. package/vendor/ink/build/log-update.d.ts +19 -0
  599. package/vendor/ink/build/log-update.js +243 -0
  600. package/vendor/ink/build/log-update.js.map +1 -0
  601. package/vendor/ink/build/measure-element.d.ts +16 -0
  602. package/vendor/ink/build/measure-element.js +9 -0
  603. package/vendor/ink/build/measure-element.js.map +1 -0
  604. package/vendor/ink/build/measure-text.d.ts +6 -0
  605. package/vendor/ink/build/measure-text.js +21 -0
  606. package/vendor/ink/build/measure-text.js.map +1 -0
  607. package/vendor/ink/build/options.d.ts +52 -0
  608. package/vendor/ink/build/options.js +2 -0
  609. package/vendor/ink/build/options.js.map +1 -0
  610. package/vendor/ink/build/output.d.ts +35 -0
  611. package/vendor/ink/build/output.js +183 -0
  612. package/vendor/ink/build/output.js.map +1 -0
  613. package/vendor/ink/build/parse-keypress.d.ts +22 -0
  614. package/vendor/ink/build/parse-keypress.js +493 -0
  615. package/vendor/ink/build/parse-keypress.js.map +1 -0
  616. package/vendor/ink/build/reconciler.d.ts +4 -0
  617. package/vendor/ink/build/reconciler.js +274 -0
  618. package/vendor/ink/build/reconciler.js.map +1 -0
  619. package/vendor/ink/build/render-background.d.ts +4 -0
  620. package/vendor/ink/build/render-background.js +25 -0
  621. package/vendor/ink/build/render-background.js.map +1 -0
  622. package/vendor/ink/build/render-border.d.ts +4 -0
  623. package/vendor/ink/build/render-border.js +73 -0
  624. package/vendor/ink/build/render-border.js.map +1 -0
  625. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  626. package/vendor/ink/build/render-node-to-output.js +147 -0
  627. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  628. package/vendor/ink/build/render-to-string.d.ts +38 -0
  629. package/vendor/ink/build/render-to-string.js +115 -0
  630. package/vendor/ink/build/render-to-string.js.map +1 -0
  631. package/vendor/ink/build/render.d.ts +121 -0
  632. package/vendor/ink/build/render.js +55 -0
  633. package/vendor/ink/build/render.js.map +1 -0
  634. package/vendor/ink/build/renderer.d.ts +8 -0
  635. package/vendor/ink/build/renderer.js +55 -0
  636. package/vendor/ink/build/renderer.js.map +1 -0
  637. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  638. package/vendor/ink/build/sanitize-ansi.js +27 -0
  639. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  640. package/vendor/ink/build/screen-reader-update.d.ts +13 -0
  641. package/vendor/ink/build/screen-reader-update.js +38 -0
  642. package/vendor/ink/build/screen-reader-update.js.map +1 -0
  643. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  644. package/vendor/ink/build/squash-text-nodes.js +36 -0
  645. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  646. package/vendor/ink/build/styles.d.ts +240 -0
  647. package/vendor/ink/build/styles.js +232 -0
  648. package/vendor/ink/build/styles.js.map +1 -0
  649. package/vendor/ink/build/utils.d.ts +2 -0
  650. package/vendor/ink/build/utils.js +4 -0
  651. package/vendor/ink/build/utils.js.map +1 -0
  652. package/vendor/ink/build/wrap-text.d.ts +3 -0
  653. package/vendor/ink/build/wrap-text.js +31 -0
  654. package/vendor/ink/build/wrap-text.js.map +1 -0
  655. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  656. package/vendor/ink/build/write-synchronized.js +7 -0
  657. package/vendor/ink/build/write-synchronized.js.map +1 -0
  658. package/vendor/ink/license +10 -0
  659. package/vendor/ink/node_modules/@types/node/LICENSE +21 -0
  660. package/vendor/ink/node_modules/@types/node/README.md +15 -0
  661. package/vendor/ink/node_modules/@types/node/assert/strict.d.ts +105 -0
  662. package/vendor/ink/node_modules/@types/node/assert.d.ts +955 -0
  663. package/vendor/ink/node_modules/@types/node/async_hooks.d.ts +623 -0
  664. package/vendor/ink/node_modules/@types/node/buffer.buffer.d.ts +466 -0
  665. package/vendor/ink/node_modules/@types/node/buffer.d.ts +1810 -0
  666. package/vendor/ink/node_modules/@types/node/child_process.d.ts +1428 -0
  667. package/vendor/ink/node_modules/@types/node/cluster.d.ts +486 -0
  668. package/vendor/ink/node_modules/@types/node/compatibility/iterators.d.ts +21 -0
  669. package/vendor/ink/node_modules/@types/node/console.d.ts +151 -0
  670. package/vendor/ink/node_modules/@types/node/constants.d.ts +20 -0
  671. package/vendor/ink/node_modules/@types/node/crypto.d.ts +4065 -0
  672. package/vendor/ink/node_modules/@types/node/dgram.d.ts +564 -0
  673. package/vendor/ink/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
  674. package/vendor/ink/node_modules/@types/node/dns/promises.d.ts +503 -0
  675. package/vendor/ink/node_modules/@types/node/dns.d.ts +922 -0
  676. package/vendor/ink/node_modules/@types/node/domain.d.ts +166 -0
  677. package/vendor/ink/node_modules/@types/node/events.d.ts +1054 -0
  678. package/vendor/ink/node_modules/@types/node/fs/promises.d.ts +1329 -0
  679. package/vendor/ink/node_modules/@types/node/fs.d.ts +4676 -0
  680. package/vendor/ink/node_modules/@types/node/globals.d.ts +150 -0
  681. package/vendor/ink/node_modules/@types/node/globals.typedarray.d.ts +101 -0
  682. package/vendor/ink/node_modules/@types/node/http.d.ts +2167 -0
  683. package/vendor/ink/node_modules/@types/node/http2.d.ts +2480 -0
  684. package/vendor/ink/node_modules/@types/node/https.d.ts +405 -0
  685. package/vendor/ink/node_modules/@types/node/index.d.ts +115 -0
  686. package/vendor/ink/node_modules/@types/node/inspector/promises.d.ts +41 -0
  687. package/vendor/ink/node_modules/@types/node/inspector.d.ts +224 -0
  688. package/vendor/ink/node_modules/@types/node/inspector.generated.d.ts +4226 -0
  689. package/vendor/ink/node_modules/@types/node/module.d.ts +819 -0
  690. package/vendor/ink/node_modules/@types/node/net.d.ts +933 -0
  691. package/vendor/ink/node_modules/@types/node/os.d.ts +507 -0
  692. package/vendor/ink/node_modules/@types/node/package.json +155 -0
  693. package/vendor/ink/node_modules/@types/node/path/posix.d.ts +8 -0
  694. package/vendor/ink/node_modules/@types/node/path/win32.d.ts +8 -0
  695. package/vendor/ink/node_modules/@types/node/path.d.ts +187 -0
  696. package/vendor/ink/node_modules/@types/node/perf_hooks.d.ts +643 -0
  697. package/vendor/ink/node_modules/@types/node/process.d.ts +2156 -0
  698. package/vendor/ink/node_modules/@types/node/punycode.d.ts +117 -0
  699. package/vendor/ink/node_modules/@types/node/querystring.d.ts +152 -0
  700. package/vendor/ink/node_modules/@types/node/quic.d.ts +910 -0
  701. package/vendor/ink/node_modules/@types/node/readline/promises.d.ts +161 -0
  702. package/vendor/ink/node_modules/@types/node/readline.d.ts +541 -0
  703. package/vendor/ink/node_modules/@types/node/repl.d.ts +415 -0
  704. package/vendor/ink/node_modules/@types/node/sea.d.ts +162 -0
  705. package/vendor/ink/node_modules/@types/node/sqlite.d.ts +955 -0
  706. package/vendor/ink/node_modules/@types/node/stream/consumers.d.ts +38 -0
  707. package/vendor/ink/node_modules/@types/node/stream/promises.d.ts +211 -0
  708. package/vendor/ink/node_modules/@types/node/stream/web.d.ts +296 -0
  709. package/vendor/ink/node_modules/@types/node/stream.d.ts +1760 -0
  710. package/vendor/ink/node_modules/@types/node/string_decoder.d.ts +67 -0
  711. package/vendor/ink/node_modules/@types/node/test/reporters.d.ts +96 -0
  712. package/vendor/ink/node_modules/@types/node/test.d.ts +2240 -0
  713. package/vendor/ink/node_modules/@types/node/timers/promises.d.ts +108 -0
  714. package/vendor/ink/node_modules/@types/node/timers.d.ts +159 -0
  715. package/vendor/ink/node_modules/@types/node/tls.d.ts +1198 -0
  716. package/vendor/ink/node_modules/@types/node/trace_events.d.ts +197 -0
  717. package/vendor/ink/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +462 -0
  718. package/vendor/ink/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
  719. package/vendor/ink/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +36 -0
  720. package/vendor/ink/node_modules/@types/node/ts5.6/index.d.ts +117 -0
  721. package/vendor/ink/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
  722. package/vendor/ink/node_modules/@types/node/ts5.7/index.d.ts +117 -0
  723. package/vendor/ink/node_modules/@types/node/tty.d.ts +250 -0
  724. package/vendor/ink/node_modules/@types/node/url.d.ts +519 -0
  725. package/vendor/ink/node_modules/@types/node/util/types.d.ts +558 -0
  726. package/vendor/ink/node_modules/@types/node/util.d.ts +1662 -0
  727. package/vendor/ink/node_modules/@types/node/v8.d.ts +983 -0
  728. package/vendor/ink/node_modules/@types/node/vm.d.ts +1208 -0
  729. package/vendor/ink/node_modules/@types/node/wasi.d.ts +202 -0
  730. package/vendor/ink/node_modules/@types/node/web-globals/abortcontroller.d.ts +59 -0
  731. package/vendor/ink/node_modules/@types/node/web-globals/blob.d.ts +23 -0
  732. package/vendor/ink/node_modules/@types/node/web-globals/console.d.ts +9 -0
  733. package/vendor/ink/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
  734. package/vendor/ink/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  735. package/vendor/ink/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
  736. package/vendor/ink/node_modules/@types/node/web-globals/events.d.ts +106 -0
  737. package/vendor/ink/node_modules/@types/node/web-globals/fetch.d.ts +69 -0
  738. package/vendor/ink/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
  739. package/vendor/ink/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
  740. package/vendor/ink/node_modules/@types/node/web-globals/navigator.d.ts +25 -0
  741. package/vendor/ink/node_modules/@types/node/web-globals/performance.d.ts +45 -0
  742. package/vendor/ink/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  743. package/vendor/ink/node_modules/@types/node/web-globals/streams.d.ts +115 -0
  744. package/vendor/ink/node_modules/@types/node/web-globals/timers.d.ts +44 -0
  745. package/vendor/ink/node_modules/@types/node/web-globals/url.d.ts +24 -0
  746. package/vendor/ink/node_modules/@types/node/worker_threads.d.ts +717 -0
  747. package/vendor/ink/node_modules/@types/node/zlib.d.ts +618 -0
  748. package/vendor/ink/node_modules/node-pty/LICENSE +69 -0
  749. package/vendor/ink/node_modules/node-pty/README.md +164 -0
  750. package/vendor/ink/node_modules/node-pty/binding.gyp +150 -0
  751. package/vendor/ink/node_modules/node-pty/lib/conpty_console_list_agent.js +25 -0
  752. package/vendor/ink/node_modules/node-pty/lib/eventEmitter2.js +47 -0
  753. package/vendor/ink/node_modules/node-pty/lib/index.js +52 -0
  754. package/vendor/ink/node_modules/node-pty/lib/interfaces.js +7 -0
  755. package/vendor/ink/node_modules/node-pty/lib/shared/conout.js +11 -0
  756. package/vendor/ink/node_modules/node-pty/lib/terminal.js +190 -0
  757. package/vendor/ink/node_modules/node-pty/lib/types.js +7 -0
  758. package/vendor/ink/node_modules/node-pty/lib/unixTerminal.js +349 -0
  759. package/vendor/ink/node_modules/node-pty/lib/utils.js +39 -0
  760. package/vendor/ink/node_modules/node-pty/lib/windowsConoutConnection.js +125 -0
  761. package/vendor/ink/node_modules/node-pty/lib/windowsPtyAgent.js +287 -0
  762. package/vendor/ink/node_modules/node-pty/lib/windowsTerminal.js +201 -0
  763. package/vendor/ink/node_modules/node-pty/lib/worker/conoutSocketWorker.js +22 -0
  764. package/vendor/ink/node_modules/node-pty/package.json +65 -0
  765. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
  766. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
  767. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/pty.node +0 -0
  768. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
  769. package/vendor/ink/node_modules/node-pty/prebuilds/linux-arm64/pty.node +0 -0
  770. package/vendor/ink/node_modules/node-pty/prebuilds/linux-x64/pty.node +0 -0
  771. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  772. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  773. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  774. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.pdb +0 -0
  775. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  776. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
  777. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  778. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  779. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  780. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.pdb +0 -0
  781. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  782. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
  783. package/vendor/ink/node_modules/node-pty/scripts/post-install.js +76 -0
  784. package/vendor/ink/node_modules/node-pty/scripts/prebuild.js +34 -0
  785. package/vendor/ink/node_modules/node-pty/src/unix/pty.cc +875 -0
  786. package/vendor/ink/node_modules/node-pty/src/unix/spawn-helper.cc +23 -0
  787. package/vendor/ink/node_modules/node-pty/src/win/conpty.cc +582 -0
  788. package/vendor/ink/node_modules/node-pty/src/win/conpty.h +41 -0
  789. package/vendor/ink/node_modules/node-pty/src/win/conpty_console_list.cc +44 -0
  790. package/vendor/ink/node_modules/node-pty/src/win/path_util.cc +95 -0
  791. package/vendor/ink/node_modules/node-pty/src/win/path_util.h +26 -0
  792. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/OpenConsole.exe +0 -0
  793. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/conpty.dll +0 -0
  794. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/OpenConsole.exe +0 -0
  795. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/conpty.dll +0 -0
  796. package/vendor/ink/node_modules/node-pty/typings/node-pty.d.ts +215 -0
  797. package/vendor/ink/node_modules/undici-types/LICENSE +21 -0
  798. package/vendor/ink/node_modules/undici-types/README.md +6 -0
  799. package/vendor/ink/node_modules/undici-types/agent.d.ts +32 -0
  800. package/vendor/ink/node_modules/undici-types/api.d.ts +43 -0
  801. package/vendor/ink/node_modules/undici-types/balanced-pool.d.ts +30 -0
  802. package/vendor/ink/node_modules/undici-types/cache-interceptor.d.ts +173 -0
  803. package/vendor/ink/node_modules/undici-types/cache.d.ts +36 -0
  804. package/vendor/ink/node_modules/undici-types/client-stats.d.ts +15 -0
  805. package/vendor/ink/node_modules/undici-types/client.d.ts +108 -0
  806. package/vendor/ink/node_modules/undici-types/connector.d.ts +34 -0
  807. package/vendor/ink/node_modules/undici-types/content-type.d.ts +21 -0
  808. package/vendor/ink/node_modules/undici-types/cookies.d.ts +30 -0
  809. package/vendor/ink/node_modules/undici-types/diagnostics-channel.d.ts +74 -0
  810. package/vendor/ink/node_modules/undici-types/dispatcher.d.ts +276 -0
  811. package/vendor/ink/node_modules/undici-types/env-http-proxy-agent.d.ts +22 -0
  812. package/vendor/ink/node_modules/undici-types/errors.d.ts +161 -0
  813. package/vendor/ink/node_modules/undici-types/eventsource.d.ts +66 -0
  814. package/vendor/ink/node_modules/undici-types/fetch.d.ts +211 -0
  815. package/vendor/ink/node_modules/undici-types/formdata.d.ts +108 -0
  816. package/vendor/ink/node_modules/undici-types/global-dispatcher.d.ts +9 -0
  817. package/vendor/ink/node_modules/undici-types/global-origin.d.ts +7 -0
  818. package/vendor/ink/node_modules/undici-types/h2c-client.d.ts +73 -0
  819. package/vendor/ink/node_modules/undici-types/handlers.d.ts +15 -0
  820. package/vendor/ink/node_modules/undici-types/header.d.ts +160 -0
  821. package/vendor/ink/node_modules/undici-types/index.d.ts +88 -0
  822. package/vendor/ink/node_modules/undici-types/interceptors.d.ts +73 -0
  823. package/vendor/ink/node_modules/undici-types/mock-agent.d.ts +68 -0
  824. package/vendor/ink/node_modules/undici-types/mock-call-history.d.ts +111 -0
  825. package/vendor/ink/node_modules/undici-types/mock-client.d.ts +27 -0
  826. package/vendor/ink/node_modules/undici-types/mock-errors.d.ts +12 -0
  827. package/vendor/ink/node_modules/undici-types/mock-interceptor.d.ts +94 -0
  828. package/vendor/ink/node_modules/undici-types/mock-pool.d.ts +27 -0
  829. package/vendor/ink/node_modules/undici-types/package.json +55 -0
  830. package/vendor/ink/node_modules/undici-types/patch.d.ts +29 -0
  831. package/vendor/ink/node_modules/undici-types/pool-stats.d.ts +19 -0
  832. package/vendor/ink/node_modules/undici-types/pool.d.ts +41 -0
  833. package/vendor/ink/node_modules/undici-types/proxy-agent.d.ts +29 -0
  834. package/vendor/ink/node_modules/undici-types/readable.d.ts +68 -0
  835. package/vendor/ink/node_modules/undici-types/retry-agent.d.ts +8 -0
  836. package/vendor/ink/node_modules/undici-types/retry-handler.d.ts +125 -0
  837. package/vendor/ink/node_modules/undici-types/round-robin-pool.d.ts +41 -0
  838. package/vendor/ink/node_modules/undici-types/snapshot-agent.d.ts +109 -0
  839. package/vendor/ink/node_modules/undici-types/util.d.ts +18 -0
  840. package/vendor/ink/node_modules/undici-types/utility.d.ts +7 -0
  841. package/vendor/ink/node_modules/undici-types/webidl.d.ts +341 -0
  842. package/vendor/ink/node_modules/undici-types/websocket.d.ts +186 -0
  843. package/vendor/ink/package.json +201 -0
  844. package/vendor/ink/readme.md +2636 -0
  845. package/bin/swag-agent.js +0 -9
  846. package/dist/server/lib/pg-rate-limiter.d.ts +0 -21
  847. 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