@within-7/minto 0.1.6 → 0.2.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 (487) hide show
  1. package/cli.js +155 -37
  2. package/dist/Tool.js +38 -0
  3. package/dist/Tool.js.map +3 -3
  4. package/dist/commands/agents/AgentsCommand.js +52 -26
  5. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  6. package/dist/commands/agents/constants.js +1 -1
  7. package/dist/commands/agents/constants.js.map +1 -1
  8. package/dist/commands/agents/index.js +1 -1
  9. package/dist/commands/bug.js +74 -7
  10. package/dist/commands/bug.js.map +3 -3
  11. package/dist/commands/clear.js +3 -0
  12. package/dist/commands/clear.js.map +2 -2
  13. package/dist/commands/compact.js +37 -0
  14. package/dist/commands/compact.js.map +2 -2
  15. package/dist/commands/context.js +84 -0
  16. package/dist/commands/context.js.map +7 -0
  17. package/dist/commands/ctx_viz.js +18 -10
  18. package/dist/commands/ctx_viz.js.map +2 -2
  19. package/dist/commands/doctor.js +158 -12
  20. package/dist/commands/doctor.js.map +2 -2
  21. package/dist/commands/export.js +156 -0
  22. package/dist/commands/export.js.map +7 -0
  23. package/dist/commands/mcp-interactive.js +21 -12
  24. package/dist/commands/mcp-interactive.js.map +2 -2
  25. package/dist/commands/model.js +6 -5
  26. package/dist/commands/model.js.map +2 -2
  27. package/dist/commands/permissions.js +86 -0
  28. package/dist/commands/permissions.js.map +7 -0
  29. package/dist/commands/quit.js +3 -1
  30. package/dist/commands/quit.js.map +2 -2
  31. package/dist/commands/sandbox.js +104 -0
  32. package/dist/commands/sandbox.js.map +7 -0
  33. package/dist/commands/status.js +58 -0
  34. package/dist/commands/status.js.map +7 -0
  35. package/dist/commands/tasks.js +108 -0
  36. package/dist/commands/tasks.js.map +7 -0
  37. package/dist/commands/todos.js +123 -0
  38. package/dist/commands/todos.js.map +7 -0
  39. package/dist/commands.js +20 -2
  40. package/dist/commands.js.map +2 -2
  41. package/dist/components/AgentThinkingBlock.js +10 -18
  42. package/dist/components/AgentThinkingBlock.js.map +2 -2
  43. package/dist/components/BackgroundTasksPanel.js +78 -29
  44. package/dist/components/BackgroundTasksPanel.js.map +2 -2
  45. package/dist/components/BashStreamingProgress.js +24 -0
  46. package/dist/components/BashStreamingProgress.js.map +7 -0
  47. package/dist/components/CollapsibleHint.js +14 -0
  48. package/dist/components/CollapsibleHint.js.map +7 -0
  49. package/dist/components/FileEditToolUpdatedMessage.js +1 -1
  50. package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
  51. package/dist/components/HotkeyHelpPanel.js +137 -0
  52. package/dist/components/HotkeyHelpPanel.js.map +7 -0
  53. package/dist/components/Logo.js +5 -5
  54. package/dist/components/Logo.js.map +2 -2
  55. package/dist/components/Message.js +23 -7
  56. package/dist/components/Message.js.map +3 -3
  57. package/dist/components/ModelConfig.js +16 -3
  58. package/dist/components/ModelConfig.js.map +2 -2
  59. package/dist/components/ModelListManager.js +3 -3
  60. package/dist/components/ModelListManager.js.map +2 -2
  61. package/dist/components/ModelSelector/ModelSelector.js +1 -1
  62. package/dist/components/Onboarding.js +19 -14
  63. package/dist/components/Onboarding.js.map +2 -2
  64. package/dist/components/ProgressBar.js +74 -0
  65. package/dist/components/ProgressBar.js.map +7 -0
  66. package/dist/components/PromptInput.js +156 -46
  67. package/dist/components/PromptInput.js.map +2 -2
  68. package/dist/components/RequestStatusIndicator.js +194 -0
  69. package/dist/components/RequestStatusIndicator.js.map +7 -0
  70. package/dist/components/Spinner.js +92 -27
  71. package/dist/components/Spinner.js.map +2 -2
  72. package/dist/components/SpinnerSymbol.js +21 -27
  73. package/dist/components/SpinnerSymbol.js.map +2 -2
  74. package/dist/components/StreamingBashOutput.js +9 -8
  75. package/dist/components/StreamingBashOutput.js.map +2 -2
  76. package/dist/components/SubagentBlock.js +1 -1
  77. package/dist/components/SubagentBlock.js.map +1 -1
  78. package/dist/components/SubagentProgress.js +10 -11
  79. package/dist/components/SubagentProgress.js.map +2 -2
  80. package/dist/components/TaskCard.js +16 -13
  81. package/dist/components/TaskCard.js.map +2 -2
  82. package/dist/components/TodoChangeBlock.js +1 -1
  83. package/dist/components/TodoChangeBlock.js.map +2 -2
  84. package/dist/components/TodoPanel.js +120 -29
  85. package/dist/components/TodoPanel.js.map +3 -3
  86. package/dist/components/TokenCounter.js +74 -0
  87. package/dist/components/TokenCounter.js.map +7 -0
  88. package/dist/components/TokenWarning.js +2 -1
  89. package/dist/components/TokenWarning.js.map +2 -2
  90. package/dist/components/TreeConnector.js +25 -0
  91. package/dist/components/TreeConnector.js.map +7 -0
  92. package/dist/components/TurnCompletionIndicator.js +18 -0
  93. package/dist/components/TurnCompletionIndicator.js.map +7 -0
  94. package/dist/components/messages/AssistantTextMessage.js +5 -2
  95. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  96. package/dist/components/messages/AssistantThinkingMessage.js +18 -3
  97. package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
  98. package/dist/components/messages/AssistantToolUseMessage.js +11 -8
  99. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  100. package/dist/components/messages/GroupRenderer.js +53 -0
  101. package/dist/components/messages/GroupRenderer.js.map +7 -0
  102. package/dist/components/messages/NestedTasksPreview.js +12 -0
  103. package/dist/components/messages/NestedTasksPreview.js.map +7 -0
  104. package/dist/components/messages/ParallelTasksGroupView.js +92 -0
  105. package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
  106. package/dist/components/messages/TaskInModuleView.js +198 -0
  107. package/dist/components/messages/TaskInModuleView.js.map +7 -0
  108. package/dist/components/messages/TaskOutputContent.js +53 -0
  109. package/dist/components/messages/TaskOutputContent.js.map +7 -0
  110. package/dist/components/messages/UserPromptMessage.js +1 -1
  111. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  112. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
  113. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
  114. package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
  115. package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
  116. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
  117. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
  118. package/dist/constants/colors.js +48 -0
  119. package/dist/constants/colors.js.map +2 -2
  120. package/dist/constants/formatRules.js +102 -0
  121. package/dist/constants/formatRules.js.map +7 -0
  122. package/dist/constants/prompts.js +12 -34
  123. package/dist/constants/prompts.js.map +2 -2
  124. package/dist/constants/symbols.js +64 -6
  125. package/dist/constants/symbols.js.map +2 -2
  126. package/dist/constants/timing.js +5 -0
  127. package/dist/constants/timing.js.map +2 -2
  128. package/dist/core/config/defaults.js +84 -0
  129. package/dist/core/config/defaults.js.map +7 -0
  130. package/dist/core/config/index.js +111 -0
  131. package/dist/core/config/index.js.map +7 -0
  132. package/dist/core/config/loader.js +221 -0
  133. package/dist/core/config/loader.js.map +7 -0
  134. package/dist/core/config/migrations.js +128 -0
  135. package/dist/core/config/migrations.js.map +7 -0
  136. package/dist/core/config/schema.js +178 -0
  137. package/dist/core/config/schema.js.map +7 -0
  138. package/dist/core/costTracker.js +138 -0
  139. package/dist/core/costTracker.js.map +7 -0
  140. package/dist/core/index.js +5 -0
  141. package/dist/core/index.js.map +7 -0
  142. package/dist/core/permissions/auditLog.js +204 -0
  143. package/dist/core/permissions/auditLog.js.map +7 -0
  144. package/dist/core/permissions/engine/index.js +3 -0
  145. package/dist/core/permissions/engine/index.js.map +7 -0
  146. package/dist/core/permissions/engine/permissionEngine.js +106 -0
  147. package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
  148. package/dist/core/permissions/engine/types.js +1 -0
  149. package/dist/core/permissions/engine/types.js.map +7 -0
  150. package/dist/core/permissions/index.js +84 -0
  151. package/dist/core/permissions/index.js.map +7 -0
  152. package/dist/core/permissions/ruleEngine.js +259 -0
  153. package/dist/core/permissions/ruleEngine.js.map +7 -0
  154. package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
  155. package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
  156. package/dist/core/permissions/rules/autoEscalationRule.js +291 -0
  157. package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
  158. package/dist/core/permissions/rules/index.js +46 -0
  159. package/dist/core/permissions/rules/index.js.map +7 -0
  160. package/dist/core/permissions/rules/planModeRule.js +55 -0
  161. package/dist/core/permissions/rules/planModeRule.js.map +7 -0
  162. package/dist/core/permissions/rules/projectBoundaryRule.js +168 -0
  163. package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
  164. package/dist/core/permissions/rules/safeModeRule.js +65 -0
  165. package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
  166. package/dist/core/permissions/rules/sensitivePathsRule.js +340 -0
  167. package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
  168. package/dist/core/permissions/types.js +127 -0
  169. package/dist/core/permissions/types.js.map +7 -0
  170. package/dist/core/tools/executor.js +143 -0
  171. package/dist/core/tools/executor.js.map +7 -0
  172. package/dist/core/tools/index.js +15 -0
  173. package/dist/core/tools/index.js.map +7 -0
  174. package/dist/core/tools/registry.js +183 -0
  175. package/dist/core/tools/registry.js.map +7 -0
  176. package/dist/core/tools/types.js +1 -0
  177. package/dist/core/tools/types.js.map +7 -0
  178. package/dist/cost-tracker.js +23 -15
  179. package/dist/cost-tracker.js.map +2 -2
  180. package/dist/entrypoints/cli.js +43 -43
  181. package/dist/entrypoints/cli.js.map +2 -2
  182. package/dist/entrypoints/mcp.js +12 -4
  183. package/dist/entrypoints/mcp.js.map +2 -2
  184. package/dist/history.js +14 -3
  185. package/dist/history.js.map +2 -2
  186. package/dist/hooks/useAgentTranscripts.js +116 -0
  187. package/dist/hooks/useAgentTranscripts.js.map +7 -0
  188. package/dist/hooks/useAnimationSync.js +53 -0
  189. package/dist/hooks/useAnimationSync.js.map +7 -0
  190. package/dist/hooks/useArrowKeyHistory.js +4 -2
  191. package/dist/hooks/useArrowKeyHistory.js.map +2 -2
  192. package/dist/hooks/useCanUseTool.js +3 -1
  193. package/dist/hooks/useCanUseTool.js.map +2 -2
  194. package/dist/hooks/useCancelRequest.js +4 -1
  195. package/dist/hooks/useCancelRequest.js.map +2 -2
  196. package/dist/hooks/useExitOnCtrlCD.js +9 -5
  197. package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
  198. package/dist/hooks/useHookStatus.js +40 -0
  199. package/dist/hooks/useHookStatus.js.map +7 -0
  200. package/dist/hooks/useLogMessages.js +17 -1
  201. package/dist/hooks/useLogMessages.js.map +2 -2
  202. package/dist/hooks/useMessageGroups.js +43 -0
  203. package/dist/hooks/useMessageGroups.js.map +7 -0
  204. package/dist/hooks/useTerminalSize.js +62 -6
  205. package/dist/hooks/useTerminalSize.js.map +2 -2
  206. package/dist/hooks/useUnifiedCompletion.js +69 -0
  207. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  208. package/dist/i18n/index.js +109 -0
  209. package/dist/i18n/index.js.map +7 -0
  210. package/dist/i18n/locales/en.js +347 -0
  211. package/dist/i18n/locales/en.js.map +7 -0
  212. package/dist/i18n/locales/index.js +7 -0
  213. package/dist/i18n/locales/index.js.map +7 -0
  214. package/dist/i18n/locales/zh-CN.js +347 -0
  215. package/dist/i18n/locales/zh-CN.js.map +7 -0
  216. package/dist/i18n/types.js +8 -0
  217. package/dist/i18n/types.js.map +7 -0
  218. package/dist/query.js +175 -17
  219. package/dist/query.js.map +3 -3
  220. package/dist/screens/REPL.js +501 -192
  221. package/dist/screens/REPL.js.map +3 -3
  222. package/dist/services/adapters/chatCompletions.js +3 -1
  223. package/dist/services/adapters/chatCompletions.js.map +2 -2
  224. package/dist/services/adapters/messageNormalizer.js +354 -0
  225. package/dist/services/adapters/messageNormalizer.js.map +7 -0
  226. package/dist/services/adapters/responsesAPI.js +6 -3
  227. package/dist/services/adapters/responsesAPI.js.map +2 -2
  228. package/dist/services/checkpointManager.js +386 -0
  229. package/dist/services/checkpointManager.js.map +7 -0
  230. package/dist/services/claude.js +138 -11
  231. package/dist/services/claude.js.map +3 -3
  232. package/dist/services/compressionService.js +50 -1
  233. package/dist/services/compressionService.js.map +2 -2
  234. package/dist/services/contextMonitor.js +162 -0
  235. package/dist/services/contextMonitor.js.map +7 -0
  236. package/dist/services/customCommands.js +60 -41
  237. package/dist/services/customCommands.js.map +2 -2
  238. package/dist/services/hookExecutor.js +173 -1
  239. package/dist/services/hookExecutor.js.map +2 -2
  240. package/dist/services/intelligentCompactor.js +281 -0
  241. package/dist/services/intelligentCompactor.js.map +7 -0
  242. package/dist/services/lspConfig.js +109 -0
  243. package/dist/services/lspConfig.js.map +7 -0
  244. package/dist/services/mcpClient.js +273 -34
  245. package/dist/services/mcpClient.js.map +2 -2
  246. package/dist/services/modelOrchestrator.js +310 -0
  247. package/dist/services/modelOrchestrator.js.map +7 -0
  248. package/dist/services/openai.js +8 -1
  249. package/dist/services/openai.js.map +2 -2
  250. package/dist/services/outputStyles.js +138 -0
  251. package/dist/services/outputStyles.js.map +7 -0
  252. package/dist/services/plugins/index.js +5 -0
  253. package/dist/services/plugins/index.js.map +7 -0
  254. package/dist/services/plugins/lspServers.js +188 -0
  255. package/dist/services/plugins/lspServers.js.map +7 -0
  256. package/dist/services/plugins/pluginRuntime.js +229 -0
  257. package/dist/services/plugins/pluginRuntime.js.map +7 -0
  258. package/dist/services/plugins/pluginValidation.js +219 -0
  259. package/dist/services/plugins/pluginValidation.js.map +7 -0
  260. package/dist/services/plugins/skillMarketplace.js +556 -0
  261. package/dist/services/plugins/skillMarketplace.js.map +7 -0
  262. package/dist/services/responseStateManager.js +37 -3
  263. package/dist/services/responseStateManager.js.map +2 -2
  264. package/dist/services/sandbox/filesystemBoundary.js +300 -0
  265. package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
  266. package/dist/services/sandbox/index.js +14 -0
  267. package/dist/services/sandbox/index.js.map +7 -0
  268. package/dist/services/sandbox/networkProxy.js +293 -0
  269. package/dist/services/sandbox/networkProxy.js.map +7 -0
  270. package/dist/services/sandbox/sandboxController.js +574 -0
  271. package/dist/services/sandbox/sandboxController.js.map +7 -0
  272. package/dist/services/sandbox/types.js +50 -0
  273. package/dist/services/sandbox/types.js.map +7 -0
  274. package/dist/services/sessionMemory.js +266 -0
  275. package/dist/services/sessionMemory.js.map +7 -0
  276. package/dist/services/taskRouter.js +324 -0
  277. package/dist/services/taskRouter.js.map +7 -0
  278. package/dist/tools/ArchitectTool/ArchitectTool.js +10 -3
  279. package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
  280. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +3 -0
  281. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  282. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +8 -1
  283. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  284. package/dist/tools/BaseTool.js +72 -0
  285. package/dist/tools/BaseTool.js.map +7 -0
  286. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
  287. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
  288. package/dist/tools/BashTool/BashTool.js +60 -3
  289. package/dist/tools/BashTool/BashTool.js.map +2 -2
  290. package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
  291. package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
  292. package/dist/tools/BashTool/OutputLine.js +54 -0
  293. package/dist/tools/BashTool/OutputLine.js.map +2 -2
  294. package/dist/tools/BashTool/prompt.js +192 -3
  295. package/dist/tools/BashTool/prompt.js.map +2 -2
  296. package/dist/tools/FileEditTool/FileEditTool.js +29 -4
  297. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  298. package/dist/tools/FileReadTool/FileReadTool.js +23 -4
  299. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  300. package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
  301. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  302. package/dist/tools/GlobTool/GlobTool.js +14 -3
  303. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  304. package/dist/tools/GrepTool/GrepTool.js +41 -7
  305. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  306. package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
  307. package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
  308. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
  309. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
  310. package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
  311. package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
  312. package/dist/tools/LspTool/LspTool.js +664 -0
  313. package/dist/tools/LspTool/LspTool.js.map +7 -0
  314. package/dist/tools/LspTool/prompt.js +27 -0
  315. package/dist/tools/LspTool/prompt.js.map +7 -0
  316. package/dist/tools/MCPTool/MCPTool.js +11 -4
  317. package/dist/tools/MCPTool/MCPTool.js.map +2 -2
  318. package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
  319. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  320. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
  321. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  322. package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
  323. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  324. package/dist/tools/NotebookEditTool/NotebookEditTool.js +5 -1
  325. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  326. package/dist/tools/NotebookReadTool/NotebookReadTool.js +8 -4
  327. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
  328. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +74 -0
  329. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
  330. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +108 -0
  331. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
  332. package/dist/tools/PlanModeTool/prompt.js +94 -0
  333. package/dist/tools/PlanModeTool/prompt.js.map +7 -0
  334. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
  335. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
  336. package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
  337. package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
  338. package/dist/tools/SkillTool/SkillTool.js +14 -3
  339. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  340. package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
  341. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
  342. package/dist/tools/SlashCommandTool/prompt.js +35 -0
  343. package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
  344. package/dist/tools/TaskOutputTool/TaskOutputTool.js +189 -0
  345. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
  346. package/dist/tools/TaskOutputTool/prompt.js +15 -0
  347. package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
  348. package/dist/tools/TaskTool/TaskTool.js +321 -146
  349. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  350. package/dist/tools/TaskTool/prompt.js.map +2 -2
  351. package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -73
  352. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
  353. package/dist/tools/URLFetcherTool/URLFetcherTool.js +7 -1
  354. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  355. package/dist/tools/URLFetcherTool/cache.js +55 -8
  356. package/dist/tools/URLFetcherTool/cache.js.map +2 -2
  357. package/dist/tools/WebSearchTool/WebSearchTool.js +6 -1
  358. package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
  359. package/dist/tools.js +31 -2
  360. package/dist/tools.js.map +2 -2
  361. package/dist/types/hooks.js +4 -0
  362. package/dist/types/hooks.js.map +2 -2
  363. package/dist/types/marketplace.js.map +2 -2
  364. package/dist/types/messageGroup.js +36 -0
  365. package/dist/types/messageGroup.js.map +7 -0
  366. package/dist/types/plugin.js.map +2 -2
  367. package/dist/types/thinking.js +1 -0
  368. package/dist/types/thinking.js.map +7 -0
  369. package/dist/utils/BackgroundShellManager.js +136 -39
  370. package/dist/utils/BackgroundShellManager.js.map +2 -2
  371. package/dist/utils/MessageBatchBuffer.js +102 -0
  372. package/dist/utils/MessageBatchBuffer.js.map +7 -0
  373. package/dist/utils/PersistentShell.js +151 -1
  374. package/dist/utils/PersistentShell.js.map +2 -2
  375. package/dist/utils/agentLoader.js +1 -23
  376. package/dist/utils/agentLoader.js.map +2 -2
  377. package/dist/utils/agentTranscripts.js +641 -0
  378. package/dist/utils/agentTranscripts.js.map +7 -0
  379. package/dist/utils/animationManager.js +213 -0
  380. package/dist/utils/animationManager.js.map +7 -0
  381. package/dist/utils/animationSync.js +110 -0
  382. package/dist/utils/animationSync.js.map +7 -0
  383. package/dist/utils/asyncFile.js +215 -0
  384. package/dist/utils/asyncFile.js.map +7 -0
  385. package/dist/utils/backgroundAgentManager.js +231 -0
  386. package/dist/utils/backgroundAgentManager.js.map +7 -0
  387. package/dist/utils/config.js +63 -7
  388. package/dist/utils/config.js.map +2 -2
  389. package/dist/utils/conversationRecovery.js +19 -0
  390. package/dist/utils/conversationRecovery.js.map +2 -2
  391. package/dist/utils/exit.js +73 -0
  392. package/dist/utils/exit.js.map +7 -0
  393. package/dist/utils/format.js +73 -5
  394. package/dist/utils/format.js.map +2 -2
  395. package/dist/utils/generators.js +76 -6
  396. package/dist/utils/generators.js.map +2 -2
  397. package/dist/utils/globalErrorHandler.js +149 -0
  398. package/dist/utils/globalErrorHandler.js.map +7 -0
  399. package/dist/utils/groupHandlers/index.js +8 -0
  400. package/dist/utils/groupHandlers/index.js.map +7 -0
  401. package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
  402. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
  403. package/dist/utils/groupHandlers/taskHandler.js +104 -0
  404. package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
  405. package/dist/utils/groupHandlers/types.js +1 -0
  406. package/dist/utils/groupHandlers/types.js.map +7 -0
  407. package/dist/utils/logRotation.js +224 -0
  408. package/dist/utils/logRotation.js.map +7 -0
  409. package/dist/utils/marketplaceManager.js +3 -5
  410. package/dist/utils/marketplaceManager.js.map +2 -2
  411. package/dist/utils/memSafety.js +264 -0
  412. package/dist/utils/memSafety.js.map +7 -0
  413. package/dist/utils/messageGroupManager.js +274 -0
  414. package/dist/utils/messageGroupManager.js.map +7 -0
  415. package/dist/utils/messages.js +13 -4
  416. package/dist/utils/messages.js.map +2 -2
  417. package/dist/utils/model.js +119 -15
  418. package/dist/utils/model.js.map +3 -3
  419. package/dist/utils/permissions/filesystem.js +157 -5
  420. package/dist/utils/permissions/filesystem.js.map +2 -2
  421. package/dist/utils/plan/planMode.js +143 -0
  422. package/dist/utils/plan/planMode.js.map +7 -0
  423. package/dist/utils/pluginLoader.js +17 -21
  424. package/dist/utils/pluginLoader.js.map +2 -2
  425. package/dist/utils/ripgrep.js +55 -2
  426. package/dist/utils/ripgrep.js.map +2 -2
  427. package/dist/utils/sanitizeInput.js +32 -0
  428. package/dist/utils/sanitizeInput.js.map +7 -0
  429. package/dist/utils/secureKeyStorage.js +312 -0
  430. package/dist/utils/secureKeyStorage.js.map +7 -0
  431. package/dist/utils/session/sessionPlugins.js +67 -0
  432. package/dist/utils/session/sessionPlugins.js.map +7 -0
  433. package/dist/utils/taskDisplayUtils.js +257 -0
  434. package/dist/utils/taskDisplayUtils.js.map +7 -0
  435. package/dist/utils/teamConfig.js +2 -1
  436. package/dist/utils/teamConfig.js.map +2 -2
  437. package/dist/utils/todoStorage.js +92 -2
  438. package/dist/utils/todoStorage.js.map +2 -2
  439. package/dist/utils/toolTimeout.js +136 -0
  440. package/dist/utils/toolTimeout.js.map +7 -0
  441. package/dist/utils/tooling/safeRender.js +115 -0
  442. package/dist/utils/tooling/safeRender.js.map +7 -0
  443. package/dist/utils/userFriendlyError.js +346 -0
  444. package/dist/utils/userFriendlyError.js.map +7 -0
  445. package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
  446. package/dist/version.js +2 -2
  447. package/dist/version.js.map +1 -1
  448. package/package.json +14 -4
  449. package/scripts/postinstall.js +128 -38
  450. package/dist/commands/agents.js +0 -2086
  451. package/dist/commands/agents.js.map +0 -7
  452. package/dist/commands/build.js +0 -74
  453. package/dist/commands/build.js.map +0 -7
  454. package/dist/commands/compression.js +0 -57
  455. package/dist/commands/compression.js.map +0 -7
  456. package/dist/commands/listen.js +0 -37
  457. package/dist/commands/listen.js.map +0 -7
  458. package/dist/commands/login.js +0 -37
  459. package/dist/commands/login.js.map +0 -7
  460. package/dist/commands/logout.js +0 -33
  461. package/dist/commands/logout.js.map +0 -7
  462. package/dist/commands/mcp.js +0 -40
  463. package/dist/commands/mcp.js.map +0 -7
  464. package/dist/commands/mcp_refresh.js +0 -40
  465. package/dist/commands/mcp_refresh.js.map +0 -7
  466. package/dist/commands/modelstatus.js +0 -21
  467. package/dist/commands/modelstatus.js.map +0 -7
  468. package/dist/commands/onboarding.js +0 -36
  469. package/dist/commands/onboarding.js.map +0 -7
  470. package/dist/commands/plugin-interactive.js +0 -446
  471. package/dist/commands/plugin-interactive.js.map +0 -7
  472. package/dist/commands/pr_comments.js +0 -61
  473. package/dist/commands/pr_comments.js.map +0 -7
  474. package/dist/commands/release-notes.js +0 -30
  475. package/dist/commands/release-notes.js.map +0 -7
  476. package/dist/commands/review.js +0 -51
  477. package/dist/commands/review.js.map +0 -7
  478. package/dist/components/Bug.js +0 -147
  479. package/dist/components/Bug.js.map +0 -7
  480. package/dist/components/ModelSelector.js +0 -2062
  481. package/dist/components/ModelSelector.js.map +0 -7
  482. package/dist/components/ModelStatusDisplay.js +0 -87
  483. package/dist/components/ModelStatusDisplay.js.map +0 -7
  484. package/dist/entrypoints/cli-wrapper.js +0 -61
  485. package/dist/entrypoints/cli-wrapper.js.map +0 -7
  486. package/dist/screens/Doctor.js +0 -22
  487. package/dist/screens/Doctor.js.map +0 -7
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/messages/ParallelTasksGroupView.tsx"],
4
+ "sourcesContent": ["/**\n * Parallel Tasks Group View\n *\n * Renders a group of concurrent tasks as a unified module.\n * Displays completion progress and individual task status.\n */\n\nimport React from 'react'\nimport { Box, Text } from 'ink'\nimport type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport type { MessageGroup, DisplayConfig } from '@minto-types/messageGroup'\nimport type { AgentTranscript } from '@utils/agentTranscripts'\nimport type { NormalizedMessage } from '@utils/messages'\nimport { ToolUseLoader } from '@components/ToolUseLoader'\nimport { TreeConnector, TreeContinuation } from '@components/TreeConnector'\nimport { CollapsibleHint } from '@components/CollapsibleHint'\nimport { TaskInModuleView } from './TaskInModuleView'\nimport { ParallelTasksHandler } from '@utils/groupHandlers/parallelTasksHandler'\nimport { MARGIN_BEFORE_MODULE, INDENT_LEVELS } from '@constants/formatRules'\nimport { SYMBOLS } from '@constants/symbols'\nimport {\n SEMANTIC_COLORS,\n STATUS_COLORS,\n VALUE_TIER_COLORS,\n} from '@constants/colors'\nimport { formatMetaInfo } from '@utils/taskDisplayUtils'\n\ninterface Props {\n /** The parallel tasks group */\n group: MessageGroup\n /** Normalized messages for looking up task info */\n messages: NormalizedMessage[]\n /** Transcripts by agentId */\n transcripts: Map<string, AgentTranscript>\n /** Outputs by toolUseId */\n outputs: Map<string, ToolResultBlockParam>\n /** Display configuration */\n displayConfig: DisplayConfig\n /** Whether to animate */\n shouldAnimate: boolean\n /**\n * Function to get transcript by agentId with lazy loading from disk.\n * Essential for loading historical transcripts that aren't in memory.\n */\n getTranscript?: (agentId: string) => AgentTranscript | null\n}\n\nexport function ParallelTasksGroupView({\n group,\n messages,\n transcripts,\n outputs,\n displayConfig,\n shouldAnimate,\n getTranscript,\n}: Props): React.ReactNode {\n const memberIds = (group.metadata.siblingToolUseIds as string[]) || []\n\n // Helper to get transcript - use getTranscript for lazy loading, fallback to Map\n const getTranscriptForAgent = (agentId: string): AgentTranscript | null => {\n return getTranscript?.(agentId) ?? transcripts.get(agentId) ?? null\n }\n\n // Get task info for each member\n const memberInfos = ParallelTasksHandler.getMemberTaskInfo(group, messages)\n\n // Count completions - check both transcript status AND output existence\n const completedCount = memberInfos.filter(info => {\n // Check if output exists (definitive completion signal)\n const output = outputs.get(info.toolUseId)\n if (output) return true\n\n // Fallback to transcript status\n if (!info.agentId) return false\n const transcript = getTranscriptForAgent(info.agentId)\n return transcript?.status === 'completed'\n }).length\n\n const totalCount = memberInfos.length\n\n // Determine completion status - use actual completion count as primary signal\n // This is more reliable than group.status which may have timing issues\n const isCompleted = completedCount === totalCount && totalCount > 0\n\n // \u4F7F\u7528 REPL \u89C4\u8303\u5B9A\u4E49\u7684\u8BED\u4E49\u989C\u8272\n const statusColor = isCompleted\n ? SEMANTIC_COLORS.success\n : group.status === 'running'\n ? SEMANTIC_COLORS.running\n : SEMANTIC_COLORS.dim\n\n // \u4F7F\u7528 REPL \u89C4\u8303\u5B9A\u4E49\u7684\u7B26\u53F7\uFF1A\u5E76\u884C\u4EFB\u52A1\u7EC4 \u25C8\n const groupSymbol = isCompleted\n ? SYMBOLS.TOOL_SUCCESS\n : SYMBOLS.PARALLEL_GROUP\n\n // \u8BA1\u7B97\u7EC4\u7EA7\u522B\u7684\u5143\u4FE1\u606F\uFF08\u7528\u4E8E verbose \u6A21\u5F0F\uFF09\n const groupMetaInfo = (() => {\n if (!isCompleted) return null\n\n // \u83B7\u53D6\u6240\u6709\u5DF2\u5B8C\u6210\u4EFB\u52A1\u7684 transcript\n const completedTranscripts: AgentTranscript[] = []\n for (const info of memberInfos) {\n if (info.agentId) {\n const transcript = getTranscriptForAgent(info.agentId)\n if (transcript?.endTime) {\n completedTranscripts.push(transcript)\n }\n }\n }\n\n if (completedTranscripts.length === 0) return null\n\n // \u8BA1\u7B97\u603B\u8017\u65F6\uFF08\u4ECE\u6700\u65E9\u5F00\u59CB\u5230\u6700\u665A\u7ED3\u675F\uFF09\n const startTimes = completedTranscripts.map(t => t.startTime)\n const endTimes = completedTranscripts.map(t => t.endTime!)\n const earliestStart = Math.min(...startTimes)\n const latestEnd = Math.max(...endTimes)\n const totalDuration = latestEnd - earliestStart\n\n return {\n duration: totalDuration,\n timestamp: latestEnd,\n }\n })()\n\n return (\n <Box flexDirection=\"column\" width=\"100%\" marginTop={MARGIN_BEFORE_MODULE}>\n {/* Module header - \u4F7F\u7528 REPL \u89C4\u8303\u7B26\u53F7 */}\n <Box flexDirection=\"row\">\n {/* \u4F7F\u7528 \u25C8 \u4F5C\u4E3A\u5E76\u884C\u4EFB\u52A1\u7EC4\u7B26\u53F7\uFF0C\u5B8C\u6210\u65F6\u4F7F\u7528 \u2713 */}\n <Text color={statusColor}>{groupSymbol} </Text>\n <Text bold color={SEMANTIC_COLORS.secondary}>\n Parallel Tasks\n </Text>\n <Text> </Text>\n {/* \u8FDB\u5EA6\u6570\u5B57\uFF1A\u5B8C\u6210\u6570\u7528 success \u8272\uFF0C\u603B\u6570\u7528 dim \u8272 */}\n <Text>(</Text>\n <Text color={SEMANTIC_COLORS.success}>{completedCount}</Text>\n <Text color={SEMANTIC_COLORS.dim}>/{totalCount}</Text>\n <Text> finished)</Text>\n {/* Verbose mode: \u663E\u793A\u7EC4\u7EA7\u522B\u7684\u5143\u4FE1\u606F */}\n {displayConfig.showMetaInfo && groupMetaInfo && (\n <Text color={VALUE_TIER_COLORS.meta}>\n {' '}\n {formatMetaInfo({\n duration: groupMetaInfo.duration,\n timestamp: groupMetaInfo.timestamp,\n })}\n </Text>\n )}\n {/* Show expand hint in normal mode when completed */}\n <CollapsibleHint\n canExpand={isCompleted && !displayConfig.showAllChildren}\n />\n </Box>\n\n {/* Member tasks - \u4F7F\u7528 REPL \u89C4\u8303\u5B9A\u4E49\u7684\u7F29\u8FDB\u5C42\u7EA7 L1 */}\n <Box flexDirection=\"column\" marginLeft={INDENT_LEVELS.L1}>\n {memberInfos.map((info, index) => {\n const isLast = index === memberInfos.length - 1\n const transcript = info.agentId\n ? getTranscriptForAgent(info.agentId)\n : null\n const output = outputs.get(info.toolUseId)\n\n return (\n <Box key={info.toolUseId} flexDirection=\"row\">\n {/* Tree connector */}\n <TreeConnector isLast={isLast} />\n\n {/* Task content */}\n <TaskInModuleView\n toolUseId={info.toolUseId}\n description={info.description}\n agentType={info.agentType}\n transcript={transcript}\n output={output || null}\n config={displayConfig}\n shouldAnimate={shouldAnimate}\n inModule={true}\n isLastInModule={isLast}\n />\n </Box>\n )\n })}\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,198 @@
1
+ import React, { useState, useEffect } from "react";
2
+ import { Box, Text } from "ink";
3
+ import { ToolUseLoader } from "../ToolUseLoader.js";
4
+ import { TreeContinuation } from "../TreeConnector.js";
5
+ import { TaskToolMessage } from "./TaskToolMessage.js";
6
+ import {
7
+ getTaskDisplayContent,
8
+ getStatusIcon,
9
+ getStatusColor,
10
+ getToolUseHistoryForDisplay,
11
+ getToolDisplayName,
12
+ truncate,
13
+ formatMetaInfo
14
+ } from "../../utils/taskDisplayUtils.js";
15
+ import { formatDuration } from "../../utils/format.js";
16
+ import { NestedTasksPreview } from "./NestedTasksPreview.js";
17
+ import { TaskOutputContent, TaskOutputSummary } from "./TaskOutputContent.js";
18
+ import { CollapsibleHint } from "../CollapsibleHint.js";
19
+ import { formatStats, formatCount } from "../../constants/formatRules.js";
20
+ import { SYMBOLS } from "../../constants/symbols.js";
21
+ import {
22
+ SEMANTIC_COLORS,
23
+ VALUE_TIER_COLORS
24
+ } from "../../constants/colors.js";
25
+ function formatTokens(count) {
26
+ if (count >= 1e3) {
27
+ return `${(count / 1e3).toFixed(1)}k`;
28
+ }
29
+ return String(count);
30
+ }
31
+ function ToolUseHistoryDisplay({
32
+ transcript,
33
+ config,
34
+ inModule,
35
+ isLastInModule,
36
+ isTaskCompleted = false
37
+ }) {
38
+ const { tools: rawTools, hiddenCount } = getToolUseHistoryForDisplay(
39
+ transcript,
40
+ config
41
+ );
42
+ const tools = isTaskCompleted ? rawTools.map((tool) => ({ ...tool, isExecuting: false })) : rawTools;
43
+ if (tools.length === 0) {
44
+ return null;
45
+ }
46
+ const maxDescChars = config.showAllChildren ? config.maxCharsPerChild : config.maxCharsWithoutChildren;
47
+ const renderRow = (key, content) => /* @__PURE__ */ React.createElement(Box, { key, flexDirection: "row" }, inModule && /* @__PURE__ */ React.createElement(TreeContinuation, { parentIsLast: isLastInModule }), !inModule && /* @__PURE__ */ React.createElement(Box, { minWidth: 4 }), content);
48
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, hiddenCount > 0 && renderRow(
49
+ "hidden-count",
50
+ /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "... ", hiddenCount, " earlier tools hidden")
51
+ ), tools.map((tool) => {
52
+ const displayName = getToolDisplayName(tool.name);
53
+ const description = truncate(tool.description, maxDescChars);
54
+ return renderRow(
55
+ tool.id,
56
+ /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, tool.isExecuting ? /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.running }, SYMBOLS.TOOL_RUNNING, " ") : /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, SYMBOLS.CHILD_OUTPUT, " "), /* @__PURE__ */ React.createElement(
57
+ Text,
58
+ {
59
+ color: tool.isExecuting ? SEMANTIC_COLORS.running : SEMANTIC_COLORS.secondary
60
+ },
61
+ displayName
62
+ ), description && /* @__PURE__ */ React.createElement(
63
+ Text,
64
+ {
65
+ color: tool.isExecuting ? SEMANTIC_COLORS.running : SEMANTIC_COLORS.dim
66
+ },
67
+ "(",
68
+ description,
69
+ ")"
70
+ ), tool.isExecuting && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.running }, SYMBOLS.SUFFIX_RUNNING))
71
+ );
72
+ }));
73
+ }
74
+ function TaskInModuleView({
75
+ toolUseId,
76
+ description,
77
+ agentType,
78
+ transcript,
79
+ output,
80
+ config,
81
+ shouldAnimate,
82
+ inModule = false,
83
+ isLastInModule = false
84
+ }) {
85
+ const transcriptStatus = transcript?.status || "pending";
86
+ const status = output && transcriptStatus === "pending" ? "completed" : transcriptStatus;
87
+ const statusIcon = getStatusIcon(status);
88
+ const statusColor = getStatusColor(status);
89
+ const displayContent = transcript ? getTaskDisplayContent(transcript, config) : null;
90
+ const isCompleted = status === "completed" || !!output;
91
+ const isError = status === "failed";
92
+ const isRunning = status === "running";
93
+ const [elapsedMs, setElapsedMs] = useState(() => {
94
+ if (transcript?.startTime && isRunning) {
95
+ return Date.now() - transcript.startTime;
96
+ }
97
+ return 0;
98
+ });
99
+ useEffect(() => {
100
+ if (!isRunning || !transcript?.startTime) {
101
+ return;
102
+ }
103
+ const interval = setInterval(() => {
104
+ setElapsedMs(Date.now() - transcript.startTime);
105
+ }, 1e3);
106
+ return () => clearInterval(interval);
107
+ }, [isRunning, transcript?.startTime]);
108
+ const getDurationDisplay = () => {
109
+ if (!transcript) return null;
110
+ if (transcript.endTime && transcript.startTime) {
111
+ return formatDuration(transcript.endTime - transcript.startTime);
112
+ }
113
+ if (isRunning && transcript.startTime) {
114
+ return formatDuration(elapsedMs);
115
+ }
116
+ return null;
117
+ };
118
+ const duration = getDurationDisplay();
119
+ const totalTokens = transcript ? transcript.tokenUsage.inputTokens + transcript.tokenUsage.outputTokens : 0;
120
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width: "100%" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, !inModule && /* @__PURE__ */ React.createElement(
121
+ ToolUseLoader,
122
+ {
123
+ shouldAnimate: shouldAnimate && !isCompleted,
124
+ isUnresolved: !isCompleted,
125
+ isError
126
+ }
127
+ ), inModule && /* @__PURE__ */ React.createElement(Text, { color: statusColor }, statusIcon, " "), /* @__PURE__ */ React.createElement(
128
+ TaskToolMessage,
129
+ {
130
+ agentType,
131
+ bold: true,
132
+ children: description
133
+ }
134
+ ), inModule && isCompleted && transcript && /* @__PURE__ */ React.createElement(React.Fragment, null, config.showMetaInfo ? (
135
+ // Verbose mode: 使用 formatMetaInfo 显示 "耗时 · 模型 · 时间"
136
+ /* @__PURE__ */ React.createElement(Text, { color: VALUE_TIER_COLORS.meta }, " ", "(", formatMetaInfo({
137
+ duration: transcript.endTime ? transcript.endTime - transcript.startTime : void 0,
138
+ model: transcript.model,
139
+ timestamp: transcript.endTime
140
+ }), transcript.toolUseCount > 0 && ` \xB7 ${formatCount(transcript.toolUseCount, "tool")}`, ")")
141
+ ) : (
142
+ // Normal mode: 简洁显示
143
+ /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", "(", formatStats([
144
+ formatCount(transcript.toolUseCount, "tool"),
145
+ `${formatTokens(totalTokens)} tokens`,
146
+ duration
147
+ ]), ")")
148
+ )), inModule && status === "running" && transcript && /* @__PURE__ */ React.createElement(Text, { color: VALUE_TIER_COLORS.meta }, " ", "(", config.showMetaInfo ? formatMetaInfo({
149
+ model: transcript.model,
150
+ timestamp: Date.now()
151
+ }) : formatStats([
152
+ transcript.toolUseCount > 0 ? formatCount(transcript.toolUseCount, "tool") : null,
153
+ duration,
154
+ // Show output tokens with ↓ indicator (tokens being received)
155
+ transcript.tokenUsage.outputTokens > 0 ? `\u2193 ${formatTokens(transcript.tokenUsage.outputTokens)} tokens` : null
156
+ ]), ")"), !inModule && transcript && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " [", transcript.agentId.slice(0, 8), "]")), !inModule && transcript && /* @__PURE__ */ React.createElement(Box, { marginLeft: 4 }, config.showMetaInfo ? (
157
+ // Verbose mode: 使用元信息格式 "耗时 · 模型 · 时间"
158
+ /* @__PURE__ */ React.createElement(Text, { color: VALUE_TIER_COLORS.meta }, status === "completed" ? "\u2713" : "\u22EF", " ", formatMetaInfo({
159
+ duration: transcript.endTime ? transcript.endTime - transcript.startTime : void 0,
160
+ model: transcript.model,
161
+ timestamp: transcript.endTime || Date.now()
162
+ }), " \xB7 ", "Tools: ", transcript.toolUseCount, " \xB7 Tokens:", " ", formatTokens(totalTokens))
163
+ ) : (
164
+ // Normal mode: 简洁显示
165
+ /* @__PURE__ */ React.createElement(Text, { dimColor: true }, status === "completed" ? "\u2713" : "\u22EF", " Tools:", " ", transcript.toolUseCount, " | Tokens: ", formatTokens(totalTokens), duration ? ` | ${duration}` : "")
166
+ )), transcript && /* @__PURE__ */ React.createElement(
167
+ ToolUseHistoryDisplay,
168
+ {
169
+ transcript,
170
+ config,
171
+ inModule,
172
+ isLastInModule,
173
+ isTaskCompleted: isCompleted
174
+ }
175
+ ), displayContent && status === "running" && displayContent.type === "nested" && /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, inModule && /* @__PURE__ */ React.createElement(TreeContinuation, { parentIsLast: isLastInModule }), !inModule && /* @__PURE__ */ React.createElement(Box, { minWidth: 4 }), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(
176
+ NestedTasksPreview,
177
+ {
178
+ tasks: displayContent.children || [],
179
+ hiddenCount: displayContent.hiddenCount || 0
180
+ }
181
+ ))), output && isCompleted && /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, inModule && /* @__PURE__ */ React.createElement(TreeContinuation, { parentIsLast: isLastInModule }), !inModule && /* @__PURE__ */ React.createElement(Box, { minWidth: 4 }), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, config.showAllChildren ? (
182
+ // Verbose mode: show full output with header
183
+ /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Output \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(TaskOutputContent, { content: output.content })))
184
+ ) : (
185
+ // Normal mode: show compact summary with expand hint
186
+ /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(
187
+ TaskOutputSummary,
188
+ {
189
+ content: output.content,
190
+ maxChars: config.maxCharsWithoutChildren
191
+ }
192
+ ), /* @__PURE__ */ React.createElement(CollapsibleHint, { canExpand: true }))
193
+ ))));
194
+ }
195
+ export {
196
+ TaskInModuleView
197
+ };
198
+ //# sourceMappingURL=TaskInModuleView.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/messages/TaskInModuleView.tsx"],
4
+ "sourcesContent": ["/**\n * Task In Module View\n *\n * Renders a single Task within a parallel module or standalone.\n * Supports intermediate state display and final output embedding.\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport type { AgentTranscript } from '@utils/agentTranscripts'\nimport type { DisplayConfig } from '@minto-types/messageGroup'\nimport { ToolUseLoader } from '@components/ToolUseLoader'\nimport { TreeContinuation } from '@components/TreeConnector'\nimport { TaskToolMessage } from './TaskToolMessage'\nimport {\n getTaskDisplayContent,\n getStatusIcon,\n getStatusColor,\n getToolUseHistoryForDisplay,\n getToolDisplayName,\n truncate,\n formatMetaInfo,\n type MetaInfo,\n} from '@utils/taskDisplayUtils'\nimport { formatDuration } from '@utils/format'\nimport { NestedTasksPreview } from './NestedTasksPreview'\nimport { TaskOutputContent, TaskOutputSummary } from './TaskOutputContent'\nimport { CollapsibleHint } from '@components/CollapsibleHint'\nimport { formatStats, formatCount } from '@constants/formatRules'\nimport { SYMBOLS } from '@constants/symbols'\nimport {\n SEMANTIC_COLORS,\n STATUS_COLORS,\n VALUE_TIER_COLORS,\n} from '@constants/colors'\n\n/**\n * Format token count with K suffix for readability\n */\nfunction formatTokens(count: number): string {\n if (count >= 1000) {\n return `${(count / 1000).toFixed(1)}k`\n }\n return String(count)\n}\n\n/**\n * Tool Use History Display Component\n *\n * Displays tool use history for completed tasks.\n * - Normal mode: Shows recent N tools with truncated descriptions\n * - Verbose mode: Shows all tools with longer descriptions\n */\ninterface ToolUseHistoryDisplayProps {\n transcript: AgentTranscript\n config: DisplayConfig\n inModule: boolean\n isLastInModule: boolean\n /** When true, forces all tools to show as completed (not executing) */\n isTaskCompleted?: boolean\n}\n\nfunction ToolUseHistoryDisplay({\n transcript,\n config,\n inModule,\n isLastInModule,\n isTaskCompleted = false,\n}: ToolUseHistoryDisplayProps): React.ReactNode {\n const { tools: rawTools, hiddenCount } = getToolUseHistoryForDisplay(\n transcript,\n config,\n )\n\n // When task is completed, force all tools to show as not executing\n // This prevents color flashing due to race conditions in transcript updates\n const tools = isTaskCompleted\n ? rawTools.map(tool => ({ ...tool, isExecuting: false }))\n : rawTools\n\n // Don't render if no tools\n if (tools.length === 0) {\n return null\n }\n\n // Determine max chars for description based on mode\n const maxDescChars = config.showAllChildren\n ? config.maxCharsPerChild // verbose: 200 chars\n : config.maxCharsWithoutChildren // normal: 80 chars\n\n // Helper to render a row with proper tree continuation\n const renderRow = (key: string, content: React.ReactNode) => (\n <Box key={key} flexDirection=\"row\">\n {inModule && <TreeContinuation parentIsLast={isLastInModule} />}\n {!inModule && <Box minWidth={4} />}\n {content}\n </Box>\n )\n\n return (\n <Box flexDirection=\"column\">\n {/* Hidden count indicator */}\n {hiddenCount > 0 &&\n renderRow(\n 'hidden-count',\n <Text dimColor>... {hiddenCount} earlier tools hidden</Text>,\n )}\n {/* Tool list - each tool gets its own row with tree continuation */}\n {tools.map(tool => {\n const displayName = getToolDisplayName(tool.name)\n const description = truncate(tool.description, maxDescChars)\n return renderRow(\n tool.id,\n <Box flexDirection=\"row\">\n {/* \u4F7F\u7528 REPL \u89C4\u8303\u5B9A\u4E49\u7684\u7B26\u53F7\uFF1A\u6267\u884C\u4E2D \u25D0\uFF0C\u5B8C\u6210 \u23BF */}\n {tool.isExecuting ? (\n <Text color={SEMANTIC_COLORS.running}>\n {SYMBOLS.TOOL_RUNNING}{' '}\n </Text>\n ) : (\n <Text color={SEMANTIC_COLORS.dim}>{SYMBOLS.CHILD_OUTPUT} </Text>\n )}\n {/* \u5DE5\u5177\u540D\u4F7F\u7528 secondary \u8272\uFF0C\u53C2\u6570\u4F7F\u7528 dim \u8272 */}\n <Text\n color={\n tool.isExecuting\n ? SEMANTIC_COLORS.running\n : SEMANTIC_COLORS.secondary\n }\n >\n {displayName}\n </Text>\n {description && (\n <Text\n color={\n tool.isExecuting\n ? SEMANTIC_COLORS.running\n : SEMANTIC_COLORS.dim\n }\n >\n ({description})\n </Text>\n )}\n {tool.isExecuting && (\n <Text color={SEMANTIC_COLORS.running}>\n {SYMBOLS.SUFFIX_RUNNING}\n </Text>\n )}\n </Box>,\n )\n })}\n </Box>\n )\n}\n\ninterface Props {\n /** Tool use ID of this task */\n toolUseId: string\n /** Task description */\n description: string\n /** Agent type */\n agentType: string\n /** Transcript if available */\n transcript: AgentTranscript | null\n /** Output if completed */\n output: ToolResultBlockParam | null\n /** Display configuration */\n config: DisplayConfig\n /** Whether to animate */\n shouldAnimate: boolean\n /** Whether this is inside a parallel module */\n inModule?: boolean\n /** Whether this is the last item in the module (for tree continuation lines) */\n isLastInModule?: boolean\n}\n\nexport function TaskInModuleView({\n toolUseId,\n description,\n agentType,\n transcript,\n output,\n config,\n shouldAnimate,\n inModule = false,\n isLastInModule = false,\n}: Props): React.ReactNode {\n // Determine completion status: use transcript status if available, or check if output exists\n const transcriptStatus = transcript?.status || 'pending'\n // If output exists but transcript shows pending, the task is actually completed\n const status =\n output && transcriptStatus === 'pending' ? 'completed' : transcriptStatus\n const statusIcon = getStatusIcon(status)\n const statusColor = getStatusColor(status)\n\n // Get display content for intermediate state\n const displayContent = transcript\n ? getTaskDisplayContent(transcript, config)\n : null\n\n const isCompleted = status === 'completed' || !!output\n const isError = status === 'failed'\n const isRunning = status === 'running'\n\n // Real-time elapsed time counter for running tasks\n const [elapsedMs, setElapsedMs] = useState(() => {\n if (transcript?.startTime && isRunning) {\n return Date.now() - transcript.startTime\n }\n return 0\n })\n\n useEffect(() => {\n if (!isRunning || !transcript?.startTime) {\n return\n }\n\n // Update elapsed time every second\n const interval = setInterval(() => {\n setElapsedMs(Date.now() - transcript.startTime)\n }, 1000)\n\n return () => clearInterval(interval)\n }, [isRunning, transcript?.startTime])\n\n // Calculate duration for display\n const getDurationDisplay = (): string | null => {\n if (!transcript) return null\n if (transcript.endTime && transcript.startTime) {\n return formatDuration(transcript.endTime - transcript.startTime)\n }\n if (isRunning && transcript.startTime) {\n // Use real-time elapsed time for running tasks\n return formatDuration(elapsedMs)\n }\n return null\n }\n\n const duration = getDurationDisplay()\n const totalTokens = transcript\n ? transcript.tokenUsage.inputTokens + transcript.tokenUsage.outputTokens\n : 0\n\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n {/* Task header with inline stats for completed tasks */}\n <Box flexDirection=\"row\">\n {!inModule && (\n <ToolUseLoader\n shouldAnimate={shouldAnimate && !isCompleted}\n isUnresolved={!isCompleted}\n isError={isError}\n />\n )}\n {inModule && <Text color={statusColor}>{statusIcon} </Text>}\n <TaskToolMessage\n agentType={agentType}\n bold={true}\n children={description}\n />\n {/* Inline stats for completed tasks in module */}\n {inModule && isCompleted && transcript && (\n <>\n {config.showMetaInfo ? (\n // Verbose mode: \u4F7F\u7528 formatMetaInfo \u663E\u793A \"\u8017\u65F6 \u00B7 \u6A21\u578B \u00B7 \u65F6\u95F4\"\n <Text color={VALUE_TIER_COLORS.meta}>\n {' '}\n (\n {formatMetaInfo({\n duration: transcript.endTime\n ? transcript.endTime - transcript.startTime\n : undefined,\n model: transcript.model,\n timestamp: transcript.endTime,\n })}\n {transcript.toolUseCount > 0 &&\n ` \u00B7 ${formatCount(transcript.toolUseCount, 'tool')}`}\n )\n </Text>\n ) : (\n // Normal mode: \u7B80\u6D01\u663E\u793A\n <Text dimColor>\n {' '}\n (\n {formatStats([\n formatCount(transcript.toolUseCount, 'tool'),\n `${formatTokens(totalTokens)} tokens`,\n duration,\n ])}\n )\n </Text>\n )}\n </>\n )}\n {/* Running indicator with elapsed time, tokens, and model */}\n {inModule && status === 'running' && transcript && (\n <Text color={VALUE_TIER_COLORS.meta}>\n {' '}\n (\n {config.showMetaInfo\n ? formatMetaInfo({\n model: transcript.model,\n timestamp: Date.now(),\n })\n : formatStats([\n transcript.toolUseCount > 0\n ? formatCount(transcript.toolUseCount, 'tool')\n : null,\n duration,\n // Show output tokens with \u2193 indicator (tokens being received)\n transcript.tokenUsage.outputTokens > 0\n ? `\u2193 ${formatTokens(transcript.tokenUsage.outputTokens)} tokens`\n : null,\n ])}\n )\n </Text>\n )}\n {/* Agent ID for non-module view */}\n {!inModule && transcript && (\n <Text dimColor> [{transcript.agentId.slice(0, 8)}]</Text>\n )}\n </Box>\n\n {/* Detailed metadata row for non-module view */}\n {!inModule && transcript && (\n <Box marginLeft={4}>\n {config.showMetaInfo ? (\n // Verbose mode: \u4F7F\u7528\u5143\u4FE1\u606F\u683C\u5F0F \"\u8017\u65F6 \u00B7 \u6A21\u578B \u00B7 \u65F6\u95F4\"\n <Text color={VALUE_TIER_COLORS.meta}>\n {status === 'completed' ? '\u2713' : '\u22EF'}{' '}\n {formatMetaInfo({\n duration: transcript.endTime\n ? transcript.endTime - transcript.startTime\n : undefined,\n model: transcript.model,\n timestamp: transcript.endTime || Date.now(),\n })}\n {' \u00B7 '}Tools: {transcript.toolUseCount} \u00B7 Tokens:{' '}\n {formatTokens(totalTokens)}\n </Text>\n ) : (\n // Normal mode: \u7B80\u6D01\u663E\u793A\n <Text dimColor>\n {status === 'completed' ? '\u2713' : '\u22EF'} Tools:{' '}\n {transcript.toolUseCount} | Tokens: {formatTokens(totalTokens)}\n {duration ? ` | ${duration}` : ''}\n </Text>\n )}\n </Box>\n )}\n\n {/* Tool use history - show in BOTH running and completed states for real-time visibility */}\n {transcript && (\n <ToolUseHistoryDisplay\n transcript={transcript}\n config={config}\n inModule={inModule}\n isLastInModule={isLastInModule}\n isTaskCompleted={isCompleted}\n />\n )}\n\n {/* Nested tasks preview (when running and has nested tasks) */}\n {displayContent &&\n status === 'running' &&\n displayContent.type === 'nested' && (\n <Box flexDirection=\"row\">\n {inModule && <TreeContinuation parentIsLast={isLastInModule} />}\n {!inModule && <Box minWidth={4} />}\n <Box>\n <NestedTasksPreview\n tasks={displayContent.children || []}\n hiddenCount={displayContent.hiddenCount || 0}\n />\n </Box>\n </Box>\n )}\n\n {/* Final output (when completed) - respects verbose/normal mode */}\n {output && isCompleted && (\n <Box flexDirection=\"row\">\n {/* Show tree continuation line when in module */}\n {inModule && <TreeContinuation parentIsLast={isLastInModule} />}\n {!inModule && <Box minWidth={4} />}\n <Box flexDirection=\"column\">\n {config.showAllChildren ? (\n // Verbose mode: show full output with header\n <>\n <Text dimColor>Output \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500</Text>\n <Box marginLeft={2}>\n <TaskOutputContent content={output.content} />\n </Box>\n </>\n ) : (\n // Normal mode: show compact summary with expand hint\n <Box flexDirection=\"row\">\n <TaskOutputSummary\n content={output.content}\n maxChars={config.maxCharsWithoutChildren}\n />\n <CollapsibleHint canExpand={true} />\n </Box>\n )}\n </Box>\n </Box>\n )}\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,53 @@
1
+ import React from "react";
2
+ import { Box, Text } from "ink";
3
+ import { PREVIEW_SEPARATOR } from "../../constants/formatRules.js";
4
+ function TaskOutputContent({
5
+ content
6
+ }) {
7
+ if (!content) {
8
+ return /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "[No output]");
9
+ }
10
+ if (typeof content === "string") {
11
+ return /* @__PURE__ */ React.createElement(Text, null, content);
12
+ }
13
+ if (Array.isArray(content)) {
14
+ const texts = content.filter(
15
+ (block) => block.type === "text"
16
+ ).map((block) => block.text);
17
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, texts.map((text, i) => /* @__PURE__ */ React.createElement(Box, { key: `text-${i}` }, /* @__PURE__ */ React.createElement(Text, null, text))));
18
+ }
19
+ return /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "[Unknown content format]");
20
+ }
21
+ function TaskOutputSummary({
22
+ content,
23
+ maxChars = 80
24
+ }) {
25
+ if (!content) {
26
+ return /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u23BF Done");
27
+ }
28
+ let totalLength = 0;
29
+ let firstLine = "";
30
+ if (typeof content === "string") {
31
+ totalLength = content.length;
32
+ firstLine = content.split("\n")[0] || "";
33
+ } else if (Array.isArray(content)) {
34
+ const texts = content.filter(
35
+ (block) => block.type === "text"
36
+ ).map((block) => block.text);
37
+ totalLength = texts.reduce((sum, t) => sum + t.length, 0);
38
+ for (const text of texts) {
39
+ const lines = text.split("\n").filter((l) => l.trim());
40
+ if (lines[0]) {
41
+ firstLine = lines[0];
42
+ break;
43
+ }
44
+ }
45
+ }
46
+ const truncatedPreview = firstLine.length > maxChars ? firstLine.substring(0, maxChars) + "..." : firstLine;
47
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u23BF "), /* @__PURE__ */ React.createElement(Text, { color: "green" }, "Done"), truncatedPreview && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, PREVIEW_SEPARATOR, truncatedPreview));
48
+ }
49
+ export {
50
+ TaskOutputContent,
51
+ TaskOutputSummary
52
+ };
53
+ //# sourceMappingURL=TaskOutputContent.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/messages/TaskOutputContent.tsx"],
4
+ "sourcesContent": ["/**\n * Task Output Content Component\n *\n * Renders the content of a TaskOutput tool result.\n * Handles both string and array content formats.\n */\n\nimport React from 'react'\nimport { Box, Text } from 'ink'\nimport type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { PREVIEW_SEPARATOR, ABBREVIATIONS } from '@constants/formatRules'\n\ninterface TaskOutputContentProps {\n content: ToolResultBlockParam['content']\n}\n\nexport function TaskOutputContent({\n content,\n}: TaskOutputContentProps): React.ReactNode {\n if (!content) {\n return <Text dimColor>[No output]</Text>\n }\n\n if (typeof content === 'string') {\n // Simple string content\n return <Text>{content}</Text>\n }\n\n if (Array.isArray(content)) {\n // Array of content blocks - extract text from text blocks\n const texts = content\n .filter(\n (block): block is { type: 'text'; text: string } =>\n block.type === 'text',\n )\n .map(block => block.text)\n\n return (\n <Box flexDirection=\"column\">\n {texts.map((text, i) => (\n <Box key={`text-${i}`}>\n <Text>{text}</Text>\n </Box>\n ))}\n </Box>\n )\n }\n\n return <Text dimColor>[Unknown content format]</Text>\n}\n\n/**\n * Task Output Summary Component\n *\n * Shows a compact summary of task output for non-verbose mode.\n * Displays character count and optional truncated preview.\n */\ninterface TaskOutputSummaryProps {\n content: ToolResultBlockParam['content']\n maxChars?: number\n}\n\nexport function TaskOutputSummary({\n content,\n maxChars = 80,\n}: TaskOutputSummaryProps): React.ReactNode {\n if (!content) {\n return <Text dimColor>\u23BF Done</Text>\n }\n\n // Calculate total content length\n let totalLength = 0\n let firstLine = ''\n\n if (typeof content === 'string') {\n totalLength = content.length\n firstLine = content.split('\\n')[0] || ''\n } else if (Array.isArray(content)) {\n const texts = content\n .filter(\n (block): block is { type: 'text'; text: string } =>\n block.type === 'text',\n )\n .map(block => block.text)\n totalLength = texts.reduce((sum, t) => sum + t.length, 0)\n // Get first non-empty line\n for (const text of texts) {\n const lines = text.split('\\n').filter(l => l.trim())\n if (lines[0]) {\n firstLine = lines[0]\n break\n }\n }\n }\n\n // Truncate first line if too long\n const truncatedPreview =\n firstLine.length > maxChars\n ? firstLine.substring(0, maxChars) + '...'\n : firstLine\n\n // Format: \"Done\" or \"Done \u00B7 preview\" (simplified from Claude Code's style)\n return (\n <Box flexDirection=\"row\">\n <Text dimColor>\u23BF </Text>\n <Text color=\"green\">Done</Text>\n {truncatedPreview && (\n <Text dimColor>\n {PREVIEW_SEPARATOR}\n {truncatedPreview}\n </Text>\n )}\n </Box>\n )\n}\n"],
5
+ "mappings": "AAOA,OAAO,WAAW;AAClB,SAAS,KAAK,YAAY;AAE1B,SAAS,yBAAwC;AAM1C,SAAS,kBAAkB;AAAA,EAChC;AACF,GAA4C;AAC1C,MAAI,CAAC,SAAS;AACZ,WAAO,oCAAC,QAAK,UAAQ,QAAC,aAAW;AAAA,EACnC;AAEA,MAAI,OAAO,YAAY,UAAU;AAE/B,WAAO,oCAAC,YAAM,OAAQ;AAAA,EACxB;AAEA,MAAI,MAAM,QAAQ,OAAO,GAAG;AAE1B,UAAM,QAAQ,QACX;AAAA,MACC,CAAC,UACC,MAAM,SAAS;AAAA,IACnB,EACC,IAAI,WAAS,MAAM,IAAI;AAE1B,WACE,oCAAC,OAAI,eAAc,YAChB,MAAM,IAAI,CAAC,MAAM,MAChB,oCAAC,OAAI,KAAK,QAAQ,CAAC,MACjB,oCAAC,YAAM,IAAK,CACd,CACD,CACH;AAAA,EAEJ;AAEA,SAAO,oCAAC,QAAK,UAAQ,QAAC,0BAAwB;AAChD;AAaO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,WAAW;AACb,GAA4C;AAC1C,MAAI,CAAC,SAAS;AACZ,WAAO,oCAAC,QAAK,UAAQ,QAAC,aAAM;AAAA,EAC9B;AAGA,MAAI,cAAc;AAClB,MAAI,YAAY;AAEhB,MAAI,OAAO,YAAY,UAAU;AAC/B,kBAAc,QAAQ;AACtB,gBAAY,QAAQ,MAAM,IAAI,EAAE,CAAC,KAAK;AAAA,EACxC,WAAW,MAAM,QAAQ,OAAO,GAAG;AACjC,UAAM,QAAQ,QACX;AAAA,MACC,CAAC,UACC,MAAM,SAAS;AAAA,IACnB,EACC,IAAI,WAAS,MAAM,IAAI;AAC1B,kBAAc,MAAM,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,CAAC;AAExD,eAAW,QAAQ,OAAO;AACxB,YAAM,QAAQ,KAAK,MAAM,IAAI,EAAE,OAAO,OAAK,EAAE,KAAK,CAAC;AACnD,UAAI,MAAM,CAAC,GAAG;AACZ,oBAAY,MAAM,CAAC;AACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,mBACJ,UAAU,SAAS,WACf,UAAU,UAAU,GAAG,QAAQ,IAAI,QACnC;AAGN,SACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,UAAQ,QAAC,SAAE,GACjB,oCAAC,QAAK,OAAM,WAAQ,MAAI,GACvB,oBACC,oCAAC,QAAK,UAAQ,QACX,mBACA,gBACH,CAEJ;AAEJ;",
6
+ "names": []
7
+ }
@@ -12,7 +12,7 @@ function UserPromptMessage({
12
12
  logError("No content found in user prompt message");
13
13
  return null;
14
14
  }
15
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginTop: addMargin ? 1 : 0, width: "100%" }, /* @__PURE__ */ React.createElement(Box, { minWidth: 2, width: 2 }, /* @__PURE__ */ React.createElement(Text, { color: getTheme().secondaryText }, ">")), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width: columns - 4 }, /* @__PURE__ */ React.createElement(Text, { color: getTheme().secondaryText, wrap: "wrap" }, text)));
15
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginTop: addMargin ? 1 : 0, width: "100%" }, /* @__PURE__ */ React.createElement(Box, { minWidth: 2, width: 2 }, /* @__PURE__ */ React.createElement(Text, { color: getTheme().secondaryText, bold: true }, "\u276F")), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width: columns - 4 }, /* @__PURE__ */ React.createElement(Text, { color: getTheme().secondaryText, wrap: "wrap" }, text)));
16
16
  }
17
17
  export {
18
18
  UserPromptMessage
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/messages/UserPromptMessage.tsx"],
4
- "sourcesContent": ["import React from 'react'\nimport { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { logError } from '@utils/log'\nimport { useTerminalSize } from '@hooks/useTerminalSize'\n\ntype Props = {\n addMargin: boolean\n param: TextBlockParam\n}\n\nexport function UserPromptMessage({\n addMargin,\n param: { text },\n}: Props): React.ReactNode {\n const { columns } = useTerminalSize()\n if (!text) {\n logError('No content found in user prompt message')\n return null\n }\n\n return (\n <Box flexDirection=\"row\" marginTop={addMargin ? 1 : 0} width=\"100%\">\n <Box minWidth={2} width={2}>\n <Text color={getTheme().secondaryText}>&gt;</Text>\n </Box>\n <Box flexDirection=\"column\" width={columns - 4}>\n <Text color={getTheme().secondaryText} wrap=\"wrap\">\n {text}\n </Text>\n </Box>\n </Box>\n )\n}\n"],
5
- "mappings": "AAAA,OAAO,WAAW;AAElB,SAAS,KAAK,YAAY;AAC1B,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAOzB,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,OAAO,EAAE,KAAK;AAChB,GAA2B;AACzB,QAAM,EAAE,QAAQ,IAAI,gBAAgB;AACpC,MAAI,CAAC,MAAM;AACT,aAAS,yCAAyC;AAClD,WAAO;AAAA,EACT;AAEA,SACE,oCAAC,OAAI,eAAc,OAAM,WAAW,YAAY,IAAI,GAAG,OAAM,UAC3D,oCAAC,OAAI,UAAU,GAAG,OAAO,KACvB,oCAAC,QAAK,OAAO,SAAS,EAAE,iBAAe,GAAI,CAC7C,GACA,oCAAC,OAAI,eAAc,UAAS,OAAO,UAAU,KAC3C,oCAAC,QAAK,OAAO,SAAS,EAAE,eAAe,MAAK,UACzC,IACH,CACF,CACF;AAEJ;",
4
+ "sourcesContent": ["import React from 'react'\nimport { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { logError } from '@utils/log'\nimport { useTerminalSize } from '@hooks/useTerminalSize'\n\ntype Props = {\n addMargin: boolean\n param: TextBlockParam\n}\n\nexport function UserPromptMessage({\n addMargin,\n param: { text },\n}: Props): React.ReactNode {\n const { columns } = useTerminalSize()\n if (!text) {\n logError('No content found in user prompt message')\n return null\n }\n\n return (\n <Box flexDirection=\"row\" marginTop={addMargin ? 1 : 0} width=\"100%\">\n <Box minWidth={2} width={2}>\n <Text color={getTheme().secondaryText} bold>\n \u276F\n </Text>\n </Box>\n <Box flexDirection=\"column\" width={columns - 4}>\n <Text color={getTheme().secondaryText} wrap=\"wrap\">\n {text}\n </Text>\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "AAAA,OAAO,WAAW;AAElB,SAAS,KAAK,YAAY;AAC1B,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAOzB,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,OAAO,EAAE,KAAK;AAChB,GAA2B;AACzB,QAAM,EAAE,QAAQ,IAAI,gBAAgB;AACpC,MAAI,CAAC,MAAM;AACT,aAAS,yCAAyC;AAClD,WAAO;AAAA,EACT;AAEA,SACE,oCAAC,OAAI,eAAc,OAAM,WAAW,YAAY,IAAI,GAAG,OAAM,UAC3D,oCAAC,OAAI,UAAU,GAAG,OAAO,KACvB,oCAAC,QAAK,OAAO,SAAS,EAAE,eAAe,MAAI,QAAC,QAE5C,CACF,GACA,oCAAC,OAAI,eAAc,UAAS,OAAO,UAAU,KAC3C,oCAAC,QAAK,OAAO,SAAS,EAAE,eAAe,MAAK,UACzC,IACH,CACF,CACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,7 @@
1
1
  import { Box } from "ink";
2
2
  import * as React from "react";
3
3
  import { useGetToolFromMessages } from "./utils.js";
4
+ import { safeRenderToolResult } from "../../../utils/tooling/safeRender.js";
4
5
  function UserToolSuccessMessage({
5
6
  param,
6
7
  message,
@@ -12,9 +13,7 @@ function UserToolSuccessMessage({
12
13
  const { tool } = useGetToolFromMessages(param.tool_use_id, tools, messages);
13
14
  return (
14
15
  // TODO: Distinguish UserMessage from UserToolResultMessage
15
- /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width }, tool.renderToolResultMessage?.(message.toolUseResult.data, {
16
- verbose
17
- }))
16
+ /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width }, safeRenderToolResult(tool, message.toolUseResult?.data, { verbose }))
18
17
  );
19
18
  }
20
19
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx"],
4
- "sourcesContent": ["import { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Box } from 'ink'\nimport * as React from 'react'\nimport { Tool } from '@tool'\nimport { Message, UserMessage } from '@query'\nimport { useGetToolFromMessages } from './utils'\n\ntype Props = {\n param: ToolResultBlockParam\n message: UserMessage\n messages: Message[]\n verbose: boolean\n tools: Tool[]\n width: number | string\n}\n\nexport function UserToolSuccessMessage({\n param,\n message,\n messages,\n tools,\n verbose,\n width,\n}: Props): React.ReactNode {\n const { tool } = useGetToolFromMessages(param.tool_use_id, tools, messages)\n\n return (\n // TODO: Distinguish UserMessage from UserToolResultMessage\n <Box flexDirection=\"column\" width={width}>\n {tool.renderToolResultMessage?.(message.toolUseResult!.data as never, {\n verbose,\n })}\n </Box>\n )\n}\n"],
5
- "mappings": "AACA,SAAS,WAAW;AACpB,YAAY,WAAW;AAGvB,SAAS,8BAA8B;AAWhC,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,EAAE,KAAK,IAAI,uBAAuB,MAAM,aAAa,OAAO,QAAQ;AAE1E;AAAA;AAAA,IAEE,oCAAC,OAAI,eAAc,UAAS,SACzB,KAAK,0BAA0B,QAAQ,cAAe,MAAe;AAAA,MACpE;AAAA,IACF,CAAC,CACH;AAAA;AAEJ;",
4
+ "sourcesContent": ["import { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Box } from 'ink'\nimport * as React from 'react'\nimport { Tool } from '@tool'\nimport { Message, UserMessage } from '@query'\nimport { useGetToolFromMessages } from './utils'\nimport { safeRenderToolResult } from '@utils/tooling/safeRender'\n\ntype Props = {\n param: ToolResultBlockParam\n message: UserMessage\n messages: Message[]\n verbose: boolean\n tools: Tool[]\n width: number | string\n}\n\nexport function UserToolSuccessMessage({\n param,\n message,\n messages,\n tools,\n verbose,\n width,\n}: Props): React.ReactNode {\n const { tool } = useGetToolFromMessages(param.tool_use_id, tools, messages)\n\n return (\n // TODO: Distinguish UserMessage from UserToolResultMessage\n <Box flexDirection=\"column\" width={width}>\n {safeRenderToolResult(tool, message.toolUseResult?.data, { verbose })}\n </Box>\n )\n}\n"],
5
+ "mappings": "AACA,SAAS,WAAW;AACpB,YAAY,WAAW;AAGvB,SAAS,8BAA8B;AACvC,SAAS,4BAA4B;AAW9B,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,EAAE,KAAK,IAAI,uBAAuB,MAAM,aAAa,OAAO,QAAQ;AAE1E;AAAA;AAAA,IAEE,oCAAC,OAAI,eAAc,UAAS,SACzB,qBAAqB,MAAM,QAAQ,eAAe,MAAM,EAAE,QAAQ,CAAC,CACtE;AAAA;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -17,6 +17,7 @@ import chalk from "chalk";
17
17
  import {
18
18
  usePermissionRequestLogging
19
19
  } from "../../hooks/usePermissionRequestLogging.js";
20
+ import { safeRenderToolUseMessage } from "../../utils/tooling/safeRender.js";
20
21
  function FallbackPermissionRequest({
21
22
  toolUseConfirm,
22
23
  onDone,
@@ -51,10 +52,9 @@ function FallbackPermissionRequest({
51
52
  riskScore: toolUseConfirm.riskScore
52
53
  }
53
54
  ),
54
- /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingX: 2, paddingY: 1 }, /* @__PURE__ */ React.createElement(Text, null, userFacingName, "(", toolUseConfirm.tool.renderToolUseMessage(
55
- toolUseConfirm.input,
56
- { verbose }
57
- ), ")", originalUserFacingName.endsWith(" (MCP)") ? /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " (MCP)") : ""), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, toolUseConfirm.description)),
55
+ /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingX: 2, paddingY: 1 }, /* @__PURE__ */ React.createElement(Text, null, userFacingName, "(", safeRenderToolUseMessage(toolUseConfirm.tool, toolUseConfirm.input, {
56
+ verbose
57
+ }), ")", originalUserFacingName.endsWith(" (MCP)") ? /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " (MCP)") : ""), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, toolUseConfirm.description)),
58
58
  /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, "Do you want to proceed?"), /* @__PURE__ */ React.createElement(
59
59
  Select,
60
60
  {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/permissions/FallbackPermissionRequest.tsx"],
4
- "sourcesContent": ["import { Box, Text } from 'ink'\nimport React, { useMemo } from 'react'\nimport { Select } from '@components/CustomSelect/select'\nimport { getTheme } from '@utils/theme'\nimport {\n PermissionRequestTitle,\n textColorForRiskScore,\n} from './PermissionRequestTitle'\nimport { logUnaryEvent } from '@utils/unaryLogging'\nimport { env } from '@utils/env'\nimport { getCwd } from '@utils/state'\nimport { savePermission } from '@permissions'\nimport {\n type ToolUseConfirm,\n toolUseConfirmGetPrefix,\n} from './PermissionRequest'\nimport chalk from 'chalk'\nimport {\n UnaryEvent,\n usePermissionRequestLogging,\n} from '@hooks/usePermissionRequestLogging'\n\ntype Props = {\n toolUseConfirm: ToolUseConfirm\n onDone(): void\n verbose: boolean\n}\n\nexport function FallbackPermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: Props): React.ReactNode {\n const theme = getTheme()\n\n // TODO: Avoid these special cases\n const originalUserFacingName = toolUseConfirm.tool.userFacingName()\n const userFacingName = originalUserFacingName.endsWith(' (MCP)')\n ? originalUserFacingName.slice(0, -6)\n : originalUserFacingName\n\n const unaryEvent = useMemo<UnaryEvent>(\n () => ({\n completion_type: 'tool_use_single',\n language_name: 'none',\n }),\n [],\n )\n\n usePermissionRequestLogging(toolUseConfirm, unaryEvent)\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n marginTop={1}\n paddingLeft={1}\n paddingRight={1}\n paddingBottom={1}\n >\n <PermissionRequestTitle\n title=\"Tool use\"\n riskScore={toolUseConfirm.riskScore}\n />\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text>\n {userFacingName}(\n {toolUseConfirm.tool.renderToolUseMessage(\n toolUseConfirm.input as never,\n { verbose },\n )}\n )\n {originalUserFacingName.endsWith(' (MCP)') ? (\n <Text color={theme.secondaryText}> (MCP)</Text>\n ) : (\n ''\n )}\n </Text>\n <Text color={theme.secondaryText}>{toolUseConfirm.description}</Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Do you want to proceed?</Text>\n <Select\n options={[\n {\n label: 'Yes',\n value: 'yes',\n },\n {\n label: `Yes, and don't ask again for ${chalk.bold(userFacingName)} commands in ${chalk.bold(getCwd())}`,\n value: 'yes-dont-ask-again',\n },\n {\n label: `No, and provide instructions (${chalk.bold.hex(getTheme().warning)('esc')})`,\n value: 'no',\n },\n ]}\n onChange={newValue => {\n switch (newValue) {\n case 'yes':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onAllow('temporary')\n onDone()\n break\n case 'yes-dont-ask-again':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n savePermission(\n toolUseConfirm.tool,\n toolUseConfirm.input,\n toolUseConfirmGetPrefix(toolUseConfirm),\n ).then(() => {\n toolUseConfirm.onAllow('permanent')\n onDone()\n })\n break\n case 'no':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'reject',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onReject()\n onDone()\n break\n }\n }}\n />\n </Box>\n </Box>\n )\n}\n"],
5
- "mappings": "AAAA,SAAS,KAAK,YAAY;AAC1B,OAAO,SAAS,eAAe;AAC/B,SAAS,cAAc;AACvB,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,qBAAqB;AAC9B,SAAS,WAAW;AACpB,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAC/B;AAAA,EAEE;AAAA,OACK;AACP,OAAO,WAAW;AAClB;AAAA,EAEE;AAAA,OACK;AAQA,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,QAAQ,SAAS;AAGvB,QAAM,yBAAyB,eAAe,KAAK,eAAe;AAClE,QAAM,iBAAiB,uBAAuB,SAAS,QAAQ,IAC3D,uBAAuB,MAAM,GAAG,EAAE,IAClC;AAEJ,QAAM,aAAa;AAAA,IACjB,OAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,eAAe;AAAA,IACjB;AAAA,IACA,CAAC;AAAA,EACH;AAEA,8BAA4B,gBAAgB,UAAU;AAEtD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,sBAAsB,eAAe,SAAS;AAAA,MAC3D,WAAW;AAAA,MACX,aAAa;AAAA,MACb,cAAc;AAAA,MACd,eAAe;AAAA;AAAA,IAEf;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,WAAW,eAAe;AAAA;AAAA,IAC5B;AAAA,IACA,oCAAC,OAAI,eAAc,UAAS,UAAU,GAAG,UAAU,KACjD,oCAAC,YACE,gBAAe,KACf,eAAe,KAAK;AAAA,MACnB,eAAe;AAAA,MACf,EAAE,QAAQ;AAAA,IACZ,GAAE,KAED,uBAAuB,SAAS,QAAQ,IACvC,oCAAC,QAAK,OAAO,MAAM,iBAAe,QAAM,IAExC,EAEJ,GACA,oCAAC,QAAK,OAAO,MAAM,iBAAgB,eAAe,WAAY,CAChE;AAAA,IAEA,oCAAC,OAAI,eAAc,YACjB,oCAAC,YAAK,yBAAuB,GAC7B;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,UACP;AAAA,YACE,OAAO;AAAA,YACP,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,OAAO,gCAAgC,MAAM,KAAK,cAAc,CAAC,gBAAgB,MAAM,KAAK,OAAO,CAAC,CAAC;AAAA,YACrG,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,OAAO,iCAAiC,MAAM,KAAK,IAAI,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC;AAAA,YACjF,OAAO;AAAA,UACT;AAAA,QACF;AAAA,QACA,UAAU,cAAY;AACpB,kBAAQ,UAAU;AAAA,YAChB,KAAK;AACH,4BAAc;AAAA,gBACZ,iBAAiB;AAAA,gBACjB,OAAO;AAAA,gBACP,UAAU;AAAA,kBACR,eAAe;AAAA,kBACf,YAAY,eAAe,iBAAiB,QAAQ;AAAA,kBACpD,UAAU,IAAI;AAAA,gBAChB;AAAA,cACF,CAAC;AACD,6BAAe,QAAQ,WAAW;AAClC,qBAAO;AACP;AAAA,YACF,KAAK;AACH,4BAAc;AAAA,gBACZ,iBAAiB;AAAA,gBACjB,OAAO;AAAA,gBACP,UAAU;AAAA,kBACR,eAAe;AAAA,kBACf,YAAY,eAAe,iBAAiB,QAAQ;AAAA,kBACpD,UAAU,IAAI;AAAA,gBAChB;AAAA,cACF,CAAC;AACD;AAAA,gBACE,eAAe;AAAA,gBACf,eAAe;AAAA,gBACf,wBAAwB,cAAc;AAAA,cACxC,EAAE,KAAK,MAAM;AACX,+BAAe,QAAQ,WAAW;AAClC,uBAAO;AAAA,cACT,CAAC;AACD;AAAA,YACF,KAAK;AACH,4BAAc;AAAA,gBACZ,iBAAiB;AAAA,gBACjB,OAAO;AAAA,gBACP,UAAU;AAAA,kBACR,eAAe;AAAA,kBACf,YAAY,eAAe,iBAAiB,QAAQ;AAAA,kBACpD,UAAU,IAAI;AAAA,gBAChB;AAAA,cACF,CAAC;AACD,6BAAe,SAAS;AACxB,qBAAO;AACP;AAAA,UACJ;AAAA,QACF;AAAA;AAAA,IACF,CACF;AAAA,EACF;AAEJ;",
4
+ "sourcesContent": ["import { Box, Text } from 'ink'\nimport React, { useMemo } from 'react'\nimport { Select } from '@components/CustomSelect/select'\nimport { getTheme } from '@utils/theme'\nimport {\n PermissionRequestTitle,\n textColorForRiskScore,\n} from './PermissionRequestTitle'\nimport { logUnaryEvent } from '@utils/unaryLogging'\nimport { env } from '@utils/env'\nimport { getCwd } from '@utils/state'\nimport { savePermission } from '@permissions'\nimport {\n type ToolUseConfirm,\n toolUseConfirmGetPrefix,\n} from './PermissionRequest'\nimport chalk from 'chalk'\nimport {\n UnaryEvent,\n usePermissionRequestLogging,\n} from '@hooks/usePermissionRequestLogging'\nimport { safeRenderToolUseMessage } from '@utils/tooling/safeRender'\n\ntype Props = {\n toolUseConfirm: ToolUseConfirm\n onDone(): void\n verbose: boolean\n}\n\nexport function FallbackPermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: Props): React.ReactNode {\n const theme = getTheme()\n\n // TODO: Avoid these special cases\n const originalUserFacingName = toolUseConfirm.tool.userFacingName()\n const userFacingName = originalUserFacingName.endsWith(' (MCP)')\n ? originalUserFacingName.slice(0, -6)\n : originalUserFacingName\n\n const unaryEvent = useMemo<UnaryEvent>(\n () => ({\n completion_type: 'tool_use_single',\n language_name: 'none',\n }),\n [],\n )\n\n usePermissionRequestLogging(toolUseConfirm, unaryEvent)\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n marginTop={1}\n paddingLeft={1}\n paddingRight={1}\n paddingBottom={1}\n >\n <PermissionRequestTitle\n title=\"Tool use\"\n riskScore={toolUseConfirm.riskScore}\n />\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text>\n {userFacingName}(\n {safeRenderToolUseMessage(toolUseConfirm.tool, toolUseConfirm.input, {\n verbose,\n })}\n )\n {originalUserFacingName.endsWith(' (MCP)') ? (\n <Text color={theme.secondaryText}> (MCP)</Text>\n ) : (\n ''\n )}\n </Text>\n <Text color={theme.secondaryText}>{toolUseConfirm.description}</Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Do you want to proceed?</Text>\n <Select\n options={[\n {\n label: 'Yes',\n value: 'yes',\n },\n {\n label: `Yes, and don't ask again for ${chalk.bold(userFacingName)} commands in ${chalk.bold(getCwd())}`,\n value: 'yes-dont-ask-again',\n },\n {\n label: `No, and provide instructions (${chalk.bold.hex(getTheme().warning)('esc')})`,\n value: 'no',\n },\n ]}\n onChange={newValue => {\n switch (newValue) {\n case 'yes':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onAllow('temporary')\n onDone()\n break\n case 'yes-dont-ask-again':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n savePermission(\n toolUseConfirm.tool,\n toolUseConfirm.input,\n toolUseConfirmGetPrefix(toolUseConfirm),\n ).then(() => {\n toolUseConfirm.onAllow('permanent')\n onDone()\n })\n break\n case 'no':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'reject',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onReject()\n onDone()\n break\n }\n }}\n />\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -21,6 +21,7 @@ import { FileReadTool } from "../../../tools/FileReadTool/FileReadTool.js";
21
21
  import { NotebookEditTool } from "../../../tools/NotebookEditTool/NotebookEditTool.js";
22
22
  import { NotebookReadTool } from "../../../tools/NotebookReadTool/NotebookReadTool.js";
23
23
  import { FallbackPermissionRequest } from "../FallbackPermissionRequest.js";
24
+ import { safeRenderToolUseMessage } from "../../../utils/tooling/safeRender.js";
24
25
  import {
25
26
  grantWritePermissionForOriginalDir,
26
27
  pathInOriginalCwd,
@@ -140,10 +141,9 @@ function FilesystemPermissionRequestImpl({
140
141
  riskScore: toolUseConfirm.riskScore
141
142
  }
142
143
  ),
143
- /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingX: 2, paddingY: 1 }, /* @__PURE__ */ React.createElement(Text, null, userFacingName, "(", toolUseConfirm.tool.renderToolUseMessage(
144
- toolUseConfirm.input,
145
- { verbose }
146
- ), ")")),
144
+ /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingX: 2, paddingY: 1 }, /* @__PURE__ */ React.createElement(Text, null, userFacingName, "(", safeRenderToolUseMessage(toolUseConfirm.tool, toolUseConfirm.input, {
145
+ verbose
146
+ }), ")")),
147
147
  /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, "Do you want to proceed?"), /* @__PURE__ */ React.createElement(
148
148
  Select,
149
149
  {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx"],
4
- "sourcesContent": ["import { Box, Text } from 'ink'\nimport React, { useMemo } from 'react'\nimport { Select } from '@components/CustomSelect/select'\nimport { getTheme } from '@utils/theme'\nimport {\n PermissionRequestTitle,\n textColorForRiskScore,\n} from '@components/permissions/PermissionRequestTitle'\nimport { logUnaryEvent } from '@utils/unaryLogging'\nimport { env } from '@utils/env'\nimport {\n type PermissionRequestProps,\n type ToolUseConfirm,\n} from '@components/permissions/PermissionRequest'\nimport chalk from 'chalk'\nimport {\n UnaryEvent,\n usePermissionRequestLogging,\n} from '@hooks/usePermissionRequestLogging'\nimport { FileEditTool } from '@tools/FileEditTool/FileEditTool'\nimport { FileWriteTool } from '@tools/FileWriteTool/FileWriteTool'\nimport { GrepTool } from '@tools/GrepTool/GrepTool'\nimport { GlobTool } from '@tools/GlobTool/GlobTool'\nimport { LSTool } from '@tools/lsTool/lsTool'\nimport { FileReadTool } from '@tools/FileReadTool/FileReadTool'\nimport { NotebookEditTool } from '@tools/NotebookEditTool/NotebookEditTool'\nimport { NotebookReadTool } from '@tools/NotebookReadTool/NotebookReadTool'\nimport { FallbackPermissionRequest } from '@components/permissions/FallbackPermissionRequest'\nimport {\n grantWritePermissionForOriginalDir,\n pathInOriginalCwd,\n toAbsolutePath,\n} from '@utils/permissions/filesystem'\nimport { getCwd } from '@utils/state'\n\nfunction pathArgNameForToolUse(toolUseConfirm: ToolUseConfirm): string | null {\n switch (toolUseConfirm.tool) {\n case FileWriteTool:\n case FileEditTool:\n case FileReadTool: {\n return 'file_path'\n }\n case GlobTool:\n case GrepTool:\n case LSTool: {\n return 'path'\n }\n case NotebookEditTool:\n case NotebookReadTool: {\n return 'notebook_path'\n }\n }\n return null\n}\n\nfunction isMultiFile(toolUseConfirm: ToolUseConfirm): boolean {\n switch (toolUseConfirm.tool) {\n case GlobTool:\n case GrepTool:\n case LSTool: {\n return true\n }\n }\n return false\n}\n\nfunction pathFromToolUse(toolUseConfirm: ToolUseConfirm): string | null {\n const pathArgName = pathArgNameForToolUse(toolUseConfirm)\n const input = toolUseConfirm.input\n if (pathArgName && pathArgName in input) {\n if (typeof input[pathArgName] === 'string') {\n return toAbsolutePath(input[pathArgName])\n } else {\n return toAbsolutePath(getCwd())\n }\n }\n return null\n}\n\nexport function FilesystemPermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: PermissionRequestProps): React.ReactNode {\n const path = pathFromToolUse(toolUseConfirm)\n if (!path) {\n // Fall back to generic permission request if no path is found\n return (\n <FallbackPermissionRequest\n toolUseConfirm={toolUseConfirm}\n onDone={onDone}\n verbose={verbose}\n />\n )\n }\n return (\n <FilesystemPermissionRequestImpl\n toolUseConfirm={toolUseConfirm}\n path={path}\n onDone={onDone}\n verbose={verbose}\n />\n )\n}\n\nfunction getDontAskAgainOptions(toolUseConfirm: ToolUseConfirm, path: string) {\n if (toolUseConfirm.tool.isReadOnly()) {\n // \"Always allow\" is not an option for read-only tools,\n // because they always have write permission in the project directory.\n return []\n }\n // Only show don't ask again option for edits in original working directory\n return pathInOriginalCwd(path)\n ? [\n {\n label: \"Yes, and don't ask again for file edits this session\",\n value: 'yes-dont-ask-again',\n },\n ]\n : []\n}\n\ntype Props = {\n toolUseConfirm: ToolUseConfirm\n path: string\n onDone(): void\n verbose: boolean\n}\n\nfunction FilesystemPermissionRequestImpl({\n toolUseConfirm,\n path,\n onDone,\n verbose,\n}: Props): React.ReactNode {\n const userFacingName = toolUseConfirm.tool.userFacingName()\n\n const userFacingReadOrWrite = toolUseConfirm.tool.isReadOnly()\n ? 'Read'\n : 'Edit'\n const title = `${userFacingReadOrWrite} ${isMultiFile(toolUseConfirm) ? 'files' : 'file'}`\n\n const unaryEvent = useMemo<UnaryEvent>(\n () => ({\n completion_type: 'tool_use_single',\n language_name: 'none',\n }),\n [],\n )\n\n usePermissionRequestLogging(toolUseConfirm, unaryEvent)\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n marginTop={1}\n paddingLeft={1}\n paddingRight={1}\n paddingBottom={1}\n >\n <PermissionRequestTitle\n title={title}\n riskScore={toolUseConfirm.riskScore}\n />\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text>\n {userFacingName}(\n {toolUseConfirm.tool.renderToolUseMessage(\n toolUseConfirm.input as never,\n { verbose },\n )}\n )\n </Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Do you want to proceed?</Text>\n <Select\n options={[\n {\n label: 'Yes',\n value: 'yes',\n },\n ...getDontAskAgainOptions(toolUseConfirm, path),\n {\n label: `No, and provide instructions (${chalk.bold.hex(getTheme().warning)('esc')})`,\n value: 'no',\n },\n ]}\n onChange={newValue => {\n switch (newValue) {\n case 'yes':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onAllow('temporary')\n onDone()\n break\n case 'yes-dont-ask-again':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n grantWritePermissionForOriginalDir()\n toolUseConfirm.onAllow('permanent')\n onDone()\n break\n case 'no':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'reject',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onReject()\n onDone()\n break\n }\n }}\n />\n </Box>\n </Box>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Box, Text } from 'ink'\nimport React, { useMemo } from 'react'\nimport { Select } from '@components/CustomSelect/select'\nimport { getTheme } from '@utils/theme'\nimport {\n PermissionRequestTitle,\n textColorForRiskScore,\n} from '@components/permissions/PermissionRequestTitle'\nimport { logUnaryEvent } from '@utils/unaryLogging'\nimport { env } from '@utils/env'\nimport {\n type PermissionRequestProps,\n type ToolUseConfirm,\n} from '@components/permissions/PermissionRequest'\nimport chalk from 'chalk'\nimport {\n UnaryEvent,\n usePermissionRequestLogging,\n} from '@hooks/usePermissionRequestLogging'\nimport { FileEditTool } from '@tools/FileEditTool/FileEditTool'\nimport { FileWriteTool } from '@tools/FileWriteTool/FileWriteTool'\nimport { GrepTool } from '@tools/GrepTool/GrepTool'\nimport { GlobTool } from '@tools/GlobTool/GlobTool'\nimport { LSTool } from '@tools/lsTool/lsTool'\nimport { FileReadTool } from '@tools/FileReadTool/FileReadTool'\nimport { NotebookEditTool } from '@tools/NotebookEditTool/NotebookEditTool'\nimport { NotebookReadTool } from '@tools/NotebookReadTool/NotebookReadTool'\nimport { FallbackPermissionRequest } from '@components/permissions/FallbackPermissionRequest'\nimport { safeRenderToolUseMessage } from '@utils/tooling/safeRender'\nimport {\n grantWritePermissionForOriginalDir,\n pathInOriginalCwd,\n toAbsolutePath,\n} from '@utils/permissions/filesystem'\nimport { getCwd } from '@utils/state'\n\nfunction pathArgNameForToolUse(toolUseConfirm: ToolUseConfirm): string | null {\n switch (toolUseConfirm.tool) {\n case FileWriteTool:\n case FileEditTool:\n case FileReadTool: {\n return 'file_path'\n }\n case GlobTool:\n case GrepTool:\n case LSTool: {\n return 'path'\n }\n case NotebookEditTool:\n case NotebookReadTool: {\n return 'notebook_path'\n }\n }\n return null\n}\n\nfunction isMultiFile(toolUseConfirm: ToolUseConfirm): boolean {\n switch (toolUseConfirm.tool) {\n case GlobTool:\n case GrepTool:\n case LSTool: {\n return true\n }\n }\n return false\n}\n\nfunction pathFromToolUse(toolUseConfirm: ToolUseConfirm): string | null {\n const pathArgName = pathArgNameForToolUse(toolUseConfirm)\n const input = toolUseConfirm.input\n if (pathArgName && pathArgName in input) {\n if (typeof input[pathArgName] === 'string') {\n return toAbsolutePath(input[pathArgName])\n } else {\n return toAbsolutePath(getCwd())\n }\n }\n return null\n}\n\nexport function FilesystemPermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: PermissionRequestProps): React.ReactNode {\n const path = pathFromToolUse(toolUseConfirm)\n if (!path) {\n // Fall back to generic permission request if no path is found\n return (\n <FallbackPermissionRequest\n toolUseConfirm={toolUseConfirm}\n onDone={onDone}\n verbose={verbose}\n />\n )\n }\n return (\n <FilesystemPermissionRequestImpl\n toolUseConfirm={toolUseConfirm}\n path={path}\n onDone={onDone}\n verbose={verbose}\n />\n )\n}\n\nfunction getDontAskAgainOptions(toolUseConfirm: ToolUseConfirm, path: string) {\n if (toolUseConfirm.tool.isReadOnly()) {\n // \"Always allow\" is not an option for read-only tools,\n // because they always have write permission in the project directory.\n return []\n }\n // Only show don't ask again option for edits in original working directory\n return pathInOriginalCwd(path)\n ? [\n {\n label: \"Yes, and don't ask again for file edits this session\",\n value: 'yes-dont-ask-again',\n },\n ]\n : []\n}\n\ntype Props = {\n toolUseConfirm: ToolUseConfirm\n path: string\n onDone(): void\n verbose: boolean\n}\n\nfunction FilesystemPermissionRequestImpl({\n toolUseConfirm,\n path,\n onDone,\n verbose,\n}: Props): React.ReactNode {\n const userFacingName = toolUseConfirm.tool.userFacingName()\n\n const userFacingReadOrWrite = toolUseConfirm.tool.isReadOnly()\n ? 'Read'\n : 'Edit'\n const title = `${userFacingReadOrWrite} ${isMultiFile(toolUseConfirm) ? 'files' : 'file'}`\n\n const unaryEvent = useMemo<UnaryEvent>(\n () => ({\n completion_type: 'tool_use_single',\n language_name: 'none',\n }),\n [],\n )\n\n usePermissionRequestLogging(toolUseConfirm, unaryEvent)\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n marginTop={1}\n paddingLeft={1}\n paddingRight={1}\n paddingBottom={1}\n >\n <PermissionRequestTitle\n title={title}\n riskScore={toolUseConfirm.riskScore}\n />\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text>\n {userFacingName}(\n {safeRenderToolUseMessage(toolUseConfirm.tool, toolUseConfirm.input, {\n verbose,\n })}\n )\n </Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Do you want to proceed?</Text>\n <Select\n options={[\n {\n label: 'Yes',\n value: 'yes',\n },\n ...getDontAskAgainOptions(toolUseConfirm, path),\n {\n label: `No, and provide instructions (${chalk.bold.hex(getTheme().warning)('esc')})`,\n value: 'no',\n },\n ]}\n onChange={newValue => {\n switch (newValue) {\n case 'yes':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onAllow('temporary')\n onDone()\n break\n case 'yes-dont-ask-again':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n grantWritePermissionForOriginalDir()\n toolUseConfirm.onAllow('permanent')\n onDone()\n break\n case 'no':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'reject',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onReject()\n onDone()\n break\n }\n }}\n />\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }