@within-7/minto 0.4.1 → 0.4.2
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.
- package/dist/Tool.js +7 -0
- package/dist/Tool.js.map +2 -2
- package/dist/commands/agents/AgentsCommand.js +1 -1
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/agents/constants.js +2 -2
- package/dist/commands/agents/constants.js.map +2 -2
- package/dist/commands/clear.js +4 -3
- package/dist/commands/clear.js.map +2 -2
- package/dist/commands/compact.js +2 -2
- package/dist/commands/compact.js.map +1 -1
- package/dist/commands/context.js +3 -1
- package/dist/commands/context.js.map +2 -2
- package/dist/commands/login.js +128 -0
- package/dist/commands/login.js.map +7 -0
- package/dist/commands/memory.js +33 -82
- package/dist/commands/memory.js.map +2 -2
- package/dist/commands/quit.js +3 -1
- package/dist/commands/quit.js.map +2 -2
- package/dist/commands/resume.js +39 -239
- package/dist/commands/resume.js.map +2 -2
- package/dist/commands/tasks.js +1 -1
- package/dist/commands/tasks.js.map +2 -2
- package/dist/commands/terminalSetup.js +6 -2
- package/dist/commands/terminalSetup.js.map +2 -2
- package/dist/commands.js +2 -0
- package/dist/commands.js.map +2 -2
- package/dist/components/AgentDetailView.js +126 -0
- package/dist/components/AgentDetailView.js.map +7 -0
- package/dist/components/AgentThinkingBlock.js +1 -1
- package/dist/components/AgentThinkingBlock.js.map +2 -2
- package/dist/components/AgentViewBanner.js +22 -0
- package/dist/components/AgentViewBanner.js.map +7 -0
- package/dist/components/HeaderBar.js +1 -1
- package/dist/components/HeaderBar.js.map +2 -2
- package/dist/components/Help.js +8 -1
- package/dist/components/Help.js.map +2 -2
- package/dist/components/HotkeyHelpPanel.js +26 -8
- package/dist/components/HotkeyHelpPanel.js.map +2 -2
- package/dist/components/IdleNotificationBar.js +10 -0
- package/dist/components/IdleNotificationBar.js.map +7 -0
- package/dist/components/ModelSelector/ModelSelector.js +55 -20
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/PromptInput.js +186 -115
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/RewindPanel.js +272 -0
- package/dist/components/RewindPanel.js.map +7 -0
- package/dist/components/Spinner.js +10 -21
- package/dist/components/Spinner.js.map +2 -2
- package/dist/components/StreamingTextPreview.js +29 -0
- package/dist/components/StreamingTextPreview.js.map +7 -0
- package/dist/components/SubagentBlock.js +3 -2
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/SubagentProgress.js +4 -4
- package/dist/components/SubagentProgress.js.map +2 -2
- package/dist/components/TabbedListView/SearchInput.js +1 -1
- package/dist/components/TabbedListView/SearchInput.js.map +2 -2
- package/dist/components/TabbedListView/TabbedListView.js +87 -41
- package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
- package/dist/components/TaskCard.js +4 -4
- package/dist/components/TaskCard.js.map +2 -2
- package/dist/components/TeamMemberPanel.js +107 -0
- package/dist/components/TeamMemberPanel.js.map +7 -0
- package/dist/components/ThinkingSelector.js +84 -0
- package/dist/components/ThinkingSelector.js.map +7 -0
- package/dist/components/TitledDivider.js +26 -0
- package/dist/components/TitledDivider.js.map +7 -0
- package/dist/components/TodoPanel.js +31 -30
- package/dist/components/TodoPanel.js.map +2 -2
- package/dist/components/TokenWarning.js +28 -7
- package/dist/components/TokenWarning.js.map +2 -2
- package/dist/components/messages/AssistantTextMessage.js +5 -2
- package/dist/components/messages/AssistantTextMessage.js.map +2 -2
- package/dist/components/messages/AssistantToolUseMessage.js +9 -1
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/components/messages/DefaultToolResultFallback.js +11 -0
- package/dist/components/messages/DefaultToolResultFallback.js.map +7 -0
- package/dist/components/messages/ParallelTasksGroupView.js +14 -6
- package/dist/components/messages/ParallelTasksGroupView.js.map +2 -2
- package/dist/components/messages/TaskInModuleView.js +27 -27
- package/dist/components/messages/TaskInModuleView.js.map +2 -2
- package/dist/components/messages/UserGuidanceMessage.js +26 -0
- package/dist/components/messages/UserGuidanceMessage.js.map +7 -0
- package/dist/components/messages/UserPromptMessage.js +2 -1
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/components/messages/UserTeamNotificationMessage.js +91 -0
- package/dist/components/messages/UserTeamNotificationMessage.js.map +7 -0
- package/dist/components/messages/UserTextMessage.js +8 -0
- package/dist/components/messages/UserTextMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js +4 -2
- package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js +18 -1
- package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +12 -1
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
- package/dist/components/permissions/PermissionRequest.js +4 -0
- package/dist/components/permissions/PermissionRequest.js.map +2 -2
- package/dist/components/permissions/PlanApprovalRequest.js +164 -0
- package/dist/components/permissions/PlanApprovalRequest.js.map +7 -0
- package/dist/constants/agentTeams.js +17 -0
- package/dist/constants/agentTeams.js.map +7 -0
- package/dist/constants/macros.js +2 -1
- package/dist/constants/macros.js.map +2 -2
- package/dist/constants/prompts/agentPrompt.js +1 -0
- package/dist/constants/prompts/agentPrompt.js.map +2 -2
- package/dist/constants/prompts/autoMemory.js +39 -0
- package/dist/constants/prompts/autoMemory.js.map +7 -0
- package/dist/constants/prompts/codeConventions.js +1 -13
- package/dist/constants/prompts/codeConventions.js.map +2 -2
- package/dist/constants/prompts/doingTasks.js +21 -2
- package/dist/constants/prompts/doingTasks.js.map +2 -2
- package/dist/constants/prompts/envInfo.js +6 -7
- package/dist/constants/prompts/envInfo.js.map +2 -2
- package/dist/constants/prompts/index.js +27 -5
- package/dist/constants/prompts/index.js.map +2 -2
- package/dist/constants/prompts/taskManagement.js +2 -43
- package/dist/constants/prompts/taskManagement.js.map +2 -2
- package/dist/constants/prompts/teamOverlays.js +50 -0
- package/dist/constants/prompts/teamOverlays.js.map +7 -0
- package/dist/constants/prompts/toneAndStyle.js +4 -29
- package/dist/constants/prompts/toneAndStyle.js.map +2 -2
- package/dist/constants/prompts/toolUsagePolicy.js +7 -22
- package/dist/constants/prompts/toolUsagePolicy.js.map +2 -2
- package/dist/constants/toolInputExamples.js +2 -2
- package/dist/constants/toolInputExamples.js.map +2 -2
- package/dist/context.js +39 -6
- package/dist/context.js.map +2 -2
- package/dist/core/backupManager.js +1 -1
- package/dist/core/backupManager.js.map +2 -2
- package/dist/core/permissions/rules/planModeRule.js +1 -1
- package/dist/core/permissions/rules/planModeRule.js.map +1 -1
- package/dist/core/permissions/rules/safeModeRule.js +1 -1
- package/dist/core/permissions/rules/safeModeRule.js.map +1 -1
- package/dist/engine/AgentEngine.js +902 -0
- package/dist/engine/AgentEngine.js.map +7 -0
- package/dist/engine/EngineRegistry.js +89 -0
- package/dist/engine/EngineRegistry.js.map +7 -0
- package/dist/engine/foregroundAdapter.js +191 -0
- package/dist/engine/foregroundAdapter.js.map +7 -0
- package/dist/engine/index.js +15 -0
- package/dist/engine/index.js.map +7 -0
- package/dist/engine/types.js +1 -0
- package/dist/engine/types.js.map +7 -0
- package/dist/entrypoints/cli.js +410 -79
- package/dist/entrypoints/cli.js.map +3 -3
- package/dist/hooks/useAgentEngine.js +129 -0
- package/dist/hooks/useAgentEngine.js.map +7 -0
- package/dist/hooks/useAgentTokenStats.js +0 -16
- package/dist/hooks/useAgentTokenStats.js.map +2 -2
- package/dist/hooks/useCanUseTool.js +47 -2
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useDeferredLoading.js +4 -1
- package/dist/hooks/useDeferredLoading.js.map +2 -2
- package/dist/hooks/useIdleNotifications.js +66 -0
- package/dist/hooks/useIdleNotifications.js.map +7 -0
- package/dist/hooks/useSessionTracking.js +9 -7
- package/dist/hooks/useSessionTracking.js.map +2 -2
- package/dist/hooks/useTeamMembers.js +51 -0
- package/dist/hooks/useTeamMembers.js.map +7 -0
- package/dist/i18n/locales/en.js +77 -12
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.js +77 -12
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/i18n/types.js.map +1 -1
- package/dist/messages.js.map +2 -2
- package/dist/permissions.js +113 -7
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +135 -37
- package/dist/query.js.map +2 -2
- package/dist/screens/REPL.js +504 -361
- package/dist/screens/REPL.js.map +3 -3
- package/dist/screens/ResumeConversation.js +199 -14
- package/dist/screens/ResumeConversation.js.map +2 -2
- package/dist/services/adapters/base.js.map +1 -1
- package/dist/services/agentTeams/backends/headless.js +108 -0
- package/dist/services/agentTeams/backends/headless.js.map +7 -0
- package/dist/services/agentTeams/backends/inProcess.js +102 -0
- package/dist/services/agentTeams/backends/inProcess.js.map +7 -0
- package/dist/services/agentTeams/backends/resolver.js +18 -0
- package/dist/services/agentTeams/backends/resolver.js.map +7 -0
- package/dist/services/agentTeams/backends/tmux.js +168 -0
- package/dist/services/agentTeams/backends/tmux.js.map +7 -0
- package/dist/services/agentTeams/backends/types.js +1 -0
- package/dist/services/agentTeams/backends/types.js.map +7 -0
- package/dist/services/agentTeams/heartbeat.js +88 -0
- package/dist/services/agentTeams/heartbeat.js.map +7 -0
- package/dist/services/agentTeams/index.js +42 -2
- package/dist/services/agentTeams/index.js.map +2 -2
- package/dist/services/agentTeams/injectionChannel.js +105 -0
- package/dist/services/agentTeams/injectionChannel.js.map +7 -0
- package/dist/services/agentTeams/mailbox.js +410 -30
- package/dist/services/agentTeams/mailbox.js.map +2 -2
- package/dist/services/agentTeams/messageFormatter.js +80 -0
- package/dist/services/agentTeams/messageFormatter.js.map +7 -0
- package/dist/services/agentTeams/permissionDelegation.js +71 -0
- package/dist/services/agentTeams/permissionDelegation.js.map +7 -0
- package/dist/services/agentTeams/teamEvents.js +45 -0
- package/dist/services/agentTeams/teamEvents.js.map +7 -0
- package/dist/services/agentTeams/teamManager.js +251 -34
- package/dist/services/agentTeams/teamManager.js.map +2 -2
- package/dist/services/agentTeams/teamTaskStore.js +290 -61
- package/dist/services/agentTeams/teamTaskStore.js.map +2 -2
- package/dist/services/agentTeams/teammateSpawner.js +99 -18
- package/dist/services/agentTeams/teammateSpawner.js.map +2 -2
- package/dist/services/hookExecutor.js +51 -8
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/llm/anthropicProvider.js +56 -59
- package/dist/services/llm/anthropicProvider.js.map +2 -2
- package/dist/services/llm/dispatch.js +24 -5
- package/dist/services/llm/dispatch.js.map +2 -2
- package/dist/services/llm/openaiProvider.js +115 -136
- package/dist/services/llm/openaiProvider.js.map +3 -3
- package/dist/services/llm/types.js +89 -15
- package/dist/services/llm/types.js.map +2 -2
- package/dist/services/mcpClient.js +80 -4
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/mintoAuth.js +299 -0
- package/dist/services/mintoAuth.js.map +7 -0
- package/dist/services/oauth.js +3 -3
- package/dist/services/oauth.js.map +2 -2
- package/dist/services/openai.js +91 -20
- package/dist/services/openai.js.map +2 -2
- package/dist/services/plugins/pluginRuntime.js +11 -5
- package/dist/services/plugins/pluginRuntime.js.map +2 -2
- package/dist/services/plugins/pluginValidation.js +4 -2
- package/dist/services/plugins/pluginValidation.js.map +2 -2
- package/dist/services/sandbox/sandboxController.js +11 -3
- package/dist/services/sandbox/sandboxController.js.map +2 -2
- package/dist/services/sessionMemoryInjector.js +77 -0
- package/dist/services/sessionMemoryInjector.js.map +7 -0
- package/dist/services/systemReminder.js +130 -8
- package/dist/services/systemReminder.js.map +2 -2
- package/dist/services/taskStore.js +199 -8
- package/dist/services/taskStore.js.map +3 -3
- package/dist/services/topicDetector.js +169 -0
- package/dist/services/topicDetector.js.map +7 -0
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +0 -13
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
- package/dist/tools/BashTool/BashTool.js +51 -28
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/BashTool/prompt.js +95 -118
- package/dist/tools/BashTool/prompt.js.map +2 -2
- package/dist/tools/BashTool/utils.js +39 -1
- package/dist/tools/BashTool/utils.js.map +2 -2
- package/dist/tools/EnterWorktreeTool/EnterWorktreeTool.js +121 -0
- package/dist/tools/EnterWorktreeTool/EnterWorktreeTool.js.map +7 -0
- package/dist/tools/EnterWorktreeTool/prompt.js +22 -0
- package/dist/tools/EnterWorktreeTool/prompt.js.map +7 -0
- package/dist/tools/FileEditTool/FileEditTool.js +9 -4
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileEditTool/prompt.js +3 -7
- package/dist/tools/FileEditTool/prompt.js.map +2 -2
- package/dist/tools/FileReadTool/FileReadTool.js +125 -3
- package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
- package/dist/tools/FileReadTool/prompt.js +1 -2
- package/dist/tools/FileReadTool/prompt.js.map +2 -2
- package/dist/tools/FileWriteTool/prompt.js +3 -5
- package/dist/tools/FileWriteTool/prompt.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js +3 -2
- package/dist/tools/GlobTool/GlobTool.js.map +2 -2
- package/dist/tools/GrepTool/GrepTool.js +16 -5
- package/dist/tools/GrepTool/GrepTool.js.map +2 -2
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
- package/dist/tools/MCPSearchTool/MCPSearchTool.js +172 -0
- package/dist/tools/MCPSearchTool/MCPSearchTool.js.map +7 -0
- package/dist/tools/MCPSearchTool/prompt.js +77 -0
- package/dist/tools/MCPSearchTool/prompt.js.map +7 -0
- package/dist/tools/MultiEditTool/prompt.js +4 -7
- package/dist/tools/MultiEditTool/prompt.js.map +2 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +12 -8
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +54 -1
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/prompt.js +23 -74
- package/dist/tools/PlanModeTool/prompt.js.map +2 -2
- package/dist/tools/SendMessageTool/SendMessageTool.js +341 -0
- package/dist/tools/SendMessageTool/SendMessageTool.js.map +7 -0
- package/dist/tools/SendMessageTool/prompt.js +44 -0
- package/dist/tools/SendMessageTool/prompt.js.map +7 -0
- package/dist/tools/TaskCreateTool/prompt.js +15 -4
- package/dist/tools/TaskCreateTool/prompt.js.map +2 -2
- package/dist/tools/TaskListTool/prompt.js +18 -3
- package/dist/tools/TaskListTool/prompt.js.map +2 -2
- package/dist/tools/TaskOutputTool/prompt.js +4 -3
- package/dist/tools/TaskOutputTool/prompt.js.map +2 -2
- package/dist/tools/TaskTool/TaskTool.js +762 -98
- package/dist/tools/TaskTool/TaskTool.js.map +3 -3
- package/dist/tools/TaskTool/constants.js +8 -2
- package/dist/tools/TaskTool/constants.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js +74 -70
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/TaskUpdateTool/TaskUpdateTool.js +15 -1
- package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +2 -2
- package/dist/tools/TeamCreateTool/TeamCreateTool.js +129 -0
- package/dist/tools/TeamCreateTool/TeamCreateTool.js.map +7 -0
- package/dist/tools/TeamCreateTool/prompt.js +58 -0
- package/dist/tools/TeamCreateTool/prompt.js.map +7 -0
- package/dist/tools/TeamDeleteTool/TeamDeleteTool.js +151 -0
- package/dist/tools/TeamDeleteTool/TeamDeleteTool.js.map +7 -0
- package/dist/tools/TeamDeleteTool/prompt.js +16 -0
- package/dist/tools/TeamDeleteTool/prompt.js.map +7 -0
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +106 -15
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/prompt.js +3 -2
- package/dist/tools/URLFetcherTool/prompt.js.map +2 -2
- package/dist/tools/WebSearchTool/WebSearchTool.js +2 -1
- package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
- package/dist/tools/WebSearchTool/prompt.js +5 -4
- package/dist/tools/WebSearchTool/prompt.js.map +2 -2
- package/dist/tools.js +100 -20
- package/dist/tools.js.map +2 -2
- package/dist/types/PermissionMode.js +35 -6
- package/dist/types/PermissionMode.js.map +2 -2
- package/dist/types/hooks.js +2 -0
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/plugin.js +2 -0
- package/dist/types/plugin.js.map +3 -3
- package/dist/utils/CircuitBreaker.js +15 -9
- package/dist/utils/CircuitBreaker.js.map +2 -2
- package/dist/utils/agentLoader.js +249 -112
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/animationManager.js +40 -3
- package/dist/utils/animationManager.js.map +2 -2
- package/dist/utils/ask.js +7 -6
- package/dist/utils/ask.js.map +2 -2
- package/dist/utils/atomicWrite.js +23 -0
- package/dist/utils/atomicWrite.js.map +7 -0
- package/dist/utils/autoCompactCore.js +73 -56
- package/dist/utils/autoCompactCore.js.map +2 -2
- package/dist/utils/autoMemoryPaths.js +89 -0
- package/dist/utils/autoMemoryPaths.js.map +7 -0
- package/dist/utils/config.js +63 -38
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/configSchema.js +13 -8
- package/dist/utils/configSchema.js.map +2 -2
- package/dist/utils/credentials/index.js +14 -0
- package/dist/utils/credentials/index.js.map +2 -2
- package/dist/utils/dualPath.js +24 -0
- package/dist/utils/dualPath.js.map +7 -0
- package/dist/utils/exit.js +66 -7
- package/dist/utils/exit.js.map +2 -2
- package/dist/utils/externalEditor.js +155 -0
- package/dist/utils/externalEditor.js.map +7 -0
- package/dist/utils/fileLock.js +67 -0
- package/dist/utils/fileLock.js.map +7 -0
- package/dist/utils/format.js +24 -14
- package/dist/utils/format.js.map +2 -2
- package/dist/utils/globalErrorHandler.js +5 -96
- package/dist/utils/globalErrorHandler.js.map +3 -3
- package/dist/utils/groupHandlers/parallelTasksHandler.js +5 -3
- package/dist/utils/groupHandlers/parallelTasksHandler.js.map +2 -2
- package/dist/utils/groupHandlers/taskHandler.js +2 -2
- package/dist/utils/groupHandlers/taskHandler.js.map +2 -2
- package/dist/utils/hookManager.js +64 -6
- package/dist/utils/hookManager.js.map +2 -2
- package/dist/utils/log.js +6 -2
- package/dist/utils/log.js.map +2 -2
- package/dist/utils/markdown.js +237 -19
- package/dist/utils/markdown.js.map +2 -2
- package/dist/utils/messageContextManager.js +18 -5
- package/dist/utils/messageContextManager.js.map +2 -2
- package/dist/utils/messageGroupManager.js +1 -1
- package/dist/utils/messageGroupManager.js.map +2 -2
- package/dist/utils/messages.js +104 -46
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/model.js +2 -2
- package/dist/utils/model.js.map +2 -2
- package/dist/utils/pasteCache.js +8 -4
- package/dist/utils/pasteCache.js.map +2 -2
- package/dist/utils/pluginLoader.js +18 -0
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/secureKeyStorage.js +36 -7
- package/dist/utils/secureKeyStorage.js.map +2 -2
- package/dist/utils/simpleMode.js +7 -0
- package/dist/utils/simpleMode.js.map +7 -0
- package/dist/utils/streamingState.js +11 -1
- package/dist/utils/streamingState.js.map +2 -2
- package/dist/utils/taskDisplayUtils.js +2 -1
- package/dist/utils/taskDisplayUtils.js.map +2 -2
- package/dist/utils/teamConfig.js +2 -2
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/thinking.js +6 -2
- package/dist/utils/thinking.js.map +3 -3
- package/dist/utils/tokenProgress.js +55 -0
- package/dist/utils/tokenProgress.js.map +7 -0
- package/dist/utils/toolRiskClassification.js +26 -17
- package/dist/utils/toolRiskClassification.js.map +2 -2
- package/dist/utils/tooling/toolError.js +12 -0
- package/dist/utils/tooling/toolError.js.map +7 -0
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +10 -8
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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 SYMBOL_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 * Format bidirectional token usage: \u2191input \u2193output\n * Uses compact format without spaces: \u21911.2k \u2193329\n * Distinguishes from global stats which use the spaced format: \u2191 1.2k \u00B7 \u2193 329\n */\nfunction formatBidirectionalTokens(\n inputTokens: number,\n outputTokens: number,\n): string {\n const parts: string[] = []\n if (inputTokens > 0) {\n parts.push(`\u2191${formatTokens(inputTokens)}`)\n }\n if (outputTokens > 0) {\n parts.push(`\u2193${formatTokens(outputTokens)}`)\n }\n return parts.join(' ')\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 color={SEMANTIC_COLORS.dim}>\n ... {hiddenCount} earlier tools hidden\n </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 SYMBOL_COLORS \u4E0E Logo \u54C1\u724C\u914D\u8272\u4FDD\u6301\u4E00\u81F4 */}\n {tool.isExecuting ? (\n <Text color={SYMBOL_COLORS.running}>{SYMBOLS.TOOL_RUNNING} </Text>\n ) : (\n <Text color={SYMBOL_COLORS.child}>{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 ? SYMBOL_COLORS.running\n : SEMANTIC_COLORS.secondary\n }\n >\n {displayName}\n </Text>\n {description && (\n <Text\n color={\n tool.isExecuting ? SYMBOL_COLORS.running : SEMANTIC_COLORS.dim\n }\n >\n ({description})\n </Text>\n )}\n {tool.isExecuting && (\n <Text color={SYMBOL_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 undefined\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: compact stats with bidirectional tokens\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n (\n {formatStats([\n formatCount(transcript.toolUseCount, 'tool'),\n formatBidirectionalTokens(\n transcript.tokenUsage.inputTokens,\n transcript.tokenUsage.outputTokens,\n ),\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 bidirectional tokens: \u2191input \u2193output\n formatBidirectionalTokens(\n transcript.tokenUsage.inputTokens,\n transcript.tokenUsage.outputTokens,\n ) || null,\n ])}\n )\n </Text>\n )}\n {/* Agent ID for non-module view */}\n {!inModule && transcript && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n [{transcript.agentId.slice(0, 8)}]\n </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: compact display with bidirectional tokens\n <Text color={SEMANTIC_COLORS.dim}>\n {status === 'completed' ? '\u2713' : '\u22EF'} Tools:{' '}\n {transcript.toolUseCount} |{' '}\n {formatBidirectionalTokens(\n transcript.tokenUsage.inputTokens,\n transcript.tokenUsage.outputTokens,\n )}\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 color={SEMANTIC_COLORS.dim}>\n Output \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n </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": "AAOA,OAAO,SAAS,UAAU,iBAAiB;AAC3C,SAAS,KAAK,YAAY;AAI1B,SAAS,qBAAqB;AAC9B,SAAS,wBAAwB;
|
|
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 { TreeConnector, 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 {\n formatDuration,\n formatBidirectionalTokens,\n formatNumber,\n} 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 SYMBOL_COLORS,\n} from '@constants/colors'\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 color={SEMANTIC_COLORS.dim}>\n ... {hiddenCount} earlier tools hidden\n </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 SYMBOL_COLORS \u4E0E Logo \u54C1\u724C\u914D\u8272\u4FDD\u6301\u4E00\u81F4 */}\n {tool.isExecuting ? (\n <Text color={SYMBOL_COLORS.running}>{SYMBOLS.TOOL_RUNNING} </Text>\n ) : (\n <Text color={SYMBOL_COLORS.child}>{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 ? SYMBOL_COLORS.running\n : SEMANTIC_COLORS.secondary\n }\n >\n {displayName}\n </Text>\n {description && (\n <Text\n color={\n tool.isExecuting ? SYMBOL_COLORS.running : SEMANTIC_COLORS.dim\n }\n >\n ({description})\n </Text>\n )}\n {tool.isExecuting && (\n <Text color={SYMBOL_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 // Detect background team agents \u2014 suppress tool calls + stats for cleaner display\n // Check transcript metadata first (available before output), then fall back to output content\n const isBackgroundAgent = (() => {\n if (transcript?.metadata?.isBackground) return true\n const content = output?.content\n if (typeof content === 'string')\n return content.includes('running in background')\n if (Array.isArray(content)) {\n return content.some(\n (c: any) =>\n c.type === 'text' &&\n typeof c.text === 'string' &&\n c.text.includes('running in background'),\n )\n }\n return false\n })()\n\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 undefined\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 && <TreeConnector isLast={isLastInModule} />}\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 (hidden for background team agents) */}\n {inModule && isCompleted && transcript && !isBackgroundAgent && (\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: compact stats with output tokens\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n (\n {formatStats([\n formatCount(transcript.toolUseCount, 'tool'),\n formatBidirectionalTokens(\n transcript.tokenUsage.inputTokens,\n transcript.tokenUsage.outputTokens,\n ),\n duration,\n ])}\n )\n </Text>\n )}\n </>\n )}\n {/* Running indicator with elapsed time, tokens, and model (hidden for background team agents) */}\n {inModule &&\n status === 'running' &&\n transcript &&\n !isBackgroundAgent && (\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: \u2193 X tokens\n formatBidirectionalTokens(\n transcript.tokenUsage.inputTokens,\n transcript.tokenUsage.outputTokens,\n ) || null,\n ])}\n )\n </Text>\n )}\n {/* Agent ID for non-module view */}\n {!inModule && transcript && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n [{transcript.agentId.slice(0, 8)}]\n </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 {formatNumber(totalTokens)}\n </Text>\n ) : (\n // Normal mode: compact display with output tokens\n <Text color={SEMANTIC_COLORS.dim}>\n {status === 'completed' ? '\u2713' : '\u22EF'} Tools:{' '}\n {transcript.toolUseCount} |{' '}\n {formatBidirectionalTokens(\n transcript.tokenUsage.inputTokens,\n transcript.tokenUsage.outputTokens,\n )}\n {duration ? ` | ${duration}` : ''}\n </Text>\n )}\n </Box>\n )}\n\n {/* Tool use history - suppressed for background team agents unless verbose/expanded */}\n {transcript && (!isBackgroundAgent || config.showAllChildren) && (\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 {/* Hidden for background agents \u2014 description already shown in header */}\n {output && isCompleted && !isBackgroundAgent && (\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 color={SEMANTIC_COLORS.dim}>\n Output \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n </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
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { logError } from "../../utils/log.js";
|
|
4
|
+
import { useTerminalSize } from "../../hooks/useTerminalSize.js";
|
|
5
|
+
import { BRAND_GRADIENT, SEMANTIC_COLORS } from "../../constants/colors.js";
|
|
6
|
+
const USER_GUIDANCE_RE = /<user-guidance>\n?([\s\S]*?)\n?<\/user-guidance>/g;
|
|
7
|
+
const SYSTEM_REMINDER_RE = /<system-reminder>[\s\S]*?<\/system-reminder>\s*/g;
|
|
8
|
+
function UserGuidanceMessage({
|
|
9
|
+
addMargin,
|
|
10
|
+
param: { text }
|
|
11
|
+
}) {
|
|
12
|
+
const { columns } = useTerminalSize();
|
|
13
|
+
if (!text) {
|
|
14
|
+
logError("No content found in user guidance message");
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const displayText = text.replace(SYSTEM_REMINDER_RE, "").replace(USER_GUIDANCE_RE, "$1").trim();
|
|
18
|
+
if (!displayText) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
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: BRAND_GRADIENT.MIDDLE, bold: true }, "\u276F")), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width: columns - 4 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary, wrap: "wrap", italic: true }, displayText)));
|
|
22
|
+
}
|
|
23
|
+
export {
|
|
24
|
+
UserGuidanceMessage
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=UserGuidanceMessage.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/messages/UserGuidanceMessage.tsx"],
|
|
4
|
+
"sourcesContent": ["import React from 'react'\nimport { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Box, Text } from 'ink'\nimport { logError } from '@utils/log'\nimport { useTerminalSize } from '@hooks/useTerminalSize'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\n\ntype Props = {\n addMargin: boolean\n param: TextBlockParam\n}\n\n// Strip wrapper tags but keep inner content\nconst USER_GUIDANCE_RE = /<user-guidance>\\n?([\\s\\S]*?)\\n?<\\/user-guidance>/g\n// Also strip any system-reminder tags\nconst SYSTEM_REMINDER_RE = /<system-reminder>[\\s\\S]*?<\\/system-reminder>\\s*/g\n\n/**\n * Renders user guidance injected during an active query.\n * Displayed with a distinct visual style (yellow \u276F) to differentiate\n * from regular user prompts.\n */\nexport function UserGuidanceMessage({\n addMargin,\n param: { text },\n}: Props): React.ReactNode {\n const { columns } = useTerminalSize()\n if (!text) {\n logError('No content found in user guidance message')\n return null\n }\n\n const displayText = text\n .replace(SYSTEM_REMINDER_RE, '')\n .replace(USER_GUIDANCE_RE, '$1')\n .trim()\n if (!displayText) {\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={BRAND_GRADIENT.MIDDLE} bold>\n \u276F\n </Text>\n </Box>\n <Box flexDirection=\"column\" width={columns - 4}>\n <Text color={SEMANTIC_COLORS.secondary} wrap=\"wrap\" italic>\n {displayText}\n </Text>\n </Box>\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,WAAW;AAElB,SAAS,KAAK,YAAY;AAC1B,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC,SAAS,gBAAgB,uBAAuB;AAQhD,MAAM,mBAAmB;AAEzB,MAAM,qBAAqB;AAOpB,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA,OAAO,EAAE,KAAK;AAChB,GAA2B;AACzB,QAAM,EAAE,QAAQ,IAAI,gBAAgB;AACpC,MAAI,CAAC,MAAM;AACT,aAAS,2CAA2C;AACpD,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,KACjB,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,kBAAkB,IAAI,EAC9B,KAAK;AACR,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,SACE,oCAAC,OAAI,eAAc,OAAM,WAAW,YAAY,IAAI,GAAG,OAAM,UAC3D,oCAAC,OAAI,UAAU,GAAG,OAAO,KACvB,oCAAC,QAAK,OAAO,eAAe,QAAQ,MAAI,QAAC,QAEzC,CACF,GACA,oCAAC,OAAI,eAAc,UAAS,OAAO,UAAU,KAC3C,oCAAC,QAAK,OAAO,gBAAgB,WAAW,MAAK,QAAO,QAAM,QACvD,WACH,CACF,CACF;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -4,6 +4,7 @@ import { logError } from "../../utils/log.js";
|
|
|
4
4
|
import { useTerminalSize } from "../../hooks/useTerminalSize.js";
|
|
5
5
|
import { BRAND_GRADIENT, SEMANTIC_COLORS } from "../../constants/colors.js";
|
|
6
6
|
const SYSTEM_REMINDER_RE = /<system-reminder>[\s\S]*?<\/system-reminder>\s*/g;
|
|
7
|
+
const USER_GUIDANCE_RE = /<user-guidance>\n?([\s\S]*?)\n?<\/user-guidance>/g;
|
|
7
8
|
function UserPromptMessage({
|
|
8
9
|
addMargin,
|
|
9
10
|
param: { text }
|
|
@@ -13,7 +14,7 @@ function UserPromptMessage({
|
|
|
13
14
|
logError("No content found in user prompt message");
|
|
14
15
|
return null;
|
|
15
16
|
}
|
|
16
|
-
const displayText = text.replace(SYSTEM_REMINDER_RE, "").trim();
|
|
17
|
+
const displayText = text.replace(SYSTEM_REMINDER_RE, "").replace(USER_GUIDANCE_RE, "$1").trim();
|
|
17
18
|
if (!displayText) {
|
|
18
19
|
return null;
|
|
19
20
|
}
|
|
@@ -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 { logError } from '@utils/log'\nimport { useTerminalSize } from '@hooks/useTerminalSize'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\n\ntype Props = {\n addMargin: boolean\n param: TextBlockParam\n}\n\n// Strip system-reminder tags that should never be visible to the user\nconst SYSTEM_REMINDER_RE = /<system-reminder>[\\s\\S]*?<\\/system-reminder>\\s*/g\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 const displayText = text.replace(SYSTEM_REMINDER_RE, '').trim()\n if (!displayText) {\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={BRAND_GRADIENT.START} bold>\n \u276F\n </Text>\n </Box>\n <Box flexDirection=\"column\" width={columns - 4}>\n <Text color={SEMANTIC_COLORS.secondary} wrap=\"wrap\">\n {displayText}\n </Text>\n </Box>\n </Box>\n )\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAAO,WAAW;AAElB,SAAS,KAAK,YAAY;AAC1B,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC,SAAS,gBAAgB,uBAAuB;AAQhD,MAAM,qBAAqB;
|
|
4
|
+
"sourcesContent": ["import React from 'react'\nimport { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Box, Text } from 'ink'\nimport { logError } from '@utils/log'\nimport { useTerminalSize } from '@hooks/useTerminalSize'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\n\ntype Props = {\n addMargin: boolean\n param: TextBlockParam\n}\n\n// Strip system-reminder tags that should never be visible to the user\nconst SYSTEM_REMINDER_RE = /<system-reminder>[\\s\\S]*?<\\/system-reminder>\\s*/g\n// Strip user-guidance wrapper tags but keep inner content\nconst USER_GUIDANCE_RE = /<user-guidance>\\n?([\\s\\S]*?)\\n?<\\/user-guidance>/g\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 const displayText = text\n .replace(SYSTEM_REMINDER_RE, '')\n .replace(USER_GUIDANCE_RE, '$1')\n .trim()\n if (!displayText) {\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={BRAND_GRADIENT.START} bold>\n \u276F\n </Text>\n </Box>\n <Box flexDirection=\"column\" width={columns - 4}>\n <Text color={SEMANTIC_COLORS.secondary} wrap=\"wrap\">\n {displayText}\n </Text>\n </Box>\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,WAAW;AAElB,SAAS,KAAK,YAAY;AAC1B,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC,SAAS,gBAAgB,uBAAuB;AAQhD,MAAM,qBAAqB;AAE3B,MAAM,mBAAmB;AAElB,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,QAAM,cAAc,KACjB,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,kBAAkB,IAAI,EAC9B,KAAK;AACR,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,SACE,oCAAC,OAAI,eAAc,OAAM,WAAW,YAAY,IAAI,GAAG,OAAM,UAC3D,oCAAC,OAAI,UAAU,GAAG,OAAO,KACvB,oCAAC,QAAK,OAAO,eAAe,OAAO,MAAI,QAAC,QAExC,CACF,GACA,oCAAC,OAAI,eAAc,UAAS,OAAO,UAAU,KAC3C,oCAAC,QAAK,OAAO,gBAAgB,WAAW,MAAK,UAC1C,WACH,CACF,CACF;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { UserPromptMessage } from "./UserPromptMessage.js";
|
|
4
|
+
import { useTerminalSize } from "../../hooks/useTerminalSize.js";
|
|
5
|
+
import { BRAND_GRADIENT, SEMANTIC_COLORS } from "../../constants/colors.js";
|
|
6
|
+
const TEAM_MESSAGE_RE = /<team-message\s+([^>]*)>([\s\S]*?)<\/team-message>/g;
|
|
7
|
+
const TASK_NOTIFICATION_RE = /<task-notification>[\s\S]*?<\/task-notification>\s*/g;
|
|
8
|
+
const PROTOCOL_SUMMARIES = {
|
|
9
|
+
shutdown_approved: "Shutdown approved",
|
|
10
|
+
shutdown_rejected: "Shutdown rejected",
|
|
11
|
+
shutdown_request: "Shutdown requested",
|
|
12
|
+
plan_approved: "Plan approved",
|
|
13
|
+
plan_rejected: "Plan rejected",
|
|
14
|
+
plan_approval_request: "Plan review requested"
|
|
15
|
+
};
|
|
16
|
+
function humanizeProtocolBody(text) {
|
|
17
|
+
try {
|
|
18
|
+
const parsed = JSON.parse(text);
|
|
19
|
+
if (parsed && typeof parsed === "object" && parsed.type in PROTOCOL_SUMMARIES) {
|
|
20
|
+
return PROTOCOL_SUMMARIES[parsed.type] || null;
|
|
21
|
+
}
|
|
22
|
+
} catch {
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
function parseTeamContent(text) {
|
|
27
|
+
const banners = [];
|
|
28
|
+
let processed = text.replace(
|
|
29
|
+
TEAM_MESSAGE_RE,
|
|
30
|
+
(_match, attrs, body) => {
|
|
31
|
+
const attrMap = {};
|
|
32
|
+
const attrRe = /(\w+)="([^"]*)"/g;
|
|
33
|
+
let m;
|
|
34
|
+
while ((m = attrRe.exec(attrs)) !== null) {
|
|
35
|
+
attrMap[m[1]] = m[2];
|
|
36
|
+
}
|
|
37
|
+
banners.push({
|
|
38
|
+
from: attrMap.from || "unknown",
|
|
39
|
+
summary: attrMap.summary || "",
|
|
40
|
+
body: (body || "").trim(),
|
|
41
|
+
color: attrMap.color
|
|
42
|
+
});
|
|
43
|
+
return "";
|
|
44
|
+
}
|
|
45
|
+
);
|
|
46
|
+
processed = processed.replace(TASK_NOTIFICATION_RE, "");
|
|
47
|
+
const remaining = processed.trim();
|
|
48
|
+
return { banners, remaining };
|
|
49
|
+
}
|
|
50
|
+
function UserTeamNotificationMessage({
|
|
51
|
+
addMargin,
|
|
52
|
+
param
|
|
53
|
+
}) {
|
|
54
|
+
const { columns } = useTerminalSize();
|
|
55
|
+
const { banners, remaining } = parseTeamContent(param.text);
|
|
56
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginTop: addMargin ? 1 : 0 }, banners.map((banner, i) => {
|
|
57
|
+
const humanized = banner.body ? humanizeProtocolBody(banner.body) : null;
|
|
58
|
+
let displayText;
|
|
59
|
+
if (humanized) {
|
|
60
|
+
displayText = humanized;
|
|
61
|
+
} else if (banner.body && banner.body !== banner.summary) {
|
|
62
|
+
displayText = banner.body;
|
|
63
|
+
} else {
|
|
64
|
+
displayText = banner.summary || banner.body;
|
|
65
|
+
}
|
|
66
|
+
const borderColor = banner.color || BRAND_GRADIENT.START;
|
|
67
|
+
return /* @__PURE__ */ React.createElement(
|
|
68
|
+
Box,
|
|
69
|
+
{
|
|
70
|
+
key: i,
|
|
71
|
+
marginTop: i > 0 ? 1 : 0,
|
|
72
|
+
borderLeftStyle: "single",
|
|
73
|
+
borderLeftColor: borderColor,
|
|
74
|
+
paddingLeft: 1,
|
|
75
|
+
flexDirection: "column"
|
|
76
|
+
},
|
|
77
|
+
/* @__PURE__ */ React.createElement(Text, { color: borderColor, bold: true }, "@", banner.from),
|
|
78
|
+
displayText && /* @__PURE__ */ React.createElement(Box, { width: Math.max(columns - 6, 40) }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary, wrap: "wrap" }, displayText))
|
|
79
|
+
);
|
|
80
|
+
}), remaining && /* @__PURE__ */ React.createElement(
|
|
81
|
+
UserPromptMessage,
|
|
82
|
+
{
|
|
83
|
+
addMargin: banners.length > 0,
|
|
84
|
+
param: { ...param, text: remaining }
|
|
85
|
+
}
|
|
86
|
+
));
|
|
87
|
+
}
|
|
88
|
+
export {
|
|
89
|
+
UserTeamNotificationMessage
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=UserTeamNotificationMessage.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/messages/UserTeamNotificationMessage.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * User Team Notification Message\n *\n * Renders <team-message> XML tags as styled message boxes with a left border,\n * showing the sender name and full message body.\n * Strips <task-notification> tags entirely (idle notifications handled by toast bar).\n * Falls through to UserPromptMessage for any remaining text.\n */\n\nimport React from 'react'\nimport { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Box, Text } from 'ink'\nimport { UserPromptMessage } from './UserPromptMessage'\nimport { useTerminalSize } from '@hooks/useTerminalSize'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\n\ntype Props = {\n addMargin: boolean\n param: TextBlockParam\n}\n\n// Match <team-message ...attrs...>body</team-message>\nconst TEAM_MESSAGE_RE = /<team-message\\s+([^>]*)>([\\s\\S]*?)<\\/team-message>/g\n\n// Match <task-notification>...</task-notification>\nconst TASK_NOTIFICATION_RE =\n /<task-notification>[\\s\\S]*?<\\/task-notification>\\s*/g\n\ninterface TeamBanner {\n from: string\n summary: string\n body: string\n color?: string\n}\n\n/**\n * Protocol message type \u2192 human-friendly summary.\n */\nconst PROTOCOL_SUMMARIES: Record<string, string> = {\n shutdown_approved: 'Shutdown approved',\n shutdown_rejected: 'Shutdown rejected',\n shutdown_request: 'Shutdown requested',\n plan_approved: 'Plan approved',\n plan_rejected: 'Plan rejected',\n plan_approval_request: 'Plan review requested',\n}\n\n/**\n * Try to convert a protocol JSON body to a human-readable string.\n */\nfunction humanizeProtocolBody(text: string): string | null {\n try {\n const parsed = JSON.parse(text)\n if (\n parsed &&\n typeof parsed === 'object' &&\n parsed.type in PROTOCOL_SUMMARIES\n ) {\n return PROTOCOL_SUMMARIES[parsed.type] || null\n }\n } catch {\n /* not JSON */\n }\n return null\n}\n\n/**\n * Extract team message data (sender, summary, body, color) from XML tags.\n * Strips task-notification tags entirely.\n */\nfunction parseTeamContent(text: string): {\n banners: TeamBanner[]\n remaining: string\n} {\n const banners: TeamBanner[] = []\n\n let processed = text.replace(\n TEAM_MESSAGE_RE,\n (_match, attrs: string, body: string) => {\n const attrMap: Record<string, string> = {}\n const attrRe = /(\\w+)=\"([^\"]*)\"/g\n let m: RegExpExecArray | null\n while ((m = attrRe.exec(attrs)) !== null) {\n attrMap[m[1]!] = m[2]!\n }\n banners.push({\n from: attrMap.from || 'unknown',\n summary: attrMap.summary || '',\n body: (body || '').trim(),\n color: attrMap.color,\n })\n return ''\n },\n )\n\n // Strip task-notification tags entirely\n processed = processed.replace(TASK_NOTIFICATION_RE, '')\n const remaining = processed.trim()\n return { banners, remaining }\n}\n\nexport function UserTeamNotificationMessage({\n addMargin,\n param,\n}: Props): React.ReactNode {\n const { columns } = useTerminalSize()\n const { banners, remaining } = parseTeamContent(param.text)\n\n return (\n <Box flexDirection=\"column\" marginTop={addMargin ? 1 : 0}>\n {banners.map((banner, i) => {\n // Determine display text:\n // 1. If body is a protocol message (JSON), humanize it\n // 2. If body exists and differs from summary, show full body\n // 3. Otherwise show summary\n const humanized = banner.body ? humanizeProtocolBody(banner.body) : null\n let displayText: string\n if (humanized) {\n displayText = humanized\n } else if (banner.body && banner.body !== banner.summary) {\n displayText = banner.body\n } else {\n displayText = banner.summary || banner.body\n }\n\n const borderColor = banner.color || BRAND_GRADIENT.START\n\n return (\n <Box\n key={i}\n marginTop={i > 0 ? 1 : 0}\n borderLeftStyle=\"single\"\n borderLeftColor={borderColor}\n paddingLeft={1}\n flexDirection=\"column\"\n >\n <Text color={borderColor} bold>\n @{banner.from}\n </Text>\n {displayText && (\n <Box width={Math.max(columns - 6, 40)}>\n <Text color={SEMANTIC_COLORS.secondary} wrap=\"wrap\">\n {displayText}\n </Text>\n </Box>\n )}\n </Box>\n )\n })}\n\n {/* If there's remaining text after stripping tags, render via UserPromptMessage */}\n {remaining && (\n <UserPromptMessage\n addMargin={banners.length > 0}\n param={{ ...param, text: remaining }}\n />\n )}\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "AASA,OAAO,WAAW;AAElB,SAAS,KAAK,YAAY;AAC1B,SAAS,yBAAyB;AAClC,SAAS,uBAAuB;AAChC,SAAS,gBAAgB,uBAAuB;AAQhD,MAAM,kBAAkB;AAGxB,MAAM,uBACJ;AAYF,MAAM,qBAA6C;AAAA,EACjD,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,uBAAuB;AACzB;AAKA,SAAS,qBAAqB,MAA6B;AACzD,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,QACE,UACA,OAAO,WAAW,YAClB,OAAO,QAAQ,oBACf;AACA,aAAO,mBAAmB,OAAO,IAAI,KAAK;AAAA,IAC5C;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAMA,SAAS,iBAAiB,MAGxB;AACA,QAAM,UAAwB,CAAC;AAE/B,MAAI,YAAY,KAAK;AAAA,IACnB;AAAA,IACA,CAAC,QAAQ,OAAe,SAAiB;AACvC,YAAM,UAAkC,CAAC;AACzC,YAAM,SAAS;AACf,UAAI;AACJ,cAAQ,IAAI,OAAO,KAAK,KAAK,OAAO,MAAM;AACxC,gBAAQ,EAAE,CAAC,CAAE,IAAI,EAAE,CAAC;AAAA,MACtB;AACA,cAAQ,KAAK;AAAA,QACX,MAAM,QAAQ,QAAQ;AAAA,QACtB,SAAS,QAAQ,WAAW;AAAA,QAC5B,OAAO,QAAQ,IAAI,KAAK;AAAA,QACxB,OAAO,QAAQ;AAAA,MACjB,CAAC;AACD,aAAO;AAAA,IACT;AAAA,EACF;AAGA,cAAY,UAAU,QAAQ,sBAAsB,EAAE;AACtD,QAAM,YAAY,UAAU,KAAK;AACjC,SAAO,EAAE,SAAS,UAAU;AAC9B;AAEO,SAAS,4BAA4B;AAAA,EAC1C;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,EAAE,QAAQ,IAAI,gBAAgB;AACpC,QAAM,EAAE,SAAS,UAAU,IAAI,iBAAiB,MAAM,IAAI;AAE1D,SACE,oCAAC,OAAI,eAAc,UAAS,WAAW,YAAY,IAAI,KACpD,QAAQ,IAAI,CAAC,QAAQ,MAAM;AAK1B,UAAM,YAAY,OAAO,OAAO,qBAAqB,OAAO,IAAI,IAAI;AACpE,QAAI;AACJ,QAAI,WAAW;AACb,oBAAc;AAAA,IAChB,WAAW,OAAO,QAAQ,OAAO,SAAS,OAAO,SAAS;AACxD,oBAAc,OAAO;AAAA,IACvB,OAAO;AACL,oBAAc,OAAO,WAAW,OAAO;AAAA,IACzC;AAEA,UAAM,cAAc,OAAO,SAAS,eAAe;AAEnD,WACE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAW,IAAI,IAAI,IAAI;AAAA,QACvB,iBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,aAAa;AAAA,QACb,eAAc;AAAA;AAAA,MAEd,oCAAC,QAAK,OAAO,aAAa,MAAI,QAAC,KAC3B,OAAO,IACX;AAAA,MACC,eACC,oCAAC,OAAI,OAAO,KAAK,IAAI,UAAU,GAAG,EAAE,KAClC,oCAAC,QAAK,OAAO,gBAAgB,WAAW,MAAK,UAC1C,WACH,CACF;AAAA,IAEJ;AAAA,EAEJ,CAAC,GAGA,aACC;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,QAAQ,SAAS;AAAA,MAC5B,OAAO,EAAE,GAAG,OAAO,MAAM,UAAU;AAAA;AAAA,EACrC,CAEJ;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { UserBashInputMessage } from "./UserBashInputMessage.js";
|
|
2
|
+
import { UserGuidanceMessage } from "./UserGuidanceMessage.js";
|
|
2
3
|
import { UserKodingInputMessage } from "./UserKodingInputMessage.js";
|
|
3
4
|
import { UserCommandMessage } from "./UserCommandMessage.js";
|
|
4
5
|
import { UserPromptMessage } from "./UserPromptMessage.js";
|
|
6
|
+
import { UserTeamNotificationMessage } from "./UserTeamNotificationMessage.js";
|
|
5
7
|
import * as React from "react";
|
|
6
8
|
import { NO_CONTENT_MESSAGE } from "../../services/claude.js";
|
|
7
9
|
function UserTextMessage({ addMargin, param }) {
|
|
@@ -17,6 +19,12 @@ function UserTextMessage({ addMargin, param }) {
|
|
|
17
19
|
if (param.text.includes("<command-name>") || param.text.includes("<command-message>")) {
|
|
18
20
|
return /* @__PURE__ */ React.createElement(UserCommandMessage, { addMargin, param });
|
|
19
21
|
}
|
|
22
|
+
if (param.text.includes("<team-message") || param.text.includes("<task-notification>")) {
|
|
23
|
+
return /* @__PURE__ */ React.createElement(UserTeamNotificationMessage, { addMargin, param });
|
|
24
|
+
}
|
|
25
|
+
if (param.text.includes("<user-guidance>")) {
|
|
26
|
+
return /* @__PURE__ */ React.createElement(UserGuidanceMessage, { addMargin, param });
|
|
27
|
+
}
|
|
20
28
|
return /* @__PURE__ */ React.createElement(UserPromptMessage, { addMargin, param });
|
|
21
29
|
}
|
|
22
30
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/messages/UserTextMessage.tsx"],
|
|
4
|
-
"sourcesContent": ["import { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { UserBashInputMessage } from './UserBashInputMessage'\nimport { UserKodingInputMessage } from './UserKodingInputMessage'\nimport { UserCommandMessage } from './UserCommandMessage'\nimport { UserPromptMessage } from './UserPromptMessage'\nimport * as React from 'react'\nimport { NO_CONTENT_MESSAGE } from '@services/claude'\n\ntype Props = {\n addMargin: boolean\n param: TextBlockParam\n}\n\nexport function UserTextMessage({ addMargin, param }: Props): React.ReactNode {\n if (param.text.trim() === NO_CONTENT_MESSAGE) {\n return null\n }\n\n // Koding inputs!\n if (param.text.includes('<koding-input>')) {\n return <UserKodingInputMessage addMargin={addMargin} param={param} />\n }\n\n // Bash inputs!\n if (param.text.includes('<bash-input>')) {\n return <UserBashInputMessage addMargin={addMargin} param={param} />\n }\n\n // Slash commands/\n if (\n param.text.includes('<command-name>') ||\n param.text.includes('<command-message>')\n ) {\n return <UserCommandMessage addMargin={addMargin} param={param} />\n }\n\n // User prompts>\n return <UserPromptMessage addMargin={addMargin} param={param} />\n}\n"],
|
|
5
|
-
"mappings": "AACA,SAAS,4BAA4B;AACrC,SAAS,8BAA8B;AACvC,SAAS,0BAA0B;AACnC,SAAS,yBAAyB;AAClC,YAAY,WAAW;AACvB,SAAS,0BAA0B;AAO5B,SAAS,gBAAgB,EAAE,WAAW,MAAM,GAA2B;AAC5E,MAAI,MAAM,KAAK,KAAK,MAAM,oBAAoB;AAC5C,WAAO;AAAA,EACT;AAGA,MAAI,MAAM,KAAK,SAAS,gBAAgB,GAAG;AACzC,WAAO,oCAAC,0BAAuB,WAAsB,OAAc;AAAA,EACrE;AAGA,MAAI,MAAM,KAAK,SAAS,cAAc,GAAG;AACvC,WAAO,oCAAC,wBAAqB,WAAsB,OAAc;AAAA,EACnE;AAGA,MACE,MAAM,KAAK,SAAS,gBAAgB,KACpC,MAAM,KAAK,SAAS,mBAAmB,GACvC;AACA,WAAO,oCAAC,sBAAmB,WAAsB,OAAc;AAAA,EACjE;AAGA,SAAO,oCAAC,qBAAkB,WAAsB,OAAc;AAChE;",
|
|
4
|
+
"sourcesContent": ["import { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { UserBashInputMessage } from './UserBashInputMessage'\nimport { UserGuidanceMessage } from './UserGuidanceMessage'\nimport { UserKodingInputMessage } from './UserKodingInputMessage'\nimport { UserCommandMessage } from './UserCommandMessage'\nimport { UserPromptMessage } from './UserPromptMessage'\nimport { UserTeamNotificationMessage } from './UserTeamNotificationMessage'\nimport * as React from 'react'\nimport { NO_CONTENT_MESSAGE } from '@services/claude'\n\ntype Props = {\n addMargin: boolean\n param: TextBlockParam\n}\n\nexport function UserTextMessage({ addMargin, param }: Props): React.ReactNode {\n if (param.text.trim() === NO_CONTENT_MESSAGE) {\n return null\n }\n\n // Koding inputs!\n if (param.text.includes('<koding-input>')) {\n return <UserKodingInputMessage addMargin={addMargin} param={param} />\n }\n\n // Bash inputs!\n if (param.text.includes('<bash-input>')) {\n return <UserBashInputMessage addMargin={addMargin} param={param} />\n }\n\n // Slash commands/\n if (\n param.text.includes('<command-name>') ||\n param.text.includes('<command-message>')\n ) {\n return <UserCommandMessage addMargin={addMargin} param={param} />\n }\n\n // Team messages and task notifications\n if (\n param.text.includes('<team-message') ||\n param.text.includes('<task-notification>')\n ) {\n return <UserTeamNotificationMessage addMargin={addMargin} param={param} />\n }\n\n // User guidance injected during active query\n if (param.text.includes('<user-guidance>')) {\n return <UserGuidanceMessage addMargin={addMargin} param={param} />\n }\n\n // User prompts>\n return <UserPromptMessage addMargin={addMargin} param={param} />\n}\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;AACpC,SAAS,8BAA8B;AACvC,SAAS,0BAA0B;AACnC,SAAS,yBAAyB;AAClC,SAAS,mCAAmC;AAC5C,YAAY,WAAW;AACvB,SAAS,0BAA0B;AAO5B,SAAS,gBAAgB,EAAE,WAAW,MAAM,GAA2B;AAC5E,MAAI,MAAM,KAAK,KAAK,MAAM,oBAAoB;AAC5C,WAAO;AAAA,EACT;AAGA,MAAI,MAAM,KAAK,SAAS,gBAAgB,GAAG;AACzC,WAAO,oCAAC,0BAAuB,WAAsB,OAAc;AAAA,EACrE;AAGA,MAAI,MAAM,KAAK,SAAS,cAAc,GAAG;AACvC,WAAO,oCAAC,wBAAqB,WAAsB,OAAc;AAAA,EACnE;AAGA,MACE,MAAM,KAAK,SAAS,gBAAgB,KACpC,MAAM,KAAK,SAAS,mBAAmB,GACvC;AACA,WAAO,oCAAC,sBAAmB,WAAsB,OAAc;AAAA,EACjE;AAGA,MACE,MAAM,KAAK,SAAS,eAAe,KACnC,MAAM,KAAK,SAAS,qBAAqB,GACzC;AACA,WAAO,oCAAC,+BAA4B,WAAsB,OAAc;AAAA,EAC1E;AAGA,MAAI,MAAM,KAAK,SAAS,iBAAiB,GAAG;AAC1C,WAAO,oCAAC,uBAAoB,WAAsB,OAAc;AAAA,EAClE;AAGA,SAAO,oCAAC,qBAAkB,WAAsB,OAAc;AAChE;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -6,7 +6,8 @@ function UserToolRejectMessage({
|
|
|
6
6
|
toolUseID,
|
|
7
7
|
tools,
|
|
8
8
|
messages,
|
|
9
|
-
verbose
|
|
9
|
+
verbose,
|
|
10
|
+
feedbackText
|
|
10
11
|
}) {
|
|
11
12
|
const { columns } = useTerminalSize();
|
|
12
13
|
const { tool, toolUse } = useGetToolFromMessages(toolUseID, tools, messages);
|
|
@@ -14,7 +15,8 @@ function UserToolRejectMessage({
|
|
|
14
15
|
if (input.success) {
|
|
15
16
|
return tool.renderToolUseRejectedMessage(input.data, {
|
|
16
17
|
columns,
|
|
17
|
-
verbose
|
|
18
|
+
verbose,
|
|
19
|
+
feedbackText
|
|
18
20
|
});
|
|
19
21
|
}
|
|
20
22
|
return /* @__PURE__ */ React.createElement(FallbackToolUseRejectedMessage, null);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react'\nimport { Tool } from '@tool'\nimport { Message } from '@query'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { useGetToolFromMessages } from './utils'\nimport { useTerminalSize } from '@hooks/useTerminalSize'\n\ntype Props = {\n toolUseID: string\n messages: Message[]\n tools: Tool[]\n verbose: boolean\n}\n\nexport function UserToolRejectMessage({\n toolUseID,\n tools,\n messages,\n verbose,\n}: Props): React.ReactNode {\n const { columns } = useTerminalSize()\n const { tool, toolUse } = useGetToolFromMessages(toolUseID, tools, messages)\n const input = tool.inputSchema.safeParse(toolUse.input)\n if (input.success) {\n return tool.renderToolUseRejectedMessage(input.data, {\n columns,\n verbose,\n })\n }\n return <FallbackToolUseRejectedMessage />\n}\n"],
|
|
5
|
-
"mappings": "AAAA,YAAY,WAAW;AAGvB,SAAS,sCAAsC;AAC/C,SAAS,8BAA8B;AACvC,SAAS,uBAAuB;
|
|
4
|
+
"sourcesContent": ["import * as React from 'react'\nimport { Tool } from '@tool'\nimport { Message } from '@query'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { useGetToolFromMessages } from './utils'\nimport { useTerminalSize } from '@hooks/useTerminalSize'\n\ntype Props = {\n toolUseID: string\n messages: Message[]\n tools: Tool[]\n verbose: boolean\n feedbackText?: string\n}\n\nexport function UserToolRejectMessage({\n toolUseID,\n tools,\n messages,\n verbose,\n feedbackText,\n}: Props): React.ReactNode {\n const { columns } = useTerminalSize()\n const { tool, toolUse } = useGetToolFromMessages(toolUseID, tools, messages)\n const input = tool.inputSchema.safeParse(toolUse.input)\n if (input.success) {\n return tool.renderToolUseRejectedMessage(input.data, {\n columns,\n verbose,\n feedbackText,\n })\n }\n return <FallbackToolUseRejectedMessage />\n}\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,WAAW;AAGvB,SAAS,sCAAsC;AAC/C,SAAS,8BAA8B;AACvC,SAAS,uBAAuB;AAUzB,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,EAAE,QAAQ,IAAI,gBAAgB;AACpC,QAAM,EAAE,MAAM,QAAQ,IAAI,uBAAuB,WAAW,OAAO,QAAQ;AAC3E,QAAM,QAAQ,KAAK,YAAY,UAAU,QAAQ,KAAK;AACtD,MAAI,MAAM,SAAS;AACjB,WAAO,KAAK,6BAA6B,MAAM,MAAM;AAAA,MACnD;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO,oCAAC,oCAA+B;AACzC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
CANCEL_MESSAGE,
|
|
4
|
+
REJECT_MESSAGE,
|
|
5
|
+
PLAN_REJECT_WITH_FEEDBACK_PREFIX
|
|
6
|
+
} from "../../../utils/messages.js";
|
|
3
7
|
import { UserToolCanceledMessage } from "./UserToolCanceledMessage.js";
|
|
4
8
|
import { UserToolErrorMessage } from "./UserToolErrorMessage.js";
|
|
5
9
|
import { UserToolRejectMessage } from "./UserToolRejectMessage.js";
|
|
@@ -26,6 +30,19 @@ function UserToolResultMessage({
|
|
|
26
30
|
}
|
|
27
31
|
);
|
|
28
32
|
}
|
|
33
|
+
if (typeof param.content === "string" && param.content.startsWith(PLAN_REJECT_WITH_FEEDBACK_PREFIX)) {
|
|
34
|
+
const feedback = param.content.slice(PLAN_REJECT_WITH_FEEDBACK_PREFIX.length).split("\n\n")[0];
|
|
35
|
+
return /* @__PURE__ */ React.createElement(
|
|
36
|
+
UserToolRejectMessage,
|
|
37
|
+
{
|
|
38
|
+
toolUseID: param.tool_use_id,
|
|
39
|
+
tools,
|
|
40
|
+
messages,
|
|
41
|
+
verbose,
|
|
42
|
+
feedbackText: feedback
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
}
|
|
29
46
|
if (param.is_error) {
|
|
30
47
|
return /* @__PURE__ */ React.createElement(UserToolErrorMessage, { param, verbose });
|
|
31
48
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx"],
|
|
4
|
-
"sourcesContent": ["import { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport * as React from 'react'\nimport { Tool } from '@tool'\nimport { Message, UserMessage } from '@query'\nimport {
|
|
5
|
-
"mappings": "AACA,YAAY,WAAW;AAGvB,
|
|
4
|
+
"sourcesContent": ["import { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport * as React from 'react'\nimport { Tool } from '@tool'\nimport { Message, UserMessage } from '@query'\nimport {\n CANCEL_MESSAGE,\n REJECT_MESSAGE,\n PLAN_REJECT_WITH_FEEDBACK_PREFIX,\n} from '@utils/messages'\nimport { UserToolCanceledMessage } from './UserToolCanceledMessage'\nimport { UserToolErrorMessage } from './UserToolErrorMessage'\nimport { UserToolRejectMessage } from './UserToolRejectMessage'\nimport { UserToolSuccessMessage } from './UserToolSuccessMessage'\n\ntype Props = {\n param: ToolResultBlockParam\n message: UserMessage\n messages: Message[]\n tools: Tool[]\n verbose: boolean\n width: number | string\n}\n\nexport function UserToolResultMessage({\n param,\n message,\n messages,\n tools,\n verbose,\n width,\n}: Props): React.ReactNode {\n if (param.content === CANCEL_MESSAGE) {\n return <UserToolCanceledMessage />\n }\n\n if (param.content === REJECT_MESSAGE) {\n return (\n <UserToolRejectMessage\n toolUseID={param.tool_use_id}\n tools={tools}\n messages={messages}\n verbose={verbose}\n />\n )\n }\n\n // Plan rejection with feedback: show feedback text as a styled rejection\n // (not a generic error) so the user can see what feedback was sent\n if (\n typeof param.content === 'string' &&\n param.content.startsWith(PLAN_REJECT_WITH_FEEDBACK_PREFIX)\n ) {\n const feedback = param.content\n .slice(PLAN_REJECT_WITH_FEEDBACK_PREFIX.length)\n .split('\\n\\n')[0] // Extract just the feedback text, not the instruction suffix\n return (\n <UserToolRejectMessage\n toolUseID={param.tool_use_id}\n tools={tools}\n messages={messages}\n verbose={verbose}\n feedbackText={feedback}\n />\n )\n }\n\n if (param.is_error) {\n return <UserToolErrorMessage param={param} verbose={verbose} />\n }\n\n return (\n <UserToolSuccessMessage\n param={param}\n message={message}\n messages={messages}\n tools={tools}\n verbose={verbose}\n width={width}\n />\n )\n}\n"],
|
|
5
|
+
"mappings": "AACA,YAAY,WAAW;AAGvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,+BAA+B;AACxC,SAAS,4BAA4B;AACrC,SAAS,6BAA6B;AACtC,SAAS,8BAA8B;AAWhC,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,MAAI,MAAM,YAAY,gBAAgB;AACpC,WAAO,oCAAC,6BAAwB;AAAA,EAClC;AAEA,MAAI,MAAM,YAAY,gBAAgB;AACpC,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,EAEJ;AAIA,MACE,OAAO,MAAM,YAAY,YACzB,MAAM,QAAQ,WAAW,gCAAgC,GACzD;AACA,UAAM,WAAW,MAAM,QACpB,MAAM,iCAAiC,MAAM,EAC7C,MAAM,MAAM,EAAE,CAAC;AAClB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc;AAAA;AAAA,IAChB;AAAA,EAEJ;AAEA,MAAI,MAAM,UAAU;AAClB,WAAO,oCAAC,wBAAqB,OAAc,SAAkB;AAAA,EAC/D;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -10,7 +10,18 @@ function UserToolSuccessMessage({
|
|
|
10
10
|
verbose,
|
|
11
11
|
width
|
|
12
12
|
}) {
|
|
13
|
-
const { tool } = useGetToolFromMessages(
|
|
13
|
+
const { tool, toolUse } = useGetToolFromMessages(
|
|
14
|
+
param.tool_use_id,
|
|
15
|
+
tools,
|
|
16
|
+
messages
|
|
17
|
+
);
|
|
18
|
+
if (toolUse.name === "SendMessage" && !verbose) {
|
|
19
|
+
const input = toolUse.input;
|
|
20
|
+
const msgType = input?.type;
|
|
21
|
+
if (msgType === "shutdown_request" || msgType === "shutdown_response") {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
14
25
|
return (
|
|
15
26
|
// TODO: Distinguish UserMessage from UserToolResultMessage
|
|
16
27
|
/* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width }, safeRenderToolResult(tool, message.toolUseResult?.data, { verbose }))
|
|
@@ -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'\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
|
|
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,
|
|
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, toolUse } = useGetToolFromMessages(\n param.tool_use_id,\n tools,\n messages,\n )\n\n // Suppress team protocol tool results in non-verbose mode\n if (toolUse.name === 'SendMessage' && !verbose) {\n const input = toolUse.input as Record<string, unknown>\n const msgType = input?.type as string\n if (msgType === 'shutdown_request' || msgType === 'shutdown_response') {\n return null\n }\n }\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,MAAM,QAAQ,IAAI;AAAA,IACxB,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AAGA,MAAI,QAAQ,SAAS,iBAAiB,CAAC,SAAS;AAC9C,UAAM,QAAQ,QAAQ;AACtB,UAAM,UAAU,OAAO;AACvB,QAAI,YAAY,sBAAsB,YAAY,qBAAqB;AACrE,aAAO;AAAA,IACT;AAAA,EACF;AAEA;AAAA;AAAA,IAEE,oCAAC,OAAI,eAAc,UAAS,SACzB,qBAAqB,MAAM,QAAQ,eAAe,MAAM,EAAE,QAAQ,CAAC,CACtE;AAAA;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -15,6 +15,8 @@ import { GrepTool } from "../../tools/GrepTool/GrepTool.js";
|
|
|
15
15
|
import { LSTool } from "../../tools/lsTool/lsTool.js";
|
|
16
16
|
import { FileReadTool } from "../../tools/FileReadTool/FileReadTool.js";
|
|
17
17
|
import { NotebookReadTool } from "../../tools/NotebookReadTool/NotebookReadTool.js";
|
|
18
|
+
import { ExitPlanModeTool } from "../../tools/PlanModeTool/ExitPlanModeTool.js";
|
|
19
|
+
import { PlanApprovalRequest } from "./PlanApprovalRequest.js";
|
|
18
20
|
import { PRODUCT_NAME } from "../../constants/product.js";
|
|
19
21
|
function permissionComponentForTool(tool) {
|
|
20
22
|
switch (tool) {
|
|
@@ -31,6 +33,8 @@ function permissionComponentForTool(tool) {
|
|
|
31
33
|
case NotebookReadTool:
|
|
32
34
|
case NotebookEditTool:
|
|
33
35
|
return FilesystemPermissionRequest;
|
|
36
|
+
case ExitPlanModeTool:
|
|
37
|
+
return PlanApprovalRequest;
|
|
34
38
|
default:
|
|
35
39
|
return FallbackPermissionRequest;
|
|
36
40
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/permissions/PermissionRequest.tsx"],
|
|
4
|
-
"sourcesContent": ["import { useInput } from 'ink'\nimport * as React from 'react'\nimport { Tool } from '@tool'\nimport { AssistantMessage } from '@query'\nimport { FileEditTool } from '@tools/FileEditTool/FileEditTool'\nimport { FileWriteTool } from '@tools/FileWriteTool/FileWriteTool'\nimport { BashTool } from '@tools/BashTool/BashTool'\nimport { FileEditPermissionRequest } from './FileEditPermissionRequest/FileEditPermissionRequest'\nimport { BashPermissionRequest } from './BashPermissionRequest/BashPermissionRequest'\nimport { FallbackPermissionRequest } from './FallbackPermissionRequest'\nimport { useNotifyAfterTimeout } from '@hooks/useNotifyAfterTimeout'\nimport { FileWritePermissionRequest } from './FileWritePermissionRequest/FileWritePermissionRequest'\nimport { type CommandSubcommandPrefixResult } from '@utils/commands'\nimport { FilesystemPermissionRequest } from './FilesystemPermissionRequest/FilesystemPermissionRequest'\nimport { NotebookEditTool } from '@tools/NotebookEditTool/NotebookEditTool'\nimport { GlobTool } from '@tools/GlobTool/GlobTool'\nimport { GrepTool } from '@tools/GrepTool/GrepTool'\nimport { LSTool } from '@tools/lsTool/lsTool'\nimport { FileReadTool } from '@tools/FileReadTool/FileReadTool'\nimport { NotebookReadTool } from '@tools/NotebookReadTool/NotebookReadTool'\nimport { PRODUCT_NAME } from '@constants/product'\n\nfunction permissionComponentForTool(tool: Tool) {\n switch (tool) {\n case FileEditTool:\n return FileEditPermissionRequest\n case FileWriteTool:\n return FileWritePermissionRequest\n case BashTool:\n return BashPermissionRequest\n case GlobTool:\n case GrepTool:\n case LSTool:\n case FileReadTool:\n case NotebookReadTool:\n case NotebookEditTool:\n return FilesystemPermissionRequest\n default:\n return FallbackPermissionRequest\n }\n}\n\nexport type PermissionRequestProps = {\n toolUseConfirm: ToolUseConfirm\n onDone(): void\n verbose: boolean\n}\n\nexport function toolUseConfirmGetPrefix(\n toolUseConfirm: ToolUseConfirm,\n): string | null {\n return (\n (toolUseConfirm.commandPrefix &&\n !(toolUseConfirm.commandPrefix as any).commandInjectionDetected &&\n (toolUseConfirm.commandPrefix as any).commandPrefix) ||\n null\n )\n}\n\nexport type ToolUseConfirm = {\n assistantMessage: AssistantMessage\n tool: Tool\n description: string\n input: { [key: string]: unknown }\n commandPrefix: CommandSubcommandPrefixResult | null\n // TODO: remove riskScore from ToolUseConfirm\n riskScore: number | null\n onAbort(): void\n onAllow(type: 'permanent' | 'temporary'): void\n onReject(): void\n}\n\n// TODO: Move this to Tool.renderPermissionRequest\nexport function PermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: PermissionRequestProps): React.ReactNode {\n // Handle Ctrl+C\n useInput((input, key) => {\n if (key.ctrl && input === 'c') {\n onDone()\n toolUseConfirm.onReject()\n }\n })\n\n const toolName = toolUseConfirm.tool.userFacingName?.() || 'Tool'\n useNotifyAfterTimeout(\n `${PRODUCT_NAME} needs your permission to use ${toolName}`,\n )\n\n const PermissionComponent = permissionComponentForTool(toolUseConfirm.tool)\n\n return (\n <PermissionComponent\n toolUseConfirm={toolUseConfirm}\n onDone={onDone}\n verbose={verbose}\n />\n )\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,gBAAgB;AACzB,YAAY,WAAW;AAGvB,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,iCAAiC;AAC1C,SAAS,6BAA6B;AACtC,SAAS,iCAAiC;AAC1C,SAAS,6BAA6B;AACtC,SAAS,kCAAkC;AAE3C,SAAS,mCAAmC;AAC5C,SAAS,wBAAwB;AACjC,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,oBAAoB;AAC7B,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAE7B,SAAS,2BAA2B,MAAY;AAC9C,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAQO,SAAS,wBACd,gBACe;AACf,SACG,eAAe,iBACd,CAAE,eAAe,cAAsB,4BACtC,eAAe,cAAsB,iBACxC;AAEJ;
|
|
4
|
+
"sourcesContent": ["import { useInput } from 'ink'\nimport * as React from 'react'\nimport { Tool } from '@tool'\nimport { AssistantMessage } from '@query'\nimport { FileEditTool } from '@tools/FileEditTool/FileEditTool'\nimport { FileWriteTool } from '@tools/FileWriteTool/FileWriteTool'\nimport { BashTool } from '@tools/BashTool/BashTool'\nimport { FileEditPermissionRequest } from './FileEditPermissionRequest/FileEditPermissionRequest'\nimport { BashPermissionRequest } from './BashPermissionRequest/BashPermissionRequest'\nimport { FallbackPermissionRequest } from './FallbackPermissionRequest'\nimport { useNotifyAfterTimeout } from '@hooks/useNotifyAfterTimeout'\nimport { FileWritePermissionRequest } from './FileWritePermissionRequest/FileWritePermissionRequest'\nimport { type CommandSubcommandPrefixResult } from '@utils/commands'\nimport { FilesystemPermissionRequest } from './FilesystemPermissionRequest/FilesystemPermissionRequest'\nimport { NotebookEditTool } from '@tools/NotebookEditTool/NotebookEditTool'\nimport { GlobTool } from '@tools/GlobTool/GlobTool'\nimport { GrepTool } from '@tools/GrepTool/GrepTool'\nimport { LSTool } from '@tools/lsTool/lsTool'\nimport { FileReadTool } from '@tools/FileReadTool/FileReadTool'\nimport { NotebookReadTool } from '@tools/NotebookReadTool/NotebookReadTool'\nimport { ExitPlanModeTool } from '@tools/PlanModeTool/ExitPlanModeTool'\nimport { PlanApprovalRequest } from './PlanApprovalRequest'\nimport { PRODUCT_NAME } from '@constants/product'\n\nfunction permissionComponentForTool(tool: Tool) {\n switch (tool) {\n case FileEditTool:\n return FileEditPermissionRequest\n case FileWriteTool:\n return FileWritePermissionRequest\n case BashTool:\n return BashPermissionRequest\n case GlobTool:\n case GrepTool:\n case LSTool:\n case FileReadTool:\n case NotebookReadTool:\n case NotebookEditTool:\n return FilesystemPermissionRequest\n case ExitPlanModeTool:\n return PlanApprovalRequest\n default:\n return FallbackPermissionRequest\n }\n}\n\nexport type PermissionRequestProps = {\n toolUseConfirm: ToolUseConfirm\n onDone(): void\n verbose: boolean\n}\n\nexport function toolUseConfirmGetPrefix(\n toolUseConfirm: ToolUseConfirm,\n): string | null {\n return (\n (toolUseConfirm.commandPrefix &&\n !(toolUseConfirm.commandPrefix as any).commandInjectionDetected &&\n (toolUseConfirm.commandPrefix as any).commandPrefix) ||\n null\n )\n}\n\nexport type ToolUseConfirm = {\n assistantMessage: AssistantMessage\n tool: Tool\n description: string\n input: { [key: string]: unknown }\n commandPrefix: CommandSubcommandPrefixResult | null\n // TODO: remove riskScore from ToolUseConfirm\n riskScore: number | null\n onAbort(): void\n onAllow(type: 'permanent' | 'temporary'): void\n onAllowWithPrompts?(patterns: string[]): void\n onReject(): void\n onRejectWithFeedback?(feedback: string): void\n}\n\n// TODO: Move this to Tool.renderPermissionRequest\nexport function PermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: PermissionRequestProps): React.ReactNode {\n // Handle Ctrl+C\n useInput((input, key) => {\n if (key.ctrl && input === 'c') {\n onDone()\n toolUseConfirm.onReject()\n }\n })\n\n const toolName = toolUseConfirm.tool.userFacingName?.() || 'Tool'\n useNotifyAfterTimeout(\n `${PRODUCT_NAME} needs your permission to use ${toolName}`,\n )\n\n const PermissionComponent = permissionComponentForTool(toolUseConfirm.tool)\n\n return (\n <PermissionComponent\n toolUseConfirm={toolUseConfirm}\n onDone={onDone}\n verbose={verbose}\n />\n )\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,gBAAgB;AACzB,YAAY,WAAW;AAGvB,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,iCAAiC;AAC1C,SAAS,6BAA6B;AACtC,SAAS,iCAAiC;AAC1C,SAAS,6BAA6B;AACtC,SAAS,kCAAkC;AAE3C,SAAS,mCAAmC;AAC5C,SAAS,wBAAwB;AACjC,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,oBAAoB;AAC7B,SAAS,wBAAwB;AACjC,SAAS,wBAAwB;AACjC,SAAS,2BAA2B;AACpC,SAAS,oBAAoB;AAE7B,SAAS,2BAA2B,MAAY;AAC9C,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAQO,SAAS,wBACd,gBACe;AACf,SACG,eAAe,iBACd,CAAE,eAAe,cAAsB,4BACtC,eAAe,cAAsB,iBACxC;AAEJ;AAkBO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,GAA4C;AAE1C,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ,UAAU,KAAK;AAC7B,aAAO;AACP,qBAAe,SAAS;AAAA,IAC1B;AAAA,EACF,CAAC;AAED,QAAM,WAAW,eAAe,KAAK,iBAAiB,KAAK;AAC3D;AAAA,IACE,GAAG,YAAY,iCAAiC,QAAQ;AAAA,EAC1D;AAEA,QAAM,sBAAsB,2BAA2B,eAAe,IAAI;AAE1E,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|