@within-7/minto 0.3.10 → 0.4.1

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 (306) hide show
  1. package/dist/Tool.js.map +2 -2
  2. package/dist/commands/agents/AgentsCommand.js +2 -2
  3. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  4. package/dist/commands/ctx_viz.js +1 -1
  5. package/dist/commands/effort.js +87 -0
  6. package/dist/commands/effort.js.map +7 -0
  7. package/dist/commands/export.js +19 -9
  8. package/dist/commands/export.js.map +2 -2
  9. package/dist/commands/ide.js +18 -0
  10. package/dist/commands/ide.js.map +7 -0
  11. package/dist/commands/mcp-interactive.js +14 -8
  12. package/dist/commands/mcp-interactive.js.map +2 -2
  13. package/dist/commands/memory.js +168 -0
  14. package/dist/commands/memory.js.map +7 -0
  15. package/dist/commands/model.js +45 -2
  16. package/dist/commands/model.js.map +2 -2
  17. package/dist/commands/outputStyle.js +64 -0
  18. package/dist/commands/outputStyle.js.map +7 -0
  19. package/dist/commands/plugin/utils.js +33 -1
  20. package/dist/commands/plugin/utils.js.map +2 -2
  21. package/dist/commands/plugin.js +10 -1
  22. package/dist/commands/plugin.js.map +2 -2
  23. package/dist/commands/refreshCommands.js +2 -0
  24. package/dist/commands/refreshCommands.js.map +2 -2
  25. package/dist/commands/review.js +51 -0
  26. package/dist/commands/review.js.map +7 -0
  27. package/dist/commands/terminalSetup.js +6 -0
  28. package/dist/commands/terminalSetup.js.map +2 -2
  29. package/dist/commands/undo.js +8 -0
  30. package/dist/commands/undo.js.map +2 -2
  31. package/dist/commands/vim.js +22 -0
  32. package/dist/commands/vim.js.map +7 -0
  33. package/dist/commands.js +12 -0
  34. package/dist/commands.js.map +2 -2
  35. package/dist/components/HighlightedCode.js +1 -0
  36. package/dist/components/HighlightedCode.js.map +2 -2
  37. package/dist/components/ModelSelector/ModelSelector.js +250 -143
  38. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  39. package/dist/components/PromptInput.js +21 -6
  40. package/dist/components/PromptInput.js.map +2 -2
  41. package/dist/components/PulseLabel.js +44 -0
  42. package/dist/components/PulseLabel.js.map +7 -0
  43. package/dist/components/RequestStatusIndicator.js +1 -1
  44. package/dist/components/RequestStatusIndicator.js.map +1 -1
  45. package/dist/components/Spinner.js +12 -42
  46. package/dist/components/Spinner.js.map +3 -3
  47. package/dist/components/StartupStatus.js +57 -0
  48. package/dist/components/StartupStatus.js.map +7 -0
  49. package/dist/components/SubagentBlock.js +43 -6
  50. package/dist/components/SubagentBlock.js.map +2 -2
  51. package/dist/components/TabbedListView/TabBar.js +13 -8
  52. package/dist/components/TabbedListView/TabBar.js.map +2 -2
  53. package/dist/components/TabbedListView/TabbedListView.js +1 -1
  54. package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
  55. package/dist/components/TodoPanel.js +1 -1
  56. package/dist/components/TodoPanel.js.map +1 -1
  57. package/dist/components/ToolUseLoader.js +5 -0
  58. package/dist/components/ToolUseLoader.js.map +2 -2
  59. package/dist/components/TrustDialog.js +0 -2
  60. package/dist/components/TrustDialog.js.map +2 -2
  61. package/dist/components/messages/TaskInModuleView.js +1 -1
  62. package/dist/components/messages/TaskInModuleView.js.map +2 -2
  63. package/dist/components/messages/TaskToolMessage.js +1 -1
  64. package/dist/components/messages/TaskToolMessage.js.map +2 -2
  65. package/dist/components/messages/UserPromptMessage.js +6 -1
  66. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  67. package/dist/constants/modelCapabilities.js +103 -18
  68. package/dist/constants/modelCapabilities.js.map +2 -2
  69. package/dist/constants/product.js +2 -0
  70. package/dist/constants/product.js.map +2 -2
  71. package/dist/constants/prompts/agentPrompt.js +30 -0
  72. package/dist/constants/prompts/agentPrompt.js.map +7 -0
  73. package/dist/constants/prompts/codeConventions.js +27 -0
  74. package/dist/constants/prompts/codeConventions.js.map +7 -0
  75. package/dist/constants/prompts/doingTasks.js +15 -0
  76. package/dist/constants/prompts/doingTasks.js.map +7 -0
  77. package/dist/constants/prompts/envInfo.js +17 -0
  78. package/dist/constants/prompts/envInfo.js.map +7 -0
  79. package/dist/constants/prompts/executingWithCare.js +17 -0
  80. package/dist/constants/prompts/executingWithCare.js.map +7 -0
  81. package/dist/constants/prompts/identity.js +10 -0
  82. package/dist/constants/prompts/identity.js.map +7 -0
  83. package/dist/constants/prompts/index.js +78 -0
  84. package/dist/constants/prompts/index.js.map +7 -0
  85. package/dist/constants/prompts/taskManagement.js +60 -0
  86. package/dist/constants/prompts/taskManagement.js.map +7 -0
  87. package/dist/constants/prompts/toneAndStyle.js +62 -0
  88. package/dist/constants/prompts/toneAndStyle.js.map +7 -0
  89. package/dist/constants/prompts/toolUsagePolicy.js +38 -0
  90. package/dist/constants/prompts/toolUsagePolicy.js.map +7 -0
  91. package/dist/constants/prompts.js +5 -176
  92. package/dist/constants/prompts.js.map +2 -2
  93. package/dist/constants/providerRegistry.js +235 -0
  94. package/dist/constants/providerRegistry.js.map +7 -0
  95. package/dist/constants/providers.js +35 -0
  96. package/dist/constants/providers.js.map +7 -0
  97. package/dist/context/PermissionContext.js +0 -1
  98. package/dist/context/PermissionContext.js.map +2 -2
  99. package/dist/context.js +87 -31
  100. package/dist/context.js.map +2 -2
  101. package/dist/core/backupHook.js +2 -2
  102. package/dist/core/backupHook.js.map +2 -2
  103. package/dist/core/config/defaults.js +4 -1
  104. package/dist/core/config/defaults.js.map +2 -2
  105. package/dist/core/config/schema.js +7 -1
  106. package/dist/core/config/schema.js.map +2 -2
  107. package/dist/core/costTracker.js +18 -0
  108. package/dist/core/costTracker.js.map +2 -2
  109. package/dist/core/index.js +0 -1
  110. package/dist/core/index.js.map +2 -2
  111. package/dist/core/tokenStatsManager.js +22 -4
  112. package/dist/core/tokenStatsManager.js.map +2 -2
  113. package/dist/entrypoints/cli.js +65 -84
  114. package/dist/entrypoints/cli.js.map +2 -2
  115. package/dist/hooks/useAgentTokenStats.js +1 -1
  116. package/dist/hooks/useAgentTokenStats.js.map +2 -2
  117. package/dist/hooks/useAgentTranscripts.js +2 -1
  118. package/dist/hooks/useAgentTranscripts.js.map +2 -2
  119. package/dist/hooks/useBackgroundShells.js +29 -0
  120. package/dist/hooks/useBackgroundShells.js.map +7 -0
  121. package/dist/hooks/useCanUseTool.js +1 -1
  122. package/dist/hooks/useCanUseTool.js.map +2 -2
  123. package/dist/hooks/useDeferredLoading.js +64 -0
  124. package/dist/hooks/useDeferredLoading.js.map +7 -0
  125. package/dist/hooks/useHookStatus.js +1 -1
  126. package/dist/hooks/useHookStatus.js.map +2 -2
  127. package/dist/hooks/useSessionTracking.js +55 -0
  128. package/dist/hooks/useSessionTracking.js.map +7 -0
  129. package/dist/hooks/useTerminalSize.js +21 -0
  130. package/dist/hooks/useTerminalSize.js.map +2 -2
  131. package/dist/hooks/useTextInput.js +1 -0
  132. package/dist/hooks/useTextInput.js.map +2 -2
  133. package/dist/hooks/useUnifiedCompletion.js +3 -2
  134. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  135. package/dist/i18n/locales/en.js +8 -9
  136. package/dist/i18n/locales/en.js.map +2 -2
  137. package/dist/i18n/locales/zh-CN.js +8 -9
  138. package/dist/i18n/locales/zh-CN.js.map +2 -2
  139. package/dist/i18n/types.js.map +1 -1
  140. package/dist/messages.js +41 -17
  141. package/dist/messages.js.map +2 -2
  142. package/dist/permissions.js +94 -1
  143. package/dist/permissions.js.map +2 -2
  144. package/dist/query.js +27 -19
  145. package/dist/query.js.map +2 -2
  146. package/dist/screens/REPL.js +83 -74
  147. package/dist/screens/REPL.js.map +2 -2
  148. package/dist/services/adapters/responsesAPI.js +6 -0
  149. package/dist/services/adapters/responsesAPI.js.map +2 -2
  150. package/dist/services/agentTeams/index.js +35 -0
  151. package/dist/services/agentTeams/index.js.map +7 -0
  152. package/dist/services/agentTeams/mailbox.js +114 -0
  153. package/dist/services/agentTeams/mailbox.js.map +7 -0
  154. package/dist/services/agentTeams/teamManager.js +149 -0
  155. package/dist/services/agentTeams/teamManager.js.map +7 -0
  156. package/dist/services/agentTeams/teamTaskStore.js +114 -0
  157. package/dist/services/agentTeams/teamTaskStore.js.map +7 -0
  158. package/dist/services/agentTeams/teammateSpawner.js +80 -0
  159. package/dist/services/agentTeams/teammateSpawner.js.map +7 -0
  160. package/dist/services/checkpointManager.js +16 -3
  161. package/dist/services/checkpointManager.js.map +2 -2
  162. package/dist/services/claude.js +19 -1728
  163. package/dist/services/claude.js.map +3 -3
  164. package/dist/services/gpt5ConnectionTest.js +4 -2
  165. package/dist/services/gpt5ConnectionTest.js.map +2 -2
  166. package/dist/services/hookExecutor.js +411 -127
  167. package/dist/services/hookExecutor.js.map +2 -2
  168. package/dist/services/llm/anthropicProvider.js +807 -0
  169. package/dist/services/llm/anthropicProvider.js.map +7 -0
  170. package/dist/services/llm/dispatch.js +218 -0
  171. package/dist/services/llm/dispatch.js.map +7 -0
  172. package/dist/services/llm/index.js +44 -0
  173. package/dist/services/llm/index.js.map +7 -0
  174. package/dist/services/llm/mintoContext.js +69 -0
  175. package/dist/services/llm/mintoContext.js.map +7 -0
  176. package/dist/services/llm/openaiProvider.js +622 -0
  177. package/dist/services/llm/openaiProvider.js.map +7 -0
  178. package/dist/services/llm/types.js +157 -0
  179. package/dist/services/llm/types.js.map +7 -0
  180. package/dist/services/mcpClient.js +183 -33
  181. package/dist/services/mcpClient.js.map +2 -2
  182. package/dist/services/notifier.js +14 -0
  183. package/dist/services/notifier.js.map +2 -2
  184. package/dist/services/oauth.js +4 -2
  185. package/dist/services/oauth.js.map +2 -2
  186. package/dist/services/openai.js +66 -56
  187. package/dist/services/openai.js.map +3 -3
  188. package/dist/services/outputStyles.js +102 -21
  189. package/dist/services/outputStyles.js.map +2 -2
  190. package/dist/services/plugins/skillMarketplace.js +4 -1
  191. package/dist/services/plugins/skillMarketplace.js.map +2 -2
  192. package/dist/services/sentry.js +1 -1
  193. package/dist/services/sentry.js.map +2 -2
  194. package/dist/services/sessionMemory.js +16 -3
  195. package/dist/services/sessionMemory.js.map +2 -2
  196. package/dist/services/systemReminder.js +350 -3
  197. package/dist/services/systemReminder.js.map +2 -2
  198. package/dist/services/taskStore.js +19 -0
  199. package/dist/services/taskStore.js.map +2 -2
  200. package/dist/tools/ArchitectTool/ArchitectTool.js.map +1 -1
  201. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +1 -1
  202. package/dist/tools/BashOutputTool/BashOutputTool.js.map +1 -1
  203. package/dist/tools/BashTool/BashTool.js +28 -0
  204. package/dist/tools/BashTool/BashTool.js.map +2 -2
  205. package/dist/tools/FileEditTool/FileEditTool.js +1 -1
  206. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  207. package/dist/tools/FileReadTool/FileReadTool.js +14 -0
  208. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  209. package/dist/tools/FileWriteTool/FileWriteTool.js +3 -1
  210. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  211. package/dist/tools/GlobTool/GlobTool.js.map +1 -1
  212. package/dist/tools/GrepTool/GrepTool.js.map +1 -1
  213. package/dist/tools/KillShellTool/KillShellTool.js.map +1 -1
  214. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
  215. package/dist/tools/LspTool/LspTool.js +11 -2
  216. package/dist/tools/LspTool/LspTool.js.map +2 -2
  217. package/dist/tools/MCPTool/MCPTool.js.map +1 -1
  218. package/dist/tools/MemoryReadTool/MemoryReadTool.js +2 -1
  219. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  220. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +2 -1
  221. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  222. package/dist/tools/MultiEditTool/MultiEditTool.js.map +1 -1
  223. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +1 -1
  224. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +1 -1
  225. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +8 -2
  226. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
  227. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +2 -0
  228. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
  229. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +1 -1
  230. package/dist/tools/SlashCommandTool/SlashCommandTool.js +174 -18
  231. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +3 -3
  232. package/dist/tools/TaskCreateTool/TaskCreateTool.js.map +1 -1
  233. package/dist/tools/TaskGetTool/TaskGetTool.js.map +1 -1
  234. package/dist/tools/TaskListTool/TaskListTool.js.map +1 -1
  235. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +1 -1
  236. package/dist/tools/TaskStopTool/TaskStopTool.js.map +1 -1
  237. package/dist/tools/TaskTool/TaskTool.js +75 -5
  238. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  239. package/dist/tools/TaskTool/prompt.js +12 -6
  240. package/dist/tools/TaskTool/prompt.js.map +2 -2
  241. package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +1 -1
  242. package/dist/tools/ThinkTool/ThinkTool.js.map +1 -1
  243. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +1 -1
  244. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +1 -1
  245. package/dist/tools/WebSearchTool/WebSearchTool.js.map +1 -1
  246. package/dist/tools/WebSearchTool/searchProviders.js +2 -1
  247. package/dist/tools/WebSearchTool/searchProviders.js.map +2 -2
  248. package/dist/tools/lsTool/lsTool.js.map +2 -2
  249. package/dist/tools/lsTool/prompt.js.map +1 -1
  250. package/dist/tools.js +14 -3
  251. package/dist/tools.js.map +2 -2
  252. package/dist/types/PermissionMode.js +21 -1
  253. package/dist/types/PermissionMode.js.map +2 -2
  254. package/dist/types/agentTeams.js +1 -0
  255. package/dist/types/agentTeams.js.map +7 -0
  256. package/dist/types/hooks.js +8 -2
  257. package/dist/types/hooks.js.map +2 -2
  258. package/dist/types/plugin.js +1 -1
  259. package/dist/types/plugin.js.map +2 -2
  260. package/dist/utils/agentLoader.js +25 -3
  261. package/dist/utils/agentLoader.js.map +2 -2
  262. package/dist/utils/animationManager.js +1 -1
  263. package/dist/utils/animationManager.js.map +2 -2
  264. package/dist/utils/ask.js +1 -1
  265. package/dist/utils/async.js +5 -1
  266. package/dist/utils/async.js.map +2 -2
  267. package/dist/utils/autoCompactCore.js +60 -0
  268. package/dist/utils/autoCompactCore.js.map +2 -2
  269. package/dist/utils/config.js +26 -128
  270. package/dist/utils/config.js.map +2 -2
  271. package/dist/utils/configSchema.js +227 -0
  272. package/dist/utils/configSchema.js.map +7 -0
  273. package/dist/utils/debugLogger.js.map +2 -2
  274. package/dist/utils/env.js +4 -3
  275. package/dist/utils/env.js.map +2 -2
  276. package/dist/utils/envConfig.js +34 -0
  277. package/dist/utils/envConfig.js.map +3 -3
  278. package/dist/utils/gpt5.js +146 -0
  279. package/dist/utils/gpt5.js.map +7 -0
  280. package/dist/utils/hookManager.js +374 -140
  281. package/dist/utils/hookManager.js.map +2 -2
  282. package/dist/utils/markdown.js +47 -0
  283. package/dist/utils/markdown.js.map +2 -2
  284. package/dist/utils/memoizeWithTTL.js +25 -0
  285. package/dist/utils/memoizeWithTTL.js.map +7 -0
  286. package/dist/utils/model.js +34 -9
  287. package/dist/utils/model.js.map +2 -2
  288. package/dist/utils/pluginInstaller.js +34 -5
  289. package/dist/utils/pluginInstaller.js.map +2 -2
  290. package/dist/utils/pluginLoader.js +201 -32
  291. package/dist/utils/pluginLoader.js.map +2 -2
  292. package/dist/utils/safeFetch.js +45 -0
  293. package/dist/utils/safeFetch.js.map +7 -0
  294. package/dist/utils/skillLoader.js +59 -6
  295. package/dist/utils/skillLoader.js.map +2 -2
  296. package/dist/utils/streamingState.js +52 -0
  297. package/dist/utils/streamingState.js.map +7 -0
  298. package/dist/utils/style.js +6 -3
  299. package/dist/utils/style.js.map +2 -2
  300. package/dist/utils/teamConfig.js +9 -3
  301. package/dist/utils/teamConfig.js.map +2 -2
  302. package/dist/utils/toolRiskClassification.js +0 -6
  303. package/dist/utils/toolRiskClassification.js.map +2 -2
  304. package/dist/version.js +2 -2
  305. package/dist/version.js.map +1 -1
  306. package/package.json +7 -6
package/dist/query.js CHANGED
@@ -31,7 +31,7 @@ import {
31
31
  normalizeMessagesForAPI
32
32
  } from "./utils/messages.js";
33
33
  import { withTimeout, ToolTimeoutError } from "./utils/toolTimeout.js";
34
- import { setStreamingState, resetStreamingState } from "./components/Spinner.js";
34
+ import { setStreamingState, resetStreamingState } from "./utils/streamingState.js";
35
35
  import { BashTool } from "./tools/BashTool/BashTool.js";
36
36
  function normalizeToolResultContent(content) {
37
37
  if (content === null || content === void 0) {
@@ -122,24 +122,8 @@ async function* query(messages, systemPrompt, context, canUseTool, toolUseContex
122
122
  messages: messages.length,
123
123
  timestamp: Date.now()
124
124
  });
125
- if (reminders && messages.length > 0) {
126
- for (let i = messages.length - 1; i >= 0; i--) {
127
- const msg = messages[i];
128
- if (msg?.type === "user") {
129
- const lastUserMessage = msg;
130
- messages[i] = {
131
- ...lastUserMessage,
132
- message: {
133
- ...lastUserMessage.message,
134
- content: typeof lastUserMessage.message.content === "string" ? reminders + lastUserMessage.message.content : [
135
- ...Array.isArray(lastUserMessage.message.content) ? lastUserMessage.message.content : [],
136
- { type: "text", text: reminders }
137
- ]
138
- }
139
- };
140
- break;
141
- }
142
- }
125
+ if (reminders) {
126
+ fullSystemPrompt.push(reminders);
143
127
  }
144
128
  markPhase("LLM_PREPARATION");
145
129
  setStreamingState({ phase: "waiting" });
@@ -180,6 +164,11 @@ async function* query(messages, systemPrompt, context, canUseTool, toolUseContex
180
164
  );
181
165
  if (!toolUseMessages.length) {
182
166
  resetStreamingState();
167
+ const hookManager = getHookManager();
168
+ if (hookManager) {
169
+ hookManager.executeStop().catch(() => {
170
+ });
171
+ }
183
172
  return;
184
173
  }
185
174
  const toolResults = [];
@@ -437,6 +426,15 @@ async function* runToolUse(toolUse, siblingToolUseIDs, assistantMessage, canUseT
437
426
  }
438
427
  } catch (e) {
439
428
  logError(e);
429
+ const hookManager = getHookManager();
430
+ if (hookManager) {
431
+ hookManager.executePostToolUseFailure(
432
+ toolName,
433
+ toolInput,
434
+ e instanceof Error ? e.message : String(e)
435
+ ).catch(() => {
436
+ });
437
+ }
440
438
  const errorMessage = createUserMessage([
441
439
  {
442
440
  type: "tool_result",
@@ -684,6 +682,16 @@ async function* checkPermissionsAndCallTool(tool, toolUseID, siblingToolUseIDs,
684
682
  recordToolCall(tool.name, true);
685
683
  } catch {
686
684
  }
685
+ const hookMgr = getHookManager();
686
+ if (hookMgr) {
687
+ hookMgr.executePostToolUseFailure(
688
+ tool.name,
689
+ normalizedInput,
690
+ error instanceof Error ? error.message : String(error),
691
+ error instanceof ToolTimeoutError ? "timeout" : void 0
692
+ ).catch(() => {
693
+ });
694
+ }
687
695
  if (error instanceof ToolTimeoutError) {
688
696
  debug.error("TOOL_TIMEOUT", {
689
697
  toolName: tool.name,
package/dist/query.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/query.ts"],
4
- "sourcesContent": ["import {\n Message as APIAssistantMessage,\n MessageParam,\n ToolUseBlock,\n} from '@anthropic-ai/sdk/resources/index.mjs'\nimport type { UUID } from './types/common'\nimport type { ThinkingMetadata } from './types/thinking'\nimport type { Tool, ToolUseContext, AskUserFn } from './Tool'\nimport {\n messagePairValidForBinaryFeedback,\n shouldUseBinaryFeedback,\n} from '@components/binary-feedback/utils'\nimport { CanUseToolFn } from './hooks/useCanUseTool'\nimport {\n formatSystemPromptWithContext,\n queryLLM,\n queryModel,\n} from '@services/claude'\nimport { emitReminderEvent } from '@services/systemReminder'\nimport {\n TOOL_INPUT_EXAMPLES,\n TOOL_DESCRIPTIONS,\n PARAMETER_DESCRIPTIONS,\n} from '@constants/toolInputExamples'\nimport { all } from '@utils/generators'\nimport { logError } from '@utils/log'\nimport {\n debug,\n markPhase,\n getCurrentRequest,\n logUserFriendly,\n} from './utils/debugLogger'\nimport { getModelManager } from '@utils/model'\nimport {\n createAssistantMessage,\n createAssistantAPIErrorMessage,\n createProgressMessage,\n createToolResultStopMessage,\n createUserMessage,\n FullToolUseResult,\n INTERRUPT_MESSAGE,\n INTERRUPT_MESSAGE_FOR_TOOL_USE,\n NormalizedMessage,\n normalizeMessagesForAPI,\n} from '@utils/messages'\nimport { createToolExecutionController } from '@utils/toolExecutionController'\nimport { withTimeout, ToolTimeoutError } from '@utils/toolTimeout'\nimport { setStreamingState, resetStreamingState } from '@components/Spinner'\nimport { BashTool } from '@tools/BashTool/BashTool'\n\n/**\n * Normalize tool result content for API submission.\n * Ensures content is always a string regardless of input type.\n */\nfunction normalizeToolResultContent(content: unknown): string {\n if (content === null || content === undefined) {\n return '(no content)'\n }\n if (typeof content === 'string') {\n return content || '(no content)'\n }\n if (Array.isArray(content)) {\n // Handle array of content blocks (e.g., TextBlock[])\n return content\n .map(item => {\n if (typeof item === 'string') return item\n if (item && typeof item === 'object' && 'text' in item)\n return String(item.text)\n return JSON.stringify(item)\n })\n .join('\\n')\n }\n if (typeof content === 'object') {\n // Handle objects - try to extract text or stringify\n if ('text' in content) return String((content as { text: unknown }).text)\n return JSON.stringify(content)\n }\n return String(content)\n}\nimport { getCwd } from './utils/state'\nimport { checkAutoCompact } from './utils/autoCompactCore'\nimport { getHookManager } from '@utils/hookManager'\nimport { recordToolCall } from '@utils/stats'\n\n// Extended ToolUseContext for query functions\ninterface ExtendedToolUseContext extends ToolUseContext {\n abortController: AbortController\n options: {\n commands: any[]\n forkNumber: number\n messageLogName: string\n tools: Tool[]\n verbose: boolean\n /** @deprecated Use safetyMode instead */\n safeMode?: boolean\n /** Safety mode: 'yolo' | 'smart' | 'strict' */\n safetyMode?: import('./utils/config').SafetyMode\n maxThinkingTokens: number\n isKodingRequest?: boolean\n model?: string | import('./utils/config').ModelPointerType\n }\n readFileTimestamps: { [filename: string]: number }\n setToolJSX: (jsx: any) => void\n askUser?: AskUserFn\n requestId?: string\n}\n\nexport type Response = { costUSD: number; response: string }\nexport type UserMessage = {\n message: MessageParam\n type: 'user'\n uuid: UUID\n toolUseResult?: FullToolUseResult\n options?: {\n isKodingRequest?: boolean\n kodingContext?: string\n isCustomCommand?: boolean\n commandName?: string\n commandArgs?: string\n }\n}\n\nexport type AssistantMessage = {\n costUSD: number\n durationMs: number\n message: APIAssistantMessage\n type: 'assistant'\n uuid: UUID\n isApiErrorMessage?: boolean\n responseId?: string // For GPT-5 Responses API state management\n /**\n * Original message UUID before normalization.\n * When a message with multiple content blocks is split into individual messages,\n * each resulting message will have a unique `uuid` but share the same `originalUuid`.\n * This is used to identify parallel tool calls from the same assistant message.\n */\n originalUuid?: UUID\n /**\n * Metadata for thinking blocks if present.\n * Used to display duration and character count in verbose mode.\n */\n thinkingMetadata?: ThinkingMetadata\n}\n\nexport type BinaryFeedbackResult =\n | { message: AssistantMessage | null; shouldSkipPermissionCheck: false }\n | { message: AssistantMessage; shouldSkipPermissionCheck: true }\n\n/**\n * Streaming output content for tools like BashTool\n */\nexport type StreamingProgressContent = {\n type: 'streaming'\n toolName: string\n stdout: string\n stderr: string\n isStreaming: boolean\n}\n\nexport type ProgressMessage = {\n content: AssistantMessage | StreamingProgressContent\n normalizedMessages: NormalizedMessage[]\n siblingToolUseIDs: Set<string>\n tools: Tool[]\n toolUseID: string\n type: 'progress'\n uuid: UUID\n}\n\n// Each array item is either a single message or a message-and-response pair\nexport type Message = UserMessage | AssistantMessage | ProgressMessage\n\nconst MAX_TOOL_USE_CONCURRENCY = 10\n\n/**\n * Maximum recursion depth for query calls.\n * Prevents stack overflow from infinite tool use loops.\n */\nconst MAX_QUERY_DEPTH = 50\n\n/**\n * Error thrown when query depth limit is exceeded\n */\nexport class QueryDepthExceededError extends Error {\n constructor(depth: number) {\n super(\n `Query depth limit exceeded (${depth}/${MAX_QUERY_DEPTH}). ` +\n `This usually indicates an infinite loop in tool usage.`,\n )\n this.name = 'QueryDepthExceededError'\n }\n}\n\n// Returns a message if we got one, or `null` if the user cancelled\nasync function queryWithBinaryFeedback(\n toolUseContext: ExtendedToolUseContext,\n getAssistantResponse: () => Promise<AssistantMessage>,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n): Promise<BinaryFeedbackResult> {\n if (\n process.env.USER_TYPE !== 'ant' ||\n !getBinaryFeedbackResponse ||\n !(await shouldUseBinaryFeedback())\n ) {\n const assistantMessage = await getAssistantResponse()\n if (toolUseContext.abortController.signal.aborted) {\n return { message: null, shouldSkipPermissionCheck: false }\n }\n return { message: assistantMessage, shouldSkipPermissionCheck: false }\n }\n const [m1, m2] = await Promise.all([\n getAssistantResponse(),\n getAssistantResponse(),\n ])\n if (toolUseContext.abortController.signal.aborted) {\n return { message: null, shouldSkipPermissionCheck: false }\n }\n if (m2.isApiErrorMessage) {\n // If m2 is an error, we might as well return m1, even if it's also an error --\n // the UI will display it as an error as it would in the non-feedback path.\n return { message: m1, shouldSkipPermissionCheck: false }\n }\n if (m1.isApiErrorMessage) {\n return { message: m2, shouldSkipPermissionCheck: false }\n }\n if (!messagePairValidForBinaryFeedback(m1, m2)) {\n return { message: m1, shouldSkipPermissionCheck: false }\n }\n return await getBinaryFeedbackResponse(m1, m2)\n}\n\n/**\n * The rules of thinking are lengthy and fortuitous. They require plenty of thinking\n * of most long duration and deep meditation for a wizard to wrap one's noggin around.\n *\n * The rules follow:\n * 1. A message that contains a thinking or redacted_thinking block must be part of a query whose max_thinking_length > 0\n * 2. A thinking block may not be the last message in a block\n * 3. Thinking blocks must be preserved for the duration of an assistant trajectory (a single turn, or if that turn includes a tool_use block then also its subsequent tool_result and the following assistant message)\n *\n * Heed these rules well, young wizard. For they are the rules of thinking, and\n * the rules of thinking are the rules of the universe. If ye does not heed these\n * rules, ye will be punished with an entire day of debugging and hair pulling.\n */\nexport async function* query(\n messages: Message[],\n systemPrompt: string[],\n context: { [k: string]: string },\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n _depth: number = 0, // Internal: tracks recursion depth\n): AsyncGenerator<Message, void> {\n // Check recursion depth to prevent stack overflow\n if (_depth > MAX_QUERY_DEPTH) {\n const error = new QueryDepthExceededError(_depth)\n logError(error)\n yield createAssistantAPIErrorMessage(error.message)\n return\n }\n const currentRequest = getCurrentRequest()\n\n markPhase('QUERY_INIT')\n\n // Auto-compact check\n // \u2705 P2 FIX: Show compaction status in UI\n setStreamingState({ phase: 'compacting' })\n\n const { messages: processedMessages, wasCompacted } = await checkAutoCompact(\n messages,\n toolUseContext,\n )\n if (wasCompacted) {\n messages = processedMessages\n debug.flow('CONTEXT_COMPACTED', {\n originalCount: messages.length,\n compactedCount: processedMessages.length,\n })\n }\n\n markPhase('SYSTEM_PROMPT_BUILD')\n\n const { systemPrompt: fullSystemPrompt, reminders } =\n formatSystemPromptWithContext(systemPrompt, context, toolUseContext.agentId)\n\n // Emit session startup event\n emitReminderEvent('session:startup', {\n agentId: toolUseContext.agentId,\n messages: messages.length,\n timestamp: Date.now(),\n })\n\n // Inject reminders into the latest user message\n if (reminders && messages.length > 0) {\n // Find the last user message\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]\n if (msg?.type === 'user') {\n const lastUserMessage = msg as UserMessage\n messages[i] = {\n ...lastUserMessage,\n message: {\n ...lastUserMessage.message,\n content:\n typeof lastUserMessage.message.content === 'string'\n ? reminders + lastUserMessage.message.content\n : [\n ...(Array.isArray(lastUserMessage.message.content)\n ? lastUserMessage.message.content\n : []),\n { type: 'text', text: reminders },\n ],\n },\n }\n break\n }\n }\n }\n\n markPhase('LLM_PREPARATION')\n\n // Update streaming state for UI feedback\n setStreamingState({ phase: 'waiting' })\n\n function getAssistantResponse() {\n return queryLLM(\n normalizeMessagesForAPI(messages),\n fullSystemPrompt,\n toolUseContext.options.maxThinkingTokens,\n toolUseContext.options.tools,\n toolUseContext.abortController.signal,\n {\n safeMode: toolUseContext.options.safeMode ?? false,\n model: toolUseContext.options.model || 'main',\n prependCLISysprompt: true,\n toolUseContext: toolUseContext,\n },\n )\n }\n\n const result = await queryWithBinaryFeedback(\n toolUseContext,\n getAssistantResponse,\n getBinaryFeedbackResponse,\n )\n\n // If request was cancelled, return immediately with interrupt message\n if (toolUseContext.abortController.signal.aborted) {\n yield createAssistantMessage(INTERRUPT_MESSAGE)\n return\n }\n\n if (result.message === null) {\n yield createAssistantMessage(INTERRUPT_MESSAGE)\n return\n }\n\n const assistantMessage = result.message\n const shouldSkipPermissionCheck = result.shouldSkipPermissionCheck\n\n // Update streaming state - we got a response\n setStreamingState({ phase: 'generating' })\n\n yield assistantMessage\n\n // @see https://docs.anthropic.com/en/docs/build-with-claude/tool-use\n // Note: stop_reason === 'tool_use' is unreliable -- it's not always set correctly\n const toolUseMessages = assistantMessage.message.content.filter(\n _ => _.type === 'tool_use',\n )\n\n // If there's no more tool use, we're done\n if (!toolUseMessages.length) {\n resetStreamingState()\n return\n }\n\n const toolResults: UserMessage[] = []\n\n // Smart concurrency: separate tools into serial and concurrent groups\n // This allows mixing TodoWrite (serial) with multiple Task calls (concurrent)\n const serialTools: ToolUseBlock[] = []\n const concurrentTools: ToolUseBlock[] = []\n\n for (const msg of toolUseMessages) {\n const tool = toolUseContext.options.tools.find(t => t.name === msg.name)\n const isSafe = tool?.isConcurrencySafe?.() ?? tool?.isReadOnly?.() ?? false\n if (isSafe) {\n concurrentTools.push(msg)\n } else {\n serialTools.push(msg)\n }\n }\n\n // Debug: Log concurrency decision\n debug.flow('TOOL_CONCURRENCY_CHECK', {\n toolCount: toolUseMessages.length,\n serialTools: serialTools.map(msg => msg.name),\n concurrentTools: concurrentTools.map(msg => msg.name),\n concurrencyDetails: toolUseMessages.map(msg => {\n const tool = toolUseContext.options.tools.find(t => t.name === msg.name)\n return {\n name: msg.name,\n isConcurrencySafe: tool?.isConcurrencySafe?.() ?? 'undefined',\n isReadOnly: tool?.isReadOnly?.() ?? 'undefined',\n }\n }),\n })\n\n // Step 1: Execute serial tools first (e.g., TodoWrite)\n if (serialTools.length > 0) {\n debug.flow('SERIAL_TOOLS_START', {\n count: serialTools.length,\n tools: serialTools.map(t => t.name),\n })\n for await (const message of runToolsSerially(\n serialTools,\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n )) {\n yield message\n if (message.type === 'user') {\n toolResults.push(message)\n }\n }\n debug.flow('SERIAL_TOOLS_COMPLETE', {\n count: serialTools.length,\n })\n }\n\n // Step 2: Execute concurrent tools in parallel (e.g., multiple Task calls)\n if (concurrentTools.length > 0) {\n debug.flow('CONCURRENT_TOOLS_START', {\n count: concurrentTools.length,\n tools: concurrentTools.map(t => t.name),\n maxConcurrency: MAX_TOOL_USE_CONCURRENCY,\n })\n\n // \u2705 P2 FIX: Update UI to show concurrent task count\n setStreamingState({\n phase: 'concurrent',\n concurrentCount: concurrentTools.length,\n })\n\n const concurrentStartTime = Date.now()\n for await (const message of runToolsConcurrently(\n concurrentTools,\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n )) {\n yield message\n if (message.type === 'user') {\n toolResults.push(message)\n }\n }\n debug.flow('CONCURRENT_TOOLS_COMPLETE', {\n count: concurrentTools.length,\n durationMs: Date.now() - concurrentStartTime,\n })\n }\n\n if (toolUseContext.abortController.signal.aborted) {\n yield createAssistantMessage(INTERRUPT_MESSAGE_FOR_TOOL_USE)\n return\n }\n\n // Sort toolResults to match the order of toolUseMessages\n const orderedToolResults = toolResults.sort((a, b) => {\n const aIndex = toolUseMessages.findIndex(\n tu => tu.id === (a.message.content[0] as ToolUseBlock).id,\n )\n const bIndex = toolUseMessages.findIndex(\n tu => tu.id === (b.message.content[0] as ToolUseBlock).id,\n )\n return aIndex - bIndex\n })\n\n // Process contextModifier and newMessages from tool results\n // These are used by SlashCommandTool to modify context and inject messages\n let modifiedContext = toolUseContext\n const additionalMessages: Message[] = []\n\n for (const result of orderedToolResults) {\n if (result.toolUseResult?.contextModifier) {\n // Apply context modifier (e.g., allowed tools, model switching)\n modifiedContext =\n result.toolUseResult.contextModifier.modifyContext(modifiedContext)\n debug.flow('CONTEXT_MODIFIER_APPLIED', {\n toolResultId: (result.message.content[0] as ToolUseBlock)?.id,\n })\n }\n\n if (\n result.toolUseResult?.newMessages &&\n Array.isArray(result.toolUseResult.newMessages)\n ) {\n // Add new messages from tool execution (e.g., skill-generated prompts)\n for (const msg of result.toolUseResult.newMessages) {\n if (msg && typeof msg === 'object' && 'type' in msg) {\n additionalMessages.push(msg as Message)\n }\n }\n debug.flow('NEW_MESSAGES_ADDED', {\n count: result.toolUseResult.newMessages.length,\n })\n }\n }\n\n // Recursive query with depth tracking\n\n try {\n yield* await query(\n [\n ...messages,\n assistantMessage,\n ...orderedToolResults,\n ...additionalMessages,\n ],\n systemPrompt,\n context,\n canUseTool,\n modifiedContext, // Use modified context if contextModifier was applied\n getBinaryFeedbackResponse,\n _depth + 1, // Increment depth for recursion tracking\n )\n } catch (error) {\n // \uD83D\uDD27 CRITICAL FIX: Yield error message instead of just re-throwing\n // This ensures the UI receives proper feedback when recursive query fails\n const errorMessage = error instanceof Error ? error.message : String(error)\n logError(`Recursive query error: ${errorMessage}`)\n\n // Yield an error message so the UI can display it\n yield createAssistantAPIErrorMessage(`Query failed: ${errorMessage}`)\n\n // Re-throw to propagate to caller for additional handling if needed\n throw error\n }\n}\n\nasync function* runToolsConcurrently(\n toolUseMessages: ToolUseBlock[],\n assistantMessage: AssistantMessage,\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n yield* all(\n toolUseMessages.map(toolUse =>\n runToolUse(\n toolUse,\n new Set(toolUseMessages.map(_ => _.id)),\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n ),\n ),\n MAX_TOOL_USE_CONCURRENCY,\n toolUseContext.abortController.signal, // Pass abort signal for proper cancellation\n )\n}\n\nasync function* runToolsSerially(\n toolUseMessages: ToolUseBlock[],\n assistantMessage: AssistantMessage,\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n for (const toolUse of toolUseMessages) {\n yield* runToolUse(\n toolUse,\n new Set(toolUseMessages.map(_ => _.id)),\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n )\n }\n}\n\nexport async function* runToolUse(\n toolUse: ToolUseBlock,\n siblingToolUseIDs: Set<string>,\n assistantMessage: AssistantMessage,\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n const currentRequest = getCurrentRequest()\n\n // \uD83D\uDD0D Debug: \u5DE5\u5177\u8C03\u7528\u5F00\u59CB\n debug.flow('TOOL_USE_START', {\n toolName: toolUse.name,\n toolUseID: toolUse.id,\n inputSize: JSON.stringify(toolUse.input).length,\n siblingToolCount: siblingToolUseIDs.size,\n shouldSkipPermissionCheck: !!shouldSkipPermissionCheck,\n requestId: currentRequest?.id,\n })\n\n logUserFriendly(\n 'TOOL_EXECUTION',\n {\n toolName: toolUse.name,\n action: 'Starting',\n target: toolUse.input ? Object.keys(toolUse.input).join(', ') : '',\n },\n currentRequest?.id,\n )\n\n const toolName = toolUse.name\n const tool = toolUseContext.options.tools.find(t => t.name === toolName)\n\n // Update streaming state to show tool execution\n setStreamingState({ phase: 'tool_use', toolName })\n\n // Check if the tool exists\n if (!tool) {\n debug.error('TOOL_NOT_FOUND', {\n requestedTool: toolName,\n availableTools: toolUseContext.options.tools.map(t => t.name),\n toolUseID: toolUse.id,\n requestId: currentRequest?.id,\n })\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: `Error: No such tool available: ${toolName}`,\n is_error: true,\n tool_use_id: toolUse.id,\n },\n ])\n return\n }\n\n const toolInput = toolUse.input as { [key: string]: string }\n\n debug.flow('TOOL_VALIDATION_START', {\n toolName: tool.name,\n toolUseID: toolUse.id,\n inputKeys: Object.keys(toolInput),\n requestId: currentRequest?.id,\n })\n\n try {\n // \uD83D\uDD27 Check for cancellation before starting tool execution\n if (toolUseContext.abortController.signal.aborted) {\n debug.flow('TOOL_USE_CANCELLED_BEFORE_START', {\n toolName: tool.name,\n toolUseID: toolUse.id,\n abortReason: 'AbortController signal',\n requestId: currentRequest?.id,\n })\n\n const message = createUserMessage([\n createToolResultStopMessage(toolUse.id),\n ])\n yield message\n return\n }\n\n // Track if any progress messages were yielded\n let hasProgressMessages = false\n\n for await (const message of checkPermissionsAndCallTool(\n tool,\n toolUse.id,\n siblingToolUseIDs,\n toolInput,\n toolUseContext,\n canUseTool,\n assistantMessage,\n shouldSkipPermissionCheck,\n )) {\n // \uD83D\uDD27 Check for cancellation during tool execution\n if (toolUseContext.abortController.signal.aborted) {\n debug.flow('TOOL_USE_CANCELLED_DURING_EXECUTION', {\n toolName: tool.name,\n toolUseID: toolUse.id,\n hasProgressMessages,\n abortReason: 'AbortController signal during execution',\n requestId: currentRequest?.id,\n })\n\n // If we yielded progress messages but got cancelled, yield a cancellation result\n if (hasProgressMessages && message.type === 'progress') {\n yield message // yield the last progress message first\n }\n\n // Always yield a tool result message for cancellation to clear UI state\n const cancelMessage = createUserMessage([\n createToolResultStopMessage(toolUse.id),\n ])\n yield cancelMessage\n return\n }\n\n if (message.type === 'progress') {\n hasProgressMessages = true\n }\n\n yield message\n }\n } catch (e) {\n logError(e)\n\n // \uD83D\uDD27 Even on error, ensure we yield a tool result to clear UI state\n const errorMessage = createUserMessage([\n {\n type: 'tool_result',\n content: `Tool execution failed: ${e instanceof Error ? e.message : String(e)}`,\n is_error: true,\n tool_use_id: toolUse.id,\n },\n ])\n yield errorMessage\n }\n}\n\n// TODO: Generalize this to all tools\nexport function normalizeToolInput(\n tool: Tool,\n input: { [key: string]: boolean | string | number },\n): { [key: string]: boolean | string | number } {\n switch (tool) {\n case BashTool: {\n const { command, timeout } = BashTool.inputSchema.parse(input) // already validated upstream, won't throw\n return {\n command: command.replace(`cd ${getCwd()} && `, ''),\n ...(timeout ? { timeout } : {}),\n }\n }\n default:\n return input\n }\n}\n\n/**\n * Build a user-friendly error message for tool input validation failures.\n * Provides clear guidance on expected format, examples, and how to fix the issue.\n */\nfunction buildToolInputErrorMessage(\n tool: Tool,\n input: { [key: string]: boolean | string | number },\n validationError: any,\n): string {\n // Check if this is a JSON parse error from upstream (claude.ts)\n const parseError = input as {\n __parse_error__?: boolean\n __error_message__?: string\n __raw_json_preview__?: string\n }\n\n if (parseError.__parse_error__) {\n // JSON parse error - model generated malformed JSON\n let message = [\n `Error: Failed to parse tool parameters for \"${tool.name}\".`,\n ``,\n `The model generated invalid JSON. This is typically a temporary issue.`,\n ``,\n `Expected format: ${TOOL_INPUT_EXAMPLES[tool.name] || '{...}'}`,\n ]\n\n if (parseError.__error_message__) {\n message.push(`Parse error: ${parseError.__error_message__}`)\n }\n\n if (parseError.__raw_json_preview__) {\n message.push(``, `Raw JSON preview:`, parseError.__raw_json_preview__)\n }\n\n message.push(\n ``,\n `Suggestions:`,\n `\u2022 Retry your request - the model may succeed on the next attempt`,\n `\u2022 Try simplifying your request with fewer parameters`,\n `\u2022 Check if special characters in values need escaping`,\n )\n\n return message.join('\\n')\n }\n\n // Validation error - parameters are syntactically correct but semantically wrong\n const inputKeys = Object.keys(input)\n const isEmptyInput = inputKeys.length === 0\n\n const example =\n TOOL_INPUT_EXAMPLES[tool.name] || '{...required parameters...}'\n const description = TOOL_DESCRIPTIONS[tool.name]\n const paramDescriptions = PARAMETER_DESCRIPTIONS[tool.name]\n\n let message = [\n `Error: Invalid parameters for \"${tool.name}\" tool.`,\n ``,\n `Expected format:`,\n `${example}`,\n ]\n\n if (description) {\n message.push(``, `Description: ${description}`)\n }\n\n if (isEmptyInput) {\n message.push(\n ``,\n `Issue: The tool was called without any parameters.`,\n `This usually indicates a JSON parsing error in the model's response.`,\n )\n } else {\n // Show which parameters were provided vs missing\n message.push(\n ``,\n `Issue: ${validationError.message}`,\n `Provided parameters: ${inputKeys.length > 0 ? inputKeys.join(', ') : '(none)'}`,\n )\n\n // Show parameter-specific help if available\n if (paramDescriptions) {\n message.push(``, `Parameter guide:`)\n for (const [param, desc] of Object.entries(paramDescriptions)) {\n message.push(`\u2022 ${param}: ${desc}`)\n }\n }\n }\n\n message.push(\n ``,\n `Suggestions:`,\n `\u2022 Ensure all required parameters are provided`,\n `\u2022 Check that parameters have the correct type (string, number, boolean)`,\n `\u2022 Verify file paths are absolute (start with /)`,\n `\u2022 Retry your request - the model often succeeds on retry`,\n )\n\n return message.join('\\n')\n}\n\nasync function* checkPermissionsAndCallTool(\n tool: Tool,\n toolUseID: string,\n siblingToolUseIDs: Set<string>,\n input: { [key: string]: boolean | string | number },\n context: ToolUseContext,\n canUseTool: CanUseToolFn,\n assistantMessage: AssistantMessage,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<UserMessage | ProgressMessage, void> {\n // Validate input types with zod\n // (surprisingly, the model is not great at generating valid input)\n const isValidInput = tool.inputSchema.safeParse(input)\n if (!isValidInput.success) {\n let errorMessage = buildToolInputErrorMessage(\n tool,\n input,\n isValidInput.error,\n )\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: errorMessage,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n const normalizedInput = normalizeToolInput(tool, input)\n\n // Validate input values. Each tool has its own validation logic\n const isValidCall = await tool.validateInput?.(\n normalizedInput as never,\n context,\n )\n if (isValidCall?.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: isValidCall!.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n // Check whether we have permission to use the tool,\n // and ask the user for permission if we don't\n const permissionResult = shouldSkipPermissionCheck\n ? ({ result: true } as const)\n : await canUseTool(tool, normalizedInput, context, assistantMessage)\n if (permissionResult.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: permissionResult.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n // \u2705 P1 FIX: Show permission waiting state when permission check is pending\n // Note: This is handled by the PermissionRequest dialog in the UI\n // But we update streaming state to indicate the phase\n if (!shouldSkipPermissionCheck && !permissionResult.result) {\n setStreamingState({ phase: 'permission' })\n }\n\n // PreToolUse hooks\n const hookManager = getHookManager()\n if (hookManager) {\n try {\n const decision = await hookManager.executePreToolUse(\n tool.name,\n normalizedInput as Record<string, unknown>,\n )\n\n if (!decision.shouldContinue) {\n if (decision.shouldAskUser) {\n // Ask user for approval via permission system\n const approved = await canUseTool(\n tool,\n normalizedInput,\n context,\n assistantMessage,\n )\n if (approved.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content:\n decision.reason || 'Hook requested approval but user denied',\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n } else {\n // Hook blocked the tool\n yield createUserMessage([\n {\n type: 'tool_result',\n content: decision.reason || 'Tool execution blocked by hook',\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n }\n } catch (error) {\n debug.error('PreToolUse hook failed', { error })\n // Continue on error (fail-safe)\n }\n }\n\n // Call the tool with timeout protection\n let toolOutput: FullToolUseResult | null = null\n try {\n // Add toolUseId to context for tracking concurrent executions\n const contextWithToolUseId = {\n ...context,\n toolUseId: toolUseID,\n }\n const rawGenerator = tool.call(\n normalizedInput as never,\n contextWithToolUseId,\n )\n // Wrap tool execution with timeout to prevent infinite hangs\n const generator = withTimeout(rawGenerator, tool.name)\n\n for await (const result of generator) {\n switch (result.type) {\n case 'result':\n // Normalize content to ensure API compatibility\n const normalizedContent = normalizeToolResultContent(\n result.resultForAssistant ?? result.data,\n )\n toolOutput = {\n data: result.data,\n resultForAssistant: normalizedContent,\n // Preserve contextModifier and newMessages for caller to process\n newMessages: result.newMessages,\n contextModifier: result.contextModifier,\n }\n\n yield createUserMessage(\n [\n {\n type: 'tool_result',\n content: normalizedContent,\n tool_use_id: toolUseID,\n },\n ],\n toolOutput,\n )\n\n // Record successful tool call to stats (fire-and-forget)\n try {\n recordToolCall(tool.name, false)\n } catch {\n // Stats recording is non-critical, ignore errors\n }\n\n // PostToolUse hooks (fire-and-forget)\n if (hookManager && toolOutput) {\n hookManager\n .executePostToolUse(\n tool.name,\n normalizedInput as Record<string, unknown>,\n toolOutput as any,\n )\n .catch(err => {\n debug.error('PostToolUse hook failed', { error: err })\n })\n }\n\n return\n case 'progress':\n yield createProgressMessage(\n toolUseID,\n siblingToolUseIDs,\n result.content,\n result.normalizedMessages || [],\n result.tools || [],\n )\n break\n }\n }\n } catch (error) {\n // Record failed tool call to stats (fire-and-forget)\n try {\n recordToolCall(tool.name, true)\n } catch {\n // Stats recording is non-critical, ignore errors\n }\n\n // Special handling for timeout errors\n if (error instanceof ToolTimeoutError) {\n debug.error('TOOL_TIMEOUT', {\n toolName: tool.name,\n toolUseID,\n timeoutMs: error.timeoutMs,\n })\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: `Error: ${error.message}. The tool execution was cancelled. Consider breaking this operation into smaller steps or checking if there's an infinite loop.`,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n const content = formatError(error)\n logError(error)\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n }\n}\n\nfunction formatError(error: unknown): string {\n if (!(error instanceof Error)) {\n return String(error)\n }\n const parts = [error.message]\n if ('stderr' in error && typeof error.stderr === 'string') {\n parts.push(error.stderr)\n }\n if ('stdout' in error && typeof error.stdout === 'string') {\n parts.push(error.stdout)\n }\n const fullMessage = parts.filter(Boolean).join('\\n')\n if (fullMessage.length <= 10000) {\n return fullMessage\n }\n const halfLength = 5000\n const start = fullMessage.slice(0, halfLength)\n const end = fullMessage.slice(-halfLength)\n return `${start}\\n\\n... [${fullMessage.length - 10000} characters truncated] ...\\n\\n${end}`\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n Message as APIAssistantMessage,\n MessageParam,\n ToolUseBlock,\n} from '@anthropic-ai/sdk/resources/index.mjs'\nimport { z } from 'zod'\nimport type { UUID } from './types/common'\nimport type { ThinkingMetadata } from './types/thinking'\nimport type { Tool, ToolUseContext, AskUserFn, SetToolJSXFn } from './Tool'\nimport {\n messagePairValidForBinaryFeedback,\n shouldUseBinaryFeedback,\n} from '@components/binary-feedback/utils'\nimport { CanUseToolFn } from './hooks/useCanUseTool'\nimport {\n formatSystemPromptWithContext,\n queryLLM,\n queryModel,\n} from '@services/claude'\nimport { emitReminderEvent } from '@services/systemReminder'\nimport {\n TOOL_INPUT_EXAMPLES,\n TOOL_DESCRIPTIONS,\n PARAMETER_DESCRIPTIONS,\n} from '@constants/toolInputExamples'\nimport { all } from '@utils/generators'\nimport { logError } from '@utils/log'\nimport {\n debug,\n markPhase,\n getCurrentRequest,\n logUserFriendly,\n} from './utils/debugLogger'\nimport { getModelManager } from '@utils/model'\nimport {\n createAssistantMessage,\n createAssistantAPIErrorMessage,\n createProgressMessage,\n createToolResultStopMessage,\n createUserMessage,\n FullToolUseResult,\n INTERRUPT_MESSAGE,\n INTERRUPT_MESSAGE_FOR_TOOL_USE,\n NormalizedMessage,\n normalizeMessagesForAPI,\n} from '@utils/messages'\nimport { createToolExecutionController } from '@utils/toolExecutionController'\nimport { withTimeout, ToolTimeoutError } from '@utils/toolTimeout'\nimport { setStreamingState, resetStreamingState } from '@utils/streamingState'\nimport { BashTool } from '@tools/BashTool/BashTool'\n\n/**\n * Normalize tool result content for API submission.\n * Ensures content is always a string regardless of input type.\n */\nfunction normalizeToolResultContent(content: unknown): string {\n if (content === null || content === undefined) {\n return '(no content)'\n }\n if (typeof content === 'string') {\n return content || '(no content)'\n }\n if (Array.isArray(content)) {\n // Handle array of content blocks (e.g., TextBlock[])\n return content\n .map(item => {\n if (typeof item === 'string') return item\n if (item && typeof item === 'object' && 'text' in item)\n return String(item.text)\n return JSON.stringify(item)\n })\n .join('\\n')\n }\n if (typeof content === 'object') {\n // Handle objects - try to extract text or stringify\n if ('text' in content) return String((content as { text: unknown }).text)\n return JSON.stringify(content)\n }\n return String(content)\n}\nimport { getCwd } from './utils/state'\nimport { checkAutoCompact } from './utils/autoCompactCore'\nimport { getHookManager } from '@utils/hookManager'\nimport { recordToolCall } from '@utils/stats'\n\n// Extended ToolUseContext for query functions\ninterface ExtendedToolUseContext extends ToolUseContext {\n abortController: AbortController\n options: {\n commands: import('./commands').Command[]\n forkNumber: number\n messageLogName: string\n tools: Tool[]\n verbose: boolean\n /** @deprecated Use safetyMode instead */\n safeMode?: boolean\n /** Safety mode: 'yolo' | 'smart' | 'strict' */\n safetyMode?: import('./utils/config').SafetyMode\n maxThinkingTokens: number\n isKodingRequest?: boolean\n model?: string | import('./utils/config').ModelPointerType\n }\n readFileTimestamps: { [filename: string]: number }\n setToolJSX: SetToolJSXFn\n askUser?: AskUserFn\n requestId?: string\n}\n\nexport type Response = { costUSD: number; response: string }\nexport type UserMessage = {\n message: MessageParam\n type: 'user'\n uuid: UUID\n toolUseResult?: FullToolUseResult\n options?: {\n isKodingRequest?: boolean\n kodingContext?: string\n isCustomCommand?: boolean\n commandName?: string\n commandArgs?: string\n }\n}\n\nexport type AssistantMessage = {\n costUSD: number\n durationMs: number\n message: APIAssistantMessage\n type: 'assistant'\n uuid: UUID\n isApiErrorMessage?: boolean\n responseId?: string // For GPT-5 Responses API state management\n /**\n * Original message UUID before normalization.\n * When a message with multiple content blocks is split into individual messages,\n * each resulting message will have a unique `uuid` but share the same `originalUuid`.\n * This is used to identify parallel tool calls from the same assistant message.\n */\n originalUuid?: UUID\n /**\n * Metadata for thinking blocks if present.\n * Used to display duration and character count in verbose mode.\n */\n thinkingMetadata?: ThinkingMetadata\n}\n\nexport type BinaryFeedbackResult =\n | { message: AssistantMessage | null; shouldSkipPermissionCheck: false }\n | { message: AssistantMessage; shouldSkipPermissionCheck: true }\n\n/**\n * Streaming output content for tools like BashTool\n */\nexport type StreamingProgressContent = {\n type: 'streaming'\n toolName: string\n stdout: string\n stderr: string\n isStreaming: boolean\n}\n\nexport type ProgressMessage = {\n content: AssistantMessage | StreamingProgressContent\n normalizedMessages: NormalizedMessage[]\n siblingToolUseIDs: Set<string>\n tools: Tool[]\n toolUseID: string\n type: 'progress'\n uuid: UUID\n}\n\n// Each array item is either a single message or a message-and-response pair\nexport type Message = UserMessage | AssistantMessage | ProgressMessage\n\nconst MAX_TOOL_USE_CONCURRENCY = 10\n\n/**\n * Maximum recursion depth for query calls.\n * Prevents stack overflow from infinite tool use loops.\n */\nconst MAX_QUERY_DEPTH = 50\n\n/**\n * Error thrown when query depth limit is exceeded\n */\nexport class QueryDepthExceededError extends Error {\n constructor(depth: number) {\n super(\n `Query depth limit exceeded (${depth}/${MAX_QUERY_DEPTH}). ` +\n `This usually indicates an infinite loop in tool usage.`,\n )\n this.name = 'QueryDepthExceededError'\n }\n}\n\n// Returns a message if we got one, or `null` if the user cancelled\nasync function queryWithBinaryFeedback(\n toolUseContext: ExtendedToolUseContext,\n getAssistantResponse: () => Promise<AssistantMessage>,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n): Promise<BinaryFeedbackResult> {\n if (\n process.env.USER_TYPE !== 'ant' ||\n !getBinaryFeedbackResponse ||\n !(await shouldUseBinaryFeedback())\n ) {\n const assistantMessage = await getAssistantResponse()\n if (toolUseContext.abortController.signal.aborted) {\n return { message: null, shouldSkipPermissionCheck: false }\n }\n return { message: assistantMessage, shouldSkipPermissionCheck: false }\n }\n const [m1, m2] = await Promise.all([\n getAssistantResponse(),\n getAssistantResponse(),\n ])\n if (toolUseContext.abortController.signal.aborted) {\n return { message: null, shouldSkipPermissionCheck: false }\n }\n if (m2.isApiErrorMessage) {\n // If m2 is an error, we might as well return m1, even if it's also an error --\n // the UI will display it as an error as it would in the non-feedback path.\n return { message: m1, shouldSkipPermissionCheck: false }\n }\n if (m1.isApiErrorMessage) {\n return { message: m2, shouldSkipPermissionCheck: false }\n }\n if (!messagePairValidForBinaryFeedback(m1, m2)) {\n return { message: m1, shouldSkipPermissionCheck: false }\n }\n return await getBinaryFeedbackResponse(m1, m2)\n}\n\n/**\n * The rules of thinking are lengthy and fortuitous. They require plenty of thinking\n * of most long duration and deep meditation for a wizard to wrap one's noggin around.\n *\n * The rules follow:\n * 1. A message that contains a thinking or redacted_thinking block must be part of a query whose max_thinking_length > 0\n * 2. A thinking block may not be the last message in a block\n * 3. Thinking blocks must be preserved for the duration of an assistant trajectory (a single turn, or if that turn includes a tool_use block then also its subsequent tool_result and the following assistant message)\n *\n * Heed these rules well, young wizard. For they are the rules of thinking, and\n * the rules of thinking are the rules of the universe. If ye does not heed these\n * rules, ye will be punished with an entire day of debugging and hair pulling.\n */\nexport async function* query(\n messages: Message[],\n systemPrompt: string[],\n context: { [k: string]: string },\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n _depth: number = 0, // Internal: tracks recursion depth\n): AsyncGenerator<Message, void> {\n // Check recursion depth to prevent stack overflow\n if (_depth > MAX_QUERY_DEPTH) {\n const error = new QueryDepthExceededError(_depth)\n logError(error)\n yield createAssistantAPIErrorMessage(error.message)\n return\n }\n const currentRequest = getCurrentRequest()\n\n markPhase('QUERY_INIT')\n\n // Auto-compact check\n // \u2705 P2 FIX: Show compaction status in UI\n setStreamingState({ phase: 'compacting' })\n\n const { messages: processedMessages, wasCompacted } = await checkAutoCompact(\n messages,\n toolUseContext,\n )\n if (wasCompacted) {\n messages = processedMessages\n debug.flow('CONTEXT_COMPACTED', {\n originalCount: messages.length,\n compactedCount: processedMessages.length,\n })\n }\n\n markPhase('SYSTEM_PROMPT_BUILD')\n\n const { systemPrompt: fullSystemPrompt, reminders } =\n formatSystemPromptWithContext(systemPrompt, context, toolUseContext.agentId)\n\n // Emit session startup event\n emitReminderEvent('session:startup', {\n agentId: toolUseContext.agentId,\n messages: messages.length,\n timestamp: Date.now(),\n })\n\n // Inject reminders into system prompt (not user messages) to prevent UI leakage\n if (reminders) {\n fullSystemPrompt.push(reminders)\n }\n\n markPhase('LLM_PREPARATION')\n\n // Update streaming state for UI feedback\n setStreamingState({ phase: 'waiting' })\n\n function getAssistantResponse() {\n return queryLLM(\n normalizeMessagesForAPI(messages),\n fullSystemPrompt,\n toolUseContext.options.maxThinkingTokens,\n toolUseContext.options.tools,\n toolUseContext.abortController.signal,\n {\n safeMode: toolUseContext.options.safeMode ?? false,\n model: toolUseContext.options.model || 'main',\n prependCLISysprompt: true,\n toolUseContext: toolUseContext,\n },\n )\n }\n\n const result = await queryWithBinaryFeedback(\n toolUseContext,\n getAssistantResponse,\n getBinaryFeedbackResponse,\n )\n\n // If request was cancelled, return immediately with interrupt message\n if (toolUseContext.abortController.signal.aborted) {\n yield createAssistantMessage(INTERRUPT_MESSAGE)\n return\n }\n\n if (result.message === null) {\n yield createAssistantMessage(INTERRUPT_MESSAGE)\n return\n }\n\n const assistantMessage = result.message\n const shouldSkipPermissionCheck = result.shouldSkipPermissionCheck\n\n // Update streaming state - we got a response\n setStreamingState({ phase: 'generating' })\n\n yield assistantMessage\n\n // @see https://docs.anthropic.com/en/docs/build-with-claude/tool-use\n // Note: stop_reason === 'tool_use' is unreliable -- it's not always set correctly\n const toolUseMessages = assistantMessage.message.content.filter(\n _ => _.type === 'tool_use',\n )\n\n // If there's no more tool use, we're done\n if (!toolUseMessages.length) {\n resetStreamingState()\n\n // Fire Stop hook (fire-and-forget)\n const hookManager = getHookManager()\n if (hookManager) {\n hookManager.executeStop().catch(() => {})\n }\n\n return\n }\n\n const toolResults: UserMessage[] = []\n\n // Smart concurrency: separate tools into serial and concurrent groups\n // This allows mixing TodoWrite (serial) with multiple Task calls (concurrent)\n const serialTools: ToolUseBlock[] = []\n const concurrentTools: ToolUseBlock[] = []\n\n for (const msg of toolUseMessages) {\n const tool = toolUseContext.options.tools.find(t => t.name === msg.name)\n const isSafe = tool?.isConcurrencySafe?.() ?? tool?.isReadOnly?.() ?? false\n if (isSafe) {\n concurrentTools.push(msg)\n } else {\n serialTools.push(msg)\n }\n }\n\n // Debug: Log concurrency decision\n debug.flow('TOOL_CONCURRENCY_CHECK', {\n toolCount: toolUseMessages.length,\n serialTools: serialTools.map(msg => msg.name),\n concurrentTools: concurrentTools.map(msg => msg.name),\n concurrencyDetails: toolUseMessages.map(msg => {\n const tool = toolUseContext.options.tools.find(t => t.name === msg.name)\n return {\n name: msg.name,\n isConcurrencySafe: tool?.isConcurrencySafe?.() ?? 'undefined',\n isReadOnly: tool?.isReadOnly?.() ?? 'undefined',\n }\n }),\n })\n\n // Step 1: Execute serial tools first (e.g., TodoWrite)\n if (serialTools.length > 0) {\n debug.flow('SERIAL_TOOLS_START', {\n count: serialTools.length,\n tools: serialTools.map(t => t.name),\n })\n for await (const message of runToolsSerially(\n serialTools,\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n )) {\n yield message\n if (message.type === 'user') {\n toolResults.push(message)\n }\n }\n debug.flow('SERIAL_TOOLS_COMPLETE', {\n count: serialTools.length,\n })\n }\n\n // Step 2: Execute concurrent tools in parallel (e.g., multiple Task calls)\n if (concurrentTools.length > 0) {\n debug.flow('CONCURRENT_TOOLS_START', {\n count: concurrentTools.length,\n tools: concurrentTools.map(t => t.name),\n maxConcurrency: MAX_TOOL_USE_CONCURRENCY,\n })\n\n // \u2705 P2 FIX: Update UI to show concurrent task count\n setStreamingState({\n phase: 'concurrent',\n concurrentCount: concurrentTools.length,\n })\n\n const concurrentStartTime = Date.now()\n for await (const message of runToolsConcurrently(\n concurrentTools,\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n )) {\n yield message\n if (message.type === 'user') {\n toolResults.push(message)\n }\n }\n debug.flow('CONCURRENT_TOOLS_COMPLETE', {\n count: concurrentTools.length,\n durationMs: Date.now() - concurrentStartTime,\n })\n }\n\n if (toolUseContext.abortController.signal.aborted) {\n yield createAssistantMessage(INTERRUPT_MESSAGE_FOR_TOOL_USE)\n return\n }\n\n // Sort toolResults to match the order of toolUseMessages\n const orderedToolResults = toolResults.sort((a, b) => {\n const aIndex = toolUseMessages.findIndex(\n tu => tu.id === (a.message.content[0] as ToolUseBlock).id,\n )\n const bIndex = toolUseMessages.findIndex(\n tu => tu.id === (b.message.content[0] as ToolUseBlock).id,\n )\n return aIndex - bIndex\n })\n\n // Process contextModifier and newMessages from tool results\n // These are used by SlashCommandTool to modify context and inject messages\n let modifiedContext = toolUseContext\n const additionalMessages: Message[] = []\n\n for (const result of orderedToolResults) {\n if (result.toolUseResult?.contextModifier) {\n // Apply context modifier (e.g., allowed tools, model switching)\n modifiedContext =\n result.toolUseResult.contextModifier.modifyContext(modifiedContext)\n debug.flow('CONTEXT_MODIFIER_APPLIED', {\n toolResultId: (result.message.content[0] as ToolUseBlock)?.id,\n })\n }\n\n if (\n result.toolUseResult?.newMessages &&\n Array.isArray(result.toolUseResult.newMessages)\n ) {\n // Add new messages from tool execution (e.g., skill-generated prompts)\n for (const msg of result.toolUseResult.newMessages) {\n if (msg && typeof msg === 'object' && 'type' in msg) {\n additionalMessages.push(msg as Message)\n }\n }\n debug.flow('NEW_MESSAGES_ADDED', {\n count: result.toolUseResult.newMessages.length,\n })\n }\n }\n\n // Recursive query with depth tracking\n\n try {\n yield* await query(\n [\n ...messages,\n assistantMessage,\n ...orderedToolResults,\n ...additionalMessages,\n ],\n systemPrompt,\n context,\n canUseTool,\n modifiedContext, // Use modified context if contextModifier was applied\n getBinaryFeedbackResponse,\n _depth + 1, // Increment depth for recursion tracking\n )\n } catch (error) {\n // \uD83D\uDD27 CRITICAL FIX: Yield error message instead of just re-throwing\n // This ensures the UI receives proper feedback when recursive query fails\n const errorMessage = error instanceof Error ? error.message : String(error)\n logError(`Recursive query error: ${errorMessage}`)\n\n // Yield an error message so the UI can display it\n yield createAssistantAPIErrorMessage(`Query failed: ${errorMessage}`)\n\n // Re-throw to propagate to caller for additional handling if needed\n throw error\n }\n}\n\nasync function* runToolsConcurrently(\n toolUseMessages: ToolUseBlock[],\n assistantMessage: AssistantMessage,\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n yield* all(\n toolUseMessages.map(toolUse =>\n runToolUse(\n toolUse,\n new Set(toolUseMessages.map(_ => _.id)),\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n ),\n ),\n MAX_TOOL_USE_CONCURRENCY,\n toolUseContext.abortController.signal, // Pass abort signal for proper cancellation\n )\n}\n\nasync function* runToolsSerially(\n toolUseMessages: ToolUseBlock[],\n assistantMessage: AssistantMessage,\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n for (const toolUse of toolUseMessages) {\n yield* runToolUse(\n toolUse,\n new Set(toolUseMessages.map(_ => _.id)),\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n )\n }\n}\n\nexport async function* runToolUse(\n toolUse: ToolUseBlock,\n siblingToolUseIDs: Set<string>,\n assistantMessage: AssistantMessage,\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n const currentRequest = getCurrentRequest()\n\n // \uD83D\uDD0D Debug: \u5DE5\u5177\u8C03\u7528\u5F00\u59CB\n debug.flow('TOOL_USE_START', {\n toolName: toolUse.name,\n toolUseID: toolUse.id,\n inputSize: JSON.stringify(toolUse.input).length,\n siblingToolCount: siblingToolUseIDs.size,\n shouldSkipPermissionCheck: !!shouldSkipPermissionCheck,\n requestId: currentRequest?.id,\n })\n\n logUserFriendly(\n 'TOOL_EXECUTION',\n {\n toolName: toolUse.name,\n action: 'Starting',\n target: toolUse.input ? Object.keys(toolUse.input).join(', ') : '',\n },\n currentRequest?.id,\n )\n\n const toolName = toolUse.name\n const tool = toolUseContext.options.tools.find(t => t.name === toolName)\n\n // Update streaming state to show tool execution\n setStreamingState({ phase: 'tool_use', toolName })\n\n // Check if the tool exists\n if (!tool) {\n debug.error('TOOL_NOT_FOUND', {\n requestedTool: toolName,\n availableTools: toolUseContext.options.tools.map(t => t.name),\n toolUseID: toolUse.id,\n requestId: currentRequest?.id,\n })\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: `Error: No such tool available: ${toolName}`,\n is_error: true,\n tool_use_id: toolUse.id,\n },\n ])\n return\n }\n\n const toolInput = toolUse.input as { [key: string]: string }\n\n debug.flow('TOOL_VALIDATION_START', {\n toolName: tool.name,\n toolUseID: toolUse.id,\n inputKeys: Object.keys(toolInput),\n requestId: currentRequest?.id,\n })\n\n try {\n // \uD83D\uDD27 Check for cancellation before starting tool execution\n if (toolUseContext.abortController.signal.aborted) {\n debug.flow('TOOL_USE_CANCELLED_BEFORE_START', {\n toolName: tool.name,\n toolUseID: toolUse.id,\n abortReason: 'AbortController signal',\n requestId: currentRequest?.id,\n })\n\n const message = createUserMessage([\n createToolResultStopMessage(toolUse.id),\n ])\n yield message\n return\n }\n\n // Track if any progress messages were yielded\n let hasProgressMessages = false\n\n for await (const message of checkPermissionsAndCallTool(\n tool,\n toolUse.id,\n siblingToolUseIDs,\n toolInput,\n toolUseContext,\n canUseTool,\n assistantMessage,\n shouldSkipPermissionCheck,\n )) {\n // \uD83D\uDD27 Check for cancellation during tool execution\n if (toolUseContext.abortController.signal.aborted) {\n debug.flow('TOOL_USE_CANCELLED_DURING_EXECUTION', {\n toolName: tool.name,\n toolUseID: toolUse.id,\n hasProgressMessages,\n abortReason: 'AbortController signal during execution',\n requestId: currentRequest?.id,\n })\n\n // If we yielded progress messages but got cancelled, yield a cancellation result\n if (hasProgressMessages && message.type === 'progress') {\n yield message // yield the last progress message first\n }\n\n // Always yield a tool result message for cancellation to clear UI state\n const cancelMessage = createUserMessage([\n createToolResultStopMessage(toolUse.id),\n ])\n yield cancelMessage\n return\n }\n\n if (message.type === 'progress') {\n hasProgressMessages = true\n }\n\n yield message\n }\n } catch (e) {\n logError(e)\n\n // Fire PostToolUseFailure hook (fire-and-forget)\n const hookManager = getHookManager()\n if (hookManager) {\n hookManager\n .executePostToolUseFailure(\n toolName,\n toolInput as Record<string, unknown>,\n e instanceof Error ? e.message : String(e),\n )\n .catch(() => {})\n }\n\n // \uD83D\uDD27 Even on error, ensure we yield a tool result to clear UI state\n const errorMessage = createUserMessage([\n {\n type: 'tool_result',\n content: `Tool execution failed: ${e instanceof Error ? e.message : String(e)}`,\n is_error: true,\n tool_use_id: toolUse.id,\n },\n ])\n yield errorMessage\n }\n}\n\n// TODO: Generalize this to all tools\nexport function normalizeToolInput(\n tool: Tool,\n input: { [key: string]: boolean | string | number },\n): { [key: string]: boolean | string | number } {\n switch (tool) {\n case BashTool: {\n const { command, timeout } = BashTool.inputSchema.parse(input) // already validated upstream, won't throw\n return {\n command: command.replace(`cd ${getCwd()} && `, ''),\n ...(timeout ? { timeout } : {}),\n }\n }\n default:\n return input\n }\n}\n\n/**\n * Build a user-friendly error message for tool input validation failures.\n * Provides clear guidance on expected format, examples, and how to fix the issue.\n */\nfunction buildToolInputErrorMessage(\n tool: Tool,\n input: { [key: string]: boolean | string | number },\n validationError: z.ZodError,\n): string {\n // Check if this is a JSON parse error from upstream (claude.ts)\n const parseError = input as {\n __parse_error__?: boolean\n __error_message__?: string\n __raw_json_preview__?: string\n }\n\n if (parseError.__parse_error__) {\n // JSON parse error - model generated malformed JSON\n let message = [\n `Error: Failed to parse tool parameters for \"${tool.name}\".`,\n ``,\n `The model generated invalid JSON. This is typically a temporary issue.`,\n ``,\n `Expected format: ${TOOL_INPUT_EXAMPLES[tool.name] || '{...}'}`,\n ]\n\n if (parseError.__error_message__) {\n message.push(`Parse error: ${parseError.__error_message__}`)\n }\n\n if (parseError.__raw_json_preview__) {\n message.push(``, `Raw JSON preview:`, parseError.__raw_json_preview__)\n }\n\n message.push(\n ``,\n `Suggestions:`,\n `\u2022 Retry your request - the model may succeed on the next attempt`,\n `\u2022 Try simplifying your request with fewer parameters`,\n `\u2022 Check if special characters in values need escaping`,\n )\n\n return message.join('\\n')\n }\n\n // Validation error - parameters are syntactically correct but semantically wrong\n const inputKeys = Object.keys(input)\n const isEmptyInput = inputKeys.length === 0\n\n const example =\n TOOL_INPUT_EXAMPLES[tool.name] || '{...required parameters...}'\n const description = TOOL_DESCRIPTIONS[tool.name]\n const paramDescriptions = PARAMETER_DESCRIPTIONS[tool.name]\n\n let message = [\n `Error: Invalid parameters for \"${tool.name}\" tool.`,\n ``,\n `Expected format:`,\n `${example}`,\n ]\n\n if (description) {\n message.push(``, `Description: ${description}`)\n }\n\n if (isEmptyInput) {\n message.push(\n ``,\n `Issue: The tool was called without any parameters.`,\n `This usually indicates a JSON parsing error in the model's response.`,\n )\n } else {\n // Show which parameters were provided vs missing\n message.push(\n ``,\n `Issue: ${validationError.message}`,\n `Provided parameters: ${inputKeys.length > 0 ? inputKeys.join(', ') : '(none)'}`,\n )\n\n // Show parameter-specific help if available\n if (paramDescriptions) {\n message.push(``, `Parameter guide:`)\n for (const [param, desc] of Object.entries(paramDescriptions)) {\n message.push(`\u2022 ${param}: ${desc}`)\n }\n }\n }\n\n message.push(\n ``,\n `Suggestions:`,\n `\u2022 Ensure all required parameters are provided`,\n `\u2022 Check that parameters have the correct type (string, number, boolean)`,\n `\u2022 Verify file paths are absolute (start with /)`,\n `\u2022 Retry your request - the model often succeeds on retry`,\n )\n\n return message.join('\\n')\n}\n\nasync function* checkPermissionsAndCallTool(\n tool: Tool,\n toolUseID: string,\n siblingToolUseIDs: Set<string>,\n input: { [key: string]: boolean | string | number },\n context: ToolUseContext,\n canUseTool: CanUseToolFn,\n assistantMessage: AssistantMessage,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<UserMessage | ProgressMessage, void> {\n // Validate input types with zod\n // (surprisingly, the model is not great at generating valid input)\n const isValidInput = tool.inputSchema.safeParse(input)\n if (!isValidInput.success) {\n let errorMessage = buildToolInputErrorMessage(\n tool,\n input,\n isValidInput.error,\n )\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: errorMessage,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n const normalizedInput = normalizeToolInput(tool, input)\n\n // Validate input values. Each tool has its own validation logic\n const isValidCall = await tool.validateInput?.(\n normalizedInput as never,\n context,\n )\n if (isValidCall?.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: isValidCall!.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n // Check whether we have permission to use the tool,\n // and ask the user for permission if we don't\n const permissionResult = shouldSkipPermissionCheck\n ? ({ result: true } as const)\n : await canUseTool(tool, normalizedInput, context, assistantMessage)\n if (permissionResult.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: permissionResult.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n // \u2705 P1 FIX: Show permission waiting state when permission check is pending\n // Note: This is handled by the PermissionRequest dialog in the UI\n // But we update streaming state to indicate the phase\n if (!shouldSkipPermissionCheck && !permissionResult.result) {\n setStreamingState({ phase: 'permission' })\n }\n\n // PreToolUse hooks\n const hookManager = getHookManager()\n if (hookManager) {\n try {\n const decision = await hookManager.executePreToolUse(\n tool.name,\n normalizedInput as Record<string, unknown>,\n )\n\n if (!decision.shouldContinue) {\n if (decision.shouldAskUser) {\n // Ask user for approval via permission system\n const approved = await canUseTool(\n tool,\n normalizedInput,\n context,\n assistantMessage,\n )\n if (approved.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content:\n decision.reason || 'Hook requested approval but user denied',\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n } else {\n // Hook blocked the tool\n yield createUserMessage([\n {\n type: 'tool_result',\n content: decision.reason || 'Tool execution blocked by hook',\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n }\n } catch (error) {\n debug.error('PreToolUse hook failed', { error })\n // Continue on error (fail-safe)\n }\n }\n\n // Call the tool with timeout protection\n let toolOutput: FullToolUseResult | null = null\n try {\n // Add toolUseId to context for tracking concurrent executions\n const contextWithToolUseId = {\n ...context,\n toolUseId: toolUseID,\n }\n const rawGenerator = tool.call(\n normalizedInput as never,\n contextWithToolUseId,\n )\n // Wrap tool execution with timeout to prevent infinite hangs\n const generator = withTimeout(rawGenerator, tool.name)\n\n for await (const result of generator) {\n switch (result.type) {\n case 'result':\n // Normalize content to ensure API compatibility\n const normalizedContent = normalizeToolResultContent(\n result.resultForAssistant ?? result.data,\n )\n toolOutput = {\n data: result.data,\n resultForAssistant: normalizedContent,\n // Preserve contextModifier and newMessages for caller to process\n newMessages: result.newMessages,\n contextModifier: result.contextModifier,\n }\n\n yield createUserMessage(\n [\n {\n type: 'tool_result',\n content: normalizedContent,\n tool_use_id: toolUseID,\n },\n ],\n toolOutput,\n )\n\n // Record successful tool call to stats (fire-and-forget)\n try {\n recordToolCall(tool.name, false)\n } catch {\n // Stats recording is non-critical, ignore errors\n }\n\n // PostToolUse hooks (fire-and-forget)\n if (hookManager && toolOutput) {\n hookManager\n .executePostToolUse(\n tool.name,\n normalizedInput as Record<string, unknown>,\n toolOutput as Record<string, unknown>,\n )\n .catch(err => {\n debug.error('PostToolUse hook failed', { error: err })\n })\n }\n\n return\n case 'progress':\n yield createProgressMessage(\n toolUseID,\n siblingToolUseIDs,\n result.content,\n result.normalizedMessages || [],\n result.tools || [],\n )\n break\n }\n }\n } catch (error) {\n // Record failed tool call to stats (fire-and-forget)\n try {\n recordToolCall(tool.name, true)\n } catch {\n // Stats recording is non-critical, ignore errors\n }\n\n // Fire PostToolUseFailure hook for all tool errors\n const hookMgr = getHookManager()\n if (hookMgr) {\n hookMgr\n .executePostToolUseFailure(\n tool.name,\n normalizedInput as Record<string, unknown>,\n error instanceof Error ? error.message : String(error),\n error instanceof ToolTimeoutError ? 'timeout' : undefined,\n )\n .catch(() => {})\n }\n\n // Special handling for timeout errors\n if (error instanceof ToolTimeoutError) {\n debug.error('TOOL_TIMEOUT', {\n toolName: tool.name,\n toolUseID,\n timeoutMs: error.timeoutMs,\n })\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: `Error: ${error.message}. The tool execution was cancelled. Consider breaking this operation into smaller steps or checking if there's an infinite loop.`,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n const content = formatError(error)\n logError(error)\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n }\n}\n\nfunction formatError(error: unknown): string {\n if (!(error instanceof Error)) {\n return String(error)\n }\n const parts = [error.message]\n if ('stderr' in error && typeof error.stderr === 'string') {\n parts.push(error.stderr)\n }\n if ('stdout' in error && typeof error.stdout === 'string') {\n parts.push(error.stdout)\n }\n const fullMessage = parts.filter(Boolean).join('\\n')\n if (fullMessage.length <= 10000) {\n return fullMessage\n }\n const halfLength = 5000\n const start = fullMessage.slice(0, halfLength)\n const end = fullMessage.slice(-halfLength)\n return `${start}\\n\\n... [${fullMessage.length - 10000} characters truncated] ...\\n\\n${end}`\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["result", "message"]
7
7
  }