whale-code 6.5.10 → 6.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (627) hide show
  1. package/dist/cli/chat/ChatApp.js +7 -11
  2. package/dist/cli/chat/ChatApp.js.map +1 -1
  3. package/dist/cli/chat/ChatInput.js +7 -3
  4. package/dist/cli/chat/ChatInput.js.map +1 -1
  5. package/dist/cli/chat/MessageList.js +5 -6
  6. package/dist/cli/chat/MessageList.js.map +1 -1
  7. package/dist/cli/chat/StatusBar.d.ts +2 -2
  8. package/dist/cli/chat/StatusBar.js +90 -160
  9. package/dist/cli/chat/StatusBar.js.map +1 -1
  10. package/dist/cli/chat/components/LiveArea.js +78 -115
  11. package/dist/cli/chat/components/LiveArea.js.map +1 -1
  12. package/dist/cli/chat/components/StaticMessages.js +60 -79
  13. package/dist/cli/chat/components/StaticMessages.js.map +1 -1
  14. package/dist/cli/chat/hooks/useAgentLoop.js +45 -37
  15. package/dist/cli/chat/hooks/useAgentLoop.js.map +1 -1
  16. package/dist/cli/chat/store.d.ts +12 -0
  17. package/dist/cli/chat/store.js +19 -0
  18. package/dist/cli/chat/store.js.map +1 -1
  19. package/dist/cli/commands/doctor.js +1 -6
  20. package/dist/cli/commands/doctor.js.map +1 -1
  21. package/dist/cli/services/agent-loop-tools.js +11 -2
  22. package/dist/cli/services/agent-loop-tools.js.map +1 -1
  23. package/dist/cli/services/agent-loop.js +1 -1
  24. package/dist/cli/services/agent-loop.js.map +1 -1
  25. package/dist/cli/services/cli-agent-loop.js +3 -2
  26. package/dist/cli/services/cli-agent-loop.js.map +1 -1
  27. package/dist/cli/services/config-store.d.ts +8 -10
  28. package/dist/cli/services/config-store.js +14 -13
  29. package/dist/cli/services/config-store.js.map +1 -1
  30. package/dist/cli/services/memory-manager.js +2 -2
  31. package/dist/cli/services/memory-manager.js.map +1 -1
  32. package/dist/cli/services/permission-modes.js +14 -10
  33. package/dist/cli/services/permission-modes.js.map +1 -1
  34. package/dist/cli/services/session-client.js +2 -1
  35. package/dist/cli/services/session-client.js.map +1 -1
  36. package/dist/cli/services/session-persistence.js +14 -6
  37. package/dist/cli/services/session-persistence.js.map +1 -1
  38. package/dist/cli/setup/SetupApp.d.ts +2 -2
  39. package/dist/cli/setup/SetupApp.js +91 -254
  40. package/dist/cli/setup/SetupApp.js.map +1 -1
  41. package/dist/cli/shared/SpinnerSlot.js +4 -1
  42. package/dist/cli/shared/SpinnerSlot.js.map +1 -1
  43. package/dist/cli/status/StatusApp.js +3 -3
  44. package/dist/cli/status/StatusApp.js.map +1 -1
  45. package/dist/index.js +13 -3
  46. package/dist/index.js.map +1 -1
  47. package/dist/server/handlers/browser-lifecycle.js +10 -0
  48. package/dist/server/handlers/browser-lifecycle.js.map +1 -1
  49. package/dist/server/handlers/browser.js +16 -1
  50. package/dist/server/handlers/browser.js.map +1 -1
  51. package/dist/server/handlers/campaigns.js +11 -0
  52. package/dist/server/handlers/campaigns.js.map +1 -1
  53. package/dist/server/handlers/catalog-products.js +19 -5
  54. package/dist/server/handlers/catalog-products.js.map +1 -1
  55. package/dist/server/handlers/catalog.js +42 -8
  56. package/dist/server/handlers/catalog.js.map +1 -1
  57. package/dist/server/handlers/clickhouse.js +4 -4
  58. package/dist/server/handlers/clickhouse.js.map +1 -1
  59. package/dist/server/handlers/comms-email.js +70 -8
  60. package/dist/server/handlers/comms-email.js.map +1 -1
  61. package/dist/server/handlers/comms.js +63 -21
  62. package/dist/server/handlers/comms.js.map +1 -1
  63. package/dist/server/handlers/coupons.js +141 -77
  64. package/dist/server/handlers/coupons.js.map +1 -1
  65. package/dist/server/handlers/google-ads.js +280 -8
  66. package/dist/server/handlers/google-ads.js.map +1 -1
  67. package/dist/server/handlers/remove-bg.d.ts +33 -0
  68. package/dist/server/handlers/remove-bg.js +698 -44
  69. package/dist/server/handlers/remove-bg.js.map +1 -1
  70. package/dist/server/handlers/supply-chain.js +93 -1
  71. package/dist/server/handlers/supply-chain.js.map +1 -1
  72. package/dist/server/handlers/workflow-steps-types.d.ts +1 -1
  73. package/dist/server/handlers/workflow-steps-types.js +7 -1
  74. package/dist/server/handlers/workflow-steps-types.js.map +1 -1
  75. package/dist/server/handlers/workflow-steps.js +1 -1
  76. package/dist/server/handlers/workflow-steps.js.map +1 -1
  77. package/dist/server/index.js +122 -29
  78. package/dist/server/index.js.map +1 -1
  79. package/dist/server/lib/agent-loop-turn.js +33 -3
  80. package/dist/server/lib/agent-loop-turn.js.map +1 -1
  81. package/dist/server/lib/agent-loop-types.d.ts +6 -2
  82. package/dist/server/lib/agent-loop-types.js +14 -2
  83. package/dist/server/lib/agent-loop-types.js.map +1 -1
  84. package/dist/server/lib/clickhouse-client.js +4 -2
  85. package/dist/server/lib/clickhouse-client.js.map +1 -1
  86. package/dist/server/lib/code-worker.js +4 -1
  87. package/dist/server/lib/code-worker.js.map +1 -1
  88. package/dist/server/providers/anthropic.js +103 -33
  89. package/dist/server/providers/anthropic.js.map +1 -1
  90. package/dist/server/server-chat.js +2 -2
  91. package/dist/server/server-chat.js.map +1 -1
  92. package/dist/server/server-helpers.d.ts +8 -1
  93. package/dist/server/server-helpers.js +17 -3
  94. package/dist/server/server-helpers.js.map +1 -1
  95. package/dist/server/server-persist.js +34 -21
  96. package/dist/server/server-persist.js.map +1 -1
  97. package/dist/server/server-rate-limit.d.ts +0 -1
  98. package/dist/server/server-rate-limit.js +5 -5
  99. package/dist/server/server-rate-limit.js.map +1 -1
  100. package/dist/server/server-routes-approvals.js +2 -2
  101. package/dist/server/server-routes-approvals.js.map +1 -1
  102. package/dist/server/server-routes-auth.js +2 -2
  103. package/dist/server/server-routes-auth.js.map +1 -1
  104. package/dist/server/server-routes-events.js +2 -2
  105. package/dist/server/server-routes-events.js.map +1 -1
  106. package/dist/server/server-routes-public.js +4 -4
  107. package/dist/server/server-routes-public.js.map +1 -1
  108. package/dist/server/server-routes-webchat.js +3 -3
  109. package/dist/server/server-routes-webchat.js.map +1 -1
  110. package/dist/server/server-store-circuit-breaker.js +1 -1
  111. package/dist/server/server-store-circuit-breaker.js.map +1 -1
  112. package/dist/server/tool-router.js +7 -4
  113. package/dist/server/tool-router.js.map +1 -1
  114. package/dist/server/validation.js +11 -0
  115. package/dist/server/validation.js.map +1 -1
  116. package/dist/setup.js +5 -25
  117. package/dist/setup.js.map +1 -1
  118. package/dist/shared/api-client.js +38 -11
  119. package/dist/shared/api-client.js.map +1 -1
  120. package/package.json +12 -10
  121. package/vendor/ink/build/ink.js +68 -24
  122. package/vendor/ink/node_modules/react-devtools-core/README.md +152 -0
  123. package/vendor/ink/node_modules/react-devtools-core/backend.js +1 -0
  124. package/vendor/ink/node_modules/react-devtools-core/dist/648.chunk.js +2 -0
  125. package/vendor/ink/node_modules/react-devtools-core/dist/648.chunk.js.map +1 -0
  126. package/vendor/ink/node_modules/react-devtools-core/dist/backend.js +15691 -0
  127. package/vendor/ink/node_modules/react-devtools-core/dist/backend.js.map +1 -0
  128. package/vendor/ink/node_modules/react-devtools-core/dist/importFile.worker.worker.js +2 -0
  129. package/vendor/ink/node_modules/react-devtools-core/dist/importFile.worker.worker.js.map +1 -0
  130. package/vendor/ink/node_modules/react-devtools-core/dist/parseSourceAndMetadata.worker.worker.js +14 -0
  131. package/vendor/ink/node_modules/react-devtools-core/dist/parseSourceAndMetadata.worker.worker.js.map +1 -0
  132. package/vendor/ink/node_modules/react-devtools-core/dist/standalone.js +2 -0
  133. package/vendor/ink/node_modules/react-devtools-core/dist/standalone.js.map +1 -0
  134. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/LICENSE +21 -0
  135. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/README.md +495 -0
  136. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/browser.js +8 -0
  137. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/index.js +10 -0
  138. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/buffer-util.js +129 -0
  139. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/constants.js +10 -0
  140. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/event-target.js +184 -0
  141. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/extension.js +223 -0
  142. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/limiter.js +55 -0
  143. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/permessage-deflate.js +518 -0
  144. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/receiver.js +607 -0
  145. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/sender.js +409 -0
  146. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/stream.js +180 -0
  147. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/validation.js +104 -0
  148. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/websocket-server.js +449 -0
  149. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/websocket.js +1197 -0
  150. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/package.json +56 -0
  151. package/vendor/ink/node_modules/react-devtools-core/package.json +38 -0
  152. package/vendor/ink/node_modules/react-devtools-core/standalone.js +1 -0
  153. package/dist/cli/__tests__/print-mode-streaming.test.js +0 -270
  154. package/dist/cli/__tests__/print-mode.basic-output.test.js +0 -230
  155. package/dist/cli/__tests__/print-mode.session-errors.test.js +0 -252
  156. package/dist/cli/__tests__/print-mode.test.js +0 -273
  157. package/dist/cli/__tests__/serve-mode-messages.test.js +0 -338
  158. package/dist/cli/__tests__/serve-mode.messages.part2.test.js +0 -266
  159. package/dist/cli/__tests__/serve-mode.messages.test.js +0 -277
  160. package/dist/cli/__tests__/serve-mode.startup-http.test.js +0 -279
  161. package/dist/cli/__tests__/serve-mode.test.js +0 -345
  162. package/dist/cli/chat/NodeManager.d.ts +0 -30
  163. package/dist/cli/chat/NodeManager.js +0 -66
  164. package/dist/cli/chat/NodeManager.js.map +0 -1
  165. package/dist/cli/chat/chat-input-menu-handler.d.ts +0 -32
  166. package/dist/cli/chat/hooks/slash-imsg-handlers.js +0 -148
  167. package/dist/cli/chat/hooks/slash-imsg-handlers.js.map +0 -1
  168. package/dist/cli/chat/hooks/useStreamingReducer.d.ts +0 -66
  169. package/dist/cli/commands/__tests__/config-cmd.test.js +0 -270
  170. package/dist/cli/commands/__tests__/doctor.test.js +0 -257
  171. package/dist/cli/commands/__tests__/imsg-node-bridge.test.js +0 -99
  172. package/dist/cli/commands/__tests__/imsg-utils.test.js +0 -73
  173. package/dist/cli/commands/__tests__/init.test.js +0 -214
  174. package/dist/cli/commands/__tests__/mcp.test.js +0 -287
  175. package/dist/cli/commands/imsg-watcher-helpers.d.ts +0 -40
  176. package/dist/cli/commands/imsg-watcher-helpers.js +0 -184
  177. package/dist/cli/commands/imsg-watcher-helpers.js.map +0 -1
  178. package/dist/cli/commands/imsg-watcher.d.ts +0 -11
  179. package/dist/cli/commands/imsg-watcher.js +0 -230
  180. package/dist/cli/commands/imsg-watcher.js.map +0 -1
  181. package/dist/cli/services/__tests__/agent-definitions.test.js +0 -153
  182. package/dist/cli/services/__tests__/agent-events-global.test.js +0 -39
  183. package/dist/cli/services/__tests__/agent-events.part2.test.js +0 -113
  184. package/dist/cli/services/__tests__/agent-events.test.js +0 -157
  185. package/dist/cli/services/__tests__/agent-loop-auth.test.js +0 -392
  186. package/dist/cli/services/__tests__/agent-loop-budget.test.js +0 -389
  187. package/dist/cli/services/__tests__/agent-loop-tools-lifecycle.test.js +0 -430
  188. package/dist/cli/services/__tests__/agent-loop-tools-maxturns.test.js +0 -486
  189. package/dist/cli/services/__tests__/agent-loop-utils-execution.test.js +0 -528
  190. package/dist/cli/services/__tests__/agent-loop-utils-helpers.test.js +0 -466
  191. package/dist/cli/services/__tests__/agent-worker-base-execute.test.js +0 -257
  192. package/dist/cli/services/__tests__/agent-worker-base-helpers.test.js +0 -198
  193. package/dist/cli/services/__tests__/agent-worker-base.test.js +0 -278
  194. package/dist/cli/services/__tests__/auth-service-exports.test.js +0 -41
  195. package/dist/cli/services/__tests__/auth-service.part2.test.js +0 -169
  196. package/dist/cli/services/__tests__/auth-service.test.js +0 -242
  197. package/dist/cli/services/__tests__/background-processes.test.js +0 -282
  198. package/dist/cli/services/__tests__/claude-md-loader.test.js +0 -134
  199. package/dist/cli/services/__tests__/config-store.test.js +0 -247
  200. package/dist/cli/services/__tests__/debug-log.test.js +0 -199
  201. package/dist/cli/services/__tests__/edge-cases-caching.test.js +0 -174
  202. package/dist/cli/services/__tests__/edge-cases-compaction-core.test.js +0 -226
  203. package/dist/cli/services/__tests__/edge-cases-compaction-openai.test.js +0 -152
  204. package/dist/cli/services/__tests__/edge-cases-compaction-shapes.test.js +0 -53
  205. package/dist/cli/services/__tests__/edge-cases-compaction-thinking.test.js +0 -226
  206. package/dist/cli/services/__tests__/edge-cases-compaction.test.js +0 -131
  207. package/dist/cli/services/__tests__/edge-cases-paths.test.js +0 -86
  208. package/dist/cli/services/__tests__/error-logger-messages.test.js +0 -81
  209. package/dist/cli/services/__tests__/error-logger-transport.test.js +0 -119
  210. package/dist/cli/services/__tests__/error-logger.test.js +0 -264
  211. package/dist/cli/services/__tests__/file-history.test.js +0 -136
  212. package/dist/cli/services/__tests__/git-context-cache-reset.test.js +0 -223
  213. package/dist/cli/services/__tests__/git-context.test.js +0 -241
  214. package/dist/cli/services/__tests__/interactive-tools-execute.test.js +0 -166
  215. package/dist/cli/services/__tests__/interactive-tools-plan.test.js +0 -197
  216. package/dist/cli/services/__tests__/interactive-tools.part2.test.js +0 -168
  217. package/dist/cli/services/__tests__/interactive-tools.test.js +0 -179
  218. package/dist/cli/services/__tests__/keybinding-manager.test.js +0 -205
  219. package/dist/cli/services/__tests__/local-tools-dispatch.test.js +0 -404
  220. package/dist/cli/services/__tests__/local-tools.test.js +0 -238
  221. package/dist/cli/services/__tests__/lsp-manager.test.js +0 -364
  222. package/dist/cli/services/__tests__/mcp-client-connect-disconnect.test.js +0 -310
  223. package/dist/cli/services/__tests__/mcp-client.test.js +0 -93
  224. package/dist/cli/services/__tests__/memory-manager.test.js +0 -154
  225. package/dist/cli/services/__tests__/model-manager-utils.test.js +0 -154
  226. package/dist/cli/services/__tests__/model-manager.test.js +0 -175
  227. package/dist/cli/services/__tests__/permission-modes.test.js +0 -222
  228. package/dist/cli/services/__tests__/ripgrep.test.js +0 -328
  229. package/dist/cli/services/__tests__/server-tools-execute.test.js +0 -317
  230. package/dist/cli/services/__tests__/server-tools.test.js +0 -272
  231. package/dist/cli/services/__tests__/session-persistence.test.js +0 -245
  232. package/dist/cli/services/__tests__/subagent-basic.test.js +0 -489
  233. package/dist/cli/services/__tests__/subagent-edge.test.js +0 -545
  234. package/dist/cli/services/__tests__/subagent-prompts.test.js +0 -558
  235. package/dist/cli/services/__tests__/subagent-worker-errors.test.js +0 -255
  236. package/dist/cli/services/__tests__/subagent-worker.test.js +0 -242
  237. package/dist/cli/services/__tests__/system-prompt.test.js +0 -210
  238. package/dist/cli/services/__tests__/team-lead-comms-messaging.test.js +0 -250
  239. package/dist/cli/services/__tests__/team-lead-comms-result.test.js +0 -232
  240. package/dist/cli/services/__tests__/team-lead-comms-stop.test.js +0 -344
  241. package/dist/cli/services/__tests__/team-lead-comms.test.js +0 -285
  242. package/dist/cli/services/__tests__/team-lead-create.test.js +0 -327
  243. package/dist/cli/services/__tests__/team-lead-run.test.js +0 -318
  244. package/dist/cli/services/__tests__/team-lead-stop.test.js +0 -199
  245. package/dist/cli/services/__tests__/team-state-comms.test.js +0 -240
  246. package/dist/cli/services/__tests__/team-state-core.test.js +0 -230
  247. package/dist/cli/services/__tests__/team-state-tasks-complete-fail-available.test.js +0 -224
  248. package/dist/cli/services/__tests__/team-state-tasks.test.js +0 -184
  249. package/dist/cli/services/__tests__/telemetry-ai-metadata.test.js +0 -116
  250. package/dist/cli/services/__tests__/telemetry.part2.test.js +0 -195
  251. package/dist/cli/services/__tests__/telemetry.test.js +0 -176
  252. package/dist/cli/services/agent-loop-iteration.d.ts +0 -13
  253. package/dist/cli/services/agent-loop-setup.d.ts +0 -32
  254. package/dist/cli/services/agent-worker-base-api.d.ts +0 -19
  255. package/dist/cli/services/agent-worker-base-helpers.d.ts +0 -27
  256. package/dist/cli/services/agent-worker-base-tools.d.ts +0 -16
  257. package/dist/cli/services/agent-worker-base-types.d.ts +0 -81
  258. package/dist/cli/services/background-agents.d.ts +0 -26
  259. package/dist/cli/services/background-processes-ops.d.ts +0 -24
  260. package/dist/cli/services/background-tool-defs.d.ts +0 -50
  261. package/dist/cli/services/config-modules-model.test.js +0 -133
  262. package/dist/cli/services/config-modules-permission.test.js +0 -85
  263. package/dist/cli/services/config-modules-permissions.test.js +0 -85
  264. package/dist/cli/services/config-modules-session.test.js +0 -297
  265. package/dist/cli/services/format-server-response-columns.test.js +0 -265
  266. package/dist/cli/services/format-server-response-fallback.test.js +0 -65
  267. package/dist/cli/services/format-server-response-primitives-basic.test.js +0 -261
  268. package/dist/cli/services/format-server-response-primitives-nested.test.js +0 -188
  269. package/dist/cli/services/format-server-response-primitives.test.js +0 -300
  270. package/dist/cli/services/format-server-response-realworld.test.js +0 -248
  271. package/dist/cli/services/format-server-response-values.test.js +0 -247
  272. package/dist/cli/services/hooks-runners.test.js +0 -184
  273. package/dist/cli/services/hooks.glob-load.test.js +0 -233
  274. package/dist/cli/services/hooks.run-hooks.test.js +0 -184
  275. package/dist/cli/services/hooks.test.js +0 -233
  276. package/dist/cli/services/ink-incremental.d.ts +0 -19
  277. package/dist/cli/services/ink-incremental.js +0 -59
  278. package/dist/cli/services/ink-incremental.js.map +0 -1
  279. package/dist/cli/services/ink-resize-fix.d.ts +0 -18
  280. package/dist/cli/services/ink-resize-fix.js +0 -76
  281. package/dist/cli/services/ink-resize-fix.js.map +0 -1
  282. package/dist/cli/services/ink-sync-output.d.ts +0 -12
  283. package/dist/cli/services/ink-sync-output.js +0 -16
  284. package/dist/cli/services/ink-sync-output.js.map +0 -1
  285. package/dist/cli/services/interactive-tool-defs.d.ts +0 -80
  286. package/dist/cli/services/local-tools-definitions.d.ts +0 -6
  287. package/dist/cli/services/local-tools-files.test.js +0 -256
  288. package/dist/cli/services/local-tools-read-many.d.ts +0 -6
  289. package/dist/cli/services/model-router.test.js +0 -245
  290. package/dist/cli/services/rewind-rewindTo.test.js +0 -202
  291. package/dist/cli/services/rewind.test.js +0 -175
  292. package/dist/cli/services/sandbox.test.js +0 -198
  293. package/dist/cli/services/subagent-execution.d.ts +0 -12
  294. package/dist/cli/services/team-lead-auto.d.ts +0 -11
  295. package/dist/cli/services/team-lead-execution.d.ts +0 -28
  296. package/dist/cli/services/teammate-loop.js +0 -557
  297. package/dist/cli/services/teammate-loop.js.map +0 -1
  298. package/dist/cli/services/tools/__tests__/agent-tools-tasks-teams.test.js +0 -250
  299. package/dist/cli/services/tools/__tests__/agent-tools-teams.test.js +0 -200
  300. package/dist/cli/services/tools/__tests__/agent-tools.test.js +0 -340
  301. package/dist/cli/services/tools/__tests__/file-ops-cache.test.js +0 -152
  302. package/dist/cli/services/tools/__tests__/file-ops-notebook.test.js +0 -249
  303. package/dist/cli/services/tools/__tests__/file-ops-read.test.js +0 -261
  304. package/dist/cli/services/tools/__tests__/file-ops-write.test.js +0 -292
  305. package/dist/cli/services/tools/__tests__/search-tools-rg.test.js +0 -92
  306. package/dist/cli/services/tools/__tests__/search-tools.part2.test.js +0 -174
  307. package/dist/cli/services/tools/__tests__/search-tools.test.js +0 -227
  308. package/dist/cli/services/tools/__tests__/shell-exec-allowed-core.test.js +0 -163
  309. package/dist/cli/services/tools/__tests__/shell-exec-allowed-extended.test.js +0 -220
  310. package/dist/cli/services/tools/__tests__/shell-exec-allowed.part2.test.js +0 -215
  311. package/dist/cli/services/tools/__tests__/shell-exec-allowed.test.js +0 -154
  312. package/dist/cli/services/tools/__tests__/shell-exec-blocked.test.js +0 -132
  313. package/dist/cli/services/tools/__tests__/shell-exec-execution.test.js +0 -245
  314. package/dist/cli/services/tools/__tests__/task-manager-create.test.js +0 -110
  315. package/dist/cli/services/tools/__tests__/task-manager-crud.test.js +0 -339
  316. package/dist/cli/services/tools/__tests__/task-manager-list-get.test.js +0 -343
  317. package/dist/cli/services/tools/__tests__/task-manager-query.test.js +0 -346
  318. package/dist/cli/services/tools/__tests__/task-manager-routing.test.js +0 -58
  319. package/dist/cli/services/tools/__tests__/task-manager-update.test.js +0 -224
  320. package/dist/cli/services/tools/__tests__/task-manager.test.js +0 -159
  321. package/dist/cli/services/tools/__tests__/web-tools-html-search.test.js +0 -227
  322. package/dist/cli/services/tools/__tests__/web-tools.test.js +0 -285
  323. package/dist/cli/services/tools/shell-exec.test.js +0 -148
  324. package/dist/cli/shared/SharedTick.d.ts +0 -10
  325. package/dist/cli/shared/__tests__/markdown.test.js +0 -188
  326. package/dist/local-agent/__tests__/connection-disconnect.test.js +0 -201
  327. package/dist/local-agent/__tests__/connection-lifecycle.test.js +0 -289
  328. package/dist/local-agent/__tests__/connection-msghandling.test.js +0 -311
  329. package/dist/local-agent/__tests__/connection-reconnect.test.js +0 -230
  330. package/dist/local-agent/__tests__/connection-toolexec.test.js +0 -253
  331. package/dist/local-agent/__tests__/discovery.test.js +0 -328
  332. package/dist/local-agent/__tests__/executor-background.test.js +0 -219
  333. package/dist/local-agent/__tests__/executor-exec.test.js +0 -221
  334. package/dist/local-agent/__tests__/executor-jobs-sessions.test.js +0 -220
  335. package/dist/local-agent/__tests__/executor-system-info.test.js +0 -133
  336. package/dist/local-agent/__tests__/executor-systeminfo.test.js +0 -109
  337. package/dist/local-agent/__tests__/executor.test.js +0 -235
  338. package/dist/local-agent/__tests__/index.test.js +0 -139
  339. package/dist/node/__tests__/cli-channels.test.js +0 -293
  340. package/dist/node/__tests__/cli-config-edge.test.js +0 -154
  341. package/dist/node/__tests__/cli-config.test.js +0 -215
  342. package/dist/node/__tests__/config.test.js +0 -292
  343. package/dist/node/__tests__/runtime-heartbeat.test.js +0 -153
  344. package/dist/node/__tests__/runtime-lifecycle-init.test.js +0 -263
  345. package/dist/node/__tests__/runtime-lifecycle-stats.test.js +0 -180
  346. package/dist/node/__tests__/runtime-lifecycle.test.js +0 -305
  347. package/dist/node/__tests__/runtime-relay.test.js +0 -341
  348. package/dist/node/adapters/__tests__/base.test.js +0 -286
  349. package/dist/node/adapters/__tests__/discord.test.js +0 -284
  350. package/dist/node/adapters/__tests__/email-send.test.js +0 -295
  351. package/dist/node/adapters/__tests__/email.inbound-send.test.js +0 -217
  352. package/dist/node/adapters/__tests__/email.lifecycle.test.js +0 -211
  353. package/dist/node/adapters/__tests__/email.test.js +0 -290
  354. package/dist/node/adapters/__tests__/email.webhook-send.test.js +0 -251
  355. package/dist/node/adapters/__tests__/imessage-filter.test.js +0 -183
  356. package/dist/node/adapters/__tests__/imessage-lifecycle.test.js +0 -215
  357. package/dist/node/adapters/__tests__/imessage-send-restart.test.js +0 -227
  358. package/dist/node/adapters/__tests__/slack.part2.test.js +0 -135
  359. package/dist/node/adapters/__tests__/slack.test.js +0 -241
  360. package/dist/node/adapters/__tests__/sms-extras.test.js +0 -108
  361. package/dist/node/adapters/__tests__/sms-lifecycle.test.js +0 -203
  362. package/dist/node/adapters/__tests__/sms-messaging.test.js +0 -266
  363. package/dist/node/adapters/__tests__/sms.part2.test.js +0 -174
  364. package/dist/node/adapters/__tests__/sms.test.js +0 -253
  365. package/dist/node/adapters/__tests__/telegram-polling.test.js +0 -256
  366. package/dist/node/adapters/__tests__/telegram-send.test.js +0 -166
  367. package/dist/node/adapters/__tests__/webchat-inbound.test.js +0 -188
  368. package/dist/node/adapters/__tests__/webchat-outbound.test.js +0 -178
  369. package/dist/node/adapters/__tests__/whatsapp-inbound.test.js +0 -200
  370. package/dist/node/adapters/__tests__/whatsapp-send.test.js +0 -212
  371. package/dist/node/adapters/__tests__/whatsapp.test.js +0 -280
  372. package/dist/server/__tests__/gateway-fast-fail.test.js +0 -160
  373. package/dist/server/__tests__/local-agent-gateway.test.js +0 -186
  374. package/dist/server/__tests__/proxy-handlers-delegation.test.js +0 -240
  375. package/dist/server/__tests__/proxy-handlers-validation.test.js +0 -211
  376. package/dist/server/__tests__/proxy-handlers.part2.test.js +0 -240
  377. package/dist/server/__tests__/proxy-handlers.test.js +0 -213
  378. package/dist/server/__tests__/strip-base64-e2e.test.js +0 -303
  379. package/dist/server/__tests__/strip-base64.test.js +0 -256
  380. package/dist/server/__tests__/tool-router-agent-tools.test.js +0 -324
  381. package/dist/server/__tests__/tool-router-execute-core.test.js +0 -357
  382. package/dist/server/__tests__/tool-router-execute-permissions.test.js +0 -332
  383. package/dist/server/__tests__/tool-router-execute.test.js +0 -348
  384. package/dist/server/__tests__/tool-router-load.test.js +0 -432
  385. package/dist/server/__tests__/tool-router-permissions.test.js +0 -359
  386. package/dist/server/__tests__/tool-router-registry-cache.test.js +0 -383
  387. package/dist/server/__tests__/tool-router-registry-handlers.test.js +0 -272
  388. package/dist/server/__tests__/tool-router-registry.test.js +0 -331
  389. package/dist/server/__tests__/validation-inventory.test.js +0 -250
  390. package/dist/server/__tests__/validation-misc.test.js +0 -243
  391. package/dist/server/__tests__/validation-supply-chain.test.js +0 -188
  392. package/dist/server/__tests__/worker.test.js +0 -265
  393. package/dist/server/handlers/__tests__/conversation-lock.test.js +0 -117
  394. package/dist/server/handlers/__tests__/e2e/auth-cross-platform-login.e2e.test.js +0 -268
  395. package/dist/server/handlers/__tests__/e2e/auth-cross-platform-tokens.e2e.test.js +0 -264
  396. package/dist/server/handlers/__tests__/e2e/email-pipeline-send.e2e.test.js +0 -214
  397. package/dist/server/handlers/__tests__/e2e/email-pipeline-threads.e2e.test.js +0 -168
  398. package/dist/server/handlers/__tests__/e2e/error-logging-pipeline-dedup.e2e.test.js +0 -229
  399. package/dist/server/handlers/__tests__/e2e/error-logging-pipeline.e2e.test.js +0 -239
  400. package/dist/server/handlers/__tests__/e2e/error-logging-rate-limit.e2e.test.js +0 -150
  401. package/dist/server/handlers/__tests__/e2e/inventory-sync-guards.e2e.test.js +0 -177
  402. package/dist/server/handlers/__tests__/e2e/inventory-sync.e2e.test.js +0 -228
  403. package/dist/server/handlers/__tests__/e2e/inventory-sync.part2.e2e.test.js +0 -188
  404. package/dist/server/handlers/__tests__/e2e/order-lifecycle-fulfillment.e2e.test.js +0 -295
  405. package/dist/server/handlers/__tests__/e2e/order-lifecycle.e2e.test.js +0 -277
  406. package/dist/server/handlers/__tests__/e2e/order-lifecycle.fulfillment.e2e.test.js +0 -307
  407. package/dist/server/handlers/__tests__/e2e/order-lifecycle.setup.e2e.test.js +0 -177
  408. package/dist/server/handlers/__tests__/e2e/storefront-checkout-cart.e2e.test.js +0 -255
  409. package/dist/server/handlers/__tests__/e2e/storefront-checkout-webhook.e2e.test.js +0 -231
  410. package/dist/server/handlers/__tests__/e2e/workflow-execution-failures.e2e.test.js +0 -235
  411. package/dist/server/handlers/__tests__/e2e/workflow-execution.e2e.test.js +0 -294
  412. package/dist/server/handlers/__tests__/e2e/workflow-security.e2e.test.js +0 -311
  413. package/dist/server/handlers/__tests__/e2e/workflow-security.part2.e2e.test.js +0 -267
  414. package/dist/server/handlers/__tests__/workflow-cache.test.js +0 -237
  415. package/dist/server/handlers/analytics-errors-edge.test.js +0 -173
  416. package/dist/server/handlers/analytics.test.js +0 -280
  417. package/dist/server/handlers/api-docs-examples-ext.d.ts +0 -9
  418. package/dist/server/handlers/api-docs-examples-ext.js +0 -278
  419. package/dist/server/handlers/api-docs-examples-ext.js.map +0 -1
  420. package/dist/server/handlers/api-docs-examples.d.ts +0 -8
  421. package/dist/server/handlers/api-docs-examples.js +0 -221
  422. package/dist/server/handlers/api-docs-examples.js.map +0 -1
  423. package/dist/server/handlers/api-docs-sections-ext.d.ts +0 -2
  424. package/dist/server/handlers/api-docs-sections-ext.js +0 -497
  425. package/dist/server/handlers/api-docs-sections-ext.js.map +0 -1
  426. package/dist/server/handlers/api-docs-sections.d.ts +0 -21
  427. package/dist/server/handlers/api-docs-sections.js +0 -293
  428. package/dist/server/handlers/api-docs-sections.js.map +0 -1
  429. package/dist/server/handlers/api-keys.part2.test.js +0 -157
  430. package/dist/server/handlers/api-keys.test.js +0 -161
  431. package/dist/server/handlers/billing-routes.test.js +0 -123
  432. package/dist/server/handlers/billing.test.js +0 -215
  433. package/dist/server/handlers/browser-actions-errors.test.js +0 -94
  434. package/dist/server/handlers/browser-actions.part2.test.js +0 -190
  435. package/dist/server/handlers/browser-actions.test.js +0 -190
  436. package/dist/server/handlers/browser-validation.test.js +0 -257
  437. package/dist/server/handlers/catalog.test.js +0 -297
  438. package/dist/server/handlers/comms.test.js +0 -289
  439. package/dist/server/handlers/creations-advanced-collections.test.js +0 -214
  440. package/dist/server/handlers/creations-advanced-generate.test.js +0 -142
  441. package/dist/server/handlers/creations-advanced.test.js +0 -171
  442. package/dist/server/handlers/creations-collections-preview.test.js +0 -214
  443. package/dist/server/handlers/creations-crud.test.js +0 -260
  444. package/dist/server/handlers/creations-mutations.test.js +0 -197
  445. package/dist/server/handlers/crm.test.js +0 -179
  446. package/dist/server/handlers/discovery-advertise.test.js +0 -185
  447. package/dist/server/handlers/discovery-scan.test.js +0 -233
  448. package/dist/server/handlers/embeddings-embed-search.test.js +0 -196
  449. package/dist/server/handlers/embeddings-index-delete-stats.test.js +0 -140
  450. package/dist/server/handlers/embeddings-search.test.js +0 -221
  451. package/dist/server/handlers/embeddings.test.js +0 -137
  452. package/dist/server/handlers/enrichment-breach.d.ts +0 -8
  453. package/dist/server/handlers/enrichment-breach.js +0 -266
  454. package/dist/server/handlers/enrichment-breach.js.map +0 -1
  455. package/dist/server/handlers/enrichment-data.d.ts +0 -13
  456. package/dist/server/handlers/enrichment-data.js +0 -145
  457. package/dist/server/handlers/enrichment-data.js.map +0 -1
  458. package/dist/server/handlers/enrichment-mutations.test.js +0 -240
  459. package/dist/server/handlers/enrichment-queries.test.js +0 -181
  460. package/dist/server/handlers/enrichment-validation.test.js +0 -177
  461. package/dist/server/handlers/enrichment-writes.d.ts +0 -16
  462. package/dist/server/handlers/enrichment-writes.js +0 -226
  463. package/dist/server/handlers/enrichment-writes.js.map +0 -1
  464. package/dist/server/handlers/image-gen.test.js +0 -205
  465. package/dist/server/handlers/inventory.test.js +0 -380
  466. package/dist/server/handlers/kali-background.test.js +0 -222
  467. package/dist/server/handlers/kali-errors.test.js +0 -92
  468. package/dist/server/handlers/kali-validation.test.js +0 -234
  469. package/dist/server/handlers/llm-providers-actions.test.js +0 -220
  470. package/dist/server/handlers/llm-providers-anthropic.test.js +0 -239
  471. package/dist/server/handlers/llm-providers-failover.test.js +0 -232
  472. package/dist/server/handlers/llm-providers-providers.test.js +0 -300
  473. package/dist/server/handlers/llm-providers-validation.test.js +0 -239
  474. package/dist/server/handlers/local-agent-tools.test.js +0 -224
  475. package/dist/server/handlers/local-agent.test.js +0 -198
  476. package/dist/server/handlers/local-agent.tools-status.test.js +0 -204
  477. package/dist/server/handlers/local-agent.validation-exec.test.js +0 -182
  478. package/dist/server/handlers/meta-ads-audience-rules.test.js +0 -243
  479. package/dist/server/handlers/meta-ads-audience-targeting.test.js +0 -205
  480. package/dist/server/handlers/meta-ads-audiences-targeting.test.js +0 -383
  481. package/dist/server/handlers/meta-ads-crud-ads.test.js +0 -136
  482. package/dist/server/handlers/meta-ads-crud-campaigns.test.js +0 -189
  483. package/dist/server/handlers/meta-ads-crud-create.test.js +0 -303
  484. package/dist/server/handlers/meta-ads-crud-list-update.test.js +0 -259
  485. package/dist/server/handlers/meta-ads-delete-publish-sync.test.js +0 -282
  486. package/dist/server/handlers/meta-ads-insights.test.js +0 -80
  487. package/dist/server/handlers/meta-ads-list-get.test.js +0 -237
  488. package/dist/server/handlers/meta-ads-publish-delete.test.js +0 -254
  489. package/dist/server/handlers/meta-ads-publish-helpers.js +0 -117
  490. package/dist/server/handlers/meta-ads-publish-helpers.js.map +0 -1
  491. package/dist/server/handlers/meta-ads-publish-sync.test.js +0 -205
  492. package/dist/server/handlers/meta-ads-publish.test.js +0 -254
  493. package/dist/server/handlers/meta-ads-sync-insights.test.js +0 -184
  494. package/dist/server/handlers/meta-ads-update.test.js +0 -117
  495. package/dist/server/handlers/nodes-channels.test.js +0 -413
  496. package/dist/server/handlers/nodes-events.test.js +0 -131
  497. package/dist/server/handlers/nodes-list-delete.test.js +0 -171
  498. package/dist/server/handlers/nodes-messages-delivery.test.js +0 -208
  499. package/dist/server/handlers/nodes-messages.test.js +0 -211
  500. package/dist/server/handlers/nodes-register.test.js +0 -277
  501. package/dist/server/handlers/nodes.test.js +0 -353
  502. package/dist/server/handlers/operations.test.js +0 -136
  503. package/dist/server/handlers/platform-telemetry.test.js +0 -200
  504. package/dist/server/handlers/platform-websearch.test.js +0 -160
  505. package/dist/server/handlers/storefront.test.js +0 -329
  506. package/dist/server/handlers/supply-chain.test.js +0 -347
  507. package/dist/server/handlers/transcription.test.js +0 -118
  508. package/dist/server/handlers/video-gen-veo.js +0 -114
  509. package/dist/server/handlers/video-gen-veo.js.map +0 -1
  510. package/dist/server/handlers/video-gen.test.js +0 -146
  511. package/dist/server/handlers/voice.test.js +0 -153
  512. package/dist/server/handlers/workflow-steps.test.js +0 -330
  513. package/dist/server/handlers/workflows-extras.test.js +0 -65
  514. package/dist/server/handlers/workflows.part2.test.js +0 -170
  515. package/dist/server/handlers/workflows.test.js +0 -281
  516. package/dist/server/lib/__tests__/batch-client-conversion-jsonl.test.js +0 -171
  517. package/dist/server/lib/__tests__/batch-client-polling.test.js +0 -292
  518. package/dist/server/lib/__tests__/batch-client-queue.test.js +0 -270
  519. package/dist/server/lib/__tests__/clickhouse-buffer.test.js +0 -236
  520. package/dist/server/lib/__tests__/code-worker-edge-cases.test.js +0 -118
  521. package/dist/server/lib/__tests__/code-worker-pool-execute.test.js +0 -193
  522. package/dist/server/lib/__tests__/code-worker-pool-execution.test.js +0 -165
  523. package/dist/server/lib/__tests__/code-worker-pool-init.test.js +0 -131
  524. package/dist/server/lib/__tests__/code-worker-pool.test.js +0 -194
  525. package/dist/server/lib/__tests__/code-worker-sandbox-ops.test.js +0 -123
  526. package/dist/server/lib/__tests__/code-worker-sandbox.test.js +0 -217
  527. package/dist/server/lib/__tests__/code-worker.test.js +0 -179
  528. package/dist/server/lib/__tests__/compaction-service-generate.test.js +0 -229
  529. package/dist/server/lib/__tests__/compaction-service.test.js +0 -319
  530. package/dist/server/lib/__tests__/otel.test.js +0 -146
  531. package/dist/server/lib/__tests__/prompt-sanitizer-validation.test.js +0 -165
  532. package/dist/server/lib/__tests__/prompt-sanitizer.sanitize.test.js +0 -343
  533. package/dist/server/lib/__tests__/prompt-sanitizer.test.js +0 -328
  534. package/dist/server/lib/__tests__/prompt-sanitizer.validate-tool.test.js +0 -145
  535. package/dist/server/lib/__tests__/provider-capabilities.test.js +0 -263
  536. package/dist/server/lib/__tests__/provider-failover-routing.test.js +0 -145
  537. package/dist/server/lib/__tests__/provider-failover-state.test.js +0 -131
  538. package/dist/server/lib/__tests__/rate-limiter-budgets.test.js +0 -216
  539. package/dist/server/lib/__tests__/rate-limiter.budgets-tools.test.js +0 -113
  540. package/dist/server/lib/__tests__/rate-limiter.check-request.test.js +0 -141
  541. package/dist/server/lib/__tests__/rate-limiter.stats-lifecycle.test.js +0 -135
  542. package/dist/server/lib/__tests__/rate-limiter.test.js +0 -207
  543. package/dist/server/lib/__tests__/server-agent-loop-abort-conditions.test.js +0 -544
  544. package/dist/server/lib/__tests__/server-agent-loop-abort.part2.test.js +0 -504
  545. package/dist/server/lib/__tests__/server-agent-loop-abort.test.js +0 -396
  546. package/dist/server/lib/__tests__/server-agent-loop-compaction.test.js +0 -397
  547. package/dist/server/lib/__tests__/server-agent-loop-failover.test.js +0 -356
  548. package/dist/server/lib/__tests__/server-agent-loop-features-caching.test.js +0 -519
  549. package/dist/server/lib/__tests__/server-agent-loop-features-edges.test.js +0 -512
  550. package/dist/server/lib/__tests__/server-subagent-bailout.test.js +0 -194
  551. package/dist/server/lib/__tests__/server-subagent-basics.test.js +0 -348
  552. package/dist/server/lib/__tests__/server-subagent-errors-abort.test.js +0 -319
  553. package/dist/server/lib/__tests__/server-subagent-errors-progress.test.js +0 -253
  554. package/dist/server/lib/__tests__/server-subagent-errors.part2.test.js +0 -253
  555. package/dist/server/lib/__tests__/server-subagent-errors.test.js +0 -319
  556. package/dist/server/lib/__tests__/session-checkpoint-load.test.js +0 -275
  557. package/dist/server/lib/__tests__/session-checkpoint-save.test.js +0 -159
  558. package/dist/server/lib/__tests__/ssrf-guard.test.js +0 -93
  559. package/dist/server/lib/__tests__/supabase-client.test.js +0 -111
  560. package/dist/server/lib/__tests__/template-resolver.test.js +0 -317
  561. package/dist/server/lib/__tests__/utils-timeout.test.js +0 -49
  562. package/dist/server/lib/__tests__/utils.test.js +0 -322
  563. package/dist/server/providers/__tests__/anthropic-adapter.test.js +0 -228
  564. package/dist/server/providers/__tests__/anthropic-betas-toolchoice.test.js +0 -257
  565. package/dist/server/providers/__tests__/anthropic-errors.test.js +0 -262
  566. package/dist/server/providers/__tests__/anthropic-stream-core.test.js +0 -275
  567. package/dist/server/providers/__tests__/anthropic-streaming-betas.test.js +0 -247
  568. package/dist/server/providers/__tests__/anthropic-streaming-core.test.js +0 -275
  569. package/dist/server/providers/__tests__/bedrock-config.test.js +0 -177
  570. package/dist/server/providers/__tests__/bedrock-stream-behavior-streaming.test.js +0 -272
  571. package/dist/server/providers/__tests__/bedrock-stream-behavior-toolchoice.test.js +0 -214
  572. package/dist/server/providers/__tests__/bedrock-stream-behavior.part2.test.js +0 -165
  573. package/dist/server/providers/__tests__/bedrock-stream-behavior.test.js +0 -309
  574. package/dist/server/providers/__tests__/bedrock-stream-body-credentials.test.js +0 -170
  575. package/dist/server/providers/__tests__/bedrock-stream-body-extras.test.js +0 -183
  576. package/dist/server/providers/__tests__/bedrock-stream-body-request.test.js +0 -305
  577. package/dist/server/providers/__tests__/bedrock-stream-body.part2.test.js +0 -305
  578. package/dist/server/providers/__tests__/bedrock-stream-body.test.js +0 -175
  579. package/dist/server/providers/__tests__/bedrock-stream-errors.test.js +0 -165
  580. package/dist/server/providers/__tests__/gemini-config-methods.test.js +0 -182
  581. package/dist/server/providers/__tests__/gemini-config-streaming.test.js +0 -257
  582. package/dist/server/providers/__tests__/gemini-conversion-messages.test.js +0 -247
  583. package/dist/server/providers/__tests__/gemini-conversion-schema.test.js +0 -365
  584. package/dist/server/providers/__tests__/gemini-tools-choice.test.js +0 -221
  585. package/dist/server/providers/__tests__/gemini-tools-fn.test.js +0 -252
  586. package/dist/server/providers/__tests__/openai-config.test.js +0 -194
  587. package/dist/server/providers/__tests__/openai-conversion.test.js +0 -276
  588. package/dist/server/providers/__tests__/openai-messages.test.js +0 -261
  589. package/dist/server/providers/__tests__/openai-streaming.test.js +0 -394
  590. package/dist/server/providers/__tests__/openai-tools-cache.test.js +0 -227
  591. package/dist/server/providers/__tests__/registry.test.js +0 -183
  592. package/dist/server/providers/__tests__/shared.test.js +0 -297
  593. package/dist/shared/agent-core-config.test.js +0 -132
  594. package/dist/shared/agent-core-context-thinking.test.js +0 -293
  595. package/dist/shared/agent-core-loop-calls.test.js +0 -174
  596. package/dist/shared/agent-core-loop-detector-bail.test.js +0 -201
  597. package/dist/shared/agent-core-loop-detector.test.js +0 -195
  598. package/dist/shared/agent-core-loop-errors.test.js +0 -258
  599. package/dist/shared/agent-core-pricing.test.js +0 -191
  600. package/dist/shared/agent-core-sanitize-retry.test.js +0 -129
  601. package/dist/shared/api-client-build-request.test.js +0 -228
  602. package/dist/shared/api-client-build-system-caching.test.js +0 -107
  603. package/dist/shared/api-client-build.test.js +0 -223
  604. package/dist/shared/api-client-config.d.ts +0 -21
  605. package/dist/shared/api-client-helpers.d.ts +0 -57
  606. package/dist/shared/api-client-helpers.test.js +0 -261
  607. package/dist/shared/api-client-proxy-happy.test.js +0 -255
  608. package/dist/shared/api-client-proxy-retry.test.js +0 -307
  609. package/dist/shared/api-client-proxy.d.ts +0 -26
  610. package/dist/shared/api-client-proxy.test.js +0 -255
  611. package/dist/shared/api-client-retry.test.js +0 -307
  612. package/dist/shared/api-client-system-trimming.test.js +0 -261
  613. package/dist/shared/api-client-trimming.d.ts +0 -36
  614. package/dist/shared/api-client.test.js +0 -228
  615. package/dist/shared/compaction-thinking.test.js +0 -315
  616. package/dist/shared/compaction-trimming.test.js +0 -223
  617. package/dist/shared/sse-parser-callbacks.test.js +0 -422
  618. package/dist/shared/sse-parser-collect.test.js +0 -252
  619. package/dist/shared/sse-parser-e2e.test.js +0 -558
  620. package/dist/shared/sse-parser-parse.test.js +0 -253
  621. package/dist/shared/tool-dispatch-advanced-batch-build.test.js +0 -405
  622. package/dist/shared/tool-dispatch-advanced.test.js +0 -320
  623. package/dist/shared/tool-dispatch-basic.test.js +0 -278
  624. package/dist/shared/tool-dispatch-content.d.ts +0 -14
  625. package/dist/shared/tool-dispatch-parallel.test.js +0 -378
  626. package/dist/webchat/__tests__/widget-messaging.test.js +0 -323
  627. package/dist/webchat/__tests__/widget.test.js +0 -273
@@ -35,13 +35,13 @@ export function useAgentLoop(deps) {
35
35
  clearTimeout(flushTimerRef.current);
36
36
  flushTimerRef.current = null;
37
37
  }
38
- store.getState().addMessage({
38
+
39
+ // Atomic: add user message + reset streaming state + set isStreaming in one render
40
+ store.getState().startStreaming({
39
41
  role: "user",
40
42
  text: userMessage,
41
43
  images: images?.map(img => img.name)
42
44
  });
43
- store.getState().resetStreamingState();
44
- store.getState().setIsStreaming(true);
45
45
  thinkingChunksRef.current = 0;
46
46
  thinkingDoneRef.current = false;
47
47
  const abort = new AbortController();
@@ -83,52 +83,60 @@ export function useAgentLoop(deps) {
83
83
  }
84
84
  function flushAll() {
85
85
  flushTimerRef.current = null;
86
- const s = store.getState();
86
+ // Batch ALL dirty fields into a single store update.
87
+ // Prevents intermediate renders with inconsistent state
88
+ // (e.g., new text but old tools) that cause visual glitching.
89
+ const patch = {};
87
90
  if (dirty.text) {
88
- s.setStreamingText(accTextRef.current);
91
+ patch.streamingText = accTextRef.current;
89
92
  dirty.text = false;
90
93
  }
91
94
  if (dirty.thinking) {
92
- s.setThinkingText(thinkingBuffer.value);
95
+ patch.thinkingText = thinkingBuffer.value;
93
96
  dirty.thinking = false;
94
97
  }
95
98
  if (dirty.tools) {
96
- s.setActiveTools([...toolCalls]);
99
+ patch.activeTools = [...toolCalls];
97
100
  dirty.tools = false;
98
101
  }
99
102
  if (dirty.team) {
100
- s.setTeamState({
103
+ patch.teamState = {
101
104
  name: team.teamName,
102
105
  tasksCompleted: team.teamCompleted,
103
106
  tasksTotal: team.teamTotal,
104
107
  teammates: new Map(teammateStatus)
105
- });
108
+ };
106
109
  dirty.team = false;
107
110
  }
108
111
  if (dirty.subagents) {
109
- s.setSubagentActivity(new Map(subagentMap));
110
- if (pendingCompleted.length > 0) s.setCompletedSubagents(prev => [...prev, ...pendingCompleted.splice(0)]);
112
+ patch.subagentActivity = new Map(subagentMap);
111
113
  dirty.subagents = false;
112
114
  }
113
- if (dirty.messages) {
114
- const batch = pendingToolMsgs.splice(0);
115
- if (batch.length > 0) s.setMessages(prev_0 => [...prev_0, ...batch]);
116
- dirty.messages = false;
115
+ // Messages and completedSubagents need current state for appending
116
+ const needsMessages = dirty.messages && pendingToolMsgs.length > 0;
117
+ const needsCompleted = pendingCompleted.length > 0;
118
+ if (needsMessages || needsCompleted) {
119
+ const msgBatch = needsMessages ? pendingToolMsgs.splice(0) : [];
120
+ const completedBatch = needsCompleted ? pendingCompleted.splice(0) : [];
121
+ store.setState(s => ({
122
+ ...patch,
123
+ messages: msgBatch.length > 0 ? [...s.messages, ...msgBatch] : s.messages,
124
+ completedSubagents: completedBatch.length > 0 ? [...s.completedSubagents, ...completedBatch] : s.completedSubagents
125
+ }));
126
+ } else if (Object.keys(patch).length > 0) {
127
+ store.setState(patch);
117
128
  }
129
+ dirty.messages = false;
118
130
  lastContentUpdateRef.current = Date.now();
119
131
  }
120
132
  const flushText = () => {
121
- const s_0 = store.getState();
122
133
  const text = accTextRef.current;
123
- if (text.trim()) s_0.setMessages(prev_1 => [...prev_1, {
124
- role: "assistant",
125
- text
126
- }]);
134
+ // Atomic: commit text to messages + clear streaming/thinking in one update
135
+ // Prevents intermediate render showing text in both Static and LiveArea
136
+ store.getState().commitStreamingText(text);
127
137
  accTextRef.current = "";
128
138
  dirty.text = false;
129
- s_0.setStreamingText("");
130
139
  thinkingBuffer.value = "";
131
- s_0.setThinkingText("");
132
140
  };
133
141
  const emitter = new AgentEventEmitter();
134
142
  const thinkingRefs = {
@@ -272,31 +280,31 @@ export function useAgentLoop(deps) {
272
280
  flushAll();
273
281
 
274
282
  // Collect all pending messages into a single batch
275
- const batch_1 = [];
276
- if (pendingToolMsgs.length > 0) batch_1.push(...pendingToolMsgs.splice(0));
283
+ const batch_0 = [];
284
+ if (pendingToolMsgs.length > 0) batch_0.push(...pendingToolMsgs.splice(0));
277
285
  const allCompleted = [...store.getState().completedSubagents, ...pendingCompleted.splice(0)];
278
- if (allCompleted.length > 0) batch_1.push({
286
+ if (allCompleted.length > 0) batch_0.push({
279
287
  role: "assistant",
280
288
  text: "",
281
289
  completedSubagents: allCompleted
282
290
  });
283
291
  const finalText = accTextRef.current;
284
- if (finalText.trim() || usage) batch_1.push({
292
+ if (finalText.trim() || usage) batch_0.push({
285
293
  role: "assistant",
286
294
  text: finalText,
287
295
  usage
288
296
  });
289
297
 
290
298
  // Atomic update — commit messages + reset streaming + set isStreaming=false in one render
291
- store.getState().finishStreaming(batch_1);
299
+ store.getState().finishStreaming(batch_0);
292
300
 
293
301
  // Rewind checkpoint (no-op on messages, just tracks state)
294
- store.getState().setMessages(prev_2 => {
302
+ store.getState().setMessages(prev => {
295
303
  const fileChanges = rewindManagerRef.current.getCurrentFileChanges();
296
- rewindManagerRef.current.addCheckpoint(turnIndexRef.current, prev_2.length, finalText.trim() || "(tool-only turn)", fileChanges);
304
+ rewindManagerRef.current.addCheckpoint(turnIndexRef.current, prev.length, finalText.trim() || "(tool-only turn)", fileChanges);
297
305
  rewindManagerRef.current.commitTurn();
298
306
  turnIndexRef.current++;
299
- return prev_2;
307
+ return prev;
300
308
  });
301
309
  abortRef.current = null;
302
310
  conversationRef.current = finalMessages;
@@ -318,13 +326,13 @@ export function useAgentLoop(deps) {
318
326
  team.teamCompleted = 0;
319
327
  teammateStatus.clear();
320
328
  flushAll();
321
- const batch_2 = [];
322
- if (pendingToolMsgs.length > 0) batch_2.push(...pendingToolMsgs.splice(0));
323
- if (err !== "Cancelled") batch_2.push({
329
+ const batch_1 = [];
330
+ if (pendingToolMsgs.length > 0) batch_1.push(...pendingToolMsgs.splice(0));
331
+ if (err !== "Cancelled") batch_1.push({
324
332
  role: "assistant",
325
333
  text: `\x1b[31m\u2718 Error: ${err}\x1b[0m`
326
334
  });
327
- store.getState().finishStreaming(batch_2);
335
+ store.getState().finishStreaming(batch_1);
328
336
  abortRef.current = null;
329
337
  if (partialMessages && partialMessages.length > 0) conversationRef.current = partialMessages;
330
338
  }
@@ -342,12 +350,12 @@ export function useAgentLoop(deps) {
342
350
  teammateStatus.clear();
343
351
  flushAll();
344
352
  const errMsg = e_13 instanceof Error ? e_13.message : String(e_13);
345
- const batch_0 = [];
346
- if (errMsg !== "Cancelled") batch_0.push({
353
+ const batch = [];
354
+ if (errMsg !== "Cancelled") batch.push({
347
355
  role: "assistant",
348
356
  text: `\x1b[31m\u2718 Error: ${errMsg}\x1b[0m`
349
357
  });
350
- store.getState().finishStreaming(batch_0);
358
+ store.getState().finishStreaming(batch);
351
359
  abortRef.current = null;
352
360
  }
353
361
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useAgentLoop.js","names":["useRef","runAgentLoop","AgentEventEmitter","saveSession","listBackups","getChatStore","handleThinking","handleText","handleToolOutput","handleToolProgress","handleTeamStart","handleTeamTask","handleTeamProgress","handleTeamDone","handleSubagentStart","handleSubagentProgress","handleSubagentToolStart","handleSubagentToolEnd","handleSubagentDone","handleDone","useAgentLoop","deps","conversationRef","abortRef","accTextRef","lastContentUpdateRef","thinkingChunksRef","thinkingDoneRef","rewindManagerRef","turnIndexRef","flushTimerRef","handleSend","userMessage","images","store","isStreaming","thinkingEnabled","getState","current","clearTimeout","addMessage","role","text","map","img","name","resetStreamingState","setIsStreaming","abort","AbortController","toolCalls","usage","dirty","tools","team","subagents","messages","thinking","thinkingBuffer","value","subagentMap","Map","pendingCompleted","pendingToolMsgs","teamName","teamTotal","teamCompleted","teammateStatus","markDirty","field","setTimeout","flushAll","cancelFlush","s","setStreamingText","setThinkingText","setActiveTools","setTeamState","tasksCompleted","tasksTotal","teammates","setSubagentActivity","length","setCompletedSubagents","prev","splice","batch","setMessages","Date","now","flushText","trim","emitter","thinkingRefs","eventCtx","EVENT_HANDLERS","e","tool_output","tool_progress","team_start","team_task","team_progress","team_done","v","subagent_start","subagent_progress","subagent_tool_start","subagent_tool_end","subagent_done","done","unsub","onEvent","event","type","message","base64","mediaType","conversationHistory","abortSignal","signal","callbacks","onText","onToolStart","input","idx","findIndex","t","status","push","onToolResult","success","result","durationMs","completedTool","JSON","stringify","FILE_TOOLS","includes","filePath","file_path","backups","fileName","split","pop","backup","find","b","endsWith","trackFileChange","backupPath","path","operation","isNewFile","onUsage","input_tokens","output_tokens","thinking_tokens","model","costUsd","cacheReadTokens","cacheCreationTokens","cache_read_tokens","cache_creation_tokens","onAutoCompact","before","after","tokensSaved","toFixed","onDone","finalMessages","destroy","clear","allCompleted","completedSubagents","finalText","finishStreaming","fileChanges","getCurrentFileChanges","addCheckpoint","commitTurn","sid","sessionId","onError","err","partialMessages","errMsg","Error","String"],"sources":["../../../../src/cli/chat/hooks/useAgentLoop.ts"],"sourcesContent":["/**\n * useAgentLoop — agent loop runner extracted from ChatApp\n *\n * Uses Zustand store for all state updates.\n * Event handlers extracted to agent-loop-events.ts.\n */\n\nimport { useRef } from \"react\";\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport { runAgentLoop } from \"../../services/agent-loop.js\";\nimport { AgentEventEmitter, type AgentEvent } from \"../../services/agent-events.js\";\nimport { RewindManager } from \"../../services/rewind.js\";\nimport { saveSession } from \"../../services/session-persistence.js\";\nimport { listBackups } from \"../../services/file-history.js\";\nimport type { ChatMessage, ToolCall } from \"../MessageList.js\";\nimport type { SubagentActivityState, CompletedSubagentInfo } from \"../SubagentPanel.js\";\nimport type { ImageAttachment } from \"../ChatInput.js\";\nimport { getChatStore } from \"../store.js\";\nimport {\n type EventCtx, type TeamRefs, type ThinkingRefs,\n handleThinking, handleText, handleToolOutput, handleToolProgress,\n handleTeamStart, handleTeamTask, handleTeamProgress, handleTeamDone,\n handleSubagentStart, handleSubagentProgress, handleSubagentToolStart,\n handleSubagentToolEnd, handleSubagentDone, handleDone,\n} from \"./agent-loop-events.js\";\n\nexport interface AgentLoopDeps {\n conversationRef: React.MutableRefObject<Anthropic.MessageParam[]>;\n abortRef: React.MutableRefObject<AbortController | null>;\n accTextRef: React.MutableRefObject<string>;\n lastContentUpdateRef: React.MutableRefObject<number>;\n thinkingChunksRef: React.MutableRefObject<number>;\n thinkingDoneRef: React.MutableRefObject<boolean>;\n rewindManagerRef: React.MutableRefObject<RewindManager>;\n turnIndexRef: React.MutableRefObject<number>;\n}\n\nexport function useAgentLoop(deps: AgentLoopDeps) {\n const {\n conversationRef, abortRef,\n accTextRef, lastContentUpdateRef, thinkingChunksRef, thinkingDoneRef,\n rewindManagerRef, turnIndexRef,\n } = deps;\n\n const flushTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n const handleSend = async (userMessage: string, images?: ImageAttachment[]) => {\n const store = getChatStore();\n const { isStreaming, thinkingEnabled } = store.getState();\n if (isStreaming) return;\n\n if (flushTimerRef.current) {\n clearTimeout(flushTimerRef.current);\n flushTimerRef.current = null;\n }\n\n store.getState().addMessage({ role: \"user\", text: userMessage, images: images?.map(img => img.name) });\n store.getState().resetStreamingState();\n store.getState().setIsStreaming(true);\n thinkingChunksRef.current = 0;\n thinkingDoneRef.current = false;\n\n const abort = new AbortController();\n abortRef.current = abort;\n accTextRef.current = \"\";\n const toolCalls: ToolCall[] = [];\n let usage: ChatMessage[\"usage\"];\n\n // Render batching\n const dirty = { text: false, tools: false, team: false, subagents: false, messages: false, thinking: false };\n const thinkingBuffer = { value: \"\" };\n const subagentMap = new Map<string, SubagentActivityState>();\n const pendingCompleted: CompletedSubagentInfo[] = [];\n const pendingToolMsgs: ChatMessage[] = [];\n const team: TeamRefs = { teamName: \"\", teamTotal: 0, teamCompleted: 0 };\n const teammateStatus = new Map<string, { name: string; status: string; startTime: number }>();\n\n function markDirty(field: keyof typeof dirty) {\n dirty[field] = true;\n if (!flushTimerRef.current) flushTimerRef.current = setTimeout(flushAll, 200);\n }\n\n function cancelFlush() {\n if (flushTimerRef.current) { clearTimeout(flushTimerRef.current); flushTimerRef.current = null; }\n }\n\n function flushAll() {\n flushTimerRef.current = null;\n const s = store.getState();\n if (dirty.text) { s.setStreamingText(accTextRef.current); dirty.text = false; }\n if (dirty.thinking) { s.setThinkingText(thinkingBuffer.value); dirty.thinking = false; }\n if (dirty.tools) { s.setActiveTools([...toolCalls]); dirty.tools = false; }\n if (dirty.team) {\n s.setTeamState({ name: team.teamName, tasksCompleted: team.teamCompleted, tasksTotal: team.teamTotal, teammates: new Map(teammateStatus) });\n dirty.team = false;\n }\n if (dirty.subagents) {\n s.setSubagentActivity(new Map(subagentMap));\n if (pendingCompleted.length > 0) s.setCompletedSubagents(prev => [...prev, ...pendingCompleted.splice(0)]);\n dirty.subagents = false;\n }\n if (dirty.messages) {\n const batch = pendingToolMsgs.splice(0);\n if (batch.length > 0) s.setMessages(prev => [...prev, ...batch]);\n dirty.messages = false;\n }\n lastContentUpdateRef.current = Date.now();\n }\n\n const flushText = () => {\n const s = store.getState();\n const text = accTextRef.current;\n if (text.trim()) s.setMessages(prev => [...prev, { role: \"assistant\" as const, text }]);\n accTextRef.current = \"\";\n dirty.text = false;\n s.setStreamingText(\"\");\n thinkingBuffer.value = \"\";\n s.setThinkingText(\"\");\n };\n\n const emitter = new AgentEventEmitter();\n const thinkingRefs: ThinkingRefs = { thinkingChunksRef, thinkingDoneRef, thinkingBuffer, accTextRef };\n const eventCtx: EventCtx = { markDirty, cancelFlush, flushAll, toolCalls, subagentMap, pendingCompleted, teammateStatus };\n\n const EVENT_HANDLERS: Record<string, (event: any) => void> = {\n thinking: (e) => handleThinking(e, eventCtx, thinkingRefs),\n text: (e) => handleText(e, eventCtx, thinkingRefs),\n tool_output: (e) => handleToolOutput(e, eventCtx),\n tool_progress: (e) => handleToolProgress(e, eventCtx),\n team_start: (e) => handleTeamStart(e, eventCtx, team),\n team_task: (e) => handleTeamTask(e, eventCtx, team),\n team_progress: (e) => handleTeamProgress(e, eventCtx),\n team_done: (e) => handleTeamDone(e, eventCtx, team, accTextRef, (v) => store.getState().setTeamState(v), (v) => store.getState().setStreamingText(v)),\n subagent_start: (e) => handleSubagentStart(e, eventCtx),\n subagent_progress: (e) => handleSubagentProgress(e, eventCtx),\n subagent_tool_start: (e) => handleSubagentToolStart(e, eventCtx),\n subagent_tool_end: (e) => handleSubagentToolEnd(e, eventCtx),\n subagent_done: (e) => handleSubagentDone(e, eventCtx),\n done: (e) => handleDone(e, eventCtx, accTextRef),\n };\n\n const unsub = emitter.onEvent((event: AgentEvent) => { EVENT_HANDLERS[event.type]?.(event); });\n\n try {\n await runAgentLoop({\n message: userMessage,\n images: images?.map(img => ({ base64: img.base64, mediaType: img.mediaType })),\n conversationHistory: conversationRef.current,\n abortSignal: abort.signal,\n emitter,\n thinking: thinkingEnabled,\n callbacks: {\n onText: () => {},\n onToolStart: (name, input) => {\n if (input) {\n const idx = toolCalls.findIndex(t => t.name === name && t.status === \"running\" && !t.input);\n if (idx >= 0) { toolCalls[idx].input = input; } else { toolCalls.push({ name, status: \"running\", input }); }\n markDirty(\"tools\");\n lastContentUpdateRef.current = Date.now();\n return;\n }\n flushText();\n toolCalls.push({ name, status: \"running\" });\n markDirty(\"tools\");\n lastContentUpdateRef.current = Date.now();\n },\n onToolResult: (name, success, result, input, durationMs) => {\n const completedTool: ToolCall = { name, status: success ? \"success\" : \"error\", result: typeof result === \"string\" ? result : JSON.stringify(result), input, durationMs };\n const idx = toolCalls.findIndex((t) => t.name === name && t.status === \"running\");\n if (idx >= 0) toolCalls.splice(idx, 1);\n\n if (success && input) {\n const FILE_TOOLS = [\"write_file\", \"edit_file\", \"multi_edit\"];\n if (FILE_TOOLS.includes(name)) {\n try {\n const filePath = (input as Record<string, unknown>).file_path as string | undefined;\n if (filePath) {\n const backups = listBackups();\n const fileName = filePath.split(\"/\").pop() || \"\";\n const backup = backups.find(b => b.name.endsWith(`-${fileName}`));\n rewindManagerRef.current.trackFileChange({\n filePath, backupPath: backup?.path || \"\",\n operation: name === \"write_file\" ? \"write\" : name === \"edit_file\" ? \"edit\" : \"multi_edit\",\n isNewFile: !backup,\n });\n }\n } catch { /* best effort */ }\n }\n }\n\n pendingToolMsgs.push({ role: \"assistant\" as const, text: \"\", toolCalls: [completedTool] });\n markDirty(\"messages\"); markDirty(\"tools\");\n accTextRef.current = \"\"; markDirty(\"text\");\n lastContentUpdateRef.current = Date.now();\n },\n onUsage: (input_tokens, output_tokens, thinking_tokens, model, costUsd, cacheReadTokens, cacheCreationTokens) => {\n usage = { input_tokens, output_tokens, thinking_tokens, model, costUsd, cache_read_tokens: cacheReadTokens, cache_creation_tokens: cacheCreationTokens };\n },\n onAutoCompact: (before, after, tokensSaved) => {\n pendingToolMsgs.push({ role: \"assistant\" as const, text: ` Context auto-compacted: ${before} messages -> ${after} messages (~${(tokensSaved / 1000).toFixed(0)}K tokens freed)` });\n markDirty(\"messages\");\n },\n onDone: (finalMessages) => {\n unsub(); emitter.destroy(); cancelFlush();\n // Clear team refs before flush so dirty.team won't re-create stale state\n team.teamName = \"\"; team.teamTotal = 0; team.teamCompleted = 0; teammateStatus.clear();\n flushAll();\n\n // Collect all pending messages into a single batch\n const batch: ChatMessage[] = [];\n if (pendingToolMsgs.length > 0) batch.push(...pendingToolMsgs.splice(0));\n const allCompleted = [...store.getState().completedSubagents, ...pendingCompleted.splice(0)];\n if (allCompleted.length > 0) batch.push({ role: \"assistant\" as const, text: \"\", completedSubagents: allCompleted });\n const finalText = accTextRef.current;\n if (finalText.trim() || usage) batch.push({ role: \"assistant\" as const, text: finalText, usage });\n\n // Atomic update — commit messages + reset streaming + set isStreaming=false in one render\n store.getState().finishStreaming(batch);\n\n // Rewind checkpoint (no-op on messages, just tracks state)\n store.getState().setMessages(prev => {\n const fileChanges = rewindManagerRef.current.getCurrentFileChanges();\n rewindManagerRef.current.addCheckpoint(turnIndexRef.current, prev.length, finalText.trim() || \"(tool-only turn)\", fileChanges);\n rewindManagerRef.current.commitTurn();\n turnIndexRef.current++;\n return prev;\n });\n abortRef.current = null;\n conversationRef.current = finalMessages;\n\n // Auto-save session to disk after each turn — prevents data loss\n // if the CLI is killed or crashes. Uses the store's sessionId if set\n // (from /save or /resume), otherwise creates a rolling \"current\" session.\n try {\n const sid = store.getState().sessionId || \"current\";\n saveSession(finalMessages, sid);\n } catch { /* best effort — don't block UI */ }\n },\n onError: (err, partialMessages) => {\n unsub(); emitter.destroy(); cancelFlush();\n team.teamName = \"\"; team.teamTotal = 0; team.teamCompleted = 0; teammateStatus.clear();\n flushAll();\n const batch: ChatMessage[] = [];\n if (pendingToolMsgs.length > 0) batch.push(...pendingToolMsgs.splice(0));\n if (err !== \"Cancelled\") batch.push({ role: \"assistant\", text: `\\x1b[31m\\u2718 Error: ${err}\\x1b[0m` });\n store.getState().finishStreaming(batch);\n abortRef.current = null;\n if (partialMessages && partialMessages.length > 0) conversationRef.current = partialMessages;\n },\n },\n });\n } catch (e) {\n // Ensure streaming state is always cleaned up — even if runAgentLoop\n // throws before reaching onDone/onError callbacks\n unsub(); emitter.destroy(); cancelFlush();\n team.teamName = \"\"; team.teamTotal = 0; team.teamCompleted = 0; teammateStatus.clear();\n flushAll();\n const errMsg = e instanceof Error ? e.message : String(e);\n const batch: ChatMessage[] = [];\n if (errMsg !== \"Cancelled\") batch.push({ role: \"assistant\", text: `\\x1b[31m\\u2718 Error: ${errMsg}\\x1b[0m` });\n store.getState().finishStreaming(batch);\n abortRef.current = null;\n }\n };\n\n return { handleSend };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"useAgentLoop.js","names":["useRef","runAgentLoop","AgentEventEmitter","saveSession","listBackups","getChatStore","handleThinking","handleText","handleToolOutput","handleToolProgress","handleTeamStart","handleTeamTask","handleTeamProgress","handleTeamDone","handleSubagentStart","handleSubagentProgress","handleSubagentToolStart","handleSubagentToolEnd","handleSubagentDone","handleDone","useAgentLoop","deps","conversationRef","abortRef","accTextRef","lastContentUpdateRef","thinkingChunksRef","thinkingDoneRef","rewindManagerRef","turnIndexRef","flushTimerRef","handleSend","userMessage","images","store","isStreaming","thinkingEnabled","getState","current","clearTimeout","startStreaming","role","text","map","img","name","abort","AbortController","toolCalls","usage","dirty","tools","team","subagents","messages","thinking","thinkingBuffer","value","subagentMap","Map","pendingCompleted","pendingToolMsgs","teamName","teamTotal","teamCompleted","teammateStatus","markDirty","field","setTimeout","flushAll","cancelFlush","patch","streamingText","thinkingText","activeTools","teamState","tasksCompleted","tasksTotal","teammates","subagentActivity","needsMessages","length","needsCompleted","msgBatch","splice","completedBatch","setState","s","completedSubagents","Object","keys","Date","now","flushText","commitStreamingText","emitter","thinkingRefs","eventCtx","EVENT_HANDLERS","e","tool_output","tool_progress","team_start","team_task","team_progress","team_done","v","setTeamState","setStreamingText","subagent_start","subagent_progress","subagent_tool_start","subagent_tool_end","subagent_done","done","unsub","onEvent","event","type","message","base64","mediaType","conversationHistory","abortSignal","signal","callbacks","onText","onToolStart","input","idx","findIndex","t","status","push","onToolResult","success","result","durationMs","completedTool","JSON","stringify","FILE_TOOLS","includes","filePath","file_path","backups","fileName","split","pop","backup","find","b","endsWith","trackFileChange","backupPath","path","operation","isNewFile","onUsage","input_tokens","output_tokens","thinking_tokens","model","costUsd","cacheReadTokens","cacheCreationTokens","cache_read_tokens","cache_creation_tokens","onAutoCompact","before","after","tokensSaved","toFixed","onDone","finalMessages","destroy","clear","batch","allCompleted","finalText","trim","finishStreaming","setMessages","prev","fileChanges","getCurrentFileChanges","addCheckpoint","commitTurn","sid","sessionId","onError","err","partialMessages","errMsg","Error","String"],"sources":["../../../../src/cli/chat/hooks/useAgentLoop.ts"],"sourcesContent":["/**\n * useAgentLoop — agent loop runner extracted from ChatApp\n *\n * Uses Zustand store for all state updates.\n * Event handlers extracted to agent-loop-events.ts.\n */\n\nimport { useRef } from \"react\";\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport { runAgentLoop } from \"../../services/agent-loop.js\";\nimport { AgentEventEmitter, type AgentEvent } from \"../../services/agent-events.js\";\nimport { RewindManager } from \"../../services/rewind.js\";\nimport { saveSession } from \"../../services/session-persistence.js\";\nimport { listBackups } from \"../../services/file-history.js\";\nimport type { ChatMessage, ToolCall } from \"../MessageList.js\";\nimport type { SubagentActivityState, CompletedSubagentInfo } from \"../SubagentPanel.js\";\nimport type { ImageAttachment } from \"../ChatInput.js\";\nimport { getChatStore } from \"../store.js\";\nimport {\n type EventCtx, type TeamRefs, type ThinkingRefs,\n handleThinking, handleText, handleToolOutput, handleToolProgress,\n handleTeamStart, handleTeamTask, handleTeamProgress, handleTeamDone,\n handleSubagentStart, handleSubagentProgress, handleSubagentToolStart,\n handleSubagentToolEnd, handleSubagentDone, handleDone,\n} from \"./agent-loop-events.js\";\n\nexport interface AgentLoopDeps {\n conversationRef: React.MutableRefObject<Anthropic.MessageParam[]>;\n abortRef: React.MutableRefObject<AbortController | null>;\n accTextRef: React.MutableRefObject<string>;\n lastContentUpdateRef: React.MutableRefObject<number>;\n thinkingChunksRef: React.MutableRefObject<number>;\n thinkingDoneRef: React.MutableRefObject<boolean>;\n rewindManagerRef: React.MutableRefObject<RewindManager>;\n turnIndexRef: React.MutableRefObject<number>;\n}\n\nexport function useAgentLoop(deps: AgentLoopDeps) {\n const {\n conversationRef, abortRef,\n accTextRef, lastContentUpdateRef, thinkingChunksRef, thinkingDoneRef,\n rewindManagerRef, turnIndexRef,\n } = deps;\n\n const flushTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n const handleSend = async (userMessage: string, images?: ImageAttachment[]) => {\n const store = getChatStore();\n const { isStreaming, thinkingEnabled } = store.getState();\n if (isStreaming) return;\n\n if (flushTimerRef.current) {\n clearTimeout(flushTimerRef.current);\n flushTimerRef.current = null;\n }\n\n // Atomic: add user message + reset streaming state + set isStreaming in one render\n store.getState().startStreaming({ role: \"user\", text: userMessage, images: images?.map(img => img.name) });\n thinkingChunksRef.current = 0;\n thinkingDoneRef.current = false;\n\n const abort = new AbortController();\n abortRef.current = abort;\n accTextRef.current = \"\";\n const toolCalls: ToolCall[] = [];\n let usage: ChatMessage[\"usage\"];\n\n // Render batching\n const dirty = { text: false, tools: false, team: false, subagents: false, messages: false, thinking: false };\n const thinkingBuffer = { value: \"\" };\n const subagentMap = new Map<string, SubagentActivityState>();\n const pendingCompleted: CompletedSubagentInfo[] = [];\n const pendingToolMsgs: ChatMessage[] = [];\n const team: TeamRefs = { teamName: \"\", teamTotal: 0, teamCompleted: 0 };\n const teammateStatus = new Map<string, { name: string; status: string; startTime: number }>();\n\n function markDirty(field: keyof typeof dirty) {\n dirty[field] = true;\n if (!flushTimerRef.current) flushTimerRef.current = setTimeout(flushAll, 200);\n }\n\n function cancelFlush() {\n if (flushTimerRef.current) { clearTimeout(flushTimerRef.current); flushTimerRef.current = null; }\n }\n\n function flushAll() {\n flushTimerRef.current = null;\n // Batch ALL dirty fields into a single store update.\n // Prevents intermediate renders with inconsistent state\n // (e.g., new text but old tools) that cause visual glitching.\n const patch: Record<string, unknown> = {};\n if (dirty.text) { patch.streamingText = accTextRef.current; dirty.text = false; }\n if (dirty.thinking) { patch.thinkingText = thinkingBuffer.value; dirty.thinking = false; }\n if (dirty.tools) { patch.activeTools = [...toolCalls]; dirty.tools = false; }\n if (dirty.team) {\n patch.teamState = { name: team.teamName, tasksCompleted: team.teamCompleted, tasksTotal: team.teamTotal, teammates: new Map(teammateStatus) };\n dirty.team = false;\n }\n if (dirty.subagents) {\n patch.subagentActivity = new Map(subagentMap);\n dirty.subagents = false;\n }\n // Messages and completedSubagents need current state for appending\n const needsMessages = dirty.messages && pendingToolMsgs.length > 0;\n const needsCompleted = pendingCompleted.length > 0;\n if (needsMessages || needsCompleted) {\n const msgBatch = needsMessages ? pendingToolMsgs.splice(0) : [];\n const completedBatch = needsCompleted ? pendingCompleted.splice(0) : [];\n store.setState((s) => ({\n ...patch,\n messages: msgBatch.length > 0 ? [...s.messages, ...msgBatch] : s.messages,\n completedSubagents: completedBatch.length > 0 ? [...s.completedSubagents, ...completedBatch] : s.completedSubagents,\n }));\n } else if (Object.keys(patch).length > 0) {\n store.setState(patch);\n }\n dirty.messages = false;\n lastContentUpdateRef.current = Date.now();\n }\n\n const flushText = () => {\n const text = accTextRef.current;\n // Atomic: commit text to messages + clear streaming/thinking in one update\n // Prevents intermediate render showing text in both Static and LiveArea\n store.getState().commitStreamingText(text);\n accTextRef.current = \"\";\n dirty.text = false;\n thinkingBuffer.value = \"\";\n };\n\n const emitter = new AgentEventEmitter();\n const thinkingRefs: ThinkingRefs = { thinkingChunksRef, thinkingDoneRef, thinkingBuffer, accTextRef };\n const eventCtx: EventCtx = { markDirty, cancelFlush, flushAll, toolCalls, subagentMap, pendingCompleted, teammateStatus };\n\n const EVENT_HANDLERS: Record<string, (event: any) => void> = {\n thinking: (e) => handleThinking(e, eventCtx, thinkingRefs),\n text: (e) => handleText(e, eventCtx, thinkingRefs),\n tool_output: (e) => handleToolOutput(e, eventCtx),\n tool_progress: (e) => handleToolProgress(e, eventCtx),\n team_start: (e) => handleTeamStart(e, eventCtx, team),\n team_task: (e) => handleTeamTask(e, eventCtx, team),\n team_progress: (e) => handleTeamProgress(e, eventCtx),\n team_done: (e) => handleTeamDone(e, eventCtx, team, accTextRef, (v) => store.getState().setTeamState(v), (v) => store.getState().setStreamingText(v)),\n subagent_start: (e) => handleSubagentStart(e, eventCtx),\n subagent_progress: (e) => handleSubagentProgress(e, eventCtx),\n subagent_tool_start: (e) => handleSubagentToolStart(e, eventCtx),\n subagent_tool_end: (e) => handleSubagentToolEnd(e, eventCtx),\n subagent_done: (e) => handleSubagentDone(e, eventCtx),\n done: (e) => handleDone(e, eventCtx, accTextRef),\n };\n\n const unsub = emitter.onEvent((event: AgentEvent) => { EVENT_HANDLERS[event.type]?.(event); });\n\n try {\n await runAgentLoop({\n message: userMessage,\n images: images?.map(img => ({ base64: img.base64, mediaType: img.mediaType })),\n conversationHistory: conversationRef.current,\n abortSignal: abort.signal,\n emitter,\n thinking: thinkingEnabled,\n callbacks: {\n onText: () => {},\n onToolStart: (name, input) => {\n if (input) {\n const idx = toolCalls.findIndex(t => t.name === name && t.status === \"running\" && !t.input);\n if (idx >= 0) { toolCalls[idx].input = input; } else { toolCalls.push({ name, status: \"running\", input }); }\n markDirty(\"tools\");\n lastContentUpdateRef.current = Date.now();\n return;\n }\n flushText();\n toolCalls.push({ name, status: \"running\" });\n markDirty(\"tools\");\n lastContentUpdateRef.current = Date.now();\n },\n onToolResult: (name, success, result, input, durationMs) => {\n const completedTool: ToolCall = { name, status: success ? \"success\" : \"error\", result: typeof result === \"string\" ? result : JSON.stringify(result), input, durationMs };\n const idx = toolCalls.findIndex((t) => t.name === name && t.status === \"running\");\n if (idx >= 0) toolCalls.splice(idx, 1);\n\n if (success && input) {\n const FILE_TOOLS = [\"write_file\", \"edit_file\", \"multi_edit\"];\n if (FILE_TOOLS.includes(name)) {\n try {\n const filePath = (input as Record<string, unknown>).file_path as string | undefined;\n if (filePath) {\n const backups = listBackups();\n const fileName = filePath.split(\"/\").pop() || \"\";\n const backup = backups.find(b => b.name.endsWith(`-${fileName}`));\n rewindManagerRef.current.trackFileChange({\n filePath, backupPath: backup?.path || \"\",\n operation: name === \"write_file\" ? \"write\" : name === \"edit_file\" ? \"edit\" : \"multi_edit\",\n isNewFile: !backup,\n });\n }\n } catch { /* best effort */ }\n }\n }\n\n pendingToolMsgs.push({ role: \"assistant\" as const, text: \"\", toolCalls: [completedTool] });\n markDirty(\"messages\"); markDirty(\"tools\");\n accTextRef.current = \"\"; markDirty(\"text\");\n lastContentUpdateRef.current = Date.now();\n },\n onUsage: (input_tokens, output_tokens, thinking_tokens, model, costUsd, cacheReadTokens, cacheCreationTokens) => {\n usage = { input_tokens, output_tokens, thinking_tokens, model, costUsd, cache_read_tokens: cacheReadTokens, cache_creation_tokens: cacheCreationTokens };\n },\n onAutoCompact: (before, after, tokensSaved) => {\n pendingToolMsgs.push({ role: \"assistant\" as const, text: ` Context auto-compacted: ${before} messages -> ${after} messages (~${(tokensSaved / 1000).toFixed(0)}K tokens freed)` });\n markDirty(\"messages\");\n },\n onDone: (finalMessages) => {\n unsub(); emitter.destroy(); cancelFlush();\n // Clear team refs before flush so dirty.team won't re-create stale state\n team.teamName = \"\"; team.teamTotal = 0; team.teamCompleted = 0; teammateStatus.clear();\n flushAll();\n\n // Collect all pending messages into a single batch\n const batch: ChatMessage[] = [];\n if (pendingToolMsgs.length > 0) batch.push(...pendingToolMsgs.splice(0));\n const allCompleted = [...store.getState().completedSubagents, ...pendingCompleted.splice(0)];\n if (allCompleted.length > 0) batch.push({ role: \"assistant\" as const, text: \"\", completedSubagents: allCompleted });\n const finalText = accTextRef.current;\n if (finalText.trim() || usage) batch.push({ role: \"assistant\" as const, text: finalText, usage });\n\n // Atomic update — commit messages + reset streaming + set isStreaming=false in one render\n store.getState().finishStreaming(batch);\n\n // Rewind checkpoint (no-op on messages, just tracks state)\n store.getState().setMessages(prev => {\n const fileChanges = rewindManagerRef.current.getCurrentFileChanges();\n rewindManagerRef.current.addCheckpoint(turnIndexRef.current, prev.length, finalText.trim() || \"(tool-only turn)\", fileChanges);\n rewindManagerRef.current.commitTurn();\n turnIndexRef.current++;\n return prev;\n });\n abortRef.current = null;\n conversationRef.current = finalMessages;\n\n // Auto-save session to disk after each turn — prevents data loss\n // if the CLI is killed or crashes. Uses the store's sessionId if set\n // (from /save or /resume), otherwise creates a rolling \"current\" session.\n try {\n const sid = store.getState().sessionId || \"current\";\n saveSession(finalMessages, sid);\n } catch { /* best effort — don't block UI */ }\n },\n onError: (err, partialMessages) => {\n unsub(); emitter.destroy(); cancelFlush();\n team.teamName = \"\"; team.teamTotal = 0; team.teamCompleted = 0; teammateStatus.clear();\n flushAll();\n const batch: ChatMessage[] = [];\n if (pendingToolMsgs.length > 0) batch.push(...pendingToolMsgs.splice(0));\n if (err !== \"Cancelled\") batch.push({ role: \"assistant\", text: `\\x1b[31m\\u2718 Error: ${err}\\x1b[0m` });\n store.getState().finishStreaming(batch);\n abortRef.current = null;\n if (partialMessages && partialMessages.length > 0) conversationRef.current = partialMessages;\n },\n },\n });\n } catch (e) {\n // Ensure streaming state is always cleaned up — even if runAgentLoop\n // throws before reaching onDone/onError callbacks\n unsub(); emitter.destroy(); cancelFlush();\n team.teamName = \"\"; team.teamTotal = 0; team.teamCompleted = 0; teammateStatus.clear();\n flushAll();\n const errMsg = e instanceof Error ? e.message : String(e);\n const batch: ChatMessage[] = [];\n if (errMsg !== \"Cancelled\") batch.push({ role: \"assistant\", text: `\\x1b[31m\\u2718 Error: ${errMsg}\\x1b[0m` });\n store.getState().finishStreaming(batch);\n abortRef.current = null;\n }\n };\n\n return { handleSend };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -101,12 +101,24 @@ export interface ChatActions {
101
101
  setError: (error: string) => void;
102
102
  setCheckpoints: (checkpoints: RewindCheckpoint[]) => void;
103
103
  resetStreamingState: () => void;
104
+ /**
105
+ * Atomic start — adds user message, resets streaming state, and sets
106
+ * isStreaming=true in one store update. Prevents intermediate renders
107
+ * where old streaming artifacts are visible alongside the new message.
108
+ */
109
+ startStreaming: (userMessage: ChatMessage) => void;
104
110
  /**
105
111
  * Atomic finish — commits final messages AND resets streaming state
106
112
  * in a single store update, preventing intermediate renders that
107
113
  * cause duplicate input bars.
108
114
  */
109
115
  finishStreaming: (appendMessages: ChatMessage[]) => void;
116
+ /**
117
+ * Atomic text commit — moves streaming text into committed messages
118
+ * and clears streaming/thinking state in a single update, preventing
119
+ * the text from appearing in both Static and LiveArea simultaneously.
120
+ */
121
+ commitStreamingText: (text: string) => void;
110
122
  }
111
123
  export type ChatStore = ChatState & ChatActions;
112
124
  export declare function createChatStore(initialModel?: string): import("zustand/vanilla").StoreApi<ChatStore>;
@@ -124,6 +124,17 @@ export function createChatStore(initialModel = "") {
124
124
  teamState: null,
125
125
  streamElapsed: 0
126
126
  }),
127
+ startStreaming: userMessage => set(s => ({
128
+ messages: [...s.messages, userMessage],
129
+ streamingText: "",
130
+ thinkingText: "",
131
+ activeTools: [],
132
+ subagentActivity: new Map(),
133
+ completedSubagents: [],
134
+ teamState: null,
135
+ streamElapsed: 0,
136
+ isStreaming: true
137
+ })),
127
138
  finishStreaming: appendMessages => set(s => ({
128
139
  messages: [...s.messages, ...appendMessages],
129
140
  streamingText: "",
@@ -134,6 +145,14 @@ export function createChatStore(initialModel = "") {
134
145
  teamState: null,
135
146
  streamElapsed: 0,
136
147
  isStreaming: false
148
+ })),
149
+ commitStreamingText: text => set(s => ({
150
+ messages: text.trim() ? [...s.messages, {
151
+ role: "assistant",
152
+ text
153
+ }] : s.messages,
154
+ streamingText: "",
155
+ thinkingText: ""
137
156
  }))
138
157
  }));
139
158
  }
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","names":["createStore","createChatStore","initialModel","set","messages","streamingText","thinkingText","isStreaming","activeTools","subagentActivity","Map","completedSubagents","teamState","streamElapsed","overlay","type","currentModel","thinkingEnabled","toolsExpanded","serverToolsAvailable","userLabel","sessionId","ready","error","checkpoints","addMessage","msg","s","addMessages","msgs","setMessages","msgsOrFn","setStreamingText","setThinkingText","setIsStreaming","setActiveTools","setSubagentActivity","setCompletedSubagents","agentsOrFn","setTeamState","setStreamElapsed","setOverlay","dismissOverlay","setCurrentModel","setThinkingEnabled","setToolsExpanded","expanded","setServerToolsAvailable","setUserLabel","setSessionId","setReady","setError","setCheckpoints","resetStreamingState","finishStreaming","appendMessages","_store","initChatStore","getChatStore","Error","useState","useEffect","useRef","useReactRef","useChatStore","selector","storeRef","selectorRef","current","value","setValue","getState","store","prev","Object","is","unsub","subscribe","state","next"],"sources":["../../../src/cli/chat/store.ts"],"sourcesContent":["/**\n * Chat Store — Zustand store replacing all prop drilling\n *\n * Single source of truth for:\n * - messages (committed to Static)\n * - streaming state (text, tools, subagents, team)\n * - overlay state (discriminated union)\n * - UI preferences (model, thinking, expanded)\n * - session identity (user label, session ID)\n *\n * All components read from this store directly.\n * No props needed except leaf-component configuration.\n */\n\nimport { createStore } from \"zustand/vanilla\";\nimport type { ToolCall, ChatMessage } from \"./MessageList.js\";\nimport type { SubagentActivityState, CompletedSubagentInfo } from \"./SubagentPanel.js\";\nimport type { StoreInfo } from \"../services/auth-service.js\";\nimport type { SessionMeta } from \"../services/session-persistence.js\";\nimport type { NodeInfo } from \"./NodeSelector.js\";\nimport type { RewindCheckpoint } from \"../services/rewind.js\";\n\n// ── Overlay State — discriminated union replaces 14 booleans ──\n\nexport type OverlayState =\n | { type: \"none\" }\n | { type: \"storeSelect\"; stores: StoreInfo[] }\n | { type: \"nodeSelect\"; nodes: NodeInfo[] }\n | { type: \"sessionManager\"; sessions: SessionMeta[] }\n | { type: \"memoryManager\"; memories: string[] }\n | { type: \"modelSelect\" }\n | { type: \"themeSelect\" }\n | { type: \"planApproval\"; planContent: string; planFile: string }\n | { type: \"rewind\" }\n | { type: \"nodeManager\"; daemonRunning: boolean; daemonPid: number | null };\n\n// ── Team State ──\n\nexport interface TeamInfo {\n name: string;\n tasksCompleted: number;\n tasksTotal: number;\n teammates: Map<string, { name: string; status: string; startTime: number }>;\n}\n\n// ── Store Shape ──\n\nexport interface ChatState {\n // Messages (committed to Ink <Static>)\n messages: ChatMessage[];\n\n // Streaming\n streamingText: string;\n thinkingText: string;\n isStreaming: boolean;\n activeTools: ToolCall[];\n subagentActivity: Map<string, SubagentActivityState>;\n completedSubagents: CompletedSubagentInfo[];\n teamState: TeamInfo | null;\n streamElapsed: number;\n\n // Overlay\n overlay: OverlayState;\n\n // UI preferences\n currentModel: string;\n thinkingEnabled: boolean;\n toolsExpanded: boolean;\n serverToolsAvailable: number;\n\n // Session identity\n userLabel: string;\n sessionId: string | null;\n ready: boolean;\n error: string;\n\n // Rewind checkpoints (read-only snapshot for overlay)\n checkpoints: RewindCheckpoint[];\n}\n\nexport interface ChatActions {\n // Messages\n addMessage: (msg: ChatMessage) => void;\n addMessages: (msgs: ChatMessage[]) => void;\n setMessages: (msgs: ChatMessage[] | ((prev: ChatMessage[]) => ChatMessage[])) => void;\n\n // Streaming\n setStreamingText: (text: string) => void;\n setThinkingText: (text: string) => void;\n setIsStreaming: (streaming: boolean) => void;\n setActiveTools: (tools: ToolCall[]) => void;\n setSubagentActivity: (activity: Map<string, SubagentActivityState>) => void;\n setCompletedSubagents: (agents: CompletedSubagentInfo[] | ((prev: CompletedSubagentInfo[]) => CompletedSubagentInfo[])) => void;\n setTeamState: (team: TeamInfo | null) => void;\n setStreamElapsed: (elapsed: number) => void;\n\n // Overlay\n setOverlay: (overlay: OverlayState) => void;\n dismissOverlay: () => void;\n\n // UI preferences\n setCurrentModel: (model: string) => void;\n setThinkingEnabled: (enabled: boolean) => void;\n setToolsExpanded: (expanded: boolean) => void;\n setServerToolsAvailable: (count: number) => void;\n\n // Session\n setUserLabel: (label: string) => void;\n setSessionId: (id: string | null) => void;\n setReady: (ready: boolean) => void;\n setError: (error: string) => void;\n setCheckpoints: (checkpoints: RewindCheckpoint[]) => void;\n\n // Batch reset for stream start/end\n resetStreamingState: () => void;\n\n /**\n * Atomic finish — commits final messages AND resets streaming state\n * in a single store update, preventing intermediate renders that\n * cause duplicate input bars.\n */\n finishStreaming: (appendMessages: ChatMessage[]) => void;\n}\n\nexport type ChatStore = ChatState & ChatActions;\n\n// ── Store Factory ──\n\nexport function createChatStore(initialModel: string = \"\") {\n return createStore<ChatStore>((set) => ({\n // Initial state\n messages: [],\n streamingText: \"\",\n thinkingText: \"\",\n isStreaming: false,\n activeTools: [],\n subagentActivity: new Map(),\n completedSubagents: [],\n teamState: null,\n streamElapsed: 0,\n overlay: { type: \"none\" },\n currentModel: initialModel,\n thinkingEnabled: true,\n toolsExpanded: false,\n serverToolsAvailable: 0,\n userLabel: \"\",\n sessionId: null,\n ready: false,\n error: \"\",\n checkpoints: [],\n\n // Actions\n addMessage: (msg) => set((s) => ({ messages: [...s.messages, msg] })),\n addMessages: (msgs) => set((s) => ({ messages: [...s.messages, ...msgs] })),\n setMessages: (msgsOrFn) => set((s) => ({\n messages: typeof msgsOrFn === \"function\" ? msgsOrFn(s.messages) : msgsOrFn,\n })),\n\n setStreamingText: (streamingText) => set({ streamingText }),\n setThinkingText: (thinkingText) => set({ thinkingText }),\n setIsStreaming: (isStreaming) => set({ isStreaming }),\n setActiveTools: (activeTools) => set({ activeTools }),\n setSubagentActivity: (subagentActivity) => set({ subagentActivity }),\n setCompletedSubagents: (agentsOrFn) => set((s) => ({\n completedSubagents: typeof agentsOrFn === \"function\" ? agentsOrFn(s.completedSubagents) : agentsOrFn,\n })),\n setTeamState: (teamState) => set({ teamState }),\n setStreamElapsed: (streamElapsed) => set({ streamElapsed }),\n\n setOverlay: (overlay) => set({ overlay }),\n dismissOverlay: () => set({ overlay: { type: \"none\" } }),\n\n setCurrentModel: (currentModel) => set({ currentModel }),\n setThinkingEnabled: (thinkingEnabled) => set({ thinkingEnabled }),\n setToolsExpanded: (expanded) => set({ toolsExpanded: expanded }),\n setServerToolsAvailable: (serverToolsAvailable) => set({ serverToolsAvailable }),\n\n setUserLabel: (userLabel) => set({ userLabel }),\n setSessionId: (sessionId) => set({ sessionId }),\n setReady: (ready) => set({ ready }),\n setError: (error) => set({ error }),\n setCheckpoints: (checkpoints) => set({ checkpoints }),\n\n resetStreamingState: () => set({\n streamingText: \"\",\n thinkingText: \"\",\n activeTools: [],\n subagentActivity: new Map(),\n completedSubagents: [],\n teamState: null,\n streamElapsed: 0,\n }),\n\n finishStreaming: (appendMessages) => set((s) => ({\n messages: [...s.messages, ...appendMessages],\n streamingText: \"\",\n thinkingText: \"\",\n activeTools: [],\n subagentActivity: new Map(),\n completedSubagents: [],\n teamState: null,\n streamElapsed: 0,\n isStreaming: false,\n })),\n }));\n}\n\n// ── Singleton ──\n// Created once at app startup, accessed by all components.\n\nlet _store: ReturnType<typeof createChatStore> | null = null;\n\nexport function initChatStore(initialModel: string = \"\"): ReturnType<typeof createChatStore> {\n if (!_store) _store = createChatStore(initialModel);\n return _store;\n}\n\nexport function getChatStore(): ReturnType<typeof createChatStore> {\n if (!_store) throw new Error(\"Chat store not initialized. Call initChatStore() first.\");\n return _store;\n}\n\n// ── React Hook (for use in Ink components) ──\n// Ink's custom renderer doesn't support useSyncExternalStore correctly,\n// so we bridge with useState + useEffect + store.subscribe instead.\n\nimport { useState, useEffect, useRef as useReactRef } from \"react\";\n\nexport function useChatStore<T>(selector: (state: ChatStore) => T): T {\n const storeRef = useReactRef(getChatStore());\n const selectorRef = useReactRef(selector);\n selectorRef.current = selector;\n\n const [value, setValue] = useState(() => selector(storeRef.current.getState()));\n\n useEffect(() => {\n const store = storeRef.current;\n // Sync immediately in case store changed between render and effect\n const current = selectorRef.current(store.getState());\n setValue((prev) => Object.is(prev, current) ? prev : current);\n\n const unsub = store.subscribe((state) => {\n const next = selectorRef.current(state);\n setValue((prev) => Object.is(prev, next) ? prev : next);\n });\n return unsub;\n }, []);\n\n return value;\n}\n\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"store.js","names":["createStore","createChatStore","initialModel","set","messages","streamingText","thinkingText","isStreaming","activeTools","subagentActivity","Map","completedSubagents","teamState","streamElapsed","overlay","type","currentModel","thinkingEnabled","toolsExpanded","serverToolsAvailable","userLabel","sessionId","ready","error","checkpoints","addMessage","msg","s","addMessages","msgs","setMessages","msgsOrFn","setStreamingText","setThinkingText","setIsStreaming","setActiveTools","setSubagentActivity","setCompletedSubagents","agentsOrFn","setTeamState","setStreamElapsed","setOverlay","dismissOverlay","setCurrentModel","setThinkingEnabled","setToolsExpanded","expanded","setServerToolsAvailable","setUserLabel","setSessionId","setReady","setError","setCheckpoints","resetStreamingState","startStreaming","userMessage","finishStreaming","appendMessages","commitStreamingText","text","trim","role","_store","initChatStore","getChatStore","Error","useState","useEffect","useRef","useReactRef","useChatStore","selector","storeRef","selectorRef","current","value","setValue","getState","store","prev","Object","is","unsub","subscribe","state","next"],"sources":["../../../src/cli/chat/store.ts"],"sourcesContent":["/**\n * Chat Store — Zustand store replacing all prop drilling\n *\n * Single source of truth for:\n * - messages (committed to Static)\n * - streaming state (text, tools, subagents, team)\n * - overlay state (discriminated union)\n * - UI preferences (model, thinking, expanded)\n * - session identity (user label, session ID)\n *\n * All components read from this store directly.\n * No props needed except leaf-component configuration.\n */\n\nimport { createStore } from \"zustand/vanilla\";\nimport type { ToolCall, ChatMessage } from \"./MessageList.js\";\nimport type { SubagentActivityState, CompletedSubagentInfo } from \"./SubagentPanel.js\";\nimport type { StoreInfo } from \"../services/auth-service.js\";\nimport type { SessionMeta } from \"../services/session-persistence.js\";\nimport type { NodeInfo } from \"./NodeSelector.js\";\nimport type { RewindCheckpoint } from \"../services/rewind.js\";\n\n// ── Overlay State — discriminated union replaces 14 booleans ──\n\nexport type OverlayState =\n | { type: \"none\" }\n | { type: \"storeSelect\"; stores: StoreInfo[] }\n | { type: \"nodeSelect\"; nodes: NodeInfo[] }\n | { type: \"sessionManager\"; sessions: SessionMeta[] }\n | { type: \"memoryManager\"; memories: string[] }\n | { type: \"modelSelect\" }\n | { type: \"themeSelect\" }\n | { type: \"planApproval\"; planContent: string; planFile: string }\n | { type: \"rewind\" }\n | { type: \"nodeManager\"; daemonRunning: boolean; daemonPid: number | null };\n\n// ── Team State ──\n\nexport interface TeamInfo {\n name: string;\n tasksCompleted: number;\n tasksTotal: number;\n teammates: Map<string, { name: string; status: string; startTime: number }>;\n}\n\n// ── Store Shape ──\n\nexport interface ChatState {\n // Messages (committed to Ink <Static>)\n messages: ChatMessage[];\n\n // Streaming\n streamingText: string;\n thinkingText: string;\n isStreaming: boolean;\n activeTools: ToolCall[];\n subagentActivity: Map<string, SubagentActivityState>;\n completedSubagents: CompletedSubagentInfo[];\n teamState: TeamInfo | null;\n streamElapsed: number;\n\n // Overlay\n overlay: OverlayState;\n\n // UI preferences\n currentModel: string;\n thinkingEnabled: boolean;\n toolsExpanded: boolean;\n serverToolsAvailable: number;\n\n // Session identity\n userLabel: string;\n sessionId: string | null;\n ready: boolean;\n error: string;\n\n // Rewind checkpoints (read-only snapshot for overlay)\n checkpoints: RewindCheckpoint[];\n}\n\nexport interface ChatActions {\n // Messages\n addMessage: (msg: ChatMessage) => void;\n addMessages: (msgs: ChatMessage[]) => void;\n setMessages: (msgs: ChatMessage[] | ((prev: ChatMessage[]) => ChatMessage[])) => void;\n\n // Streaming\n setStreamingText: (text: string) => void;\n setThinkingText: (text: string) => void;\n setIsStreaming: (streaming: boolean) => void;\n setActiveTools: (tools: ToolCall[]) => void;\n setSubagentActivity: (activity: Map<string, SubagentActivityState>) => void;\n setCompletedSubagents: (agents: CompletedSubagentInfo[] | ((prev: CompletedSubagentInfo[]) => CompletedSubagentInfo[])) => void;\n setTeamState: (team: TeamInfo | null) => void;\n setStreamElapsed: (elapsed: number) => void;\n\n // Overlay\n setOverlay: (overlay: OverlayState) => void;\n dismissOverlay: () => void;\n\n // UI preferences\n setCurrentModel: (model: string) => void;\n setThinkingEnabled: (enabled: boolean) => void;\n setToolsExpanded: (expanded: boolean) => void;\n setServerToolsAvailable: (count: number) => void;\n\n // Session\n setUserLabel: (label: string) => void;\n setSessionId: (id: string | null) => void;\n setReady: (ready: boolean) => void;\n setError: (error: string) => void;\n setCheckpoints: (checkpoints: RewindCheckpoint[]) => void;\n\n // Batch reset for stream start/end\n resetStreamingState: () => void;\n\n /**\n * Atomic start — adds user message, resets streaming state, and sets\n * isStreaming=true in one store update. Prevents intermediate renders\n * where old streaming artifacts are visible alongside the new message.\n */\n startStreaming: (userMessage: ChatMessage) => void;\n\n /**\n * Atomic finish — commits final messages AND resets streaming state\n * in a single store update, preventing intermediate renders that\n * cause duplicate input bars.\n */\n finishStreaming: (appendMessages: ChatMessage[]) => void;\n\n /**\n * Atomic text commit — moves streaming text into committed messages\n * and clears streaming/thinking state in a single update, preventing\n * the text from appearing in both Static and LiveArea simultaneously.\n */\n commitStreamingText: (text: string) => void;\n}\n\nexport type ChatStore = ChatState & ChatActions;\n\n// ── Store Factory ──\n\nexport function createChatStore(initialModel: string = \"\") {\n return createStore<ChatStore>((set) => ({\n // Initial state\n messages: [],\n streamingText: \"\",\n thinkingText: \"\",\n isStreaming: false,\n activeTools: [],\n subagentActivity: new Map(),\n completedSubagents: [],\n teamState: null,\n streamElapsed: 0,\n overlay: { type: \"none\" },\n currentModel: initialModel,\n thinkingEnabled: true,\n toolsExpanded: false,\n serverToolsAvailable: 0,\n userLabel: \"\",\n sessionId: null,\n ready: false,\n error: \"\",\n checkpoints: [],\n\n // Actions\n addMessage: (msg) => set((s) => ({ messages: [...s.messages, msg] })),\n addMessages: (msgs) => set((s) => ({ messages: [...s.messages, ...msgs] })),\n setMessages: (msgsOrFn) => set((s) => ({\n messages: typeof msgsOrFn === \"function\" ? msgsOrFn(s.messages) : msgsOrFn,\n })),\n\n setStreamingText: (streamingText) => set({ streamingText }),\n setThinkingText: (thinkingText) => set({ thinkingText }),\n setIsStreaming: (isStreaming) => set({ isStreaming }),\n setActiveTools: (activeTools) => set({ activeTools }),\n setSubagentActivity: (subagentActivity) => set({ subagentActivity }),\n setCompletedSubagents: (agentsOrFn) => set((s) => ({\n completedSubagents: typeof agentsOrFn === \"function\" ? agentsOrFn(s.completedSubagents) : agentsOrFn,\n })),\n setTeamState: (teamState) => set({ teamState }),\n setStreamElapsed: (streamElapsed) => set({ streamElapsed }),\n\n setOverlay: (overlay) => set({ overlay }),\n dismissOverlay: () => set({ overlay: { type: \"none\" } }),\n\n setCurrentModel: (currentModel) => set({ currentModel }),\n setThinkingEnabled: (thinkingEnabled) => set({ thinkingEnabled }),\n setToolsExpanded: (expanded) => set({ toolsExpanded: expanded }),\n setServerToolsAvailable: (serverToolsAvailable) => set({ serverToolsAvailable }),\n\n setUserLabel: (userLabel) => set({ userLabel }),\n setSessionId: (sessionId) => set({ sessionId }),\n setReady: (ready) => set({ ready }),\n setError: (error) => set({ error }),\n setCheckpoints: (checkpoints) => set({ checkpoints }),\n\n resetStreamingState: () => set({\n streamingText: \"\",\n thinkingText: \"\",\n activeTools: [],\n subagentActivity: new Map(),\n completedSubagents: [],\n teamState: null,\n streamElapsed: 0,\n }),\n\n startStreaming: (userMessage) => set((s) => ({\n messages: [...s.messages, userMessage],\n streamingText: \"\",\n thinkingText: \"\",\n activeTools: [],\n subagentActivity: new Map(),\n completedSubagents: [],\n teamState: null,\n streamElapsed: 0,\n isStreaming: true,\n })),\n\n finishStreaming: (appendMessages) => set((s) => ({\n messages: [...s.messages, ...appendMessages],\n streamingText: \"\",\n thinkingText: \"\",\n activeTools: [],\n subagentActivity: new Map(),\n completedSubagents: [],\n teamState: null,\n streamElapsed: 0,\n isStreaming: false,\n })),\n\n commitStreamingText: (text) => set((s) => ({\n messages: text.trim()\n ? [...s.messages, { role: \"assistant\" as const, text }]\n : s.messages,\n streamingText: \"\",\n thinkingText: \"\",\n })),\n }));\n}\n\n// ── Singleton ──\n// Created once at app startup, accessed by all components.\n\nlet _store: ReturnType<typeof createChatStore> | null = null;\n\nexport function initChatStore(initialModel: string = \"\"): ReturnType<typeof createChatStore> {\n if (!_store) _store = createChatStore(initialModel);\n return _store;\n}\n\nexport function getChatStore(): ReturnType<typeof createChatStore> {\n if (!_store) throw new Error(\"Chat store not initialized. Call initChatStore() first.\");\n return _store;\n}\n\n// ── React Hook (for use in Ink components) ──\n// Ink's custom renderer doesn't support useSyncExternalStore correctly,\n// so we bridge with useState + useEffect + store.subscribe instead.\n\nimport { useState, useEffect, useRef as useReactRef } from \"react\";\n\nexport function useChatStore<T>(selector: (state: ChatStore) => T): T {\n const storeRef = useReactRef(getChatStore());\n const selectorRef = useReactRef(selector);\n selectorRef.current = selector;\n\n const [value, setValue] = useState(() => selector(storeRef.current.getState()));\n\n useEffect(() => {\n const store = storeRef.current;\n // Sync immediately in case store changed between render and effect\n const current = selectorRef.current(store.getState());\n setValue((prev) => Object.is(prev, current) ? prev : current);\n\n const unsub = store.subscribe((state) => {\n const next = selectorRef.current(state);\n setValue((prev) => Object.is(prev, next) ? prev : next);\n });\n return unsub;\n }, []);\n\n return value;\n}\n\n"],"mappings":"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","ignoreList":[]}
@@ -109,12 +109,7 @@ async function checkAuth() {
109
109
  getValidToken
110
110
  } = await import("../services/auth-service.js");
111
111
  if (!isLoggedIn()) {
112
- // Check for API key
113
- const {
114
- loadConfig
115
- } = await import("../services/config-store.js");
116
- const config = loadConfig();
117
- if (process.env.ANTHROPIC_API_KEY || config.anthropic_api_key) {
112
+ if (process.env.ANTHROPIC_API_KEY) {
118
113
  return {
119
114
  status: "ok",
120
115
  label: "Auth",
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","names":["execSync","existsSync","readFileSync","join","homedir","CHECK","CROSS","WARN","DIM","RESET","icon","status","checkNodeVersion","version","process","major","parseInt","slice","split","label","detail","checkRipgrep","encoding","timeout","trim","rgPath","checkSupabase","SUPABASE_URL","resp","fetch","method","signal","AbortSignal","ok","err","message","checkAuth","isLoggedIn","getValidToken","loadConfig","config","env","ANTHROPIC_API_KEY","anthropic_api_key","token","checkServerTools","loadServerToolDefinitions","tools","length","checkMcpServers","servers","mcpServers","count","Object","keys","checkDiskSpace","dir","output","size","checkVersion","pkgPath","URL","import","meta","url","pathname","pkg","JSON","parse","runDoctor","console","log","checks","Promise","all","check","padEnd","errors","filter","c","warnings"],"sources":["../../../src/cli/commands/doctor.ts"],"sourcesContent":["/**\n * whale doctor — Run diagnostics\n *\n * Checks:\n * - Node.js version (>=20)\n * - ripgrep availability\n * - Supabase connection\n * - Auth status\n * - Server tools loadable\n * - MCP servers configured\n * - Disk space\n * - Package version vs latest\n */\n\nimport { execSync } from \"child_process\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\n\nconst CHECK = \"\\x1b[32m✓\\x1b[0m\";\nconst CROSS = \"\\x1b[31m✗\\x1b[0m\";\nconst WARN = \"\\x1b[33m!\\x1b[0m\";\nconst DIM = \"\\x1b[2m\";\nconst RESET = \"\\x1b[0m\";\n\ninterface CheckResult {\n status: \"ok\" | \"warn\" | \"error\";\n label: string;\n detail: string;\n}\n\nfunction icon(status: \"ok\" | \"warn\" | \"error\"): string {\n if (status === \"ok\") return CHECK;\n if (status === \"warn\") return WARN;\n return CROSS;\n}\n\nasync function checkNodeVersion(): Promise<CheckResult> {\n const version = process.version;\n const major = parseInt(version.slice(1).split(\".\")[0], 10);\n if (major >= 20) {\n return { status: \"ok\", label: \"Node.js\", detail: version };\n }\n return { status: \"error\", label: \"Node.js\", detail: `${version} (need >=20)` };\n}\n\nasync function checkRipgrep(): Promise<CheckResult> {\n try {\n const version = execSync(\"rg --version 2>/dev/null\", { encoding: \"utf-8\", timeout: 3000 }).trim().split(\"\\n\")[0];\n return { status: \"ok\", label: \"ripgrep\", detail: version };\n } catch {\n // Check if @vscode/ripgrep is available\n try {\n const { rgPath } = await import(\"@vscode/ripgrep\") as any;\n return { status: \"ok\", label: \"ripgrep\", detail: `@vscode/ripgrep (${rgPath})` };\n } catch {\n return { status: \"warn\", label: \"ripgrep\", detail: \"not found (search will use fallback)\" };\n }\n }\n}\n\nasync function checkSupabase(): Promise<CheckResult> {\n try {\n const { SUPABASE_URL } = await import(\"../services/auth-service.js\");\n const resp = await fetch(`${SUPABASE_URL}/rest/v1/`, {\n method: \"HEAD\",\n signal: AbortSignal.timeout(5000),\n });\n if (resp.ok || resp.status === 401) {\n return { status: \"ok\", label: \"Supabase\", detail: \"reachable\" };\n }\n return { status: \"warn\", label: \"Supabase\", detail: `status ${resp.status}` };\n } catch (err: any) {\n return { status: \"error\", label: \"Supabase\", detail: err.message?.slice(0, 60) || \"unreachable\" };\n }\n}\n\nasync function checkAuth(): Promise<CheckResult> {\n try {\n const { isLoggedIn, getValidToken } = await import(\"../services/auth-service.js\");\n if (!isLoggedIn()) {\n // Check for API key\n const { loadConfig } = await import(\"../services/config-store.js\");\n const config = loadConfig();\n if (process.env.ANTHROPIC_API_KEY || config.anthropic_api_key) {\n return { status: \"ok\", label: \"Auth\", detail: \"API key configured\" };\n }\n return { status: \"warn\", label: \"Auth\", detail: \"not logged in (run: whale login)\" };\n }\n const token = await getValidToken();\n return token\n ? { status: \"ok\", label: \"Auth\", detail: \"valid JWT\" }\n : { status: \"warn\", label: \"Auth\", detail: \"token expired\" };\n } catch {\n return { status: \"error\", label: \"Auth\", detail: \"check failed\" };\n }\n}\n\nasync function checkServerTools(): Promise<CheckResult> {\n try {\n const { loadServerToolDefinitions } = await import(\"../services/server-tools.js\");\n const tools = await loadServerToolDefinitions();\n return { status: \"ok\", label: \"Server tools\", detail: `${tools.length} tools loaded` };\n } catch (err: any) {\n return { status: \"warn\", label: \"Server tools\", detail: err.message?.slice(0, 60) || \"unavailable\" };\n }\n}\n\nasync function checkMcpServers(): Promise<CheckResult> {\n try {\n const { loadConfig } = await import(\"../services/config-store.js\");\n const config = loadConfig() as Record<string, unknown>;\n const servers = (config.mcpServers as Record<string, unknown>) || {};\n const count = Object.keys(servers).length;\n if (count === 0) {\n return { status: \"warn\", label: \"MCP servers\", detail: \"none configured\" };\n }\n return { status: \"ok\", label: \"MCP servers\", detail: `${count} configured` };\n } catch {\n return { status: \"warn\", label: \"MCP servers\", detail: \"config parse error\" };\n }\n}\n\nasync function checkDiskSpace(): Promise<CheckResult> {\n const dir = join(homedir(), \".whaletools\");\n if (!existsSync(dir)) {\n return { status: \"ok\", label: \"Data dir\", detail: \"~/.whaletools/ (not created yet)\" };\n }\n try {\n // Get total size\n const output = execSync(`du -sh \"${dir}\" 2>/dev/null`, { encoding: \"utf-8\", timeout: 5000 }).trim();\n const size = output.split(\"\\t\")[0];\n return { status: \"ok\", label: \"Data dir\", detail: `~/.whaletools/ (${size})` };\n } catch {\n return { status: \"ok\", label: \"Data dir\", detail: \"~/.whaletools/\" };\n }\n}\n\nasync function checkVersion(): Promise<CheckResult> {\n try {\n const pkgPath = join(new URL(\"../../..\", import.meta.url).pathname, \"package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n return { status: \"ok\", label: \"Version\", detail: `v${pkg.version}` };\n } catch {\n return { status: \"ok\", label: \"Version\", detail: \"unknown\" };\n }\n}\n\nexport async function runDoctor(): Promise<void> {\n console.log(\"\\n whale doctor\\n\");\n\n const checks = await Promise.all([\n checkNodeVersion(),\n checkRipgrep(),\n checkSupabase(),\n checkAuth(),\n checkServerTools(),\n checkMcpServers(),\n checkDiskSpace(),\n checkVersion(),\n ]);\n\n for (const check of checks) {\n console.log(` ${icon(check.status)} ${check.label.padEnd(16)} ${DIM}${check.detail}${RESET}`);\n }\n\n const errors = checks.filter(c => c.status === \"error\").length;\n const warnings = checks.filter(c => c.status === \"warn\").length;\n console.log();\n\n if (errors > 0) {\n console.log(` ${CROSS} ${errors} error${errors > 1 ? \"s\" : \"\"}, ${warnings} warning${warnings !== 1 ? \"s\" : \"\"}`);\n } else if (warnings > 0) {\n console.log(` ${WARN} All good, ${warnings} warning${warnings !== 1 ? \"s\" : \"\"}`);\n } else {\n console.log(` ${CHECK} All checks passed`);\n }\n console.log();\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"doctor.js","names":["execSync","existsSync","readFileSync","join","homedir","CHECK","CROSS","WARN","DIM","RESET","icon","status","checkNodeVersion","version","process","major","parseInt","slice","split","label","detail","checkRipgrep","encoding","timeout","trim","rgPath","checkSupabase","SUPABASE_URL","resp","fetch","method","signal","AbortSignal","ok","err","message","checkAuth","isLoggedIn","getValidToken","env","ANTHROPIC_API_KEY","token","checkServerTools","loadServerToolDefinitions","tools","length","checkMcpServers","loadConfig","config","servers","mcpServers","count","Object","keys","checkDiskSpace","dir","output","size","checkVersion","pkgPath","URL","import","meta","url","pathname","pkg","JSON","parse","runDoctor","console","log","checks","Promise","all","check","padEnd","errors","filter","c","warnings"],"sources":["../../../src/cli/commands/doctor.ts"],"sourcesContent":["/**\n * whale doctor — Run diagnostics\n *\n * Checks:\n * - Node.js version (>=20)\n * - ripgrep availability\n * - Supabase connection\n * - Auth status\n * - Server tools loadable\n * - MCP servers configured\n * - Disk space\n * - Package version vs latest\n */\n\nimport { execSync } from \"child_process\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\n\nconst CHECK = \"\\x1b[32m✓\\x1b[0m\";\nconst CROSS = \"\\x1b[31m✗\\x1b[0m\";\nconst WARN = \"\\x1b[33m!\\x1b[0m\";\nconst DIM = \"\\x1b[2m\";\nconst RESET = \"\\x1b[0m\";\n\ninterface CheckResult {\n status: \"ok\" | \"warn\" | \"error\";\n label: string;\n detail: string;\n}\n\nfunction icon(status: \"ok\" | \"warn\" | \"error\"): string {\n if (status === \"ok\") return CHECK;\n if (status === \"warn\") return WARN;\n return CROSS;\n}\n\nasync function checkNodeVersion(): Promise<CheckResult> {\n const version = process.version;\n const major = parseInt(version.slice(1).split(\".\")[0], 10);\n if (major >= 20) {\n return { status: \"ok\", label: \"Node.js\", detail: version };\n }\n return { status: \"error\", label: \"Node.js\", detail: `${version} (need >=20)` };\n}\n\nasync function checkRipgrep(): Promise<CheckResult> {\n try {\n const version = execSync(\"rg --version 2>/dev/null\", { encoding: \"utf-8\", timeout: 3000 }).trim().split(\"\\n\")[0];\n return { status: \"ok\", label: \"ripgrep\", detail: version };\n } catch {\n // Check if @vscode/ripgrep is available\n try {\n const { rgPath } = await import(\"@vscode/ripgrep\") as any;\n return { status: \"ok\", label: \"ripgrep\", detail: `@vscode/ripgrep (${rgPath})` };\n } catch {\n return { status: \"warn\", label: \"ripgrep\", detail: \"not found (search will use fallback)\" };\n }\n }\n}\n\nasync function checkSupabase(): Promise<CheckResult> {\n try {\n const { SUPABASE_URL } = await import(\"../services/auth-service.js\");\n const resp = await fetch(`${SUPABASE_URL}/rest/v1/`, {\n method: \"HEAD\",\n signal: AbortSignal.timeout(5000),\n });\n if (resp.ok || resp.status === 401) {\n return { status: \"ok\", label: \"Supabase\", detail: \"reachable\" };\n }\n return { status: \"warn\", label: \"Supabase\", detail: `status ${resp.status}` };\n } catch (err: any) {\n return { status: \"error\", label: \"Supabase\", detail: err.message?.slice(0, 60) || \"unreachable\" };\n }\n}\n\nasync function checkAuth(): Promise<CheckResult> {\n try {\n const { isLoggedIn, getValidToken } = await import(\"../services/auth-service.js\");\n if (!isLoggedIn()) {\n if (process.env.ANTHROPIC_API_KEY) {\n return { status: \"ok\", label: \"Auth\", detail: \"API key configured\" };\n }\n return { status: \"warn\", label: \"Auth\", detail: \"not logged in (run: whale login)\" };\n }\n const token = await getValidToken();\n return token\n ? { status: \"ok\", label: \"Auth\", detail: \"valid JWT\" }\n : { status: \"warn\", label: \"Auth\", detail: \"token expired\" };\n } catch {\n return { status: \"error\", label: \"Auth\", detail: \"check failed\" };\n }\n}\n\nasync function checkServerTools(): Promise<CheckResult> {\n try {\n const { loadServerToolDefinitions } = await import(\"../services/server-tools.js\");\n const tools = await loadServerToolDefinitions();\n return { status: \"ok\", label: \"Server tools\", detail: `${tools.length} tools loaded` };\n } catch (err: any) {\n return { status: \"warn\", label: \"Server tools\", detail: err.message?.slice(0, 60) || \"unavailable\" };\n }\n}\n\nasync function checkMcpServers(): Promise<CheckResult> {\n try {\n const { loadConfig } = await import(\"../services/config-store.js\");\n const config = loadConfig() as Record<string, unknown>;\n const servers = (config.mcpServers as Record<string, unknown>) || {};\n const count = Object.keys(servers).length;\n if (count === 0) {\n return { status: \"warn\", label: \"MCP servers\", detail: \"none configured\" };\n }\n return { status: \"ok\", label: \"MCP servers\", detail: `${count} configured` };\n } catch {\n return { status: \"warn\", label: \"MCP servers\", detail: \"config parse error\" };\n }\n}\n\nasync function checkDiskSpace(): Promise<CheckResult> {\n const dir = join(homedir(), \".whaletools\");\n if (!existsSync(dir)) {\n return { status: \"ok\", label: \"Data dir\", detail: \"~/.whaletools/ (not created yet)\" };\n }\n try {\n // Get total size\n const output = execSync(`du -sh \"${dir}\" 2>/dev/null`, { encoding: \"utf-8\", timeout: 5000 }).trim();\n const size = output.split(\"\\t\")[0];\n return { status: \"ok\", label: \"Data dir\", detail: `~/.whaletools/ (${size})` };\n } catch {\n return { status: \"ok\", label: \"Data dir\", detail: \"~/.whaletools/\" };\n }\n}\n\nasync function checkVersion(): Promise<CheckResult> {\n try {\n const pkgPath = join(new URL(\"../../..\", import.meta.url).pathname, \"package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n return { status: \"ok\", label: \"Version\", detail: `v${pkg.version}` };\n } catch {\n return { status: \"ok\", label: \"Version\", detail: \"unknown\" };\n }\n}\n\nexport async function runDoctor(): Promise<void> {\n console.log(\"\\n whale doctor\\n\");\n\n const checks = await Promise.all([\n checkNodeVersion(),\n checkRipgrep(),\n checkSupabase(),\n checkAuth(),\n checkServerTools(),\n checkMcpServers(),\n checkDiskSpace(),\n checkVersion(),\n ]);\n\n for (const check of checks) {\n console.log(` ${icon(check.status)} ${check.label.padEnd(16)} ${DIM}${check.detail}${RESET}`);\n }\n\n const errors = checks.filter(c => c.status === \"error\").length;\n const warnings = checks.filter(c => c.status === \"warn\").length;\n console.log();\n\n if (errors > 0) {\n console.log(` ${CROSS} ${errors} error${errors > 1 ? \"s\" : \"\"}, ${warnings} warning${warnings !== 1 ? \"s\" : \"\"}`);\n } else if (warnings > 0) {\n console.log(` ${WARN} All good, ${warnings} warning${warnings !== 1 ? \"s\" : \"\"}`);\n } else {\n console.log(` ${CHECK} All checks passed`);\n }\n console.log();\n}\n"],"mappings":"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","ignoreList":[]}
@@ -7,6 +7,7 @@ import { INTERACTIVE_TOOL_DEFINITIONS, executeInteractiveTool, waitForPlanApprov
7
7
  import { loadConfig } from "./config-store.js";
8
8
  import { isServerTool, loadServerToolDefinitions, executeServerTool } from "./server-tools.js";
9
9
  import { mcpClientManager } from "./mcp-client.js";
10
+ import { preprocessMedia } from "./server-tools-preprocess.js";
10
11
  import { getPermissionMode, isToolAllowedByPermission } from "./permission-modes.js";
11
12
  import { runBeforeToolHook, runAfterToolHook } from "./hooks.js";
12
13
  import { resetGitContext } from "./git-context.js";
@@ -182,7 +183,15 @@ export function buildToolExecutor(hooks, abortSignal, emitter) {
182
183
  } else if (isServerTool(name)) {
183
184
  result = await executeServerTool(name, effectiveInput, emitter);
184
185
  } else if (mcpClientManager.isMcpTool(name)) {
185
- result = await mcpClientManager.callTool(name, effectiveInput);
186
+ // Pre-process local file paths for MCP tools (same as server tools).
187
+ // MCP tools bypass executeServerTool(), so preprocessing must happen here.
188
+ const toolBaseName = name.replace(/^mcp__[^_]+__/, ""); // strip MCP prefix
189
+ const ppResult = preprocessMedia(toolBaseName, effectiveInput);
190
+ if (!ppResult.ok) {
191
+ result = ppResult.error;
192
+ } else {
193
+ result = await mcpClientManager.callTool(name, ppResult.serverArgs);
194
+ }
186
195
  } else {
187
196
  result = {
188
197
  success: false,
@@ -231,7 +240,7 @@ export function classifyToolError(output) {
231
240
  export function canUseAgent() {
232
241
  const config = loadConfig();
233
242
  const hasToken = !!(config.access_token && config.refresh_token);
234
- const hasApiKey = !!(process.env.ANTHROPIC_API_KEY || config.anthropic_api_key);
243
+ const hasApiKey = !!process.env.ANTHROPIC_API_KEY;
235
244
  if (hasToken || hasApiKey) return {
236
245
  ready: true
237
246
  };