whale-code 6.5.4 → 6.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (853) hide show
  1. package/README.md +39 -31
  2. package/bin/{swagmanager-mcp.js → whale-code.js} +17 -2
  3. package/dist/cli/app.js +148 -72
  4. package/dist/cli/app.js.map +1 -0
  5. package/dist/cli/chat/AgentSelector.js +105 -10
  6. package/dist/cli/chat/AgentSelector.js.map +1 -0
  7. package/dist/cli/chat/ChatApp.d.ts +31 -0
  8. package/dist/cli/chat/ChatApp.js +539 -286
  9. package/dist/cli/chat/ChatApp.js.map +1 -0
  10. package/dist/cli/chat/ChatInput.js +1088 -770
  11. package/dist/cli/chat/ChatInput.js.map +1 -0
  12. package/dist/cli/chat/MarkdownText.js +39 -14
  13. package/dist/cli/chat/MarkdownText.js.map +1 -0
  14. package/dist/cli/chat/MemoryManager.js +181 -46
  15. package/dist/cli/chat/MemoryManager.js.map +1 -0
  16. package/dist/cli/chat/MessageList.d.ts +2 -3
  17. package/dist/cli/chat/MessageList.js +186 -45
  18. package/dist/cli/chat/MessageList.js.map +1 -0
  19. package/dist/cli/chat/ModelSelector.js +282 -63
  20. package/dist/cli/chat/ModelSelector.js.map +1 -0
  21. package/dist/cli/chat/NodeManager.js +165 -75
  22. package/dist/cli/chat/NodeManager.js.map +1 -0
  23. package/dist/cli/chat/NodeSelector.js +171 -30
  24. package/dist/cli/chat/NodeSelector.js.map +1 -0
  25. package/dist/cli/chat/PlanApproval.js +281 -57
  26. package/dist/cli/chat/PlanApproval.js.map +1 -0
  27. package/dist/cli/chat/RewindViewer.js +559 -144
  28. package/dist/cli/chat/RewindViewer.js.map +1 -0
  29. package/dist/cli/chat/SessionManager.js +137 -30
  30. package/dist/cli/chat/SessionManager.js.map +1 -0
  31. package/dist/cli/chat/SlashMenu.js +293 -164
  32. package/dist/cli/chat/SlashMenu.js.map +1 -0
  33. package/dist/cli/chat/StatusBar.js +172 -9
  34. package/dist/cli/chat/StatusBar.js.map +1 -0
  35. package/dist/cli/chat/StoreSelector.js +147 -18
  36. package/dist/cli/chat/StoreSelector.js.map +1 -0
  37. package/dist/cli/chat/StreamingText.d.ts +1 -5
  38. package/dist/cli/chat/StreamingText.js +22 -7
  39. package/dist/cli/chat/StreamingText.js.map +1 -0
  40. package/dist/cli/chat/SubagentPanel.d.ts +1 -2
  41. package/dist/cli/chat/SubagentPanel.js +612 -72
  42. package/dist/cli/chat/SubagentPanel.js.map +1 -0
  43. package/dist/cli/chat/TeamPanel.d.ts +1 -0
  44. package/dist/cli/chat/TeamPanel.js +230 -30
  45. package/dist/cli/chat/TeamPanel.js.map +1 -0
  46. package/dist/cli/chat/ThemeSelector.js +84 -24
  47. package/dist/cli/chat/ThemeSelector.js.map +1 -0
  48. package/dist/cli/chat/ToolIndicator.js +1476 -371
  49. package/dist/cli/chat/ToolIndicator.js.map +1 -0
  50. package/dist/cli/chat/hooks/useAgentLoop.d.ts +1 -0
  51. package/dist/cli/chat/hooks/useAgentLoop.js +481 -367
  52. package/dist/cli/chat/hooks/useAgentLoop.js.map +1 -0
  53. package/dist/cli/chat/hooks/useSlashCommands.d.ts +3 -14
  54. package/dist/cli/chat/hooks/useSlashCommands.js +744 -572
  55. package/dist/cli/chat/hooks/useSlashCommands.js.map +1 -0
  56. package/dist/cli/commands/config-cmd.js +56 -57
  57. package/dist/cli/commands/config-cmd.js.map +1 -0
  58. package/dist/cli/commands/db.js +184 -169
  59. package/dist/cli/commands/db.js.map +1 -0
  60. package/dist/cli/commands/doctor.js +212 -122
  61. package/dist/cli/commands/doctor.js.map +1 -0
  62. package/dist/cli/commands/init.js +211 -244
  63. package/dist/cli/commands/init.js.map +1 -0
  64. package/dist/cli/commands/mcp.js +127 -122
  65. package/dist/cli/commands/mcp.js.map +1 -0
  66. package/dist/cli/login/LoginApp.js +355 -141
  67. package/dist/cli/login/LoginApp.js.map +1 -0
  68. package/dist/cli/print-mode.js +196 -177
  69. package/dist/cli/print-mode.js.map +1 -0
  70. package/dist/cli/serve-mode.js +615 -530
  71. package/dist/cli/serve-mode.js.map +1 -0
  72. package/dist/cli/services/agent-config.d.ts +29 -0
  73. package/dist/cli/services/agent-config.js +91 -0
  74. package/dist/cli/services/agent-config.js.map +1 -0
  75. package/dist/cli/services/agent-definitions.d.ts +4 -1
  76. package/dist/cli/services/agent-definitions.js +97 -56
  77. package/dist/cli/services/agent-definitions.js.map +1 -0
  78. package/dist/cli/services/agent-events.js +225 -162
  79. package/dist/cli/services/agent-events.js.map +1 -0
  80. package/dist/cli/services/agent-loop.js +978 -669
  81. package/dist/cli/services/agent-loop.js.map +1 -0
  82. package/dist/cli/services/agent-worker-base.d.ts +35 -5
  83. package/dist/cli/services/agent-worker-base.js +337 -153
  84. package/dist/cli/services/agent-worker-base.js.map +1 -0
  85. package/dist/cli/services/api-retry.js +69 -64
  86. package/dist/cli/services/api-retry.js.map +1 -0
  87. package/dist/cli/services/auth-service.d.ts +3 -3
  88. package/dist/cli/services/auth-service.js +209 -132
  89. package/dist/cli/services/auth-service.js.map +1 -0
  90. package/dist/cli/services/background-processes.js +343 -267
  91. package/dist/cli/services/background-processes.js.map +1 -0
  92. package/dist/cli/services/browser-auth.d.ts +2 -2
  93. package/dist/cli/services/browser-auth.js +159 -118
  94. package/dist/cli/services/browser-auth.js.map +1 -0
  95. package/dist/cli/services/claude-md-loader.js +40 -36
  96. package/dist/cli/services/claude-md-loader.js.map +1 -0
  97. package/dist/cli/services/config-store.d.ts +9 -4
  98. package/dist/cli/services/config-store.js +164 -117
  99. package/dist/cli/services/config-store.js.map +1 -0
  100. package/dist/cli/services/debug-log.d.ts +1 -1
  101. package/dist/cli/services/debug-log.js +34 -35
  102. package/dist/cli/services/debug-log.js.map +1 -0
  103. package/dist/cli/services/env-detect.d.ts +7 -0
  104. package/dist/cli/services/env-detect.js +9 -0
  105. package/dist/cli/services/env-detect.js.map +1 -0
  106. package/dist/cli/services/error-logger.d.ts +2 -3
  107. package/dist/cli/services/error-logger.js +189 -180
  108. package/dist/cli/services/error-logger.js.map +1 -0
  109. package/dist/cli/services/file-history.d.ts +1 -1
  110. package/dist/cli/services/file-history.js +50 -54
  111. package/dist/cli/services/file-history.js.map +1 -0
  112. package/dist/cli/services/format-server-response.js +332 -372
  113. package/dist/cli/services/format-server-response.js.map +1 -0
  114. package/dist/cli/services/git-context.js +61 -45
  115. package/dist/cli/services/git-context.js.map +1 -0
  116. package/dist/cli/services/hooks.d.ts +2 -2
  117. package/dist/cli/services/hooks.js +195 -180
  118. package/dist/cli/services/hooks.js.map +1 -0
  119. package/dist/cli/services/ink-incremental.d.ts +19 -0
  120. package/dist/cli/services/ink-incremental.js +59 -0
  121. package/dist/cli/services/ink-incremental.js.map +1 -0
  122. package/dist/cli/services/ink-resize-fix.js +54 -44
  123. package/dist/cli/services/ink-resize-fix.js.map +1 -0
  124. package/dist/cli/services/ink-sync-output.d.ts +12 -0
  125. package/dist/cli/services/ink-sync-output.js +16 -0
  126. package/dist/cli/services/ink-sync-output.js.map +1 -0
  127. package/dist/cli/services/interactive-tools.js +268 -212
  128. package/dist/cli/services/interactive-tools.js.map +1 -0
  129. package/dist/cli/services/keybinding-manager.d.ts +11 -1
  130. package/dist/cli/services/keybinding-manager.js +126 -63
  131. package/dist/cli/services/keybinding-manager.js.map +1 -0
  132. package/dist/cli/services/local-tools.d.ts +1 -1
  133. package/dist/cli/services/local-tools.js +939 -656
  134. package/dist/cli/services/local-tools.js.map +1 -0
  135. package/dist/cli/services/lsp-manager.js +757 -594
  136. package/dist/cli/services/lsp-manager.js.map +1 -0
  137. package/dist/cli/services/mcp-client.d.ts +1 -1
  138. package/dist/cli/services/mcp-client.js +173 -134
  139. package/dist/cli/services/mcp-client.js.map +1 -0
  140. package/dist/cli/services/memory-manager.js +53 -40
  141. package/dist/cli/services/memory-manager.js.map +1 -0
  142. package/dist/cli/services/model-manager.js +55 -40
  143. package/dist/cli/services/model-manager.js.map +1 -0
  144. package/dist/cli/services/model-router.js +115 -85
  145. package/dist/cli/services/model-router.js.map +1 -0
  146. package/dist/cli/services/paths.d.ts +30 -0
  147. package/dist/cli/services/paths.js +81 -0
  148. package/dist/cli/services/paths.js.map +1 -0
  149. package/dist/cli/services/permission-modes.js +32 -25
  150. package/dist/cli/services/permission-modes.js.map +1 -0
  151. package/dist/cli/services/rewind.js +182 -168
  152. package/dist/cli/services/rewind.js.map +1 -0
  153. package/dist/cli/services/ripgrep.js +115 -115
  154. package/dist/cli/services/ripgrep.js.map +1 -0
  155. package/dist/cli/services/sandbox.d.ts +1 -1
  156. package/dist/cli/services/sandbox.js +58 -37
  157. package/dist/cli/services/sandbox.js.map +1 -0
  158. package/dist/cli/services/server-tools.js +738 -565
  159. package/dist/cli/services/server-tools.js.map +1 -0
  160. package/dist/cli/services/session-persistence.js +69 -74
  161. package/dist/cli/services/session-persistence.js.map +1 -0
  162. package/dist/cli/services/subagent-worker.js +42 -27
  163. package/dist/cli/services/subagent-worker.js.map +1 -0
  164. package/dist/cli/services/subagent.d.ts +2 -0
  165. package/dist/cli/services/subagent.js +606 -430
  166. package/dist/cli/services/subagent.js.map +1 -0
  167. package/dist/cli/services/system-prompt.js +86 -78
  168. package/dist/cli/services/system-prompt.js.map +1 -0
  169. package/dist/cli/services/task-decomposer.d.ts +1 -1
  170. package/dist/cli/services/task-decomposer.js +172 -139
  171. package/dist/cli/services/task-decomposer.js.map +1 -0
  172. package/dist/cli/services/team-lead.d.ts +2 -2
  173. package/dist/cli/services/team-lead.js +727 -529
  174. package/dist/cli/services/team-lead.js.map +1 -0
  175. package/dist/cli/services/team-state.js +319 -319
  176. package/dist/cli/services/team-state.js.map +1 -0
  177. package/dist/cli/services/teammate.d.ts +8 -2
  178. package/dist/cli/services/teammate.js +862 -560
  179. package/dist/cli/services/teammate.js.map +1 -0
  180. package/dist/cli/services/telemetry.d.ts +6 -1
  181. package/dist/cli/services/telemetry.js +180 -157
  182. package/dist/cli/services/telemetry.js.map +1 -0
  183. package/dist/cli/services/tools/agent-tools.d.ts +3 -3
  184. package/dist/cli/services/tools/agent-tools.js +480 -322
  185. package/dist/cli/services/tools/agent-tools.js.map +1 -0
  186. package/dist/cli/services/tools/file-ops.js +563 -450
  187. package/dist/cli/services/tools/file-ops.js.map +1 -0
  188. package/dist/cli/services/tools/search-tools.js +231 -162
  189. package/dist/cli/services/tools/search-tools.js.map +1 -0
  190. package/dist/cli/services/tools/shell-exec.js +197 -151
  191. package/dist/cli/services/tools/shell-exec.js.map +1 -0
  192. package/dist/cli/services/tools/task-manager.js +206 -173
  193. package/dist/cli/services/tools/task-manager.js.map +1 -0
  194. package/dist/cli/services/tools/web-tools.js +388 -341
  195. package/dist/cli/services/tools/web-tools.js.map +1 -0
  196. package/dist/cli/setup/SetupApp.d.ts +2 -2
  197. package/dist/cli/setup/SetupApp.js +608 -160
  198. package/dist/cli/setup/SetupApp.js.map +1 -0
  199. package/dist/cli/shared/ErrorBoundary.d.ts +22 -0
  200. package/dist/cli/shared/ErrorBoundary.js +73 -0
  201. package/dist/cli/shared/ErrorBoundary.js.map +1 -0
  202. package/dist/cli/shared/MatrixIntro.js +66 -69
  203. package/dist/cli/shared/MatrixIntro.js.map +1 -0
  204. package/dist/cli/shared/SpinnerSlot.d.ts +14 -0
  205. package/dist/cli/shared/SpinnerSlot.js +63 -0
  206. package/dist/cli/shared/SpinnerSlot.js.map +1 -0
  207. package/dist/cli/shared/Theme.d.ts +1 -1
  208. package/dist/cli/shared/Theme.js +136 -92
  209. package/dist/cli/shared/Theme.js.map +1 -0
  210. package/dist/cli/shared/WhaleBanner.js +99 -11
  211. package/dist/cli/shared/WhaleBanner.js.map +1 -0
  212. package/dist/cli/shared/markdown.d.ts +3 -1
  213. package/dist/cli/shared/markdown.js +736 -674
  214. package/dist/cli/shared/markdown.js.map +1 -0
  215. package/dist/cli/shared/marked-terminal.d.js +2 -0
  216. package/dist/cli/shared/marked-terminal.d.js.map +1 -0
  217. package/dist/cli/shared/theme-manager.js +99 -90
  218. package/dist/cli/shared/theme-manager.js.map +1 -0
  219. package/dist/cli/shared/theme-presets.js +256 -254
  220. package/dist/cli/shared/theme-presets.js.map +1 -0
  221. package/dist/cli/status/StatusApp.js +235 -86
  222. package/dist/cli/status/StatusApp.js.map +1 -0
  223. package/dist/cli/stores/StoreApp.js +275 -65
  224. package/dist/cli/stores/StoreApp.js.map +1 -0
  225. package/dist/index.d.ts +2 -2
  226. package/dist/index.js +509 -396
  227. package/dist/index.js.map +1 -0
  228. package/dist/local-agent/connection.d.ts +2 -2
  229. package/dist/local-agent/connection.js +352 -293
  230. package/dist/local-agent/connection.js.map +1 -0
  231. package/dist/local-agent/discovery.js +259 -122
  232. package/dist/local-agent/discovery.js.map +1 -0
  233. package/dist/local-agent/executor.js +216 -193
  234. package/dist/local-agent/executor.js.map +1 -0
  235. package/dist/local-agent/index.d.ts +2 -2
  236. package/dist/local-agent/index.js +156 -156
  237. package/dist/local-agent/index.js.map +1 -0
  238. package/dist/node/adapters/base.js +18 -8
  239. package/dist/node/adapters/base.js.map +1 -0
  240. package/dist/node/adapters/discord.js +286 -275
  241. package/dist/node/adapters/discord.js.map +1 -0
  242. package/dist/node/adapters/email.js +189 -202
  243. package/dist/node/adapters/email.js.map +1 -0
  244. package/dist/node/adapters/imessage.js +145 -142
  245. package/dist/node/adapters/imessage.js.map +1 -0
  246. package/dist/node/adapters/slack.js +237 -236
  247. package/dist/node/adapters/slack.js.map +1 -0
  248. package/dist/node/adapters/sms.js +149 -151
  249. package/dist/node/adapters/sms.js.map +1 -0
  250. package/dist/node/adapters/telegram.js +88 -92
  251. package/dist/node/adapters/telegram.js.map +1 -0
  252. package/dist/node/adapters/webchat.js +160 -136
  253. package/dist/node/adapters/webchat.js.map +1 -0
  254. package/dist/node/adapters/whatsapp.js +212 -215
  255. package/dist/node/adapters/whatsapp.js.map +1 -0
  256. package/dist/node/cli.js +884 -653
  257. package/dist/node/cli.js.map +1 -0
  258. package/dist/node/config.js +20 -18
  259. package/dist/node/config.js.map +1 -0
  260. package/dist/node/gateway-client.js +191 -181
  261. package/dist/node/gateway-client.js.map +1 -0
  262. package/dist/node/portal/clipboard.js +161 -130
  263. package/dist/node/portal/clipboard.js.map +1 -0
  264. package/dist/node/portal/discovery.js +51 -45
  265. package/dist/node/portal/discovery.js.map +1 -0
  266. package/dist/node/portal/forward.js +64 -58
  267. package/dist/node/portal/forward.js.map +1 -0
  268. package/dist/node/portal/index.js +246 -221
  269. package/dist/node/portal/index.js.map +1 -0
  270. package/dist/node/portal/multiplexer.js +192 -182
  271. package/dist/node/portal/multiplexer.js.map +1 -0
  272. package/dist/node/portal/permissions.js +102 -70
  273. package/dist/node/portal/permissions.js.map +1 -0
  274. package/dist/node/portal/protocol.js +153 -116
  275. package/dist/node/portal/protocol.js.map +1 -0
  276. package/dist/node/portal/screen.js +80 -69
  277. package/dist/node/portal/screen.js.map +1 -0
  278. package/dist/node/portal/session.js +124 -117
  279. package/dist/node/portal/session.js.map +1 -0
  280. package/dist/node/portal/shell.js +140 -113
  281. package/dist/node/portal/shell.js.map +1 -0
  282. package/dist/node/portal/stream.js +77 -75
  283. package/dist/node/portal/stream.js.map +1 -0
  284. package/dist/node/portal/transfer.js +190 -167
  285. package/dist/node/portal/transfer.js.map +1 -0
  286. package/dist/node/portal/ui.js +124 -99
  287. package/dist/node/portal/ui.js.map +1 -0
  288. package/dist/node/remote-desktop/compile-helper.js +50 -45
  289. package/dist/node/remote-desktop/compile-helper.js.map +1 -0
  290. package/dist/node/remote-desktop/index.js +215 -187
  291. package/dist/node/remote-desktop/index.js.map +1 -0
  292. package/dist/node/remote-desktop/protocol.js +45 -29
  293. package/dist/node/remote-desktop/protocol.js.map +1 -0
  294. package/dist/node/runtime.js +493 -410
  295. package/dist/node/runtime.js.map +1 -0
  296. package/dist/server/handlers/__test-utils__/test-db.js +39 -89
  297. package/dist/server/handlers/__test-utils__/test-db.js.map +1 -0
  298. package/dist/server/handlers/analytics.js +467 -261
  299. package/dist/server/handlers/analytics.js.map +1 -0
  300. package/dist/server/handlers/api-docs.d.ts +6 -0
  301. package/dist/server/handlers/api-docs.js +1613 -0
  302. package/dist/server/handlers/api-docs.js.map +1 -0
  303. package/dist/server/handlers/api-keys.js +295 -232
  304. package/dist/server/handlers/api-keys.js.map +1 -0
  305. package/dist/server/handlers/billing.js +330 -239
  306. package/dist/server/handlers/billing.js.map +1 -0
  307. package/dist/server/handlers/browser.js +468 -395
  308. package/dist/server/handlers/browser.js.map +1 -0
  309. package/dist/server/handlers/catalog.js +1377 -978
  310. package/dist/server/handlers/catalog.js.map +1 -0
  311. package/dist/server/handlers/clickhouse.js +157 -109
  312. package/dist/server/handlers/clickhouse.js.map +1 -0
  313. package/dist/server/handlers/comms.d.ts +0 -53
  314. package/dist/server/handlers/comms.js +1443 -970
  315. package/dist/server/handlers/comms.js.map +1 -0
  316. package/dist/server/handlers/creations.js +461 -394
  317. package/dist/server/handlers/creations.js.map +1 -0
  318. package/dist/server/handlers/crm.js +1082 -791
  319. package/dist/server/handlers/crm.js.map +1 -0
  320. package/dist/server/handlers/discovery.js +251 -232
  321. package/dist/server/handlers/discovery.js.map +1 -0
  322. package/dist/server/handlers/embeddings.js +241 -164
  323. package/dist/server/handlers/embeddings.js.map +1 -0
  324. package/dist/server/handlers/enrichment.js +887 -718
  325. package/dist/server/handlers/enrichment.js.map +1 -0
  326. package/dist/server/handlers/image-gen.js +467 -376
  327. package/dist/server/handlers/image-gen.js.map +1 -0
  328. package/dist/server/handlers/inventory.js +797 -424
  329. package/dist/server/handlers/inventory.js.map +1 -0
  330. package/dist/server/handlers/kali.js +272 -230
  331. package/dist/server/handlers/kali.js.map +1 -0
  332. package/dist/server/handlers/llm-providers.js +803 -580
  333. package/dist/server/handlers/llm-providers.js.map +1 -0
  334. package/dist/server/handlers/local-agent.js +133 -105
  335. package/dist/server/handlers/local-agent.js.map +1 -0
  336. package/dist/server/handlers/media.js +1179 -857
  337. package/dist/server/handlers/media.js.map +1 -0
  338. package/dist/server/handlers/meta-ads.js +2669 -2093
  339. package/dist/server/handlers/meta-ads.js.map +1 -0
  340. package/dist/server/handlers/nodes.js +1321 -913
  341. package/dist/server/handlers/nodes.js.map +1 -0
  342. package/dist/server/handlers/operations.js +183 -157
  343. package/dist/server/handlers/operations.js.map +1 -0
  344. package/dist/server/handlers/platform.js +346 -210
  345. package/dist/server/handlers/platform.js.map +1 -0
  346. package/dist/server/handlers/remove-bg.js +118 -86
  347. package/dist/server/handlers/remove-bg.js.map +1 -0
  348. package/dist/server/handlers/storefront.js +586 -446
  349. package/dist/server/handlers/storefront.js.map +1 -0
  350. package/dist/server/handlers/supply-chain.js +546 -326
  351. package/dist/server/handlers/supply-chain.js.map +1 -0
  352. package/dist/server/handlers/transcription.js +106 -97
  353. package/dist/server/handlers/transcription.js.map +1 -0
  354. package/dist/server/handlers/video-gen.js +593 -424
  355. package/dist/server/handlers/video-gen.js.map +1 -0
  356. package/dist/server/handlers/voice.js +1458 -1017
  357. package/dist/server/handlers/voice.js.map +1 -0
  358. package/dist/server/handlers/workflow-steps.js +2837 -2116
  359. package/dist/server/handlers/workflow-steps.js.map +1 -0
  360. package/dist/server/handlers/workflows.js +1630 -933
  361. package/dist/server/handlers/workflows.js.map +1 -0
  362. package/dist/server/index.js +3166 -2390
  363. package/dist/server/index.js.map +1 -0
  364. package/dist/server/lib/batch-client.js +471 -409
  365. package/dist/server/lib/batch-client.js.map +1 -0
  366. package/dist/server/lib/clickhouse-buffer.js +118 -104
  367. package/dist/server/lib/clickhouse-buffer.js.map +1 -0
  368. package/dist/server/lib/clickhouse-client.js +107 -107
  369. package/dist/server/lib/clickhouse-client.js.map +1 -0
  370. package/dist/server/lib/coa-renderer.js +1786 -356
  371. package/dist/server/lib/coa-renderer.js.map +1 -0
  372. package/dist/server/lib/code-worker-pool.js +227 -177
  373. package/dist/server/lib/code-worker-pool.js.map +1 -0
  374. package/dist/server/lib/code-worker.js +174 -164
  375. package/dist/server/lib/code-worker.js.map +1 -0
  376. package/dist/server/lib/compaction-service.d.ts +2 -12
  377. package/dist/server/lib/compaction-service.js +74 -184
  378. package/dist/server/lib/compaction-service.js.map +1 -0
  379. package/dist/server/lib/logger.js +36 -24
  380. package/dist/server/lib/logger.js.map +1 -0
  381. package/dist/server/lib/otel.js +101 -80
  382. package/dist/server/lib/otel.js.map +1 -0
  383. package/dist/server/lib/pdf-renderer.d.ts +1 -1
  384. package/dist/server/lib/pdf-renderer.js +954 -776
  385. package/dist/server/lib/pdf-renderer.js.map +1 -0
  386. package/dist/server/lib/prompt-sanitizer.js +188 -108
  387. package/dist/server/lib/prompt-sanitizer.js.map +1 -0
  388. package/dist/server/lib/provider-capabilities.js +136 -138
  389. package/dist/server/lib/provider-capabilities.js.map +1 -0
  390. package/dist/server/lib/provider-failover.js +190 -168
  391. package/dist/server/lib/provider-failover.js.map +1 -0
  392. package/dist/server/lib/rate-limiter.js +186 -117
  393. package/dist/server/lib/rate-limiter.js.map +1 -0
  394. package/dist/server/lib/react-pdf-layout.js +551 -382
  395. package/dist/server/lib/react-pdf-layout.js.map +1 -0
  396. package/dist/server/lib/server-agent-loop.d.ts +9 -0
  397. package/dist/server/lib/server-agent-loop.js +906 -624
  398. package/dist/server/lib/server-agent-loop.js.map +1 -0
  399. package/dist/server/lib/server-subagent.d.ts +2 -0
  400. package/dist/server/lib/server-subagent.js +260 -162
  401. package/dist/server/lib/server-subagent.js.map +1 -0
  402. package/dist/server/lib/session-checkpoint.js +105 -96
  403. package/dist/server/lib/session-checkpoint.js.map +1 -0
  404. package/dist/server/lib/ssrf-guard.js +193 -184
  405. package/dist/server/lib/ssrf-guard.js.map +1 -0
  406. package/dist/server/lib/supabase-client.js +94 -82
  407. package/dist/server/lib/supabase-client.js.map +1 -0
  408. package/dist/server/lib/template-resolver.js +154 -176
  409. package/dist/server/lib/template-resolver.js.map +1 -0
  410. package/dist/server/lib/utils.js +242 -133
  411. package/dist/server/lib/utils.js.map +1 -0
  412. package/dist/server/local-agent-gateway.d.ts +2 -2
  413. package/dist/server/local-agent-gateway.js +785 -627
  414. package/dist/server/local-agent-gateway.js.map +1 -0
  415. package/dist/server/providers/anthropic.js +254 -176
  416. package/dist/server/providers/anthropic.js.map +1 -0
  417. package/dist/server/providers/bedrock.js +221 -162
  418. package/dist/server/providers/bedrock.js.map +1 -0
  419. package/dist/server/providers/gemini.js +548 -418
  420. package/dist/server/providers/gemini.js.map +1 -0
  421. package/dist/server/providers/openai.js +571 -437
  422. package/dist/server/providers/openai.js.map +1 -0
  423. package/dist/server/providers/registry.js +23 -18
  424. package/dist/server/providers/registry.js.map +1 -0
  425. package/dist/server/providers/shared.js +123 -95
  426. package/dist/server/providers/shared.js.map +1 -0
  427. package/dist/server/providers/types.js +1 -11
  428. package/dist/server/providers/types.js.map +1 -0
  429. package/dist/server/proxy-handlers.js +209 -165
  430. package/dist/server/proxy-handlers.js.map +1 -0
  431. package/dist/server/tool-router.d.ts +13 -0
  432. package/dist/server/tool-router.js +960 -598
  433. package/dist/server/tool-router.js.map +1 -0
  434. package/dist/server/validation.js +248 -188
  435. package/dist/server/validation.js.map +1 -0
  436. package/dist/server/worker.js +202 -133
  437. package/dist/server/worker.js.map +1 -0
  438. package/dist/setup.d.ts +2 -2
  439. package/dist/setup.js +151 -147
  440. package/dist/setup.js.map +1 -0
  441. package/dist/shared/agent-core.d.ts +191 -24
  442. package/dist/shared/agent-core.js +971 -462
  443. package/dist/shared/agent-core.js.map +1 -0
  444. package/dist/shared/anthropic-types.js +1 -6
  445. package/dist/shared/anthropic-types.js.map +1 -0
  446. package/dist/shared/api-client.d.ts +17 -9
  447. package/dist/shared/api-client.js +419 -327
  448. package/dist/shared/api-client.js.map +1 -0
  449. package/dist/shared/compaction.d.ts +36 -0
  450. package/dist/shared/compaction.js +138 -0
  451. package/dist/shared/compaction.js.map +1 -0
  452. package/dist/shared/constants.js +67 -64
  453. package/dist/shared/constants.js.map +1 -0
  454. package/dist/shared/sse-parser.js +221 -219
  455. package/dist/shared/sse-parser.js.map +1 -0
  456. package/dist/shared/tool-dispatch.d.ts +4 -2
  457. package/dist/shared/tool-dispatch.js +226 -165
  458. package/dist/shared/tool-dispatch.js.map +1 -0
  459. package/dist/shared/types.js +1 -6
  460. package/dist/shared/types.js.map +1 -0
  461. package/dist/types/cli-highlight.d.js +2 -0
  462. package/dist/types/cli-highlight.d.js.map +1 -0
  463. package/dist/types/diff.d.js +2 -0
  464. package/dist/types/diff.d.js.map +1 -0
  465. package/dist/types/pdf-parse.d.js +2 -0
  466. package/dist/types/pdf-parse.d.js.map +1 -0
  467. package/dist/updater.d.ts +1 -1
  468. package/dist/updater.js +118 -92
  469. package/dist/updater.js.map +1 -0
  470. package/dist/webchat/widget.js +227 -380
  471. package/dist/webchat/widget.js.map +1 -0
  472. package/package.json +22 -10
  473. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  474. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  475. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  476. package/vendor/ink/build/apply-styles.js +175 -0
  477. package/vendor/ink/build/build-layout.js +77 -0
  478. package/vendor/ink/build/calculate-wrapped-text.js +53 -0
  479. package/vendor/ink/build/colorize.d.ts +3 -0
  480. package/vendor/ink/build/colorize.js +48 -0
  481. package/vendor/ink/build/colorize.js.map +1 -0
  482. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  483. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  484. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  485. package/vendor/ink/build/components/App.d.ts +18 -0
  486. package/vendor/ink/build/components/App.js +351 -0
  487. package/vendor/ink/build/components/App.js.map +1 -0
  488. package/vendor/ink/build/components/AppContext.d.ts +15 -0
  489. package/vendor/ink/build/components/AppContext.js +11 -0
  490. package/vendor/ink/build/components/AppContext.js.map +1 -0
  491. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  492. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  493. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  494. package/vendor/ink/build/components/Box.d.ts +117 -0
  495. package/vendor/ink/build/components/Box.js +34 -0
  496. package/vendor/ink/build/components/Box.js.map +1 -0
  497. package/vendor/ink/build/components/Color.js +62 -0
  498. package/vendor/ink/build/components/Cursor.d.ts +83 -0
  499. package/vendor/ink/build/components/Cursor.js +53 -0
  500. package/vendor/ink/build/components/Cursor.js.map +1 -0
  501. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  502. package/vendor/ink/build/components/CursorContext.js +8 -0
  503. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  504. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  505. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  506. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  507. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  508. package/vendor/ink/build/components/ErrorOverview.js +84 -0
  509. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  510. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  511. package/vendor/ink/build/components/FocusContext.js +17 -0
  512. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  513. package/vendor/ink/build/components/Newline.d.ts +13 -0
  514. package/vendor/ink/build/components/Newline.js +8 -0
  515. package/vendor/ink/build/components/Newline.js.map +1 -0
  516. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  517. package/vendor/ink/build/components/Spacer.js +11 -0
  518. package/vendor/ink/build/components/Spacer.js.map +1 -0
  519. package/vendor/ink/build/components/Static.d.ts +24 -0
  520. package/vendor/ink/build/components/Static.js +28 -0
  521. package/vendor/ink/build/components/Static.js.map +1 -0
  522. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  523. package/vendor/ink/build/components/StderrContext.js +13 -0
  524. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  525. package/vendor/ink/build/components/StdinContext.d.ts +22 -0
  526. package/vendor/ink/build/components/StdinContext.js +19 -0
  527. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  528. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  529. package/vendor/ink/build/components/StdoutContext.js +13 -0
  530. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  531. package/vendor/ink/build/components/Text.d.ts +55 -0
  532. package/vendor/ink/build/components/Text.js +50 -0
  533. package/vendor/ink/build/components/Text.js.map +1 -0
  534. package/vendor/ink/build/components/Transform.d.ts +16 -0
  535. package/vendor/ink/build/components/Transform.js +15 -0
  536. package/vendor/ink/build/components/Transform.js.map +1 -0
  537. package/vendor/ink/build/cursor-helpers.d.ts +38 -0
  538. package/vendor/ink/build/cursor-helpers.js +56 -0
  539. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  540. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  541. package/vendor/ink/build/devtools-window-polyfill.js +65 -0
  542. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  543. package/vendor/ink/build/devtools.d.ts +1 -0
  544. package/vendor/ink/build/devtools.js +11 -0
  545. package/vendor/ink/build/devtools.js.map +1 -0
  546. package/vendor/ink/build/dom.d.ts +56 -0
  547. package/vendor/ink/build/dom.js +124 -0
  548. package/vendor/ink/build/dom.js.map +1 -0
  549. package/vendor/ink/build/experimental/apply-style.js +140 -0
  550. package/vendor/ink/build/experimental/dom.js +123 -0
  551. package/vendor/ink/build/experimental/output.js +91 -0
  552. package/vendor/ink/build/experimental/reconciler.js +141 -0
  553. package/vendor/ink/build/experimental/renderer.js +81 -0
  554. package/vendor/ink/build/get-max-width.d.ts +3 -0
  555. package/vendor/ink/build/get-max-width.js +10 -0
  556. package/vendor/ink/build/get-max-width.js.map +1 -0
  557. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  558. package/vendor/ink/build/hooks/use-app.js +8 -0
  559. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  560. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  561. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  562. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  563. package/vendor/ink/build/hooks/use-focus-manager.d.ts +28 -0
  564. package/vendor/ink/build/hooks/use-focus-manager.js +17 -0
  565. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  566. package/vendor/ink/build/hooks/use-focus.d.ts +29 -0
  567. package/vendor/ink/build/hooks/use-focus.js +42 -0
  568. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  569. package/vendor/ink/build/hooks/use-input.d.ts +131 -0
  570. package/vendor/ink/build/hooks/use-input.js +124 -0
  571. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  572. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +5 -0
  573. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +11 -0
  574. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  575. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  576. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  577. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  578. package/vendor/ink/build/hooks/use-stdin.d.ts +5 -0
  579. package/vendor/ink/build/hooks/use-stdin.js +8 -0
  580. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  581. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  582. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  583. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  584. package/vendor/ink/build/hooks/useInput.js +38 -0
  585. package/vendor/ink/build/index.d.ts +34 -0
  586. package/vendor/ink/build/index.js +20 -0
  587. package/vendor/ink/build/index.js.map +1 -0
  588. package/vendor/ink/build/ink.d.ts +90 -0
  589. package/vendor/ink/build/ink.js +654 -0
  590. package/vendor/ink/build/ink.js.map +1 -0
  591. package/vendor/ink/build/input-parser.d.ts +7 -0
  592. package/vendor/ink/build/input-parser.js +154 -0
  593. package/vendor/ink/build/input-parser.js.map +1 -0
  594. package/vendor/ink/build/instance.js +205 -0
  595. package/vendor/ink/build/instances.d.ts +3 -0
  596. package/vendor/ink/build/instances.js +8 -0
  597. package/vendor/ink/build/instances.js.map +1 -0
  598. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  599. package/vendor/ink/build/kitty-keyboard.js +32 -0
  600. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  601. package/vendor/ink/build/layout.d.ts +7 -0
  602. package/vendor/ink/build/layout.js +33 -0
  603. package/vendor/ink/build/layout.js.map +1 -0
  604. package/vendor/ink/build/log-update.d.ts +19 -0
  605. package/vendor/ink/build/log-update.js +243 -0
  606. package/vendor/ink/build/log-update.js.map +1 -0
  607. package/vendor/ink/build/measure-element.d.ts +16 -0
  608. package/vendor/ink/build/measure-element.js +9 -0
  609. package/vendor/ink/build/measure-element.js.map +1 -0
  610. package/vendor/ink/build/measure-text.d.ts +6 -0
  611. package/vendor/ink/build/measure-text.js +21 -0
  612. package/vendor/ink/build/measure-text.js.map +1 -0
  613. package/vendor/ink/build/options.d.ts +52 -0
  614. package/vendor/ink/build/options.js +2 -0
  615. package/vendor/ink/build/options.js.map +1 -0
  616. package/vendor/ink/build/output.d.ts +35 -0
  617. package/vendor/ink/build/output.js +183 -0
  618. package/vendor/ink/build/output.js.map +1 -0
  619. package/vendor/ink/build/parse-keypress.d.ts +22 -0
  620. package/vendor/ink/build/parse-keypress.js +493 -0
  621. package/vendor/ink/build/parse-keypress.js.map +1 -0
  622. package/vendor/ink/build/reconciler.d.ts +4 -0
  623. package/vendor/ink/build/reconciler.js +274 -0
  624. package/vendor/ink/build/reconciler.js.map +1 -0
  625. package/vendor/ink/build/render-background.d.ts +4 -0
  626. package/vendor/ink/build/render-background.js +25 -0
  627. package/vendor/ink/build/render-background.js.map +1 -0
  628. package/vendor/ink/build/render-border.d.ts +4 -0
  629. package/vendor/ink/build/render-border.js +73 -0
  630. package/vendor/ink/build/render-border.js.map +1 -0
  631. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  632. package/vendor/ink/build/render-node-to-output.js +147 -0
  633. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  634. package/vendor/ink/build/render-to-string.d.ts +38 -0
  635. package/vendor/ink/build/render-to-string.js +115 -0
  636. package/vendor/ink/build/render-to-string.js.map +1 -0
  637. package/vendor/ink/build/render.d.ts +121 -0
  638. package/vendor/ink/build/render.js +55 -0
  639. package/vendor/ink/build/render.js.map +1 -0
  640. package/vendor/ink/build/renderer.d.ts +8 -0
  641. package/vendor/ink/build/renderer.js +55 -0
  642. package/vendor/ink/build/renderer.js.map +1 -0
  643. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  644. package/vendor/ink/build/sanitize-ansi.js +27 -0
  645. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  646. package/vendor/ink/build/screen-reader-update.d.ts +13 -0
  647. package/vendor/ink/build/screen-reader-update.js +38 -0
  648. package/vendor/ink/build/screen-reader-update.js.map +1 -0
  649. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  650. package/vendor/ink/build/squash-text-nodes.js +36 -0
  651. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  652. package/vendor/ink/build/styles.d.ts +240 -0
  653. package/vendor/ink/build/styles.js +232 -0
  654. package/vendor/ink/build/styles.js.map +1 -0
  655. package/vendor/ink/build/utils.d.ts +2 -0
  656. package/vendor/ink/build/utils.js +4 -0
  657. package/vendor/ink/build/utils.js.map +1 -0
  658. package/vendor/ink/build/wrap-text.d.ts +3 -0
  659. package/vendor/ink/build/wrap-text.js +31 -0
  660. package/vendor/ink/build/wrap-text.js.map +1 -0
  661. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  662. package/vendor/ink/build/write-synchronized.js +7 -0
  663. package/vendor/ink/build/write-synchronized.js.map +1 -0
  664. package/vendor/ink/license +10 -0
  665. package/vendor/ink/node_modules/@types/node/LICENSE +21 -0
  666. package/vendor/ink/node_modules/@types/node/README.md +15 -0
  667. package/vendor/ink/node_modules/@types/node/assert/strict.d.ts +105 -0
  668. package/vendor/ink/node_modules/@types/node/assert.d.ts +955 -0
  669. package/vendor/ink/node_modules/@types/node/async_hooks.d.ts +623 -0
  670. package/vendor/ink/node_modules/@types/node/buffer.buffer.d.ts +466 -0
  671. package/vendor/ink/node_modules/@types/node/buffer.d.ts +1810 -0
  672. package/vendor/ink/node_modules/@types/node/child_process.d.ts +1428 -0
  673. package/vendor/ink/node_modules/@types/node/cluster.d.ts +486 -0
  674. package/vendor/ink/node_modules/@types/node/compatibility/iterators.d.ts +21 -0
  675. package/vendor/ink/node_modules/@types/node/console.d.ts +151 -0
  676. package/vendor/ink/node_modules/@types/node/constants.d.ts +20 -0
  677. package/vendor/ink/node_modules/@types/node/crypto.d.ts +4065 -0
  678. package/vendor/ink/node_modules/@types/node/dgram.d.ts +564 -0
  679. package/vendor/ink/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
  680. package/vendor/ink/node_modules/@types/node/dns/promises.d.ts +503 -0
  681. package/vendor/ink/node_modules/@types/node/dns.d.ts +922 -0
  682. package/vendor/ink/node_modules/@types/node/domain.d.ts +166 -0
  683. package/vendor/ink/node_modules/@types/node/events.d.ts +1054 -0
  684. package/vendor/ink/node_modules/@types/node/fs/promises.d.ts +1329 -0
  685. package/vendor/ink/node_modules/@types/node/fs.d.ts +4676 -0
  686. package/vendor/ink/node_modules/@types/node/globals.d.ts +150 -0
  687. package/vendor/ink/node_modules/@types/node/globals.typedarray.d.ts +101 -0
  688. package/vendor/ink/node_modules/@types/node/http.d.ts +2167 -0
  689. package/vendor/ink/node_modules/@types/node/http2.d.ts +2480 -0
  690. package/vendor/ink/node_modules/@types/node/https.d.ts +405 -0
  691. package/vendor/ink/node_modules/@types/node/index.d.ts +115 -0
  692. package/vendor/ink/node_modules/@types/node/inspector/promises.d.ts +41 -0
  693. package/vendor/ink/node_modules/@types/node/inspector.d.ts +224 -0
  694. package/vendor/ink/node_modules/@types/node/inspector.generated.d.ts +4226 -0
  695. package/vendor/ink/node_modules/@types/node/module.d.ts +819 -0
  696. package/vendor/ink/node_modules/@types/node/net.d.ts +933 -0
  697. package/vendor/ink/node_modules/@types/node/os.d.ts +507 -0
  698. package/vendor/ink/node_modules/@types/node/package.json +155 -0
  699. package/vendor/ink/node_modules/@types/node/path/posix.d.ts +8 -0
  700. package/vendor/ink/node_modules/@types/node/path/win32.d.ts +8 -0
  701. package/vendor/ink/node_modules/@types/node/path.d.ts +187 -0
  702. package/vendor/ink/node_modules/@types/node/perf_hooks.d.ts +643 -0
  703. package/vendor/ink/node_modules/@types/node/process.d.ts +2156 -0
  704. package/vendor/ink/node_modules/@types/node/punycode.d.ts +117 -0
  705. package/vendor/ink/node_modules/@types/node/querystring.d.ts +152 -0
  706. package/vendor/ink/node_modules/@types/node/quic.d.ts +910 -0
  707. package/vendor/ink/node_modules/@types/node/readline/promises.d.ts +161 -0
  708. package/vendor/ink/node_modules/@types/node/readline.d.ts +541 -0
  709. package/vendor/ink/node_modules/@types/node/repl.d.ts +415 -0
  710. package/vendor/ink/node_modules/@types/node/sea.d.ts +162 -0
  711. package/vendor/ink/node_modules/@types/node/sqlite.d.ts +955 -0
  712. package/vendor/ink/node_modules/@types/node/stream/consumers.d.ts +38 -0
  713. package/vendor/ink/node_modules/@types/node/stream/promises.d.ts +211 -0
  714. package/vendor/ink/node_modules/@types/node/stream/web.d.ts +296 -0
  715. package/vendor/ink/node_modules/@types/node/stream.d.ts +1760 -0
  716. package/vendor/ink/node_modules/@types/node/string_decoder.d.ts +67 -0
  717. package/vendor/ink/node_modules/@types/node/test/reporters.d.ts +96 -0
  718. package/vendor/ink/node_modules/@types/node/test.d.ts +2240 -0
  719. package/vendor/ink/node_modules/@types/node/timers/promises.d.ts +108 -0
  720. package/vendor/ink/node_modules/@types/node/timers.d.ts +159 -0
  721. package/vendor/ink/node_modules/@types/node/tls.d.ts +1198 -0
  722. package/vendor/ink/node_modules/@types/node/trace_events.d.ts +197 -0
  723. package/vendor/ink/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +462 -0
  724. package/vendor/ink/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
  725. package/vendor/ink/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +36 -0
  726. package/vendor/ink/node_modules/@types/node/ts5.6/index.d.ts +117 -0
  727. package/vendor/ink/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
  728. package/vendor/ink/node_modules/@types/node/ts5.7/index.d.ts +117 -0
  729. package/vendor/ink/node_modules/@types/node/tty.d.ts +250 -0
  730. package/vendor/ink/node_modules/@types/node/url.d.ts +519 -0
  731. package/vendor/ink/node_modules/@types/node/util/types.d.ts +558 -0
  732. package/vendor/ink/node_modules/@types/node/util.d.ts +1662 -0
  733. package/vendor/ink/node_modules/@types/node/v8.d.ts +983 -0
  734. package/vendor/ink/node_modules/@types/node/vm.d.ts +1208 -0
  735. package/vendor/ink/node_modules/@types/node/wasi.d.ts +202 -0
  736. package/vendor/ink/node_modules/@types/node/web-globals/abortcontroller.d.ts +59 -0
  737. package/vendor/ink/node_modules/@types/node/web-globals/blob.d.ts +23 -0
  738. package/vendor/ink/node_modules/@types/node/web-globals/console.d.ts +9 -0
  739. package/vendor/ink/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
  740. package/vendor/ink/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  741. package/vendor/ink/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
  742. package/vendor/ink/node_modules/@types/node/web-globals/events.d.ts +106 -0
  743. package/vendor/ink/node_modules/@types/node/web-globals/fetch.d.ts +69 -0
  744. package/vendor/ink/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
  745. package/vendor/ink/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
  746. package/vendor/ink/node_modules/@types/node/web-globals/navigator.d.ts +25 -0
  747. package/vendor/ink/node_modules/@types/node/web-globals/performance.d.ts +45 -0
  748. package/vendor/ink/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  749. package/vendor/ink/node_modules/@types/node/web-globals/streams.d.ts +115 -0
  750. package/vendor/ink/node_modules/@types/node/web-globals/timers.d.ts +44 -0
  751. package/vendor/ink/node_modules/@types/node/web-globals/url.d.ts +24 -0
  752. package/vendor/ink/node_modules/@types/node/worker_threads.d.ts +717 -0
  753. package/vendor/ink/node_modules/@types/node/zlib.d.ts +618 -0
  754. package/vendor/ink/node_modules/node-pty/LICENSE +69 -0
  755. package/vendor/ink/node_modules/node-pty/README.md +164 -0
  756. package/vendor/ink/node_modules/node-pty/binding.gyp +150 -0
  757. package/vendor/ink/node_modules/node-pty/lib/conpty_console_list_agent.js +25 -0
  758. package/vendor/ink/node_modules/node-pty/lib/eventEmitter2.js +47 -0
  759. package/vendor/ink/node_modules/node-pty/lib/index.js +52 -0
  760. package/vendor/ink/node_modules/node-pty/lib/interfaces.js +7 -0
  761. package/vendor/ink/node_modules/node-pty/lib/shared/conout.js +11 -0
  762. package/vendor/ink/node_modules/node-pty/lib/terminal.js +190 -0
  763. package/vendor/ink/node_modules/node-pty/lib/types.js +7 -0
  764. package/vendor/ink/node_modules/node-pty/lib/unixTerminal.js +349 -0
  765. package/vendor/ink/node_modules/node-pty/lib/utils.js +39 -0
  766. package/vendor/ink/node_modules/node-pty/lib/windowsConoutConnection.js +125 -0
  767. package/vendor/ink/node_modules/node-pty/lib/windowsPtyAgent.js +287 -0
  768. package/vendor/ink/node_modules/node-pty/lib/windowsTerminal.js +201 -0
  769. package/vendor/ink/node_modules/node-pty/lib/worker/conoutSocketWorker.js +22 -0
  770. package/vendor/ink/node_modules/node-pty/package.json +65 -0
  771. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
  772. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
  773. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/pty.node +0 -0
  774. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
  775. package/vendor/ink/node_modules/node-pty/prebuilds/linux-arm64/pty.node +0 -0
  776. package/vendor/ink/node_modules/node-pty/prebuilds/linux-x64/pty.node +0 -0
  777. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  778. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  779. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  780. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.pdb +0 -0
  781. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  782. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
  783. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  784. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  785. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  786. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.pdb +0 -0
  787. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  788. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
  789. package/vendor/ink/node_modules/node-pty/scripts/post-install.js +76 -0
  790. package/vendor/ink/node_modules/node-pty/scripts/prebuild.js +34 -0
  791. package/vendor/ink/node_modules/node-pty/src/unix/pty.cc +875 -0
  792. package/vendor/ink/node_modules/node-pty/src/unix/spawn-helper.cc +23 -0
  793. package/vendor/ink/node_modules/node-pty/src/win/conpty.cc +582 -0
  794. package/vendor/ink/node_modules/node-pty/src/win/conpty.h +41 -0
  795. package/vendor/ink/node_modules/node-pty/src/win/conpty_console_list.cc +44 -0
  796. package/vendor/ink/node_modules/node-pty/src/win/path_util.cc +95 -0
  797. package/vendor/ink/node_modules/node-pty/src/win/path_util.h +26 -0
  798. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/OpenConsole.exe +0 -0
  799. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/conpty.dll +0 -0
  800. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/OpenConsole.exe +0 -0
  801. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/conpty.dll +0 -0
  802. package/vendor/ink/node_modules/node-pty/typings/node-pty.d.ts +215 -0
  803. package/vendor/ink/node_modules/undici-types/LICENSE +21 -0
  804. package/vendor/ink/node_modules/undici-types/README.md +6 -0
  805. package/vendor/ink/node_modules/undici-types/agent.d.ts +32 -0
  806. package/vendor/ink/node_modules/undici-types/api.d.ts +43 -0
  807. package/vendor/ink/node_modules/undici-types/balanced-pool.d.ts +30 -0
  808. package/vendor/ink/node_modules/undici-types/cache-interceptor.d.ts +173 -0
  809. package/vendor/ink/node_modules/undici-types/cache.d.ts +36 -0
  810. package/vendor/ink/node_modules/undici-types/client-stats.d.ts +15 -0
  811. package/vendor/ink/node_modules/undici-types/client.d.ts +108 -0
  812. package/vendor/ink/node_modules/undici-types/connector.d.ts +34 -0
  813. package/vendor/ink/node_modules/undici-types/content-type.d.ts +21 -0
  814. package/vendor/ink/node_modules/undici-types/cookies.d.ts +30 -0
  815. package/vendor/ink/node_modules/undici-types/diagnostics-channel.d.ts +74 -0
  816. package/vendor/ink/node_modules/undici-types/dispatcher.d.ts +276 -0
  817. package/vendor/ink/node_modules/undici-types/env-http-proxy-agent.d.ts +22 -0
  818. package/vendor/ink/node_modules/undici-types/errors.d.ts +161 -0
  819. package/vendor/ink/node_modules/undici-types/eventsource.d.ts +66 -0
  820. package/vendor/ink/node_modules/undici-types/fetch.d.ts +211 -0
  821. package/vendor/ink/node_modules/undici-types/formdata.d.ts +108 -0
  822. package/vendor/ink/node_modules/undici-types/global-dispatcher.d.ts +9 -0
  823. package/vendor/ink/node_modules/undici-types/global-origin.d.ts +7 -0
  824. package/vendor/ink/node_modules/undici-types/h2c-client.d.ts +73 -0
  825. package/vendor/ink/node_modules/undici-types/handlers.d.ts +15 -0
  826. package/vendor/ink/node_modules/undici-types/header.d.ts +160 -0
  827. package/vendor/ink/node_modules/undici-types/index.d.ts +88 -0
  828. package/vendor/ink/node_modules/undici-types/interceptors.d.ts +73 -0
  829. package/vendor/ink/node_modules/undici-types/mock-agent.d.ts +68 -0
  830. package/vendor/ink/node_modules/undici-types/mock-call-history.d.ts +111 -0
  831. package/vendor/ink/node_modules/undici-types/mock-client.d.ts +27 -0
  832. package/vendor/ink/node_modules/undici-types/mock-errors.d.ts +12 -0
  833. package/vendor/ink/node_modules/undici-types/mock-interceptor.d.ts +94 -0
  834. package/vendor/ink/node_modules/undici-types/mock-pool.d.ts +27 -0
  835. package/vendor/ink/node_modules/undici-types/package.json +55 -0
  836. package/vendor/ink/node_modules/undici-types/patch.d.ts +29 -0
  837. package/vendor/ink/node_modules/undici-types/pool-stats.d.ts +19 -0
  838. package/vendor/ink/node_modules/undici-types/pool.d.ts +41 -0
  839. package/vendor/ink/node_modules/undici-types/proxy-agent.d.ts +29 -0
  840. package/vendor/ink/node_modules/undici-types/readable.d.ts +68 -0
  841. package/vendor/ink/node_modules/undici-types/retry-agent.d.ts +8 -0
  842. package/vendor/ink/node_modules/undici-types/retry-handler.d.ts +125 -0
  843. package/vendor/ink/node_modules/undici-types/round-robin-pool.d.ts +41 -0
  844. package/vendor/ink/node_modules/undici-types/snapshot-agent.d.ts +109 -0
  845. package/vendor/ink/node_modules/undici-types/util.d.ts +18 -0
  846. package/vendor/ink/node_modules/undici-types/utility.d.ts +7 -0
  847. package/vendor/ink/node_modules/undici-types/webidl.d.ts +341 -0
  848. package/vendor/ink/node_modules/undici-types/websocket.d.ts +186 -0
  849. package/vendor/ink/package.json +201 -0
  850. package/vendor/ink/readme.md +2636 -0
  851. package/bin/swag-agent.js +0 -9
  852. package/dist/server/lib/pg-rate-limiter.d.ts +0 -21
  853. package/dist/server/lib/pg-rate-limiter.js +0 -86
@@ -7,43 +7,57 @@
7
7
  * - Cost optimization (Haiku for simple tasks)
8
8
  * - Resume capability for long-running tasks
9
9
  */
10
+
10
11
  import { readFileSync, existsSync, writeFileSync, mkdirSync, appendFileSync } from "fs";
11
12
  import { join } from "path";
12
13
  import { homedir, tmpdir } from "os";
13
- import { LOCAL_TOOL_DEFINITIONS, } from "./local-tools.js";
14
- import { LoopDetector, estimateCostUsd, demoteSubagentModel } from "../../shared/agent-core.js";
14
+ import { LOCAL_TOOL_DEFINITIONS } from "./local-tools.js";
15
+ import { LoopDetector, estimateCostUsd, demoteSubagentModel, AGENT_DEFAULTS, resolveAgentLoopConfig } from "../../shared/agent-core.js";
16
+ import { preCompact } from "../../shared/compaction.js";
17
+ import { loadCLIAgentConfig } from "./agent-config.js";
15
18
  import { MODEL_MAP } from "../../shared/constants.js";
16
- import { loadServerToolDefinitions, } from "./server-tools.js";
17
- import { logSpan, generateSpanId, generateTraceId } from "./telemetry.js";
19
+ import { loadServerToolDefinitions } from "./server-tools.js";
20
+ import { logSpan, generateSpanId, generateTraceId, PKG_VERSION } from "./telemetry.js";
18
21
  import { loadClaudeMd } from "./agent-loop.js";
19
22
  import { getGlobalEmitter } from "./agent-events.js";
20
23
  import { getAgentDefinition } from "./agent-definitions.js";
21
- import { callAgentAPI, executeToolBlocks, extractTextBlocks, extractToolUseBlocks, getResponseText, yieldToEventLoop, yieldForRender, } from "./agent-worker-base.js";
24
+ import { callAgentAPI, executeToolBlocks, extractTextBlocks, extractToolUseBlocks, getResponseText, yieldToEventLoop, yieldForRender, deduplicateTools, assertUniqueToolNames } from "./agent-worker-base.js";
25
+
26
+ // ============================================================================
27
+ // TYPES
28
+ // ============================================================================
29
+
30
+ // Documentation lookups, web research
31
+
32
+ // Accepts built-in types + custom agent names from .whale/agents/
33
+
22
34
  // ============================================================================
23
35
  // CONSTANTS
24
36
  // ============================================================================
25
- const AGENTS_DIR = join(homedir(), ".swagmanager", "agents");
26
- // Claude Code pattern: subagents should be discrete tasks, not open-ended
27
- // Low turn limit prevents infinite loops and forces focused execution
28
- const MAX_TURNS = 8;
29
- const SUBAGENT_MAX_OUTPUT_TOKENS = 32_000; // Claude Code parity subagents get 32K output
37
+
38
+ const AGENTS_DIR = join(homedir(), ".whale", "agents");
39
+
40
+ // No hard cap on subagent turns — agent self-regulates via end_turn (Claude Code parity).
41
+ // DB config (subagent_max_turns) controls the default. Callers can override via max_turns param.
42
+
30
43
  // ============================================================================
31
44
  // AGENT PROMPTS — specialized per type
32
45
  // ============================================================================
46
+
33
47
  // Build agent prompt with working directory context
34
48
  function buildAgentPrompt(type, cwd) {
35
- const cwdContext = `
49
+ const cwdContext = `
36
50
  ## Working Directory
37
51
  You are working in: ${cwd}
38
52
  All file paths should be relative to or absolute from this directory.
39
53
  IMPORTANT: Focus ONLY on files within this directory. Do not get confused by other projects.
40
54
  `;
41
- // Check for custom agent definition first
42
- const custom = getAgentDefinition(type);
43
- if (custom)
44
- return custom.prompt + cwdContext;
45
- const prompts = {
46
- explore: `You are an exploration agent. Your ONLY job is to quickly find specific information in the codebase, then STOP.
55
+
56
+ // Check for custom agent definition first
57
+ const custom = getAgentDefinition(type);
58
+ if (custom) return custom.prompt + cwdContext;
59
+ const prompts = {
60
+ explore: `You are an exploration agent. Your ONLY job is to quickly find specific information in the codebase, then STOP.
47
61
 
48
62
  Tools available:
49
63
  - glob: Find files by pattern (e.g., "**/*.ts")
@@ -70,7 +84,7 @@ Return a concise summary with:
70
84
  - Direct answer to the question asked
71
85
 
72
86
  IMPORTANT: Complete in 2-4 turns. If you haven't found it by turn 4, summarize what you found and STOP.`,
73
- plan: `You are a planning agent. Your ONLY job is to analyze the codebase and create an implementation plan, then STOP.
87
+ plan: `You are a planning agent. Your ONLY job is to analyze the codebase and create an implementation plan, then STOP.
74
88
 
75
89
  Tools available:
76
90
  - glob: Find files by pattern
@@ -104,7 +118,7 @@ ${cwdContext}
104
118
  - [Any considerations]
105
119
 
106
120
  IMPORTANT: Complete in 3-5 turns. If you haven't finished by turn 5, output your best plan and STOP.`,
107
- "general-purpose": `You are an autonomous agent for discrete tasks. Complete the task, then STOP.
121
+ "general-purpose": `You are an autonomous agent for discrete tasks. Complete the task, then STOP.
108
122
 
109
123
  Tools available:
110
124
  - File operations: read_file, write_file, edit_file, glob, grep
@@ -137,7 +151,7 @@ ${cwdContext}
137
151
  [Any problems encountered]
138
152
 
139
153
  IMPORTANT: This is a discrete task. Complete it in 4-6 turns maximum. Do not loop.`,
140
- research: `You are a research agent. Find the specific information requested, then STOP.
154
+ research: `You are a research agent. Find the specific information requested, then STOP.
141
155
 
142
156
  Tools available:
143
157
  - web_fetch: Fetch and parse web content
@@ -171,446 +185,607 @@ ${cwdContext}
171
185
  ### Caveats
172
186
  [Any version requirements or limitations]
173
187
 
174
- IMPORTANT: Complete in 2-4 turns. Stop as soon as you have a good answer.`,
175
- };
176
- return prompts[type] || prompts["general-purpose"];
188
+ IMPORTANT: Complete in 2-4 turns. Stop as soon as you have a good answer.`
189
+ };
190
+ return prompts[type] || prompts["general-purpose"];
177
191
  }
192
+
178
193
  // ============================================================================
179
194
  // AGENT STATE PERSISTENCE
180
195
  // ============================================================================
196
+
181
197
  function ensureAgentsDir() {
182
- if (!existsSync(AGENTS_DIR))
183
- mkdirSync(AGENTS_DIR, { recursive: true });
198
+ if (!existsSync(AGENTS_DIR)) mkdirSync(AGENTS_DIR, {
199
+ recursive: true
200
+ });
184
201
  }
185
202
  function saveAgentState(state) {
186
- ensureAgentsDir();
187
- const path = join(AGENTS_DIR, `${state.id}.json`);
188
- writeFileSync(path, JSON.stringify(state, null, 2), "utf-8");
203
+ ensureAgentsDir();
204
+ const path = join(AGENTS_DIR, `${state.id}.json`);
205
+ writeFileSync(path, JSON.stringify(state, null, 2), "utf-8");
189
206
  }
190
207
  function loadAgentState(agentId) {
191
- const path = join(AGENTS_DIR, `${agentId}.json`);
192
- if (!existsSync(path))
193
- return null;
194
- try {
195
- return JSON.parse(readFileSync(path, "utf-8"));
196
- }
197
- catch {
198
- return null;
199
- }
208
+ const path = join(AGENTS_DIR, `${agentId}.json`);
209
+ if (!existsSync(path)) return null;
210
+ try {
211
+ return JSON.parse(readFileSync(path, "utf-8"));
212
+ } catch {
213
+ return null;
214
+ }
200
215
  }
201
216
  function generateAgentId() {
202
- return `agent-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
217
+ return `agent-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
203
218
  }
219
+
204
220
  // ============================================================================
205
221
  // TOOL FILTERING — restrict tools per agent type
206
222
  // ============================================================================
223
+
207
224
  function getToolsForAgent(type) {
208
- // Check for custom agent definition with explicit tools
209
- const custom = getAgentDefinition(type);
210
- if (custom?.tools && custom.tools.length > 0)
211
- return custom.tools;
212
- switch (type) {
213
- case "explore":
214
- return ["glob", "grep", "read_file", "list_directory", "search_files", "search_content"];
215
- case "plan":
216
- return ["glob", "grep", "read_file", "list_directory", "search_files", "search_content"];
217
- case "research":
218
- return ["web_fetch", "web_search", "read_file", "grep", "glob"];
219
- case "general-purpose":
220
- // All tools
221
- return [
222
- "read_file", "write_file", "edit_file", "list_directory",
223
- "search_files", "search_content", "run_command",
224
- "glob", "grep", "notebook_edit", "web_fetch", "tasks",
225
- ];
226
- default:
227
- return ["read_file", "glob", "grep"];
228
- }
225
+ // Check for custom agent definition with explicit tools
226
+ const custom = getAgentDefinition(type);
227
+ if (custom?.tools && custom.tools.length > 0) return custom.tools;
228
+ switch (type) {
229
+ case "explore":
230
+ return ["glob", "grep", "read_file", "list_directory", "search_files", "search_content"];
231
+ case "plan":
232
+ return ["glob", "grep", "read_file", "list_directory", "search_files", "search_content"];
233
+ case "research":
234
+ return ["web_fetch", "web_search", "read_file", "grep", "glob"];
235
+ case "general-purpose":
236
+ // All tools EXCEPT delegation — "Subagents cannot spawn other subagents" (Claude Code parity)
237
+ return ["read_file", "write_file", "edit_file", "list_directory", "search_files", "search_content", "run_command", "glob", "grep", "notebook_edit", "web_fetch"];
238
+ default:
239
+ return ["read_file", "glob", "grep"];
240
+ }
229
241
  }
230
242
  async function getFilteredTools(type) {
231
- const allowedNames = new Set(getToolsForAgent(type));
232
- // Local tools
233
- const localTools = LOCAL_TOOL_DEFINITIONS
234
- .filter((t) => allowedNames.has(t.name))
235
- .map((t) => ({
236
- name: t.name,
237
- description: t.description,
238
- input_schema: t.input_schema,
239
- }));
240
- // Add web_search from server tools if allowed
241
- if (allowedNames.has("web_search")) {
242
- try {
243
- const serverTools = await loadServerToolDefinitions();
244
- const webSearch = serverTools.find((t) => t.name === "web_search");
245
- if (webSearch)
246
- localTools.push(webSearch);
247
- }
248
- catch { /* server tools unavailable */ }
249
- }
250
- return localTools;
243
+ const allowedNames = new Set(getToolsForAgent(type));
244
+
245
+ // Local tools
246
+ const localTools = LOCAL_TOOL_DEFINITIONS.filter(t => allowedNames.has(t.name)).map(t => ({
247
+ name: t.name,
248
+ description: t.description,
249
+ input_schema: t.input_schema
250
+ }));
251
+
252
+ // Add server tools if available, filtering by allowed names
253
+ try {
254
+ const serverTools = await loadServerToolDefinitions();
255
+ const allowedServerTools = serverTools.filter(t => allowedNames.has(t.name));
256
+ localTools.push(...allowedServerTools);
257
+ } catch {/* server tools unavailable */}
258
+
259
+ // Deduplicate: local tools take priority over server tools with same name
260
+ return deduplicateTools(localTools);
251
261
  }
262
+
252
263
  // ============================================================================
253
264
  // DISPLAY HELPERS — icons and colors for trace visualization
254
265
  // ============================================================================
266
+
255
267
  function getAgentIcon(type) {
256
- const icons = {
257
- explore: "🔍", // Magnifying glass for exploration
258
- plan: "📋", // Clipboard for planning
259
- "general-purpose": "🤖", // Robot for autonomous work
260
- research: "📚", // Books for research
261
- };
262
- return icons[type] || "⚙️";
268
+ const icons = {
269
+ explore: "🔍",
270
+ // Magnifying glass for exploration
271
+ plan: "📋",
272
+ // Clipboard for planning
273
+ "general-purpose": "🤖",
274
+ // Robot for autonomous work
275
+ research: "📚" // Books for research
276
+ };
277
+ return icons[type] || "⚙️";
263
278
  }
264
279
  function getAgentColor(type) {
265
- const colors = {
266
- explore: "#3B82F6", // Blue for exploration
267
- plan: "#8B5CF6", // Purple for planning
268
- "general-purpose": "#10B981", // Green for general work
269
- research: "#F59E0B", // Amber for research
270
- };
271
- return colors[type] || "#6B7280";
280
+ const colors = {
281
+ explore: "#3B82F6",
282
+ // Blue for exploration
283
+ plan: "#8B5CF6",
284
+ // Purple for planning
285
+ "general-purpose": "#10B981",
286
+ // Green for general work
287
+ research: "#F59E0B" // Amber for research
288
+ };
289
+ return colors[type] || "#6B7280";
272
290
  }
291
+
273
292
  // ============================================================================
274
293
  // SUBAGENT EXECUTION
275
294
  // ============================================================================
295
+
276
296
  // Progress emitter — uses event system instead of stderr to avoid UI conflicts
277
297
  // The global emitter batches and routes these to ChatApp without causing re-renders
278
298
  // NOTE: No module-level mutable state — agentId/turn passed through function params for parallel safety
299
+
279
300
  function emitSubagentProgress(agentType, agentId, message, turn, toolName) {
280
- const emitter = getGlobalEmitter();
281
- emitter.emitSubagentProgress(agentId, agentType, message, turn, toolName);
301
+ const emitter = getGlobalEmitter();
302
+ emitter.emitSubagentProgress(agentId, agentType, message, turn, toolName);
282
303
  }
283
304
  export async function runSubagent(options) {
284
- const { prompt, subagent_type, model, resume, max_turns, name, parentContext, parentTraceContext } = options;
285
- const agentId = resume || generateAgentId();
286
- // Sub-agents default to Haiku for cost control — uses shared demotion logic
287
- const demotedAlias = demoteSubagentModel(model, subagent_type);
288
- const modelId = MODEL_MAP[demotedAlias] || MODEL_MAP["haiku"];
289
- const cwd = process.cwd();
290
- const systemPrompt = buildAgentPrompt(subagent_type, cwd);
291
- const startTime = Date.now();
292
- const effectiveMaxTurns = max_turns ? Math.max(1, Math.min(50, max_turns)) : MAX_TURNS;
293
- // Extract short description from prompt (first sentence or 60 chars)
294
- const descMatch = prompt.match(/^[^.!?\n]+/);
295
- const shortDescription = name || (descMatch
296
- ? descMatch[0].slice(0, 60) + (descMatch[0].length > 60 ? "…" : "")
297
- : prompt.slice(0, 60) + (prompt.length > 60 ? "…" : ""));
298
- // Emit subagent start event
299
- const emitter = getGlobalEmitter();
300
- emitter.emitSubagentStart(agentId, subagent_type, model || "inherited", shortDescription);
301
- // Load or create agent state
302
- let state = resume ? loadAgentState(resume) : null;
303
- if (!state) {
304
- state = {
305
- id: agentId,
306
- type: subagent_type,
307
- model: modelId,
308
- messages: [],
309
- toolsUsed: [],
310
- createdAt: new Date().toISOString(),
311
- updatedAt: new Date().toISOString(),
312
- };
313
- }
314
- const loopDetector = new LoopDetector();
315
- // Get filtered tools for this agent type
316
- const tools = await getFilteredTools(subagent_type);
317
- // Build full system prompt with optional parent context
318
- let fullSystemPrompt = systemPrompt;
319
- if (parentContext) {
320
- fullSystemPrompt += `\n\n## Parent Conversation Context\n${parentContext}`;
321
- }
322
- // Add CLAUDE.md if available
323
- const claudeMd = loadClaudeMd();
324
- if (claudeMd) {
325
- fullSystemPrompt += `\n\n## Project Instructions\n${claudeMd.content}`;
326
- }
327
- // Add user prompt to messages
328
- state.messages.push({ role: "user", content: prompt });
329
- let totalIn = 0;
330
- let totalOut = 0;
331
- let finalText = "";
332
- // Create subagent span context — inherit parent's trace context for hierarchy
333
- // IMPORTANT: Don't increment global turn number — subagent is part of parent turn
334
- const subagentSpanId = generateSpanId();
335
- const turnCtx = {
336
- source: "claude_code",
337
- serviceName: "whale-cli",
338
- serviceVersion: "2.1.0",
339
- model: modelId,
340
- agentId,
341
- agentName: name || `subagent-${subagent_type}`,
342
- // Inherit parent's trace to keep hierarchy intact
343
- traceId: parentTraceContext?.traceId || generateTraceId(),
344
- spanId: subagentSpanId,
345
- parentSpanId: parentTraceContext?.spanId, // Parent's spanId becomes our parentSpanId
346
- conversationId: parentTraceContext?.conversationId,
347
- turnNumber: parentTraceContext?.turnNumber, // Inherit parent turn, don't increment
348
- userId: parentTraceContext?.userId,
349
- userEmail: parentTraceContext?.userEmail,
350
- traceFlags: 1,
305
+ const {
306
+ prompt,
307
+ subagent_type,
308
+ model,
309
+ resume,
310
+ max_turns,
311
+ name,
312
+ parentContext,
313
+ parentTraceContext,
314
+ taskContext,
315
+ signal
316
+ } = options;
317
+ const agentId = resume || generateAgentId();
318
+ const cwd = process.cwd();
319
+ const systemPrompt = buildAgentPrompt(subagent_type, cwd);
320
+ const startTime = Date.now();
321
+
322
+ // Check for custom agent definition with per-agent config
323
+ const customDef = getAgentDefinition(subagent_type);
324
+
325
+ // Model resolution: caller override → agent definition → demotion logic → haiku
326
+ const effectiveModelAlias = model || customDef?.model || demoteSubagentModel(model, subagent_type);
327
+ const modelId = MODEL_MAP[effectiveModelAlias] || MODEL_MAP["haiku"];
328
+
329
+ // Resolve all config from DB → AGENT_DEFAULTS fallback (single source of truth)
330
+ const dbAgent = await loadCLIAgentConfig();
331
+ const resolved = dbAgent ? resolveAgentLoopConfig(dbAgent, "sse") : null;
332
+ const dbMaxTurns = resolved?.subagentMaxTurns ?? AGENT_DEFAULTS.subagentMaxTurns;
333
+ const dbMaxTokens = customDef?.max_tokens ?? resolved?.subagentMaxTokens ?? AGENT_DEFAULTS.subagentMaxTokens;
334
+ // 0 = no limit (agent self-regulates via end_turn, Claude Code parity)
335
+ // Safety: LoopDetector + cost budget + stall detection are the real guards.
336
+ const rawMaxTurns = max_turns ? Math.max(1, max_turns) : dbMaxTurns;
337
+ const effectiveMaxTurns = rawMaxTurns === 0 ? Number.MAX_SAFE_INTEGER : rawMaxTurns;
338
+ const maxToolResultChars = resolved?.maxToolResultChars ?? AGENT_DEFAULTS.maxToolResultChars;
339
+ const maxRetries = resolved?.subagentMaxRetries ?? AGENT_DEFAULTS.subagentMaxRetries;
340
+ const maxContinuations = resolved?.subagentMaxContinuations ?? AGENT_DEFAULTS.subagentMaxContinuations;
341
+
342
+ // Extract short description from prompt (first sentence or 60 chars)
343
+ const descMatch = prompt.match(/^[^.!?\n]+/);
344
+ const shortDescription = name || (descMatch ? descMatch[0].slice(0, 60) + (descMatch[0].length > 60 ? "…" : "") : prompt.slice(0, 60) + (prompt.length > 60 ? "…" : ""));
345
+
346
+ // Emit subagent start event
347
+ const emitter = getGlobalEmitter();
348
+ emitter.emitSubagentStart(agentId, subagent_type, model || "inherited", shortDescription);
349
+
350
+ // Load or create agent state
351
+ let state = resume ? loadAgentState(resume) : null;
352
+ if (!state) {
353
+ state = {
354
+ id: agentId,
355
+ type: subagent_type,
356
+ model: modelId,
357
+ messages: [],
358
+ toolsUsed: [],
359
+ createdAt: new Date().toISOString(),
360
+ updatedAt: new Date().toISOString()
351
361
  };
352
- try {
353
- for (let turn = 0; turn < effectiveMaxTurns; turn++) {
354
- // Emit progress and yield before API call to keep UI responsive
355
- emitSubagentProgress(subagent_type, agentId, `turn ${turn + 1}: calling API...`, turn + 1);
356
- await yieldForRender(); // Give Ink time to render the progress update
357
- // Claude Code parity: thinking is DISABLED for all subagents.
358
- // Subagents don't get extended thinking — all output tokens go to actual content.
359
- // max_tokens = 32K matching Claude Code's hardcoded subagent default.
360
- const apiStart = Date.now();
361
- let response;
362
- let lastError = null;
363
- for (let attempt = 0; attempt < 3; attempt++) {
364
- try {
365
- response = await callAgentAPI({
366
- modelId,
367
- contextProfile: "subagent",
368
- systemPrompt: fullSystemPrompt,
369
- messages: state.messages,
370
- tools,
371
- thinkingEnabled: false,
372
- maxOutputTokens: SUBAGENT_MAX_OUTPUT_TOKENS,
373
- cacheLastTool: true,
374
- });
375
- lastError = null;
376
- break;
377
- }
378
- catch (err) {
379
- lastError = err;
380
- if (attempt < 2 && (err.status === 429 || err.status === 500 || err.status === 529)) {
381
- await new Promise(r => setTimeout(r, 1000 * Math.pow(2, attempt)));
382
- continue;
383
- }
384
- throw err;
385
- }
386
- }
387
- if (lastError)
388
- throw lastError;
389
- const apiDuration = Date.now() - apiStart;
390
- // Yield after API call
391
- await yieldToEventLoop();
392
- totalIn += response.usage.input_tokens;
393
- totalOut += response.usage.output_tokens;
394
- // Log API call as child span
395
- const apiCostUsd = estimateCostUsd(response.usage.input_tokens, response.usage.output_tokens, modelId);
396
- logSpan({
397
- action: "claude_api_request",
398
- durationMs: apiDuration,
399
- context: {
400
- ...turnCtx,
401
- spanId: generateSpanId(), // New span for this API call
402
- parentSpanId: turnCtx.spanId, // Parent is the subagent
403
- inputTokens: response.usage.input_tokens,
404
- outputTokens: response.usage.output_tokens,
405
- totalCost: apiCostUsd,
406
- model: modelId,
407
- },
408
- details: {
409
- "gen_ai.request.model": modelId,
410
- "gen_ai.usage.input_tokens": response.usage.input_tokens,
411
- "gen_ai.usage.output_tokens": response.usage.output_tokens,
412
- "gen_ai.usage.cost": apiCostUsd,
413
- agent_id: agentId,
414
- agent_type: subagent_type,
415
- turn: turn + 1,
416
- stop_reason: response.stop_reason,
417
- is_subagent_api: true,
418
- },
419
- });
420
- // Yield to event loop to keep UI responsive
421
- await yieldToEventLoop();
422
- // Extract text and tool use using shared helpers
423
- const textBlocks = extractTextBlocks(response.content);
424
- const toolBlocks = extractToolUseBlocks(response.content);
425
- if (textBlocks.length) {
426
- finalText = getResponseText(response.content);
427
- }
428
- // No tool calls we're done
429
- if (toolBlocks.length === 0 || response.stop_reason === "end_turn") {
430
- emitSubagentProgress(subagent_type, agentId, `done (${turn + 1} turn${turn > 0 ? "s" : ""})`, turn + 1);
431
- break;
432
- }
433
- // Emit tool usage progress
434
- const toolNames = toolBlocks.map(b => b.name).join(", ");
435
- emitSubagentProgress(subagent_type, agentId, `using: ${toolNames}`, turn + 1);
436
- // Execute tools using shared executeToolBlocks
437
- const { toolResults, toolsUsed: turnToolsUsed } = await executeToolBlocks({
438
- toolBlocks,
439
- loopDetector,
440
- callbacks: {
441
- onToolStart: (toolName, input) => {
442
- emitSubagentProgress(subagent_type, agentId, `running ${toolName}`, turn + 1, toolName);
443
- emitter.emitSubagentToolStart(agentId, toolName, input);
444
- },
445
- onToolEnd: (toolName, success, durationMs) => {
446
- emitter.emitSubagentToolEnd(agentId, toolName, success, durationMs);
447
- // Log tool call as child span of the subagent
448
- const tu = toolBlocks.find(b => b.name === toolName);
449
- logSpan({
450
- action: `tool.${toolName}`,
451
- durationMs,
452
- context: {
453
- ...turnCtx,
454
- spanId: generateSpanId(),
455
- parentSpanId: turnCtx.spanId,
456
- },
457
- error: success ? undefined : "(see tool result)",
458
- details: {
459
- tool_type: "subagent_tool",
460
- tool_input: tu?.input,
461
- agent_id: agentId,
462
- agent_type: subagent_type,
463
- is_subagent_tool: true,
464
- iteration: turn,
465
- },
466
- });
467
- },
468
- },
469
- });
470
- // Track tool usage
471
- for (const tn of turnToolsUsed) {
472
- if (!state.toolsUsed.includes(tn)) {
473
- state.toolsUsed.push(tn);
474
- }
475
- }
476
- // Append assistant response + tool results
477
- state.messages.push({
478
- role: "assistant",
479
- content: response.content,
480
- });
481
- state.messages.push({
482
- role: "user",
483
- content: toolResults,
484
- });
485
- // Yield to event loop after tool execution
486
- await yieldToEventLoop();
362
+ }
363
+ const loopDetector = resolved ? LoopDetector.fromResolved(resolved) : new LoopDetector();
364
+
365
+ // Get filtered tools for this agent type (deduped)
366
+ const tools = await getFilteredTools(subagent_type);
367
+ assertUniqueToolNames(tools);
368
+
369
+ // Build full system prompt with optional parent context and task dedup context
370
+ let fullSystemPrompt = systemPrompt;
371
+ if (parentContext) {
372
+ fullSystemPrompt += `\n\n## Parent Conversation Context\n${parentContext}`;
373
+ }
374
+ if (taskContext) {
375
+ fullSystemPrompt += `\n\n## Other Agents\n${taskContext}\nDo NOT duplicate research or work that other agents are handling. Focus only on your assigned task.`;
376
+ }
377
+
378
+ // Add CLAUDE.md if available
379
+ const claudeMd = loadClaudeMd();
380
+ if (claudeMd) {
381
+ fullSystemPrompt += `\n\n## Project Instructions\n${claudeMd.content}`;
382
+ }
383
+
384
+ // Add user prompt to messages
385
+ state.messages.push({
386
+ role: "user",
387
+ content: prompt
388
+ });
389
+ let totalIn = 0;
390
+ let totalOut = 0;
391
+ let totalCacheRead = 0;
392
+ let totalCacheCreate = 0;
393
+ let finalText = "";
394
+
395
+ // Create subagent span context — inherit parent's trace context for hierarchy
396
+ // IMPORTANT: Don't increment global turn number — subagent is part of parent turn
397
+ const subagentSpanId = generateSpanId();
398
+ const turnCtx = {
399
+ source: "claude_code",
400
+ serviceName: "whale-cli",
401
+ serviceVersion: PKG_VERSION,
402
+ model: modelId,
403
+ agentId,
404
+ agentName: name || `subagent-${subagent_type}`,
405
+ // Inherit parent's trace to keep hierarchy intact
406
+ traceId: parentTraceContext?.traceId || generateTraceId(),
407
+ spanId: subagentSpanId,
408
+ parentSpanId: parentTraceContext?.spanId,
409
+ // Parent's spanId becomes our parentSpanId
410
+ conversationId: parentTraceContext?.conversationId,
411
+ turnNumber: parentTraceContext?.turnNumber,
412
+ // Inherit parent turn, don't increment
413
+ userId: parentTraceContext?.userId,
414
+ userEmail: parentTraceContext?.userEmail,
415
+ traceFlags: 1
416
+ };
417
+ try {
418
+ for (let turn = 0; turn < effectiveMaxTurns; turn++) {
419
+ // Check for cancellation at start of each turn
420
+ if (signal?.aborted) {
421
+ emitSubagentProgress(subagent_type, agentId, "cancelled", turn + 1);
422
+ emitter.emitSubagentDone(agentId, subagent_type, false, "Cancelled", {
423
+ input: totalIn,
424
+ output: totalOut
425
+ }, state.toolsUsed, Date.now() - startTime);
426
+ return {
427
+ success: false,
428
+ output: "Cancelled",
429
+ agentId,
430
+ tokensUsed: {
431
+ input: totalIn,
432
+ output: totalOut
433
+ },
434
+ toolsUsed: state.toolsUsed
435
+ };
436
+ }
437
+
438
+ // Emit progress and yield before API call to keep UI responsive
439
+ emitSubagentProgress(subagent_type, agentId, `turn ${turn + 1}: calling API...`, turn + 1);
440
+ await yieldForRender(); // Give Ink time to render the progress update
441
+
442
+ // Adaptive thinking enabled — model decides when to think (Claude Code parity).
443
+ // Opus 4.6 uses adaptive thinking by default; no separate enable/disable needed.
444
+ const apiStart = Date.now();
445
+ let response;
446
+ let lastError = null;
447
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
448
+ try {
449
+ response = await callAgentAPI({
450
+ modelId,
451
+ contextProfile: "subagent",
452
+ systemPrompt: fullSystemPrompt,
453
+ messages: state.messages,
454
+ tools,
455
+ thinkingEnabled: true,
456
+ maxOutputTokens: dbMaxTokens,
457
+ cacheLastTool: true,
458
+ abortSignal: signal
459
+ });
460
+ lastError = null;
461
+ break;
462
+ } catch (err) {
463
+ lastError = err;
464
+ if (attempt < maxRetries - 1 && (err.status === 429 || err.status === 500 || err.status === 529)) {
465
+ await new Promise(r => setTimeout(r, 1000 * Math.pow(2, attempt)));
466
+ continue;
467
+ }
468
+ throw err;
487
469
  }
488
- // Save state for potential resume
489
- state.updatedAt = new Date().toISOString();
490
- saveAgentState(state);
491
- // Log the subagent's final response as a chat.assistant_response span
492
- // This ensures the full output is visible in the telemetry waterfall
493
- const subFinalCost = estimateCostUsd(totalIn, totalOut, modelId);
494
- if (finalText) {
495
- logSpan({
496
- action: "chat.assistant_response",
497
- durationMs: Date.now() - startTime,
498
- context: {
499
- ...turnCtx,
500
- spanId: generateSpanId(),
501
- parentSpanId: turnCtx.spanId,
502
- inputTokens: totalIn,
503
- outputTokens: totalOut,
504
- totalCost: subFinalCost,
505
- model: modelId,
506
- },
507
- details: {
508
- response: finalText,
509
- agent_id: agentId,
510
- agent_name: name || `subagent-${subagent_type}`,
511
- agent_type: subagent_type,
512
- is_subagent: true,
513
- "gen_ai.request.model": modelId,
514
- "gen_ai.usage.input_tokens": totalIn,
515
- "gen_ai.usage.output_tokens": totalOut,
516
- "gen_ai.usage.cost": subFinalCost,
517
- model: modelId,
518
- input_tokens: totalIn,
519
- output_tokens: totalOut,
520
- turn_count: Math.floor(state.messages.length / 2),
521
- tool_calls: state.toolsUsed.length,
522
- tool_names: state.toolsUsed,
523
- },
524
- });
470
+ }
471
+ if (lastError) throw lastError;
472
+ const apiDuration = Date.now() - apiStart;
473
+
474
+ // Yield after API call
475
+ await yieldToEventLoop();
476
+ totalIn += response.usage.input_tokens;
477
+ totalOut += response.usage.output_tokens;
478
+ totalCacheRead += response.usage.cache_read_tokens;
479
+ totalCacheCreate += response.usage.cache_creation_tokens;
480
+
481
+ // Log API call as child span — include cache tokens for accurate cost
482
+ const apiCostUsd = estimateCostUsd(response.usage.input_tokens, response.usage.output_tokens, modelId, 0,
483
+ // thinkingTokens (disabled for subagents)
484
+ response.usage.cache_read_tokens, response.usage.cache_creation_tokens);
485
+ logSpan({
486
+ action: "claude_api_request",
487
+ durationMs: apiDuration,
488
+ context: {
489
+ ...turnCtx,
490
+ spanId: generateSpanId(),
491
+ // New span for this API call
492
+ parentSpanId: turnCtx.spanId,
493
+ // Parent is the subagent
494
+ inputTokens: response.usage.input_tokens,
495
+ outputTokens: response.usage.output_tokens,
496
+ cacheReadTokens: response.usage.cache_read_tokens,
497
+ cacheCreationTokens: response.usage.cache_creation_tokens,
498
+ totalCost: apiCostUsd,
499
+ model: modelId
500
+ },
501
+ details: {
502
+ "gen_ai.request.model": modelId,
503
+ "gen_ai.usage.input_tokens": response.usage.input_tokens,
504
+ "gen_ai.usage.output_tokens": response.usage.output_tokens,
505
+ "gen_ai.usage.cache_read_tokens": response.usage.cache_read_tokens,
506
+ "gen_ai.usage.cache_creation_tokens": response.usage.cache_creation_tokens,
507
+ "gen_ai.usage.cost": apiCostUsd,
508
+ agent_id: agentId,
509
+ agent_type: subagent_type,
510
+ turn: turn + 1,
511
+ stop_reason: response.stop_reason,
512
+ is_subagent_api: true
513
+ }
514
+ });
515
+
516
+ // Yield to event loop to keep UI responsive
517
+ await yieldToEventLoop();
518
+
519
+ // Extract text and tool use using shared helpers
520
+ const textBlocks = extractTextBlocks(response.content);
521
+ const toolBlocks = extractToolUseBlocks(response.content);
522
+ if (textBlocks.length) {
523
+ finalText = getResponseText(response.content);
524
+ }
525
+
526
+ // Compaction handling — API paused after generating summary.
527
+ // Per Anthropic docs: just use the compaction block, don't preserve old messages.
528
+ if (response.stop_reason === "compaction") {
529
+ const compactionBlock = response.content.find(b => b.type === "compaction");
530
+ if (compactionBlock) {
531
+ state.compactionCount = (state.compactionCount ?? 0) + 1;
532
+ state.messages = [{
533
+ role: "assistant",
534
+ content: [{
535
+ type: "compaction",
536
+ content: compactionBlock.content
537
+ }]
538
+ }, {
539
+ role: "user",
540
+ content: [{
541
+ type: "text",
542
+ text: "Continue with your task."
543
+ }]
544
+ }];
545
+ turn--; // Don't count compaction as a turn
546
+ continue;
525
547
  }
526
- // Log telemetry with rich metadata for trace visualization
527
- const subagentTotalCost = estimateCostUsd(totalIn, totalOut, modelId);
528
- logSpan({
529
- action: `subagent.${subagent_type}`,
530
- durationMs: Date.now() - new Date(state.createdAt).getTime(),
531
- context: {
548
+ }
549
+
550
+ // No tool calls — check stop reason
551
+ if (toolBlocks.length === 0 || response.stop_reason === "end_turn") {
552
+ // max_tokens: response was truncated mid-generation give the model a chance to finish
553
+ // Cap at 2 continuations to prevent infinite loops on very large outputs
554
+ if (response.stop_reason === "max_tokens" && (state.continuations ?? 0) < maxContinuations) {
555
+ state.continuations = (state.continuations ?? 0) + 1;
556
+ state.messages.push({
557
+ role: "assistant",
558
+ content: response.content
559
+ });
560
+ const contCount = state.continuations ?? 1;
561
+ const contText = contCount === 1 ? "[Your response was truncated due to the output token limit. If writing a large file, split into multiple smaller write_file calls (~200 lines each). Continue concisely.]" : `[Truncated again (${contCount}/${maxContinuations}). You MUST reduce output size — use multiple small write_file calls, not one large one.]`;
562
+ state.messages.push({
563
+ role: "user",
564
+ content: [{
565
+ type: "text",
566
+ text: contText
567
+ }]
568
+ });
569
+ continue;
570
+ }
571
+ emitSubagentProgress(subagent_type, agentId, `done (${turn + 1} turn${turn > 0 ? "s" : ""})`, turn + 1);
572
+ break;
573
+ }
574
+
575
+ // Emit tool usage progress
576
+ const toolNames = toolBlocks.map(b => b.name).join(", ");
577
+ emitSubagentProgress(subagent_type, agentId, `using: ${toolNames}`, turn + 1);
578
+
579
+ // Execute tools using shared executeToolBlocks
580
+ const {
581
+ toolResults,
582
+ toolsUsed: turnToolsUsed
583
+ } = await executeToolBlocks({
584
+ toolBlocks,
585
+ loopDetector,
586
+ signal,
587
+ callbacks: {
588
+ onToolStart: (toolName, input) => {
589
+ emitSubagentProgress(subagent_type, agentId, `running ${toolName}`, turn + 1, toolName);
590
+ emitter.emitSubagentToolStart(agentId, toolName, input);
591
+ },
592
+ onToolEnd: (toolName, success, durationMs) => {
593
+ emitter.emitSubagentToolEnd(agentId, toolName, success, durationMs);
594
+
595
+ // Log tool call as child span of the subagent
596
+ const tu = toolBlocks.find(b => b.name === toolName);
597
+ logSpan({
598
+ action: `tool.${toolName}`,
599
+ durationMs,
600
+ context: {
532
601
  ...turnCtx,
533
- inputTokens: totalIn,
534
- outputTokens: totalOut,
535
- totalCost: subagentTotalCost,
536
- },
537
- details: {
538
- // Core identification
602
+ spanId: generateSpanId(),
603
+ parentSpanId: turnCtx.spanId
604
+ },
605
+ error: success ? undefined : "(see tool result)",
606
+ details: {
607
+ tool_type: "subagent_tool",
608
+ tool_input: tu?.input,
539
609
  agent_id: agentId,
540
610
  agent_type: subagent_type,
541
- model: modelId,
542
- // Cost for SwiftUI display
543
- "gen_ai.request.model": modelId,
544
- "gen_ai.usage.input_tokens": totalIn,
545
- "gen_ai.usage.output_tokens": totalOut,
546
- "gen_ai.usage.cost": subagentTotalCost,
547
- // Execution metrics
548
- turns: state.messages.length / 2,
549
- tools_used: state.toolsUsed,
550
- tool_count: state.toolsUsed.length,
551
- // Hierarchy info for visualization
552
- is_subagent: true,
553
- parent_trace_id: parentTraceContext?.traceId,
554
- parent_span_id: parentTraceContext?.spanId,
555
- // Rich display metadata
556
- display_name: `${subagent_type.charAt(0).toUpperCase() + subagent_type.slice(1)} Agent`,
557
- display_icon: getAgentIcon(subagent_type),
558
- display_color: getAgentColor(subagent_type),
559
- // Summary for trace feed (2000 chars for meaningful preview)
560
- summary: finalText.slice(0, 2000) + (finalText.length > 2000 ? "..." : ""),
561
- prompt_preview: prompt.slice(0, 200) + (prompt.length > 200 ? "..." : ""),
562
- },
563
- });
564
- // Emit subagent done event
565
- emitter.emitSubagentDone(agentId, subagent_type, true, finalText || "(No output from agent)", { input: totalIn, output: totalOut }, state.toolsUsed, Date.now() - startTime);
566
- return {
567
- success: true,
568
- output: finalText || "(No output from agent)",
569
- agentId,
570
- tokensUsed: { input: totalIn, output: totalOut },
571
- toolsUsed: state.toolsUsed,
572
- };
573
- }
574
- catch (err) {
575
- // Emit subagent error event
576
- emitter.emitSubagentDone(agentId, subagent_type, false, `Agent error: ${err.message || err}`, { input: totalIn, output: totalOut }, state.toolsUsed, Date.now() - startTime);
577
- return {
578
- success: false,
579
- output: `Agent error: ${err.message || err}`,
580
- agentId,
581
- tokensUsed: { input: totalIn, output: totalOut },
582
- toolsUsed: state.toolsUsed,
583
- };
611
+ is_subagent_tool: true,
612
+ iteration: turn
613
+ }
614
+ });
615
+ }
616
+ }
617
+ });
618
+
619
+ // Track tool usage
620
+ for (const tn of turnToolsUsed) {
621
+ if (!state.toolsUsed.includes(tn)) {
622
+ state.toolsUsed.push(tn);
623
+ }
624
+ }
625
+
626
+ // Append assistant response + tool results
627
+ state.messages.push({
628
+ role: "assistant",
629
+ content: response.content
630
+ });
631
+ state.messages.push({
632
+ role: "user",
633
+ content: toolResults
634
+ });
635
+
636
+ // Progress nudge: when approaching turn limit without any edits, warn the agent
637
+ const turnsRemaining = effectiveMaxTurns - turn - 1;
638
+ const nudgeThreshold = Math.ceil(effectiveMaxTurns * 0.25); // Last 25% of turns
639
+ if (turnsRemaining === nudgeThreshold && turnsRemaining > 0) {
640
+ const editTools = ["write_file", "edit_file", "create_file", "notebook_edit"];
641
+ const hasEdited = state.toolsUsed.some(t => editTools.includes(t));
642
+ if (!hasEdited) {
643
+ state.messages.push({
644
+ role: "user",
645
+ content: [{
646
+ type: "text",
647
+ text: `⚠️ TURN LIMIT WARNING: You have ${turnsRemaining} turns remaining out of ${effectiveMaxTurns} and have NOT made any file edits yet. Stop exploring and start producing your output NOW. If you need to write or edit files, do it immediately. Prioritize delivering results over gathering more information.`
648
+ }]
649
+ });
650
+ }
651
+ }
652
+
653
+ // Pre-compact: trim large tool results and thinking blocks to prevent context bloat.
654
+ // Without this, context grows unbounded (4K→28K→73K tokens per turn).
655
+ const {
656
+ messages: compactedMessages
657
+ } = preCompact(state.messages, {
658
+ maxToolResultChars,
659
+ stripThinking: true
660
+ });
661
+ state.messages = compactedMessages;
662
+
663
+ // Yield to event loop after tool execution
664
+ await yieldToEventLoop();
584
665
  }
666
+
667
+ // Save state for potential resume
668
+ state.updatedAt = new Date().toISOString();
669
+ saveAgentState(state);
670
+
671
+ // Log single subagent span with all metadata for trace visualization
672
+ const subagentTotalCost = estimateCostUsd(totalIn, totalOut, modelId, 0, totalCacheRead, totalCacheCreate);
673
+ logSpan({
674
+ action: `subagent.${subagent_type}`,
675
+ durationMs: Date.now() - new Date(state.createdAt).getTime(),
676
+ context: {
677
+ ...turnCtx,
678
+ inputTokens: totalIn,
679
+ outputTokens: totalOut,
680
+ totalCost: subagentTotalCost
681
+ },
682
+ details: {
683
+ agent_id: agentId,
684
+ agent_type: subagent_type,
685
+ model: modelId,
686
+ // OpenTelemetry gen_ai semantic conventions
687
+ "gen_ai.request.model": modelId,
688
+ "gen_ai.usage.input_tokens": totalIn,
689
+ "gen_ai.usage.output_tokens": totalOut,
690
+ "gen_ai.usage.cache_read_tokens": totalCacheRead,
691
+ "gen_ai.usage.cache_creation_tokens": totalCacheCreate,
692
+ "gen_ai.usage.cost": subagentTotalCost,
693
+ // Execution metrics
694
+ turns: state.messages.length / 2,
695
+ tools_used: state.toolsUsed,
696
+ tool_count: state.toolsUsed.length,
697
+ // Hierarchy
698
+ is_subagent: true,
699
+ parent_trace_id: parentTraceContext?.traceId,
700
+ parent_span_id: parentTraceContext?.spanId,
701
+ // Display metadata
702
+ display_name: `${subagent_type.charAt(0).toUpperCase() + subagent_type.slice(1)} Agent`,
703
+ display_icon: getAgentIcon(subagent_type),
704
+ display_color: getAgentColor(subagent_type),
705
+ // Content previews
706
+ summary: finalText.slice(0, 2000) + (finalText.length > 2000 ? "..." : ""),
707
+ prompt_preview: prompt.slice(0, 200) + (prompt.length > 200 ? "..." : "")
708
+ }
709
+ });
710
+
711
+ // Emit subagent done event
712
+ emitter.emitSubagentDone(agentId, subagent_type, true, finalText || "(No output from agent)", {
713
+ input: totalIn,
714
+ output: totalOut
715
+ }, state.toolsUsed, Date.now() - startTime);
716
+ return {
717
+ success: true,
718
+ output: finalText || "(No output from agent)",
719
+ agentId,
720
+ tokensUsed: {
721
+ input: totalIn,
722
+ output: totalOut
723
+ },
724
+ toolsUsed: state.toolsUsed
725
+ };
726
+ } catch (err) {
727
+ // Emit subagent error event
728
+ emitter.emitSubagentDone(agentId, subagent_type, false, `Agent error: ${err.message || err}`, {
729
+ input: totalIn,
730
+ output: totalOut
731
+ }, state.toolsUsed, Date.now() - startTime);
732
+ return {
733
+ success: false,
734
+ output: `Agent error: ${err.message || err}`,
735
+ agentId,
736
+ tokensUsed: {
737
+ input: totalIn,
738
+ output: totalOut
739
+ },
740
+ toolsUsed: state.toolsUsed
741
+ };
742
+ }
585
743
  }
744
+
586
745
  // ============================================================================
587
746
  // BACKGROUND AGENT EXECUTION
588
747
  // ============================================================================
748
+
589
749
  export async function runSubagentBackground(options) {
590
- const agentId = options.resume || generateAgentId();
591
- const outputFile = join(tmpdir(), `whale-agent-${agentId}.output`);
592
- // Write initial status
593
- writeFileSync(outputFile, `Agent ${agentId} started (${options.subagent_type})\n`, "utf-8");
594
- // Import background process tracker (dynamic to avoid circular deps)
595
- const bgModule = await import("./background-processes.js");
596
- bgModule.registerBackgroundAgent(agentId, options.subagent_type, outputFile);
597
- // Start agent in detached async — don't await
598
- runSubagent({ ...options, resume: undefined }).then(result => {
599
- appendFileSync(outputFile, `\n---DONE---\n${JSON.stringify({ success: result.success, agentId: result.agentId, output: result.output })}\n`, "utf-8");
600
- import("./background-processes.js").then(m => m.markAgentDone(agentId, result.success));
601
- }).catch(err => {
602
- appendFileSync(outputFile, `\n---ERROR---\n${err.message}\n`, "utf-8");
603
- import("./background-processes.js").then(m => m.markAgentDone(agentId, false));
604
- });
605
- return { agentId, outputFile };
750
+ const agentId = options.resume || generateAgentId();
751
+ const outputFile = join(tmpdir(), `whale-agent-${agentId}.output`);
752
+
753
+ // Write initial status
754
+ writeFileSync(outputFile, `Agent ${agentId} started (${options.subagent_type})\n`, "utf-8");
755
+
756
+ // Import background process tracker (dynamic to avoid circular deps)
757
+ const bgModule = await import("./background-processes.js");
758
+ bgModule.registerBackgroundAgent(agentId, options.subagent_type, outputFile);
759
+
760
+ // Start agent in detached async — don't await
761
+ runSubagent({
762
+ ...options,
763
+ resume: undefined
764
+ }).then(result => {
765
+ appendFileSync(outputFile, `\n---DONE---\n${JSON.stringify({
766
+ success: result.success,
767
+ agentId: result.agentId,
768
+ output: result.output
769
+ })}\n`, "utf-8");
770
+ import("./background-processes.js").then(m => m.markAgentDone(agentId, result.success));
771
+ }).catch(err => {
772
+ appendFileSync(outputFile, `\n---ERROR---\n${err.message}\n`, "utf-8");
773
+ import("./background-processes.js").then(m => m.markAgentDone(agentId, false));
774
+ });
775
+ return {
776
+ agentId,
777
+ outputFile
778
+ };
606
779
  }
780
+
607
781
  // ============================================================================
608
782
  // TOOL DEFINITION — for integration with main agent loop
609
783
  // ============================================================================
784
+
610
785
  // Following Claude Code pattern: discrete, focused tasks with clear completion criteria
611
786
  export const TASK_TOOL_DEFINITION = {
612
- name: "task",
613
- description: `Launch a subagent in isolated context. Subagents have full tool access and batch multiple tool calls per turn (glob + grep + read_file in parallel). Launch multiple task calls in one response for parallel execution.
787
+ name: "task",
788
+ description: `Launch a subagent in isolated context. Subagents have full tool access and batch multiple tool calls per turn (glob + grep + read_file in parallel). Launch multiple task calls in one response for parallel execution.
614
789
 
615
790
  Use for any work requiring 3+ tool calls or touching multiple parts of the codebase.
616
791
 
@@ -621,28 +796,29 @@ Agent types:
621
796
  - research: Look up specific info (2-4 turns)
622
797
 
623
798
  Each agent completes autonomously and returns results.`,
624
- input_schema: {
625
- type: "object",
626
- properties: {
627
- prompt: {
628
- type: "string",
629
- description: "Specific task with clear completion criteria. Include: what to find/do, where to look, what to return.",
630
- },
631
- subagent_type: {
632
- type: "string",
633
- enum: ["explore", "plan", "general-purpose", "research"],
634
- description: "Agent type: explore=find, plan=design, general-purpose=do, research=lookup.",
635
- },
636
- model: {
637
- type: "string",
638
- enum: ["sonnet", "haiku"],
639
- description: "Optional model. haiku (default) for fast tasks, sonnet for complex reasoning.",
640
- },
641
- resume: {
642
- type: "string",
643
- description: "Agent ID to resume (rarely needed).",
644
- },
645
- },
646
- required: ["prompt", "subagent_type"],
799
+ input_schema: {
800
+ type: "object",
801
+ properties: {
802
+ prompt: {
803
+ type: "string",
804
+ description: "Specific task with clear completion criteria. Include: what to find/do, where to look, what to return."
805
+ },
806
+ subagent_type: {
807
+ type: "string",
808
+ enum: ["explore", "plan", "general-purpose", "research"],
809
+ description: "Agent type: explore=find, plan=design, general-purpose=do, research=lookup."
810
+ },
811
+ model: {
812
+ type: "string",
813
+ enum: ["sonnet", "haiku"],
814
+ description: "Optional model. haiku (default) for fast tasks, sonnet for complex reasoning."
815
+ },
816
+ resume: {
817
+ type: "string",
818
+ description: "Agent ID to resume (rarely needed)."
819
+ }
647
820
  },
821
+ required: ["prompt", "subagent_type"]
822
+ }
648
823
  };
824
+ //# sourceMappingURL=subagent.js.map