@within-7/minto 0.1.7 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli.js +155 -37
- package/dist/Tool.js +38 -0
- package/dist/Tool.js.map +3 -3
- package/dist/commands/agents/AgentsCommand.js +73 -49
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/agents/constants.js +1 -1
- package/dist/commands/agents/constants.js.map +1 -1
- package/dist/commands/agents/index.js +1 -1
- package/dist/commands/bug.js +74 -7
- package/dist/commands/bug.js.map +3 -3
- package/dist/commands/clear.js +3 -0
- package/dist/commands/clear.js.map +2 -2
- package/dist/commands/compact.js +37 -0
- package/dist/commands/compact.js.map +2 -2
- package/dist/commands/context.js +85 -0
- package/dist/commands/context.js.map +7 -0
- package/dist/commands/ctx_viz.js +18 -10
- package/dist/commands/ctx_viz.js.map +2 -2
- package/dist/commands/doctor.js +158 -12
- package/dist/commands/doctor.js.map +2 -2
- package/dist/commands/export.js +157 -0
- package/dist/commands/export.js.map +7 -0
- package/dist/commands/mcp-interactive.js +28 -18
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/model.js +9 -7
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/permissions.js +87 -0
- package/dist/commands/permissions.js.map +7 -0
- package/dist/commands/plugin/AddMarketplaceForm.js +3 -2
- package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
- package/dist/commands/plugin/ConfirmDialog.js +2 -1
- package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
- package/dist/commands/plugin/ErrorView.js +2 -1
- package/dist/commands/plugin/ErrorView.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js +5 -4
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsManager.js +5 -4
- package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
- package/dist/commands/plugin/MainMenu.js +2 -1
- package/dist/commands/plugin/MainMenu.js.map +2 -2
- package/dist/commands/plugin/MarketplaceManager.js +5 -4
- package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
- package/dist/commands/plugin/MarketplaceSelector.js +4 -3
- package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
- package/dist/commands/plugin/PlaceholderScreen.js +3 -2
- package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
- package/dist/commands/plugin/PluginBrowser.js +6 -5
- package/dist/commands/plugin/PluginBrowser.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsInstall.js +5 -4
- package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsManage.js +4 -3
- package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
- package/dist/commands/plugin.js +16 -15
- package/dist/commands/plugin.js.map +2 -2
- package/dist/commands/quit.js +3 -1
- package/dist/commands/quit.js.map +2 -2
- package/dist/commands/sandbox.js +105 -0
- package/dist/commands/sandbox.js.map +7 -0
- package/dist/commands/setup.js +2 -1
- package/dist/commands/setup.js.map +2 -2
- package/dist/commands/status.js +59 -0
- package/dist/commands/status.js.map +7 -0
- package/dist/commands/tasks.js +108 -0
- package/dist/commands/tasks.js.map +7 -0
- package/dist/commands/todos.js +123 -0
- package/dist/commands/todos.js.map +7 -0
- package/dist/commands/undo.js +245 -0
- package/dist/commands/undo.js.map +7 -0
- package/dist/commands.js +22 -2
- package/dist/commands.js.map +2 -2
- package/dist/components/AgentThinkingBlock.js +10 -18
- package/dist/components/AgentThinkingBlock.js.map +2 -2
- package/dist/components/AsciiLogo.js +7 -8
- package/dist/components/AsciiLogo.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/QuestionView.js +2 -1
- package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
- package/dist/components/BackgroundTasksPanel.js +78 -29
- package/dist/components/BackgroundTasksPanel.js.map +2 -2
- package/dist/components/BashStreamingProgress.js +24 -0
- package/dist/components/BashStreamingProgress.js.map +7 -0
- package/dist/components/CollapsibleHint.js +15 -0
- package/dist/components/CollapsibleHint.js.map +7 -0
- package/dist/components/Config.js +3 -2
- package/dist/components/Config.js.map +2 -2
- package/dist/components/ConsoleOAuthFlow.js +2 -1
- package/dist/components/ConsoleOAuthFlow.js.map +2 -2
- package/dist/components/Cost.js +2 -1
- package/dist/components/Cost.js.map +2 -2
- package/dist/components/FileEditToolUpdatedMessage.js +1 -1
- package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
- package/dist/components/HeaderBar.js +13 -8
- package/dist/components/HeaderBar.js.map +2 -2
- package/dist/components/HistorySearchOverlay.js +4 -3
- package/dist/components/HistorySearchOverlay.js.map +2 -2
- package/dist/components/HotkeyHelpPanel.js +134 -0
- package/dist/components/HotkeyHelpPanel.js.map +7 -0
- package/dist/components/InvalidConfigDialog.js +2 -1
- package/dist/components/InvalidConfigDialog.js.map +2 -2
- package/dist/components/Logo.js +24 -68
- package/dist/components/Logo.js.map +2 -2
- package/dist/components/MCPServerApprovalDialog.js +2 -1
- package/dist/components/MCPServerApprovalDialog.js.map +2 -2
- package/dist/components/MCPServerDialogCopy.js +2 -1
- package/dist/components/MCPServerDialogCopy.js.map +2 -2
- package/dist/components/MCPServerMultiselectDialog.js +2 -1
- package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
- package/dist/components/Message.js +23 -7
- package/dist/components/Message.js.map +3 -3
- package/dist/components/MessageSelector.js +4 -3
- package/dist/components/MessageSelector.js.map +2 -2
- package/dist/components/ModeIndicator.js +2 -1
- package/dist/components/ModeIndicator.js.map +2 -2
- package/dist/components/ModelConfig.js +20 -6
- package/dist/components/ModelConfig.js.map +2 -2
- package/dist/components/ModelListManager.js +7 -6
- package/dist/components/ModelListManager.js.map +2 -2
- package/dist/components/ModelSelector/ModelSelector.js +27 -14
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/Onboarding.js +22 -16
- package/dist/components/Onboarding.js.map +2 -2
- package/dist/components/OperationSummary.js +130 -0
- package/dist/components/OperationSummary.js.map +7 -0
- package/dist/components/ProgressBar.js +74 -0
- package/dist/components/ProgressBar.js.map +7 -0
- package/dist/components/PromptInput.js +210 -87
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/RequestStatusIndicator.js +194 -0
- package/dist/components/RequestStatusIndicator.js.map +7 -0
- package/dist/components/SensitiveFileWarning.js +31 -0
- package/dist/components/SensitiveFileWarning.js.map +7 -0
- package/dist/components/Spinner.js +141 -27
- package/dist/components/Spinner.js.map +2 -2
- package/dist/components/SpinnerSymbol.js +21 -27
- package/dist/components/SpinnerSymbol.js.map +2 -2
- package/dist/components/StreamingBashOutput.js +9 -8
- package/dist/components/StreamingBashOutput.js.map +2 -2
- package/dist/components/StructuredDiff.js +6 -8
- package/dist/components/StructuredDiff.js.map +2 -2
- package/dist/components/SubagentBlock.js +5 -3
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/SubagentProgress.js +17 -15
- package/dist/components/SubagentProgress.js.map +2 -2
- package/dist/components/TaskCard.js +30 -24
- package/dist/components/TaskCard.js.map +2 -2
- package/dist/components/TextInput.js +9 -1
- package/dist/components/TextInput.js.map +2 -2
- package/dist/components/TodoChangeBlock.js +1 -1
- package/dist/components/TodoChangeBlock.js.map +2 -2
- package/dist/components/TodoPanel.js +140 -31
- package/dist/components/TodoPanel.js.map +3 -3
- package/dist/components/TokenCounter.js +74 -0
- package/dist/components/TokenCounter.js.map +7 -0
- package/dist/components/TokenWarning.js +2 -1
- package/dist/components/TokenWarning.js.map +2 -2
- package/dist/components/ToolUseLoader.js +2 -2
- package/dist/components/ToolUseLoader.js.map +2 -2
- package/dist/components/TreeConnector.js +26 -0
- package/dist/components/TreeConnector.js.map +7 -0
- package/dist/components/TrustDialog.js +2 -1
- package/dist/components/TrustDialog.js.map +2 -2
- package/dist/components/TurnCompletionIndicator.js +18 -0
- package/dist/components/TurnCompletionIndicator.js.map +7 -0
- package/dist/components/binary-feedback/BinaryFeedbackView.js +2 -1
- package/dist/components/binary-feedback/BinaryFeedbackView.js.map +2 -2
- package/dist/components/messages/AssistantTextMessage.js +20 -9
- package/dist/components/messages/AssistantTextMessage.js.map +2 -2
- package/dist/components/messages/AssistantThinkingMessage.js +18 -3
- package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
- package/dist/components/messages/AssistantToolUseMessage.js +17 -10
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/components/messages/GroupRenderer.js +54 -0
- package/dist/components/messages/GroupRenderer.js.map +7 -0
- package/dist/components/messages/NestedTasksPreview.js +24 -0
- package/dist/components/messages/NestedTasksPreview.js.map +7 -0
- package/dist/components/messages/ParallelTasksGroupView.js +93 -0
- package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
- package/dist/components/messages/TaskInModuleView.js +218 -0
- package/dist/components/messages/TaskInModuleView.js.map +7 -0
- package/dist/components/messages/TaskOutputContent.js +56 -0
- package/dist/components/messages/TaskOutputContent.js.map +7 -0
- package/dist/components/messages/UserPromptMessage.js +2 -2
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
- package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
- package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
- package/dist/constants/colors.js +120 -54
- package/dist/constants/colors.js.map +2 -2
- package/dist/constants/formatRules.js +102 -0
- package/dist/constants/formatRules.js.map +7 -0
- package/dist/constants/prompts.js +12 -34
- package/dist/constants/prompts.js.map +2 -2
- package/dist/constants/symbols.js +64 -6
- package/dist/constants/symbols.js.map +2 -2
- package/dist/constants/timing.js +5 -0
- package/dist/constants/timing.js.map +2 -2
- package/dist/constants/toolInputExamples.js +84 -0
- package/dist/constants/toolInputExamples.js.map +7 -0
- package/dist/core/backupManager.js +321 -0
- package/dist/core/backupManager.js.map +7 -0
- package/dist/core/config/defaults.js +84 -0
- package/dist/core/config/defaults.js.map +7 -0
- package/dist/core/config/index.js +111 -0
- package/dist/core/config/index.js.map +7 -0
- package/dist/core/config/loader.js +221 -0
- package/dist/core/config/loader.js.map +7 -0
- package/dist/core/config/migrations.js +128 -0
- package/dist/core/config/migrations.js.map +7 -0
- package/dist/core/config/schema.js +178 -0
- package/dist/core/config/schema.js.map +7 -0
- package/dist/core/costTracker.js +129 -0
- package/dist/core/costTracker.js.map +7 -0
- package/dist/core/gitAutoCommit.js +287 -0
- package/dist/core/gitAutoCommit.js.map +7 -0
- package/dist/core/index.js +8 -0
- package/dist/core/index.js.map +7 -0
- package/dist/core/operationTracker.js +212 -0
- package/dist/core/operationTracker.js.map +7 -0
- package/dist/core/permissions/auditLog.js +204 -0
- package/dist/core/permissions/auditLog.js.map +7 -0
- package/dist/core/permissions/engine/index.js +3 -0
- package/dist/core/permissions/engine/index.js.map +7 -0
- package/dist/core/permissions/engine/permissionEngine.js +106 -0
- package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
- package/dist/core/permissions/engine/types.js +1 -0
- package/dist/core/permissions/engine/types.js.map +7 -0
- package/dist/core/permissions/index.js +84 -0
- package/dist/core/permissions/index.js.map +7 -0
- package/dist/core/permissions/ruleEngine.js +259 -0
- package/dist/core/permissions/ruleEngine.js.map +7 -0
- package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
- package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
- package/dist/core/permissions/rules/autoEscalationRule.js +296 -0
- package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
- package/dist/core/permissions/rules/index.js +46 -0
- package/dist/core/permissions/rules/index.js.map +7 -0
- package/dist/core/permissions/rules/planModeRule.js +55 -0
- package/dist/core/permissions/rules/planModeRule.js.map +7 -0
- package/dist/core/permissions/rules/projectBoundaryRule.js +173 -0
- package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
- package/dist/core/permissions/rules/safeModeRule.js +65 -0
- package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
- package/dist/core/permissions/rules/sensitivePathsRule.js +345 -0
- package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
- package/dist/core/permissions/types.js +127 -0
- package/dist/core/permissions/types.js.map +7 -0
- package/dist/core/tokenStats.js +9 -0
- package/dist/core/tokenStats.js.map +7 -0
- package/dist/core/tokenStatsManager.js +331 -0
- package/dist/core/tokenStatsManager.js.map +7 -0
- package/dist/core/tools/executor.js +143 -0
- package/dist/core/tools/executor.js.map +7 -0
- package/dist/core/tools/index.js +15 -0
- package/dist/core/tools/index.js.map +7 -0
- package/dist/core/tools/registry.js +183 -0
- package/dist/core/tools/registry.js.map +7 -0
- package/dist/core/tools/types.js +1 -0
- package/dist/core/tools/types.js.map +7 -0
- package/dist/cost-tracker.js +23 -15
- package/dist/cost-tracker.js.map +2 -2
- package/dist/entrypoints/cli.js +158 -130
- package/dist/entrypoints/cli.js.map +2 -2
- package/dist/entrypoints/mcp.js +12 -4
- package/dist/entrypoints/mcp.js.map +2 -2
- package/dist/history.js +14 -3
- package/dist/history.js.map +2 -2
- package/dist/hooks/useAgentTokenStats.js +72 -0
- package/dist/hooks/useAgentTokenStats.js.map +7 -0
- package/dist/hooks/useAgentTranscripts.js +140 -0
- package/dist/hooks/useAgentTranscripts.js.map +7 -0
- package/dist/hooks/useAnimationSync.js +53 -0
- package/dist/hooks/useAnimationSync.js.map +7 -0
- package/dist/hooks/useArrowKeyHistory.js +4 -2
- package/dist/hooks/useArrowKeyHistory.js.map +2 -2
- package/dist/hooks/useCanUseTool.js +3 -1
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useExitOnCtrlCD.js +9 -5
- package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
- package/dist/hooks/useHookStatus.js +40 -0
- package/dist/hooks/useHookStatus.js.map +7 -0
- package/dist/hooks/useLogMessages.js +29 -2
- package/dist/hooks/useLogMessages.js.map +2 -2
- package/dist/hooks/useMessageGroups.js +43 -0
- package/dist/hooks/useMessageGroups.js.map +7 -0
- package/dist/hooks/useTerminalSize.js +62 -6
- package/dist/hooks/useTerminalSize.js.map +2 -2
- package/dist/hooks/useUnifiedCompletion.js +69 -0
- package/dist/hooks/useUnifiedCompletion.js.map +2 -2
- package/dist/i18n/index.js +109 -0
- package/dist/i18n/index.js.map +7 -0
- package/dist/i18n/locales/en.js +348 -0
- package/dist/i18n/locales/en.js.map +7 -0
- package/dist/i18n/locales/index.js +7 -0
- package/dist/i18n/locales/index.js.map +7 -0
- package/dist/i18n/locales/zh-CN.js +348 -0
- package/dist/i18n/locales/zh-CN.js.map +7 -0
- package/dist/i18n/types.js +8 -0
- package/dist/i18n/types.js.map +7 -0
- package/dist/permissions.js +28 -1
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +253 -21
- package/dist/query.js.map +3 -3
- package/dist/screens/REPL.js +523 -194
- package/dist/screens/REPL.js.map +3 -3
- package/dist/services/adapters/chatCompletions.js +3 -1
- package/dist/services/adapters/chatCompletions.js.map +2 -2
- package/dist/services/adapters/messageNormalizer.js +354 -0
- package/dist/services/adapters/messageNormalizer.js.map +7 -0
- package/dist/services/adapters/responsesAPI.js +6 -3
- package/dist/services/adapters/responsesAPI.js.map +2 -2
- package/dist/services/checkpointManager.js +386 -0
- package/dist/services/checkpointManager.js.map +7 -0
- package/dist/services/claude.js +192 -14
- package/dist/services/claude.js.map +3 -3
- package/dist/services/compressionService.js +50 -1
- package/dist/services/compressionService.js.map +2 -2
- package/dist/services/contextMonitor.js +162 -0
- package/dist/services/contextMonitor.js.map +7 -0
- package/dist/services/customCommands.js +60 -41
- package/dist/services/customCommands.js.map +2 -2
- package/dist/services/hookExecutor.js +173 -1
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/intelligentCompactor.js +281 -0
- package/dist/services/intelligentCompactor.js.map +7 -0
- package/dist/services/lspConfig.js +109 -0
- package/dist/services/lspConfig.js.map +7 -0
- package/dist/services/mcpClient.js +338 -43
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/modelOrchestrator.js +310 -0
- package/dist/services/modelOrchestrator.js.map +7 -0
- package/dist/services/openai.js +8 -1
- package/dist/services/openai.js.map +2 -2
- package/dist/services/outputStyles.js +138 -0
- package/dist/services/outputStyles.js.map +7 -0
- package/dist/services/plugins/index.js +5 -0
- package/dist/services/plugins/index.js.map +7 -0
- package/dist/services/plugins/lspServers.js +188 -0
- package/dist/services/plugins/lspServers.js.map +7 -0
- package/dist/services/plugins/pluginRuntime.js +229 -0
- package/dist/services/plugins/pluginRuntime.js.map +7 -0
- package/dist/services/plugins/pluginValidation.js +219 -0
- package/dist/services/plugins/pluginValidation.js.map +7 -0
- package/dist/services/plugins/skillMarketplace.js +556 -0
- package/dist/services/plugins/skillMarketplace.js.map +7 -0
- package/dist/services/responseStateManager.js +37 -3
- package/dist/services/responseStateManager.js.map +2 -2
- package/dist/services/sandbox/filesystemBoundary.js +341 -0
- package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
- package/dist/services/sandbox/index.js +14 -0
- package/dist/services/sandbox/index.js.map +7 -0
- package/dist/services/sandbox/networkProxy.js +293 -0
- package/dist/services/sandbox/networkProxy.js.map +7 -0
- package/dist/services/sandbox/sandboxController.js +574 -0
- package/dist/services/sandbox/sandboxController.js.map +7 -0
- package/dist/services/sandbox/types.js +50 -0
- package/dist/services/sandbox/types.js.map +7 -0
- package/dist/services/sessionMemory.js +266 -0
- package/dist/services/sessionMemory.js.map +7 -0
- package/dist/services/taskRouter.js +324 -0
- package/dist/services/taskRouter.js.map +7 -0
- package/dist/tools/ArchitectTool/ArchitectTool.js +7 -1
- package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +6 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +2 -1
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
- package/dist/tools/BaseTool.js +72 -0
- package/dist/tools/BaseTool.js.map +7 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
- package/dist/tools/BashTool/BashTool.js +79 -3
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
- package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
- package/dist/tools/BashTool/OutputLine.js +54 -0
- package/dist/tools/BashTool/OutputLine.js.map +2 -2
- package/dist/tools/BashTool/prompt.js +336 -3
- package/dist/tools/BashTool/prompt.js.map +2 -2
- package/dist/tools/FileEditTool/FileEditTool.js +29 -4
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileEditTool/prompt.js +6 -3
- package/dist/tools/FileEditTool/prompt.js.map +2 -2
- package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
- package/dist/tools/FileWriteTool/prompt.js +4 -2
- package/dist/tools/FileWriteTool/prompt.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js +4 -2
- package/dist/tools/GlobTool/GlobTool.js.map +2 -2
- package/dist/tools/GrepTool/GrepTool.js +36 -7
- package/dist/tools/GrepTool/GrepTool.js.map +2 -2
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
- package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
- package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
- package/dist/tools/LspTool/LspTool.js +664 -0
- package/dist/tools/LspTool/LspTool.js.map +7 -0
- package/dist/tools/LspTool/prompt.js +27 -0
- package/dist/tools/LspTool/prompt.js.map +7 -0
- package/dist/tools/MCPTool/MCPTool.js +9 -1
- package/dist/tools/MCPTool/MCPTool.js.map +2 -2
- package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
- package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
- package/dist/tools/MultiEditTool/prompt.js +5 -3
- package/dist/tools/MultiEditTool/prompt.js.map +2 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +7 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +75 -0
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +109 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
- package/dist/tools/PlanModeTool/prompt.js +94 -0
- package/dist/tools/PlanModeTool/prompt.js.map +7 -0
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
- package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
- package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
- package/dist/tools/SkillTool/SkillTool.js +10 -4
- package/dist/tools/SkillTool/SkillTool.js.map +2 -2
- package/dist/tools/SkillTool/prompt.js +1 -1
- package/dist/tools/SkillTool/prompt.js.map +1 -1
- package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
- package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
- package/dist/tools/SlashCommandTool/prompt.js +35 -0
- package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
- package/dist/tools/TaskOutputTool/TaskOutputTool.js +190 -0
- package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
- package/dist/tools/TaskOutputTool/prompt.js +15 -0
- package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
- package/dist/tools/TaskTool/TaskTool.js +310 -104
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -77
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +4 -1
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/cache.js +55 -8
- package/dist/tools/URLFetcherTool/cache.js.map +2 -2
- package/dist/tools.js +31 -2
- package/dist/tools.js.map +2 -2
- package/dist/types/hooks.js +4 -0
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/marketplace.js.map +2 -2
- package/dist/types/messageGroup.js +36 -0
- package/dist/types/messageGroup.js.map +7 -0
- package/dist/types/plugin.js.map +2 -2
- package/dist/types/thinking.js +1 -0
- package/dist/types/thinking.js.map +7 -0
- package/dist/utils/BackgroundShellManager.js +136 -39
- package/dist/utils/BackgroundShellManager.js.map +2 -2
- package/dist/utils/CircuitBreaker.js +242 -0
- package/dist/utils/CircuitBreaker.js.map +7 -0
- package/dist/utils/MessageBatchBuffer.js +102 -0
- package/dist/utils/MessageBatchBuffer.js.map +7 -0
- package/dist/utils/PersistentShell.js +151 -1
- package/dist/utils/PersistentShell.js.map +2 -2
- package/dist/utils/agentLoader.js +1 -23
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/agentTranscripts.js +641 -0
- package/dist/utils/agentTranscripts.js.map +7 -0
- package/dist/utils/animationManager.js +213 -0
- package/dist/utils/animationManager.js.map +7 -0
- package/dist/utils/animationSync.js +110 -0
- package/dist/utils/animationSync.js.map +7 -0
- package/dist/utils/ask.js +2 -0
- package/dist/utils/ask.js.map +2 -2
- package/dist/utils/asyncFile.js +215 -0
- package/dist/utils/asyncFile.js.map +7 -0
- package/dist/utils/backgroundAgentManager.js +231 -0
- package/dist/utils/backgroundAgentManager.js.map +7 -0
- package/dist/utils/config.js +108 -10
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/conversationRecovery.js +19 -0
- package/dist/utils/conversationRecovery.js.map +2 -2
- package/dist/utils/credentials/CredentialStore.js +1 -0
- package/dist/utils/credentials/CredentialStore.js.map +7 -0
- package/dist/utils/credentials/EncryptedFileStore.js +157 -0
- package/dist/utils/credentials/EncryptedFileStore.js.map +7 -0
- package/dist/utils/credentials/index.js +37 -0
- package/dist/utils/credentials/index.js.map +7 -0
- package/dist/utils/credentials/migration.js +82 -0
- package/dist/utils/credentials/migration.js.map +7 -0
- package/dist/utils/exit.js +73 -0
- package/dist/utils/exit.js.map +7 -0
- package/dist/utils/format.js +73 -5
- package/dist/utils/format.js.map +2 -2
- package/dist/utils/generators.js +76 -6
- package/dist/utils/generators.js.map +2 -2
- package/dist/utils/globalErrorHandler.js +149 -0
- package/dist/utils/globalErrorHandler.js.map +7 -0
- package/dist/utils/groupHandlers/index.js +8 -0
- package/dist/utils/groupHandlers/index.js.map +7 -0
- package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
- package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
- package/dist/utils/groupHandlers/taskHandler.js +104 -0
- package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
- package/dist/utils/groupHandlers/types.js +1 -0
- package/dist/utils/groupHandlers/types.js.map +7 -0
- package/dist/utils/logRotation.js +224 -0
- package/dist/utils/logRotation.js.map +7 -0
- package/dist/utils/markdown.js +13 -1
- package/dist/utils/markdown.js.map +2 -2
- package/dist/utils/marketplaceManager.js +3 -5
- package/dist/utils/marketplaceManager.js.map +2 -2
- package/dist/utils/memSafety.js +264 -0
- package/dist/utils/memSafety.js.map +7 -0
- package/dist/utils/messageGroupManager.js +274 -0
- package/dist/utils/messageGroupManager.js.map +7 -0
- package/dist/utils/messages.js +13 -4
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/model.js +119 -15
- package/dist/utils/model.js.map +3 -3
- package/dist/utils/permissions/filesystem.js +162 -6
- package/dist/utils/permissions/filesystem.js.map +2 -2
- package/dist/utils/plan/planMode.js +143 -0
- package/dist/utils/plan/planMode.js.map +7 -0
- package/dist/utils/pluginLoader.js +17 -21
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/ripgrep.js +55 -2
- package/dist/utils/ripgrep.js.map +2 -2
- package/dist/utils/safePath.js +132 -0
- package/dist/utils/safePath.js.map +7 -0
- package/dist/utils/sanitizeInput.js +32 -0
- package/dist/utils/sanitizeInput.js.map +7 -0
- package/dist/utils/secureKeyStorage.js +312 -0
- package/dist/utils/secureKeyStorage.js.map +7 -0
- package/dist/utils/sensitiveFiles.js +125 -0
- package/dist/utils/sensitiveFiles.js.map +7 -0
- package/dist/utils/session/sessionPlugins.js +67 -0
- package/dist/utils/session/sessionPlugins.js.map +7 -0
- package/dist/utils/taskDisplayUtils.js +257 -0
- package/dist/utils/taskDisplayUtils.js.map +7 -0
- package/dist/utils/teamConfig.js +2 -1
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/theme.js +6 -6
- package/dist/utils/theme.js.map +1 -1
- package/dist/utils/todoStorage.js +92 -2
- package/dist/utils/todoStorage.js.map +2 -2
- package/dist/utils/toolRiskClassification.js +207 -0
- package/dist/utils/toolRiskClassification.js.map +7 -0
- package/dist/utils/toolTimeout.js +136 -0
- package/dist/utils/toolTimeout.js.map +7 -0
- package/dist/utils/tooling/safeRender.js +116 -0
- package/dist/utils/tooling/safeRender.js.map +7 -0
- package/dist/utils/userFriendlyError.js +346 -0
- package/dist/utils/userFriendlyError.js.map +7 -0
- package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +17 -5
- package/scripts/postinstall.js +128 -38
- package/dist/commands/agents.js +0 -2086
- package/dist/commands/agents.js.map +0 -7
- package/dist/commands/build.js +0 -74
- package/dist/commands/build.js.map +0 -7
- package/dist/commands/compression.js +0 -57
- package/dist/commands/compression.js.map +0 -7
- package/dist/commands/listen.js +0 -37
- package/dist/commands/listen.js.map +0 -7
- package/dist/commands/login.js +0 -37
- package/dist/commands/login.js.map +0 -7
- package/dist/commands/logout.js +0 -33
- package/dist/commands/logout.js.map +0 -7
- package/dist/commands/mcp.js +0 -40
- package/dist/commands/mcp.js.map +0 -7
- package/dist/commands/mcp_refresh.js +0 -40
- package/dist/commands/mcp_refresh.js.map +0 -7
- package/dist/commands/modelstatus.js +0 -21
- package/dist/commands/modelstatus.js.map +0 -7
- package/dist/commands/onboarding.js +0 -36
- package/dist/commands/onboarding.js.map +0 -7
- package/dist/commands/plugin-interactive.js +0 -446
- package/dist/commands/plugin-interactive.js.map +0 -7
- package/dist/commands/pr_comments.js +0 -61
- package/dist/commands/pr_comments.js.map +0 -7
- package/dist/commands/release-notes.js +0 -30
- package/dist/commands/release-notes.js.map +0 -7
- package/dist/commands/review.js +0 -51
- package/dist/commands/review.js.map +0 -7
- package/dist/components/Bug.js +0 -147
- package/dist/components/Bug.js.map +0 -7
- package/dist/components/ModelSelector.js +0 -2062
- package/dist/components/ModelSelector.js.map +0 -7
- package/dist/components/ModelStatusDisplay.js +0 -87
- package/dist/components/ModelStatusDisplay.js.map +0 -7
- package/dist/entrypoints/cli-wrapper.js +0 -61
- package/dist/entrypoints/cli-wrapper.js.map +0 -7
- package/dist/hooks/useCancelRequest.js +0 -28
- package/dist/hooks/useCancelRequest.js.map +0 -7
- package/dist/screens/Doctor.js +0 -22
- package/dist/screens/Doctor.js.map +0 -7
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import React, { useState, useEffect } from "react";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { ToolUseLoader } from "../ToolUseLoader.js";
|
|
4
|
+
import { TreeContinuation } from "../TreeConnector.js";
|
|
5
|
+
import { TaskToolMessage } from "./TaskToolMessage.js";
|
|
6
|
+
import {
|
|
7
|
+
getTaskDisplayContent,
|
|
8
|
+
getStatusIcon,
|
|
9
|
+
getStatusColor,
|
|
10
|
+
getToolUseHistoryForDisplay,
|
|
11
|
+
getToolDisplayName,
|
|
12
|
+
truncate,
|
|
13
|
+
formatMetaInfo
|
|
14
|
+
} from "../../utils/taskDisplayUtils.js";
|
|
15
|
+
import { formatDuration } from "../../utils/format.js";
|
|
16
|
+
import { NestedTasksPreview } from "./NestedTasksPreview.js";
|
|
17
|
+
import { TaskOutputContent, TaskOutputSummary } from "./TaskOutputContent.js";
|
|
18
|
+
import { CollapsibleHint } from "../CollapsibleHint.js";
|
|
19
|
+
import { formatStats, formatCount } from "../../constants/formatRules.js";
|
|
20
|
+
import { SYMBOLS } from "../../constants/symbols.js";
|
|
21
|
+
import {
|
|
22
|
+
SEMANTIC_COLORS,
|
|
23
|
+
VALUE_TIER_COLORS,
|
|
24
|
+
SYMBOL_COLORS
|
|
25
|
+
} from "../../constants/colors.js";
|
|
26
|
+
function formatTokens(count) {
|
|
27
|
+
if (count >= 1e3) {
|
|
28
|
+
return `${(count / 1e3).toFixed(1)}k`;
|
|
29
|
+
}
|
|
30
|
+
return String(count);
|
|
31
|
+
}
|
|
32
|
+
function formatBidirectionalTokens(inputTokens, outputTokens) {
|
|
33
|
+
const parts = [];
|
|
34
|
+
if (inputTokens > 0) {
|
|
35
|
+
parts.push(`\u2191${formatTokens(inputTokens)}`);
|
|
36
|
+
}
|
|
37
|
+
if (outputTokens > 0) {
|
|
38
|
+
parts.push(`\u2193${formatTokens(outputTokens)}`);
|
|
39
|
+
}
|
|
40
|
+
return parts.join(" ");
|
|
41
|
+
}
|
|
42
|
+
function ToolUseHistoryDisplay({
|
|
43
|
+
transcript,
|
|
44
|
+
config,
|
|
45
|
+
inModule,
|
|
46
|
+
isLastInModule,
|
|
47
|
+
isTaskCompleted = false
|
|
48
|
+
}) {
|
|
49
|
+
const { tools: rawTools, hiddenCount } = getToolUseHistoryForDisplay(
|
|
50
|
+
transcript,
|
|
51
|
+
config
|
|
52
|
+
);
|
|
53
|
+
const tools = isTaskCompleted ? rawTools.map((tool) => ({ ...tool, isExecuting: false })) : rawTools;
|
|
54
|
+
if (tools.length === 0) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
const maxDescChars = config.showAllChildren ? config.maxCharsPerChild : config.maxCharsWithoutChildren;
|
|
58
|
+
const renderRow = (key, content) => /* @__PURE__ */ React.createElement(Box, { key, flexDirection: "row" }, inModule && /* @__PURE__ */ React.createElement(TreeContinuation, { parentIsLast: isLastInModule }), !inModule && /* @__PURE__ */ React.createElement(Box, { minWidth: 4 }), content);
|
|
59
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, hiddenCount > 0 && renderRow(
|
|
60
|
+
"hidden-count",
|
|
61
|
+
/* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "... ", hiddenCount, " earlier tools hidden")
|
|
62
|
+
), tools.map((tool) => {
|
|
63
|
+
const displayName = getToolDisplayName(tool.name);
|
|
64
|
+
const description = truncate(tool.description, maxDescChars);
|
|
65
|
+
return renderRow(
|
|
66
|
+
tool.id,
|
|
67
|
+
/* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, tool.isExecuting ? /* @__PURE__ */ React.createElement(Text, { color: SYMBOL_COLORS.running }, SYMBOLS.TOOL_RUNNING, " ") : /* @__PURE__ */ React.createElement(Text, { color: SYMBOL_COLORS.child }, SYMBOLS.CHILD_OUTPUT, " "), /* @__PURE__ */ React.createElement(
|
|
68
|
+
Text,
|
|
69
|
+
{
|
|
70
|
+
color: tool.isExecuting ? SYMBOL_COLORS.running : SEMANTIC_COLORS.secondary
|
|
71
|
+
},
|
|
72
|
+
displayName
|
|
73
|
+
), description && /* @__PURE__ */ React.createElement(
|
|
74
|
+
Text,
|
|
75
|
+
{
|
|
76
|
+
color: tool.isExecuting ? SYMBOL_COLORS.running : SEMANTIC_COLORS.dim
|
|
77
|
+
},
|
|
78
|
+
"(",
|
|
79
|
+
description,
|
|
80
|
+
")"
|
|
81
|
+
), tool.isExecuting && /* @__PURE__ */ React.createElement(Text, { color: SYMBOL_COLORS.running }, SYMBOLS.SUFFIX_RUNNING))
|
|
82
|
+
);
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
function TaskInModuleView({
|
|
86
|
+
toolUseId,
|
|
87
|
+
description,
|
|
88
|
+
agentType,
|
|
89
|
+
transcript,
|
|
90
|
+
output,
|
|
91
|
+
config,
|
|
92
|
+
shouldAnimate,
|
|
93
|
+
inModule = false,
|
|
94
|
+
isLastInModule = false
|
|
95
|
+
}) {
|
|
96
|
+
const transcriptStatus = transcript?.status || "pending";
|
|
97
|
+
const status = output && transcriptStatus === "pending" ? "completed" : transcriptStatus;
|
|
98
|
+
const statusIcon = getStatusIcon(status);
|
|
99
|
+
const statusColor = getStatusColor(status);
|
|
100
|
+
const displayContent = transcript ? getTaskDisplayContent(transcript, config) : null;
|
|
101
|
+
const isCompleted = status === "completed" || !!output;
|
|
102
|
+
const isError = status === "failed";
|
|
103
|
+
const isRunning = status === "running";
|
|
104
|
+
const [elapsedMs, setElapsedMs] = useState(() => {
|
|
105
|
+
if (transcript?.startTime && isRunning) {
|
|
106
|
+
return Date.now() - transcript.startTime;
|
|
107
|
+
}
|
|
108
|
+
return 0;
|
|
109
|
+
});
|
|
110
|
+
useEffect(() => {
|
|
111
|
+
if (!isRunning || !transcript?.startTime) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const interval = setInterval(() => {
|
|
115
|
+
setElapsedMs(Date.now() - transcript.startTime);
|
|
116
|
+
}, 1e3);
|
|
117
|
+
return () => clearInterval(interval);
|
|
118
|
+
}, [isRunning, transcript?.startTime]);
|
|
119
|
+
const getDurationDisplay = () => {
|
|
120
|
+
if (!transcript) return null;
|
|
121
|
+
if (transcript.endTime && transcript.startTime) {
|
|
122
|
+
return formatDuration(transcript.endTime - transcript.startTime);
|
|
123
|
+
}
|
|
124
|
+
if (isRunning && transcript.startTime) {
|
|
125
|
+
return formatDuration(elapsedMs);
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
};
|
|
129
|
+
const duration = getDurationDisplay();
|
|
130
|
+
const totalTokens = transcript ? transcript.tokenUsage.inputTokens + transcript.tokenUsage.outputTokens : 0;
|
|
131
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width: "100%" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, !inModule && /* @__PURE__ */ React.createElement(
|
|
132
|
+
ToolUseLoader,
|
|
133
|
+
{
|
|
134
|
+
shouldAnimate: shouldAnimate && !isCompleted,
|
|
135
|
+
isUnresolved: !isCompleted,
|
|
136
|
+
isError
|
|
137
|
+
}
|
|
138
|
+
), inModule && /* @__PURE__ */ React.createElement(Text, { color: statusColor }, statusIcon, " "), /* @__PURE__ */ React.createElement(
|
|
139
|
+
TaskToolMessage,
|
|
140
|
+
{
|
|
141
|
+
agentType,
|
|
142
|
+
bold: true,
|
|
143
|
+
children: description
|
|
144
|
+
}
|
|
145
|
+
), inModule && isCompleted && transcript && /* @__PURE__ */ React.createElement(React.Fragment, null, config.showMetaInfo ? (
|
|
146
|
+
// Verbose mode: 使用 formatMetaInfo 显示 "耗时 · 模型 · 时间"
|
|
147
|
+
/* @__PURE__ */ React.createElement(Text, { color: VALUE_TIER_COLORS.meta }, " ", "(", formatMetaInfo({
|
|
148
|
+
duration: transcript.endTime ? transcript.endTime - transcript.startTime : void 0,
|
|
149
|
+
model: transcript.model,
|
|
150
|
+
timestamp: transcript.endTime
|
|
151
|
+
}), transcript.toolUseCount > 0 && ` \xB7 ${formatCount(transcript.toolUseCount, "tool")}`, ")")
|
|
152
|
+
) : (
|
|
153
|
+
// Normal mode: compact stats with bidirectional tokens
|
|
154
|
+
/* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "(", formatStats([
|
|
155
|
+
formatCount(transcript.toolUseCount, "tool"),
|
|
156
|
+
formatBidirectionalTokens(
|
|
157
|
+
transcript.tokenUsage.inputTokens,
|
|
158
|
+
transcript.tokenUsage.outputTokens
|
|
159
|
+
),
|
|
160
|
+
duration
|
|
161
|
+
]), ")")
|
|
162
|
+
)), inModule && status === "running" && transcript && /* @__PURE__ */ React.createElement(Text, { color: VALUE_TIER_COLORS.meta }, " ", "(", config.showMetaInfo ? formatMetaInfo({
|
|
163
|
+
model: transcript.model,
|
|
164
|
+
timestamp: Date.now()
|
|
165
|
+
}) : formatStats([
|
|
166
|
+
transcript.toolUseCount > 0 ? formatCount(transcript.toolUseCount, "tool") : null,
|
|
167
|
+
duration,
|
|
168
|
+
// Show bidirectional tokens: ↑input ↓output
|
|
169
|
+
formatBidirectionalTokens(
|
|
170
|
+
transcript.tokenUsage.inputTokens,
|
|
171
|
+
transcript.tokenUsage.outputTokens
|
|
172
|
+
) || null
|
|
173
|
+
]), ")"), !inModule && transcript && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "[", transcript.agentId.slice(0, 8), "]")), !inModule && transcript && /* @__PURE__ */ React.createElement(Box, { marginLeft: 4 }, config.showMetaInfo ? (
|
|
174
|
+
// Verbose mode: 使用元信息格式 "耗时 · 模型 · 时间"
|
|
175
|
+
/* @__PURE__ */ React.createElement(Text, { color: VALUE_TIER_COLORS.meta }, status === "completed" ? "\u2713" : "\u22EF", " ", formatMetaInfo({
|
|
176
|
+
duration: transcript.endTime ? transcript.endTime - transcript.startTime : void 0,
|
|
177
|
+
model: transcript.model,
|
|
178
|
+
timestamp: transcript.endTime || Date.now()
|
|
179
|
+
}), " \xB7 ", "Tools: ", transcript.toolUseCount, " \xB7 Tokens:", " ", formatTokens(totalTokens))
|
|
180
|
+
) : (
|
|
181
|
+
// Normal mode: compact display with bidirectional tokens
|
|
182
|
+
/* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, status === "completed" ? "\u2713" : "\u22EF", " Tools:", " ", transcript.toolUseCount, " |", " ", formatBidirectionalTokens(
|
|
183
|
+
transcript.tokenUsage.inputTokens,
|
|
184
|
+
transcript.tokenUsage.outputTokens
|
|
185
|
+
), duration ? ` | ${duration}` : "")
|
|
186
|
+
)), transcript && /* @__PURE__ */ React.createElement(
|
|
187
|
+
ToolUseHistoryDisplay,
|
|
188
|
+
{
|
|
189
|
+
transcript,
|
|
190
|
+
config,
|
|
191
|
+
inModule,
|
|
192
|
+
isLastInModule,
|
|
193
|
+
isTaskCompleted: isCompleted
|
|
194
|
+
}
|
|
195
|
+
), displayContent && status === "running" && displayContent.type === "nested" && /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, inModule && /* @__PURE__ */ React.createElement(TreeContinuation, { parentIsLast: isLastInModule }), !inModule && /* @__PURE__ */ React.createElement(Box, { minWidth: 4 }), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(
|
|
196
|
+
NestedTasksPreview,
|
|
197
|
+
{
|
|
198
|
+
tasks: displayContent.children || [],
|
|
199
|
+
hiddenCount: displayContent.hiddenCount || 0
|
|
200
|
+
}
|
|
201
|
+
))), output && isCompleted && /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, inModule && /* @__PURE__ */ React.createElement(TreeContinuation, { parentIsLast: isLastInModule }), !inModule && /* @__PURE__ */ React.createElement(Box, { minWidth: 4 }), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, config.showAllChildren ? (
|
|
202
|
+
// Verbose mode: show full output with header
|
|
203
|
+
/* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Output \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(TaskOutputContent, { content: output.content })))
|
|
204
|
+
) : (
|
|
205
|
+
// Normal mode: show compact summary with expand hint
|
|
206
|
+
/* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(
|
|
207
|
+
TaskOutputSummary,
|
|
208
|
+
{
|
|
209
|
+
content: output.content,
|
|
210
|
+
maxChars: config.maxCharsWithoutChildren
|
|
211
|
+
}
|
|
212
|
+
), /* @__PURE__ */ React.createElement(CollapsibleHint, { canExpand: true }))
|
|
213
|
+
))));
|
|
214
|
+
}
|
|
215
|
+
export {
|
|
216
|
+
TaskInModuleView
|
|
217
|
+
};
|
|
218
|
+
//# sourceMappingURL=TaskInModuleView.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/messages/TaskInModuleView.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * Task In Module View\n *\n * Renders a single Task within a parallel module or standalone.\n * Supports intermediate state display and final output embedding.\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport type { AgentTranscript } from '@utils/agentTranscripts'\nimport type { DisplayConfig } from '@minto-types/messageGroup'\nimport { ToolUseLoader } from '@components/ToolUseLoader'\nimport { TreeContinuation } from '@components/TreeConnector'\nimport { TaskToolMessage } from './TaskToolMessage'\nimport {\n getTaskDisplayContent,\n getStatusIcon,\n getStatusColor,\n getToolUseHistoryForDisplay,\n getToolDisplayName,\n truncate,\n formatMetaInfo,\n type MetaInfo,\n} from '@utils/taskDisplayUtils'\nimport { formatDuration } from '@utils/format'\nimport { NestedTasksPreview } from './NestedTasksPreview'\nimport { TaskOutputContent, TaskOutputSummary } from './TaskOutputContent'\nimport { CollapsibleHint } from '@components/CollapsibleHint'\nimport { formatStats, formatCount } from '@constants/formatRules'\nimport { SYMBOLS } from '@constants/symbols'\nimport {\n SEMANTIC_COLORS,\n STATUS_COLORS,\n VALUE_TIER_COLORS,\n 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\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": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { PREVIEW_SEPARATOR } from "../../constants/formatRules.js";
|
|
4
|
+
import { SEMANTIC_COLORS, SYMBOL_COLORS } from "../../constants/colors.js";
|
|
5
|
+
import { applyMarkdown } from "../../utils/markdown.js";
|
|
6
|
+
function TaskOutputContent({
|
|
7
|
+
content
|
|
8
|
+
}) {
|
|
9
|
+
if (!content) {
|
|
10
|
+
return /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "[No output]");
|
|
11
|
+
}
|
|
12
|
+
if (typeof content === "string") {
|
|
13
|
+
return /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, applyMarkdown(content));
|
|
14
|
+
}
|
|
15
|
+
if (Array.isArray(content)) {
|
|
16
|
+
const texts = content.filter(
|
|
17
|
+
(block) => block.type === "text"
|
|
18
|
+
).map((block) => block.text);
|
|
19
|
+
const combinedText = texts.join("\n\n");
|
|
20
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, applyMarkdown(combinedText)));
|
|
21
|
+
}
|
|
22
|
+
return /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "[Unknown content format]");
|
|
23
|
+
}
|
|
24
|
+
function TaskOutputSummary({
|
|
25
|
+
content,
|
|
26
|
+
maxChars = 80
|
|
27
|
+
}) {
|
|
28
|
+
if (!content) {
|
|
29
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: SYMBOL_COLORS.child }, "\u23BF "), /* @__PURE__ */ React.createElement(Text, { color: SYMBOL_COLORS.success }, "Done"));
|
|
30
|
+
}
|
|
31
|
+
let totalLength = 0;
|
|
32
|
+
let firstLine = "";
|
|
33
|
+
if (typeof content === "string") {
|
|
34
|
+
totalLength = content.length;
|
|
35
|
+
firstLine = content.split("\n")[0] || "";
|
|
36
|
+
} else if (Array.isArray(content)) {
|
|
37
|
+
const texts = content.filter(
|
|
38
|
+
(block) => block.type === "text"
|
|
39
|
+
).map((block) => block.text);
|
|
40
|
+
totalLength = texts.reduce((sum, t) => sum + t.length, 0);
|
|
41
|
+
for (const text of texts) {
|
|
42
|
+
const lines = text.split("\n").filter((l) => l.trim());
|
|
43
|
+
if (lines[0]) {
|
|
44
|
+
firstLine = lines[0];
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const truncatedPreview = firstLine.length > maxChars ? firstLine.substring(0, maxChars) + "..." : firstLine;
|
|
50
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: SYMBOL_COLORS.child }, "\u23BF "), /* @__PURE__ */ React.createElement(Text, { color: SYMBOL_COLORS.success }, "Done"), truncatedPreview && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, PREVIEW_SEPARATOR, truncatedPreview));
|
|
51
|
+
}
|
|
52
|
+
export {
|
|
53
|
+
TaskOutputContent,
|
|
54
|
+
TaskOutputSummary
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=TaskOutputContent.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/messages/TaskOutputContent.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * Task Output Content Component\n *\n * Renders the content of a TaskOutput tool result with Markdown support.\n * Handles both string and array content formats.\n */\n\nimport React from 'react'\nimport { Box, Text } from 'ink'\nimport type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { PREVIEW_SEPARATOR, ABBREVIATIONS } from '@constants/formatRules'\nimport { SEMANTIC_COLORS, SYMBOL_COLORS } from '@constants/colors'\nimport { applyMarkdown } from '@utils/markdown'\n\ninterface TaskOutputContentProps {\n content: ToolResultBlockParam['content']\n}\n\nexport function TaskOutputContent({\n content,\n}: TaskOutputContentProps): React.ReactNode {\n if (!content) {\n return <Text color={SEMANTIC_COLORS.dim}>[No output]</Text>\n }\n\n if (typeof content === 'string') {\n // Apply Markdown formatting for rich text display\n return <Text color={SEMANTIC_COLORS.primary}>{applyMarkdown(content)}</Text>\n }\n\n if (Array.isArray(content)) {\n // Array of content blocks - extract text from text blocks\n const texts = content\n .filter(\n (block): block is { type: 'text'; text: string } =>\n block.type === 'text',\n )\n .map(block => block.text)\n\n // Join all text blocks and apply Markdown formatting\n const combinedText = texts.join('\\n\\n')\n return (\n <Box flexDirection=\"column\">\n <Text color={SEMANTIC_COLORS.primary}>\n {applyMarkdown(combinedText)}\n </Text>\n </Box>\n )\n }\n\n return <Text color={SEMANTIC_COLORS.dim}>[Unknown content format]</Text>\n}\n\n/**\n * Task Output Summary Component\n *\n * Shows a compact summary of task output for non-verbose mode.\n * Displays character count and optional truncated preview.\n */\ninterface TaskOutputSummaryProps {\n content: ToolResultBlockParam['content']\n maxChars?: number\n}\n\nexport function TaskOutputSummary({\n content,\n maxChars = 80,\n}: TaskOutputSummaryProps): React.ReactNode {\n if (!content) {\n return (\n <Box flexDirection=\"row\">\n <Text color={SYMBOL_COLORS.child}>\u23BF </Text>\n <Text color={SYMBOL_COLORS.success}>Done</Text>\n </Box>\n )\n }\n\n // Calculate total content length\n let totalLength = 0\n let firstLine = ''\n\n if (typeof content === 'string') {\n totalLength = content.length\n firstLine = content.split('\\n')[0] || ''\n } else if (Array.isArray(content)) {\n const texts = content\n .filter(\n (block): block is { type: 'text'; text: string } =>\n block.type === 'text',\n )\n .map(block => block.text)\n totalLength = texts.reduce((sum, t) => sum + t.length, 0)\n // Get first non-empty line\n for (const text of texts) {\n const lines = text.split('\\n').filter(l => l.trim())\n if (lines[0]) {\n firstLine = lines[0]\n break\n }\n }\n }\n\n // Truncate first line if too long\n const truncatedPreview =\n firstLine.length > maxChars\n ? firstLine.substring(0, maxChars) + '...'\n : firstLine\n\n // Format: \"Done\" or \"Done \u00B7 preview\" (simplified from Claude Code's style)\n return (\n <Box flexDirection=\"row\">\n <Text color={SYMBOL_COLORS.child}>\u23BF </Text>\n <Text color={SYMBOL_COLORS.success}>Done</Text>\n {truncatedPreview && (\n <Text color={SEMANTIC_COLORS.dim}>\n {PREVIEW_SEPARATOR}\n {truncatedPreview}\n </Text>\n )}\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAOA,OAAO,WAAW;AAClB,SAAS,KAAK,YAAY;AAE1B,SAAS,yBAAwC;AACjD,SAAS,iBAAiB,qBAAqB;AAC/C,SAAS,qBAAqB;AAMvB,SAAS,kBAAkB;AAAA,EAChC;AACF,GAA4C;AAC1C,MAAI,CAAC,SAAS;AACZ,WAAO,oCAAC,QAAK,OAAO,gBAAgB,OAAK,aAAW;AAAA,EACtD;AAEA,MAAI,OAAO,YAAY,UAAU;AAE/B,WAAO,oCAAC,QAAK,OAAO,gBAAgB,WAAU,cAAc,OAAO,CAAE;AAAA,EACvE;AAEA,MAAI,MAAM,QAAQ,OAAO,GAAG;AAE1B,UAAM,QAAQ,QACX;AAAA,MACC,CAAC,UACC,MAAM,SAAS;AAAA,IACnB,EACC,IAAI,WAAS,MAAM,IAAI;AAG1B,UAAM,eAAe,MAAM,KAAK,MAAM;AACtC,WACE,oCAAC,OAAI,eAAc,YACjB,oCAAC,QAAK,OAAO,gBAAgB,WAC1B,cAAc,YAAY,CAC7B,CACF;AAAA,EAEJ;AAEA,SAAO,oCAAC,QAAK,OAAO,gBAAgB,OAAK,0BAAwB;AACnE;AAaO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,WAAW;AACb,GAA4C;AAC1C,MAAI,CAAC,SAAS;AACZ,WACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,cAAc,SAAO,SAAE,GACpC,oCAAC,QAAK,OAAO,cAAc,WAAS,MAAI,CAC1C;AAAA,EAEJ;AAGA,MAAI,cAAc;AAClB,MAAI,YAAY;AAEhB,MAAI,OAAO,YAAY,UAAU;AAC/B,kBAAc,QAAQ;AACtB,gBAAY,QAAQ,MAAM,IAAI,EAAE,CAAC,KAAK;AAAA,EACxC,WAAW,MAAM,QAAQ,OAAO,GAAG;AACjC,UAAM,QAAQ,QACX;AAAA,MACC,CAAC,UACC,MAAM,SAAS;AAAA,IACnB,EACC,IAAI,WAAS,MAAM,IAAI;AAC1B,kBAAc,MAAM,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,CAAC;AAExD,eAAW,QAAQ,OAAO;AACxB,YAAM,QAAQ,KAAK,MAAM,IAAI,EAAE,OAAO,OAAK,EAAE,KAAK,CAAC;AACnD,UAAI,MAAM,CAAC,GAAG;AACZ,oBAAY,MAAM,CAAC;AACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,mBACJ,UAAU,SAAS,WACf,UAAU,UAAU,GAAG,QAAQ,IAAI,QACnC;AAGN,SACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,cAAc,SAAO,SAAE,GACpC,oCAAC,QAAK,OAAO,cAAc,WAAS,MAAI,GACvC,oBACC,oCAAC,QAAK,OAAO,gBAAgB,OAC1B,mBACA,gBACH,CAEJ;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { Box, Text } from "ink";
|
|
3
|
-
import { getTheme } from "../../utils/theme.js";
|
|
4
3
|
import { logError } from "../../utils/log.js";
|
|
5
4
|
import { useTerminalSize } from "../../hooks/useTerminalSize.js";
|
|
5
|
+
import { BRAND_GRADIENT, SEMANTIC_COLORS } from "../../constants/colors.js";
|
|
6
6
|
function UserPromptMessage({
|
|
7
7
|
addMargin,
|
|
8
8
|
param: { text }
|
|
@@ -12,7 +12,7 @@ function UserPromptMessage({
|
|
|
12
12
|
logError("No content found in user prompt message");
|
|
13
13
|
return null;
|
|
14
14
|
}
|
|
15
|
-
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginTop: addMargin ? 1 : 0, width: "100%" }, /* @__PURE__ */ React.createElement(Box, { minWidth: 2, width: 2 }, /* @__PURE__ */ React.createElement(Text, { color:
|
|
15
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginTop: addMargin ? 1 : 0, width: "100%" }, /* @__PURE__ */ React.createElement(Box, { minWidth: 2, width: 2 }, /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START, bold: true }, "\u276F")), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width: columns - 4 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary, wrap: "wrap" }, text)));
|
|
16
16
|
}
|
|
17
17
|
export {
|
|
18
18
|
UserPromptMessage
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/messages/UserPromptMessage.tsx"],
|
|
4
|
-
"sourcesContent": ["import React from 'react'\nimport { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Box, Text } from 'ink'\nimport {
|
|
5
|
-
"mappings": "AAAA,OAAO,WAAW;AAElB,SAAS,KAAK,YAAY;AAC1B,SAAS,gBAAgB;AACzB,SAAS,
|
|
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\nexport function UserPromptMessage({\n addMargin,\n param: { text },\n}: Props): React.ReactNode {\n const { columns } = useTerminalSize()\n if (!text) {\n logError('No content found in user prompt message')\n return null\n }\n\n return (\n <Box flexDirection=\"row\" marginTop={addMargin ? 1 : 0} width=\"100%\">\n <Box minWidth={2} width={2}>\n <Text color={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 {text}\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;AAOzC,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,OAAO,EAAE,KAAK;AAChB,GAA2B;AACzB,QAAM,EAAE,QAAQ,IAAI,gBAAgB;AACpC,MAAI,CAAC,MAAM;AACT,aAAS,yCAAyC;AAClD,WAAO;AAAA,EACT;AAEA,SACE,oCAAC,OAAI,eAAc,OAAM,WAAW,YAAY,IAAI,GAAG,OAAM,UAC3D,oCAAC,OAAI,UAAU,GAAG,OAAO,KACvB,oCAAC,QAAK,OAAO,eAAe,OAAO,MAAI,QAAC,QAExC,CACF,GACA,oCAAC,OAAI,eAAc,UAAS,OAAO,UAAU,KAC3C,oCAAC,QAAK,OAAO,gBAAgB,WAAW,MAAK,UAC1C,IACH,CACF,CACF;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Box } from "ink";
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { useGetToolFromMessages } from "./utils.js";
|
|
4
|
+
import { safeRenderToolResult } from "../../../utils/tooling/safeRender.js";
|
|
4
5
|
function UserToolSuccessMessage({
|
|
5
6
|
param,
|
|
6
7
|
message,
|
|
@@ -12,9 +13,7 @@ function UserToolSuccessMessage({
|
|
|
12
13
|
const { tool } = useGetToolFromMessages(param.tool_use_id, tools, messages);
|
|
13
14
|
return (
|
|
14
15
|
// TODO: Distinguish UserMessage from UserToolResultMessage
|
|
15
|
-
/* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width }, tool
|
|
16
|
-
verbose
|
|
17
|
-
}))
|
|
16
|
+
/* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width }, safeRenderToolResult(tool, message.toolUseResult?.data, { verbose }))
|
|
18
17
|
);
|
|
19
18
|
}
|
|
20
19
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx"],
|
|
4
|
-
"sourcesContent": ["import { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Box } from 'ink'\nimport * as React from 'react'\nimport { Tool } from '@tool'\nimport { Message, UserMessage } from '@query'\nimport { useGetToolFromMessages } from './utils'\n\ntype Props = {\n param: ToolResultBlockParam\n message: UserMessage\n messages: Message[]\n verbose: boolean\n tools: Tool[]\n width: number | string\n}\n\nexport function UserToolSuccessMessage({\n param,\n message,\n messages,\n tools,\n verbose,\n width,\n}: Props): React.ReactNode {\n const { tool } = useGetToolFromMessages(param.tool_use_id, tools, messages)\n\n return (\n // TODO: Distinguish UserMessage from UserToolResultMessage\n <Box flexDirection=\"column\" width={width}>\n {tool
|
|
5
|
-
"mappings": "AACA,SAAS,WAAW;AACpB,YAAY,WAAW;AAGvB,SAAS,8BAA8B;
|
|
4
|
+
"sourcesContent": ["import { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Box } from 'ink'\nimport * as React from 'react'\nimport { Tool } from '@tool'\nimport { Message, UserMessage } from '@query'\nimport { useGetToolFromMessages } from './utils'\nimport { safeRenderToolResult } from '@utils/tooling/safeRender'\n\ntype Props = {\n param: ToolResultBlockParam\n message: UserMessage\n messages: Message[]\n verbose: boolean\n tools: Tool[]\n width: number | string\n}\n\nexport function UserToolSuccessMessage({\n param,\n message,\n messages,\n tools,\n verbose,\n width,\n}: Props): React.ReactNode {\n const { tool } = useGetToolFromMessages(param.tool_use_id, tools, messages)\n\n return (\n // TODO: Distinguish UserMessage from UserToolResultMessage\n <Box flexDirection=\"column\" width={width}>\n {safeRenderToolResult(tool, message.toolUseResult?.data, { verbose })}\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,WAAW;AACpB,YAAY,WAAW;AAGvB,SAAS,8BAA8B;AACvC,SAAS,4BAA4B;AAW9B,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,EAAE,KAAK,IAAI,uBAAuB,MAAM,aAAa,OAAO,QAAQ;AAE1E;AAAA;AAAA,IAEE,oCAAC,OAAI,eAAc,UAAS,SACzB,qBAAqB,MAAM,QAAQ,eAAe,MAAM,EAAE,QAAQ,CAAC,CACtE;AAAA;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -17,6 +17,7 @@ import chalk from "chalk";
|
|
|
17
17
|
import {
|
|
18
18
|
usePermissionRequestLogging
|
|
19
19
|
} from "../../hooks/usePermissionRequestLogging.js";
|
|
20
|
+
import { safeRenderToolUseMessage } from "../../utils/tooling/safeRender.js";
|
|
20
21
|
function FallbackPermissionRequest({
|
|
21
22
|
toolUseConfirm,
|
|
22
23
|
onDone,
|
|
@@ -51,10 +52,9 @@ function FallbackPermissionRequest({
|
|
|
51
52
|
riskScore: toolUseConfirm.riskScore
|
|
52
53
|
}
|
|
53
54
|
),
|
|
54
|
-
/* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingX: 2, paddingY: 1 }, /* @__PURE__ */ React.createElement(Text, null, userFacingName, "(", toolUseConfirm.tool.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
), ")", originalUserFacingName.endsWith(" (MCP)") ? /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " (MCP)") : ""), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, toolUseConfirm.description)),
|
|
55
|
+
/* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingX: 2, paddingY: 1 }, /* @__PURE__ */ React.createElement(Text, null, userFacingName, "(", safeRenderToolUseMessage(toolUseConfirm.tool, toolUseConfirm.input, {
|
|
56
|
+
verbose
|
|
57
|
+
}), ")", originalUserFacingName.endsWith(" (MCP)") ? /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " (MCP)") : ""), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, toolUseConfirm.description)),
|
|
58
58
|
/* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, "Do you want to proceed?"), /* @__PURE__ */ React.createElement(
|
|
59
59
|
Select,
|
|
60
60
|
{
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/permissions/FallbackPermissionRequest.tsx"],
|
|
4
|
-
"sourcesContent": ["import { Box, Text } from 'ink'\nimport React, { useMemo } from 'react'\nimport { Select } from '@components/CustomSelect/select'\nimport { getTheme } from '@utils/theme'\nimport {\n PermissionRequestTitle,\n textColorForRiskScore,\n} from './PermissionRequestTitle'\nimport { logUnaryEvent } from '@utils/unaryLogging'\nimport { env } from '@utils/env'\nimport { getCwd } from '@utils/state'\nimport { savePermission } from '@permissions'\nimport {\n type ToolUseConfirm,\n toolUseConfirmGetPrefix,\n} from './PermissionRequest'\nimport chalk from 'chalk'\nimport {\n UnaryEvent,\n usePermissionRequestLogging,\n} from '@hooks/usePermissionRequestLogging'\n\ntype Props = {\n toolUseConfirm: ToolUseConfirm\n onDone(): void\n verbose: boolean\n}\n\nexport function FallbackPermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: Props): React.ReactNode {\n const theme = getTheme()\n\n // TODO: Avoid these special cases\n const originalUserFacingName = toolUseConfirm.tool.userFacingName()\n const userFacingName = originalUserFacingName.endsWith(' (MCP)')\n ? originalUserFacingName.slice(0, -6)\n : originalUserFacingName\n\n const unaryEvent = useMemo<UnaryEvent>(\n () => ({\n completion_type: 'tool_use_single',\n language_name: 'none',\n }),\n [],\n )\n\n usePermissionRequestLogging(toolUseConfirm, unaryEvent)\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n marginTop={1}\n paddingLeft={1}\n paddingRight={1}\n paddingBottom={1}\n >\n <PermissionRequestTitle\n title=\"Tool use\"\n riskScore={toolUseConfirm.riskScore}\n />\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text>\n {userFacingName}(\n {toolUseConfirm.tool
|
|
5
|
-
"mappings": "AAAA,SAAS,KAAK,YAAY;AAC1B,OAAO,SAAS,eAAe;AAC/B,SAAS,cAAc;AACvB,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,qBAAqB;AAC9B,SAAS,WAAW;AACpB,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAC/B;AAAA,EAEE;AAAA,OACK;AACP,OAAO,WAAW;AAClB;AAAA,EAEE;AAAA,OACK;
|
|
4
|
+
"sourcesContent": ["import { Box, Text } from 'ink'\nimport React, { useMemo } from 'react'\nimport { Select } from '@components/CustomSelect/select'\nimport { getTheme } from '@utils/theme'\nimport {\n PermissionRequestTitle,\n textColorForRiskScore,\n} from './PermissionRequestTitle'\nimport { logUnaryEvent } from '@utils/unaryLogging'\nimport { env } from '@utils/env'\nimport { getCwd } from '@utils/state'\nimport { savePermission } from '@permissions'\nimport {\n type ToolUseConfirm,\n toolUseConfirmGetPrefix,\n} from './PermissionRequest'\nimport chalk from 'chalk'\nimport {\n UnaryEvent,\n usePermissionRequestLogging,\n} from '@hooks/usePermissionRequestLogging'\nimport { safeRenderToolUseMessage } from '@utils/tooling/safeRender'\n\ntype Props = {\n toolUseConfirm: ToolUseConfirm\n onDone(): void\n verbose: boolean\n}\n\nexport function FallbackPermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: Props): React.ReactNode {\n const theme = getTheme()\n\n // TODO: Avoid these special cases\n const originalUserFacingName = toolUseConfirm.tool.userFacingName()\n const userFacingName = originalUserFacingName.endsWith(' (MCP)')\n ? originalUserFacingName.slice(0, -6)\n : originalUserFacingName\n\n const unaryEvent = useMemo<UnaryEvent>(\n () => ({\n completion_type: 'tool_use_single',\n language_name: 'none',\n }),\n [],\n )\n\n usePermissionRequestLogging(toolUseConfirm, unaryEvent)\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n marginTop={1}\n paddingLeft={1}\n paddingRight={1}\n paddingBottom={1}\n >\n <PermissionRequestTitle\n title=\"Tool use\"\n riskScore={toolUseConfirm.riskScore}\n />\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text>\n {userFacingName}(\n {safeRenderToolUseMessage(toolUseConfirm.tool, toolUseConfirm.input, {\n verbose,\n })}\n )\n {originalUserFacingName.endsWith(' (MCP)') ? (\n <Text color={theme.secondaryText}> (MCP)</Text>\n ) : (\n ''\n )}\n </Text>\n <Text color={theme.secondaryText}>{toolUseConfirm.description}</Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Do you want to proceed?</Text>\n <Select\n options={[\n {\n label: 'Yes',\n value: 'yes',\n },\n {\n label: `Yes, and don't ask again for ${chalk.bold(userFacingName)} commands in ${chalk.bold(getCwd())}`,\n value: 'yes-dont-ask-again',\n },\n {\n label: `No, and provide instructions (${chalk.bold.hex(getTheme().warning)('esc')})`,\n value: 'no',\n },\n ]}\n onChange={newValue => {\n switch (newValue) {\n case 'yes':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onAllow('temporary')\n onDone()\n break\n case 'yes-dont-ask-again':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n savePermission(\n toolUseConfirm.tool,\n toolUseConfirm.input,\n toolUseConfirmGetPrefix(toolUseConfirm),\n ).then(() => {\n toolUseConfirm.onAllow('permanent')\n onDone()\n })\n break\n case 'no':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'reject',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onReject()\n onDone()\n break\n }\n }}\n />\n </Box>\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js
CHANGED
|
@@ -21,6 +21,7 @@ import { FileReadTool } from "../../../tools/FileReadTool/FileReadTool.js";
|
|
|
21
21
|
import { NotebookEditTool } from "../../../tools/NotebookEditTool/NotebookEditTool.js";
|
|
22
22
|
import { NotebookReadTool } from "../../../tools/NotebookReadTool/NotebookReadTool.js";
|
|
23
23
|
import { FallbackPermissionRequest } from "../FallbackPermissionRequest.js";
|
|
24
|
+
import { safeRenderToolUseMessage } from "../../../utils/tooling/safeRender.js";
|
|
24
25
|
import {
|
|
25
26
|
grantWritePermissionForOriginalDir,
|
|
26
27
|
pathInOriginalCwd,
|
|
@@ -140,10 +141,9 @@ function FilesystemPermissionRequestImpl({
|
|
|
140
141
|
riskScore: toolUseConfirm.riskScore
|
|
141
142
|
}
|
|
142
143
|
),
|
|
143
|
-
/* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingX: 2, paddingY: 1 }, /* @__PURE__ */ React.createElement(Text, null, userFacingName, "(", toolUseConfirm.tool.
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
), ")")),
|
|
144
|
+
/* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingX: 2, paddingY: 1 }, /* @__PURE__ */ React.createElement(Text, null, userFacingName, "(", safeRenderToolUseMessage(toolUseConfirm.tool, toolUseConfirm.input, {
|
|
145
|
+
verbose
|
|
146
|
+
}), ")")),
|
|
147
147
|
/* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, "Do you want to proceed?"), /* @__PURE__ */ React.createElement(
|
|
148
148
|
Select,
|
|
149
149
|
{
|
package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx"],
|
|
4
|
-
"sourcesContent": ["import { Box, Text } from 'ink'\nimport React, { useMemo } from 'react'\nimport { Select } from '@components/CustomSelect/select'\nimport { getTheme } from '@utils/theme'\nimport {\n PermissionRequestTitle,\n textColorForRiskScore,\n} from '@components/permissions/PermissionRequestTitle'\nimport { logUnaryEvent } from '@utils/unaryLogging'\nimport { env } from '@utils/env'\nimport {\n type PermissionRequestProps,\n type ToolUseConfirm,\n} from '@components/permissions/PermissionRequest'\nimport chalk from 'chalk'\nimport {\n UnaryEvent,\n usePermissionRequestLogging,\n} from '@hooks/usePermissionRequestLogging'\nimport { FileEditTool } from '@tools/FileEditTool/FileEditTool'\nimport { FileWriteTool } from '@tools/FileWriteTool/FileWriteTool'\nimport { GrepTool } from '@tools/GrepTool/GrepTool'\nimport { GlobTool } from '@tools/GlobTool/GlobTool'\nimport { LSTool } from '@tools/lsTool/lsTool'\nimport { FileReadTool } from '@tools/FileReadTool/FileReadTool'\nimport { NotebookEditTool } from '@tools/NotebookEditTool/NotebookEditTool'\nimport { NotebookReadTool } from '@tools/NotebookReadTool/NotebookReadTool'\nimport { FallbackPermissionRequest } from '@components/permissions/FallbackPermissionRequest'\nimport {\n grantWritePermissionForOriginalDir,\n pathInOriginalCwd,\n toAbsolutePath,\n} from '@utils/permissions/filesystem'\nimport { getCwd } from '@utils/state'\n\nfunction pathArgNameForToolUse(toolUseConfirm: ToolUseConfirm): string | null {\n switch (toolUseConfirm.tool) {\n case FileWriteTool:\n case FileEditTool:\n case FileReadTool: {\n return 'file_path'\n }\n case GlobTool:\n case GrepTool:\n case LSTool: {\n return 'path'\n }\n case NotebookEditTool:\n case NotebookReadTool: {\n return 'notebook_path'\n }\n }\n return null\n}\n\nfunction isMultiFile(toolUseConfirm: ToolUseConfirm): boolean {\n switch (toolUseConfirm.tool) {\n case GlobTool:\n case GrepTool:\n case LSTool: {\n return true\n }\n }\n return false\n}\n\nfunction pathFromToolUse(toolUseConfirm: ToolUseConfirm): string | null {\n const pathArgName = pathArgNameForToolUse(toolUseConfirm)\n const input = toolUseConfirm.input\n if (pathArgName && pathArgName in input) {\n if (typeof input[pathArgName] === 'string') {\n return toAbsolutePath(input[pathArgName])\n } else {\n return toAbsolutePath(getCwd())\n }\n }\n return null\n}\n\nexport function FilesystemPermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: PermissionRequestProps): React.ReactNode {\n const path = pathFromToolUse(toolUseConfirm)\n if (!path) {\n // Fall back to generic permission request if no path is found\n return (\n <FallbackPermissionRequest\n toolUseConfirm={toolUseConfirm}\n onDone={onDone}\n verbose={verbose}\n />\n )\n }\n return (\n <FilesystemPermissionRequestImpl\n toolUseConfirm={toolUseConfirm}\n path={path}\n onDone={onDone}\n verbose={verbose}\n />\n )\n}\n\nfunction getDontAskAgainOptions(toolUseConfirm: ToolUseConfirm, path: string) {\n if (toolUseConfirm.tool.isReadOnly()) {\n // \"Always allow\" is not an option for read-only tools,\n // because they always have write permission in the project directory.\n return []\n }\n // Only show don't ask again option for edits in original working directory\n return pathInOriginalCwd(path)\n ? [\n {\n label: \"Yes, and don't ask again for file edits this session\",\n value: 'yes-dont-ask-again',\n },\n ]\n : []\n}\n\ntype Props = {\n toolUseConfirm: ToolUseConfirm\n path: string\n onDone(): void\n verbose: boolean\n}\n\nfunction FilesystemPermissionRequestImpl({\n toolUseConfirm,\n path,\n onDone,\n verbose,\n}: Props): React.ReactNode {\n const userFacingName = toolUseConfirm.tool.userFacingName()\n\n const userFacingReadOrWrite = toolUseConfirm.tool.isReadOnly()\n ? 'Read'\n : 'Edit'\n const title = `${userFacingReadOrWrite} ${isMultiFile(toolUseConfirm) ? 'files' : 'file'}`\n\n const unaryEvent = useMemo<UnaryEvent>(\n () => ({\n completion_type: 'tool_use_single',\n language_name: 'none',\n }),\n [],\n )\n\n usePermissionRequestLogging(toolUseConfirm, unaryEvent)\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n marginTop={1}\n paddingLeft={1}\n paddingRight={1}\n paddingBottom={1}\n >\n <PermissionRequestTitle\n title={title}\n riskScore={toolUseConfirm.riskScore}\n />\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text>\n {userFacingName}(\n {toolUseConfirm.tool
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import { Box, Text } from 'ink'\nimport React, { useMemo } from 'react'\nimport { Select } from '@components/CustomSelect/select'\nimport { getTheme } from '@utils/theme'\nimport {\n PermissionRequestTitle,\n textColorForRiskScore,\n} from '@components/permissions/PermissionRequestTitle'\nimport { logUnaryEvent } from '@utils/unaryLogging'\nimport { env } from '@utils/env'\nimport {\n type PermissionRequestProps,\n type ToolUseConfirm,\n} from '@components/permissions/PermissionRequest'\nimport chalk from 'chalk'\nimport {\n UnaryEvent,\n usePermissionRequestLogging,\n} from '@hooks/usePermissionRequestLogging'\nimport { FileEditTool } from '@tools/FileEditTool/FileEditTool'\nimport { FileWriteTool } from '@tools/FileWriteTool/FileWriteTool'\nimport { GrepTool } from '@tools/GrepTool/GrepTool'\nimport { GlobTool } from '@tools/GlobTool/GlobTool'\nimport { LSTool } from '@tools/lsTool/lsTool'\nimport { FileReadTool } from '@tools/FileReadTool/FileReadTool'\nimport { NotebookEditTool } from '@tools/NotebookEditTool/NotebookEditTool'\nimport { NotebookReadTool } from '@tools/NotebookReadTool/NotebookReadTool'\nimport { FallbackPermissionRequest } from '@components/permissions/FallbackPermissionRequest'\nimport { safeRenderToolUseMessage } from '@utils/tooling/safeRender'\nimport {\n grantWritePermissionForOriginalDir,\n pathInOriginalCwd,\n toAbsolutePath,\n} from '@utils/permissions/filesystem'\nimport { getCwd } from '@utils/state'\n\nfunction pathArgNameForToolUse(toolUseConfirm: ToolUseConfirm): string | null {\n switch (toolUseConfirm.tool) {\n case FileWriteTool:\n case FileEditTool:\n case FileReadTool: {\n return 'file_path'\n }\n case GlobTool:\n case GrepTool:\n case LSTool: {\n return 'path'\n }\n case NotebookEditTool:\n case NotebookReadTool: {\n return 'notebook_path'\n }\n }\n return null\n}\n\nfunction isMultiFile(toolUseConfirm: ToolUseConfirm): boolean {\n switch (toolUseConfirm.tool) {\n case GlobTool:\n case GrepTool:\n case LSTool: {\n return true\n }\n }\n return false\n}\n\nfunction pathFromToolUse(toolUseConfirm: ToolUseConfirm): string | null {\n const pathArgName = pathArgNameForToolUse(toolUseConfirm)\n const input = toolUseConfirm.input\n if (pathArgName && pathArgName in input) {\n if (typeof input[pathArgName] === 'string') {\n return toAbsolutePath(input[pathArgName])\n } else {\n return toAbsolutePath(getCwd())\n }\n }\n return null\n}\n\nexport function FilesystemPermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: PermissionRequestProps): React.ReactNode {\n const path = pathFromToolUse(toolUseConfirm)\n if (!path) {\n // Fall back to generic permission request if no path is found\n return (\n <FallbackPermissionRequest\n toolUseConfirm={toolUseConfirm}\n onDone={onDone}\n verbose={verbose}\n />\n )\n }\n return (\n <FilesystemPermissionRequestImpl\n toolUseConfirm={toolUseConfirm}\n path={path}\n onDone={onDone}\n verbose={verbose}\n />\n )\n}\n\nfunction getDontAskAgainOptions(toolUseConfirm: ToolUseConfirm, path: string) {\n if (toolUseConfirm.tool.isReadOnly()) {\n // \"Always allow\" is not an option for read-only tools,\n // because they always have write permission in the project directory.\n return []\n }\n // Only show don't ask again option for edits in original working directory\n return pathInOriginalCwd(path)\n ? [\n {\n label: \"Yes, and don't ask again for file edits this session\",\n value: 'yes-dont-ask-again',\n },\n ]\n : []\n}\n\ntype Props = {\n toolUseConfirm: ToolUseConfirm\n path: string\n onDone(): void\n verbose: boolean\n}\n\nfunction FilesystemPermissionRequestImpl({\n toolUseConfirm,\n path,\n onDone,\n verbose,\n}: Props): React.ReactNode {\n const userFacingName = toolUseConfirm.tool.userFacingName()\n\n const userFacingReadOrWrite = toolUseConfirm.tool.isReadOnly()\n ? 'Read'\n : 'Edit'\n const title = `${userFacingReadOrWrite} ${isMultiFile(toolUseConfirm) ? 'files' : 'file'}`\n\n const unaryEvent = useMemo<UnaryEvent>(\n () => ({\n completion_type: 'tool_use_single',\n language_name: 'none',\n }),\n [],\n )\n\n usePermissionRequestLogging(toolUseConfirm, unaryEvent)\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n marginTop={1}\n paddingLeft={1}\n paddingRight={1}\n paddingBottom={1}\n >\n <PermissionRequestTitle\n title={title}\n riskScore={toolUseConfirm.riskScore}\n />\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text>\n {userFacingName}(\n {safeRenderToolUseMessage(toolUseConfirm.tool, toolUseConfirm.input, {\n verbose,\n })}\n )\n </Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Do you want to proceed?</Text>\n <Select\n options={[\n {\n label: 'Yes',\n value: 'yes',\n },\n ...getDontAskAgainOptions(toolUseConfirm, path),\n {\n label: `No, and provide instructions (${chalk.bold.hex(getTheme().warning)('esc')})`,\n value: 'no',\n },\n ]}\n onChange={newValue => {\n switch (newValue) {\n case 'yes':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onAllow('temporary')\n onDone()\n break\n case 'yes-dont-ask-again':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n grantWritePermissionForOriginalDir()\n toolUseConfirm.onAllow('permanent')\n onDone()\n break\n case 'no':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'reject',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onReject()\n onDone()\n break\n }\n }}\n />\n </Box>\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|