whale-code 6.5.5 → 6.5.6

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