@within-7/minto 0.0.5-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +1097 -0
- package/README.zh-CN.md +1097 -0
- package/cli.js +59 -0
- package/dist/Tool.js +1 -0
- package/dist/Tool.js.map +7 -0
- package/dist/commands/agents.js +2086 -0
- package/dist/commands/agents.js.map +7 -0
- package/dist/commands/approvedTools.js +36 -0
- package/dist/commands/approvedTools.js.map +7 -0
- package/dist/commands/bug.js +21 -0
- package/dist/commands/bug.js.map +7 -0
- package/dist/commands/build.js +74 -0
- package/dist/commands/build.js.map +7 -0
- package/dist/commands/clear.js +37 -0
- package/dist/commands/clear.js.map +7 -0
- package/dist/commands/compact.js +82 -0
- package/dist/commands/compact.js.map +7 -0
- package/dist/commands/compression.js +57 -0
- package/dist/commands/compression.js.map +7 -0
- package/dist/commands/config.js +20 -0
- package/dist/commands/config.js.map +7 -0
- package/dist/commands/cost.js +19 -0
- package/dist/commands/cost.js.map +7 -0
- package/dist/commands/ctx_viz.js +152 -0
- package/dist/commands/ctx_viz.js.map +7 -0
- package/dist/commands/doctor.js +25 -0
- package/dist/commands/doctor.js.map +7 -0
- package/dist/commands/help.js +20 -0
- package/dist/commands/help.js.map +7 -0
- package/dist/commands/init.js +38 -0
- package/dist/commands/init.js.map +7 -0
- package/dist/commands/listen.js +37 -0
- package/dist/commands/listen.js.map +7 -0
- package/dist/commands/login.js +37 -0
- package/dist/commands/login.js.map +7 -0
- package/dist/commands/logout.js +33 -0
- package/dist/commands/logout.js.map +7 -0
- package/dist/commands/mcp-interactive.js +267 -0
- package/dist/commands/mcp-interactive.js.map +7 -0
- package/dist/commands/mcp.js +40 -0
- package/dist/commands/mcp.js.map +7 -0
- package/dist/commands/mcp_refresh.js +40 -0
- package/dist/commands/mcp_refresh.js.map +7 -0
- package/dist/commands/model.js +41 -0
- package/dist/commands/model.js.map +7 -0
- package/dist/commands/modelstatus.js +21 -0
- package/dist/commands/modelstatus.js.map +7 -0
- package/dist/commands/onboarding.js +36 -0
- package/dist/commands/onboarding.js.map +7 -0
- package/dist/commands/plugin/AddMarketplaceForm.js +62 -0
- package/dist/commands/plugin/AddMarketplaceForm.js.map +7 -0
- package/dist/commands/plugin/ConfirmDialog.js +71 -0
- package/dist/commands/plugin/ConfirmDialog.js.map +7 -0
- package/dist/commands/plugin/ErrorView.js +33 -0
- package/dist/commands/plugin/ErrorView.js.map +7 -0
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js +135 -0
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +7 -0
- package/dist/commands/plugin/InstalledPluginsManager.js +99 -0
- package/dist/commands/plugin/InstalledPluginsManager.js.map +7 -0
- package/dist/commands/plugin/LoadingView.js +14 -0
- package/dist/commands/plugin/LoadingView.js.map +7 -0
- package/dist/commands/plugin/MainMenu.js +57 -0
- package/dist/commands/plugin/MainMenu.js.map +7 -0
- package/dist/commands/plugin/MarketplaceManager.js +155 -0
- package/dist/commands/plugin/MarketplaceManager.js.map +7 -0
- package/dist/commands/plugin/MarketplaceSelector.js +119 -0
- package/dist/commands/plugin/MarketplaceSelector.js.map +7 -0
- package/dist/commands/plugin/PlaceholderScreen.js +16 -0
- package/dist/commands/plugin/PlaceholderScreen.js.map +7 -0
- package/dist/commands/plugin/PluginBrowser.js +180 -0
- package/dist/commands/plugin/PluginBrowser.js.map +7 -0
- package/dist/commands/plugin/PluginDetailsInstall.js +152 -0
- package/dist/commands/plugin/PluginDetailsInstall.js.map +7 -0
- package/dist/commands/plugin/PluginDetailsManage.js +200 -0
- package/dist/commands/plugin/PluginDetailsManage.js.map +7 -0
- package/dist/commands/plugin/components.js +16 -0
- package/dist/commands/plugin/components.js.map +7 -0
- package/dist/commands/plugin/example-usage.js +63 -0
- package/dist/commands/plugin/example-usage.js.map +7 -0
- package/dist/commands/plugin/types.js +1 -0
- package/dist/commands/plugin/types.js.map +7 -0
- package/dist/commands/plugin/utils.js +77 -0
- package/dist/commands/plugin/utils.js.map +7 -0
- package/dist/commands/plugin-interactive.js +446 -0
- package/dist/commands/plugin-interactive.js.map +7 -0
- package/dist/commands/plugin.js +523 -0
- package/dist/commands/plugin.js.map +7 -0
- package/dist/commands/pr_comments.js +61 -0
- package/dist/commands/pr_comments.js.map +7 -0
- package/dist/commands/quit.js +16 -0
- package/dist/commands/quit.js.map +7 -0
- package/dist/commands/refreshCommands.js +43 -0
- package/dist/commands/refreshCommands.js.map +7 -0
- package/dist/commands/release-notes.js +30 -0
- package/dist/commands/release-notes.js.map +7 -0
- package/dist/commands/resume.js +35 -0
- package/dist/commands/resume.js.map +7 -0
- package/dist/commands/review.js +51 -0
- package/dist/commands/review.js.map +7 -0
- package/dist/commands/terminalSetup.js +164 -0
- package/dist/commands/terminalSetup.js.map +7 -0
- package/dist/commands.js +104 -0
- package/dist/commands.js.map +7 -0
- package/dist/components/AgentResponseBlock.js +41 -0
- package/dist/components/AgentResponseBlock.js.map +7 -0
- package/dist/components/AgentThinkingBlock.js +40 -0
- package/dist/components/AgentThinkingBlock.js.map +7 -0
- package/dist/components/AsciiLogo.js +19 -0
- package/dist/components/AsciiLogo.js.map +7 -0
- package/dist/components/BackgroundTasksPanel.js +124 -0
- package/dist/components/BackgroundTasksPanel.js.map +7 -0
- package/dist/components/Bug.js +147 -0
- package/dist/components/Bug.js.map +7 -0
- package/dist/components/Config.js +166 -0
- package/dist/components/Config.js.map +7 -0
- package/dist/components/ConsoleOAuthFlow.js +178 -0
- package/dist/components/ConsoleOAuthFlow.js.map +7 -0
- package/dist/components/Cost.js +13 -0
- package/dist/components/Cost.js.map +7 -0
- package/dist/components/CostThresholdDialog.js +38 -0
- package/dist/components/CostThresholdDialog.js.map +7 -0
- package/dist/components/CustomSelect/option-map.js +32 -0
- package/dist/components/CustomSelect/option-map.js.map +7 -0
- package/dist/components/CustomSelect/select-option.js +34 -0
- package/dist/components/CustomSelect/select-option.js.map +7 -0
- package/dist/components/CustomSelect/select.js +64 -0
- package/dist/components/CustomSelect/select.js.map +7 -0
- package/dist/components/CustomSelect/theme.js +1 -0
- package/dist/components/CustomSelect/theme.js.map +7 -0
- package/dist/components/CustomSelect/use-select-state.js +220 -0
- package/dist/components/CustomSelect/use-select-state.js.map +7 -0
- package/dist/components/CustomSelect/use-select.js +21 -0
- package/dist/components/CustomSelect/use-select.js.map +7 -0
- package/dist/components/FallbackToolUseRejectedMessage.js +11 -0
- package/dist/components/FallbackToolUseRejectedMessage.js.map +7 -0
- package/dist/components/FileEditToolUpdatedMessage.js +32 -0
- package/dist/components/FileEditToolUpdatedMessage.js.map +7 -0
- package/dist/components/HeaderBar.js +57 -0
- package/dist/components/HeaderBar.js.map +7 -0
- package/dist/components/Help.js +46 -0
- package/dist/components/Help.js.map +7 -0
- package/dist/components/HighlightedCode.js +30 -0
- package/dist/components/HighlightedCode.js.map +7 -0
- package/dist/components/HistorySearchOverlay.js +48 -0
- package/dist/components/HistorySearchOverlay.js.map +7 -0
- package/dist/components/InteractionRoundBlock.js +56 -0
- package/dist/components/InteractionRoundBlock.js.map +7 -0
- package/dist/components/InvalidConfigDialog.js +83 -0
- package/dist/components/InvalidConfigDialog.js.map +7 -0
- package/dist/components/Link.js +18 -0
- package/dist/components/Link.js.map +7 -0
- package/dist/components/LogSelector.js +50 -0
- package/dist/components/LogSelector.js.map +7 -0
- package/dist/components/Logo.js +96 -0
- package/dist/components/Logo.js.map +7 -0
- package/dist/components/MCPServerApprovalDialog.js +79 -0
- package/dist/components/MCPServerApprovalDialog.js.map +7 -0
- package/dist/components/MCPServerDialogCopy.js +11 -0
- package/dist/components/MCPServerDialogCopy.js.map +7 -0
- package/dist/components/MCPServerMultiselectDialog.js +80 -0
- package/dist/components/MCPServerMultiselectDialog.js.map +7 -0
- package/dist/components/Message.js +146 -0
- package/dist/components/Message.js.map +7 -0
- package/dist/components/MessageResponse.js +9 -0
- package/dist/components/MessageResponse.js.map +7 -0
- package/dist/components/MessageSelector.js +125 -0
- package/dist/components/MessageSelector.js.map +7 -0
- package/dist/components/ModeIndicator.js +38 -0
- package/dist/components/ModeIndicator.js.map +7 -0
- package/dist/components/ModelConfig.js +208 -0
- package/dist/components/ModelConfig.js.map +7 -0
- package/dist/components/ModelListManager.js +140 -0
- package/dist/components/ModelListManager.js.map +7 -0
- package/dist/components/ModelSelector.js +2062 -0
- package/dist/components/ModelSelector.js.map +7 -0
- package/dist/components/ModelStatusDisplay.js +87 -0
- package/dist/components/ModelStatusDisplay.js.map +7 -0
- package/dist/components/Onboarding.js +153 -0
- package/dist/components/Onboarding.js.map +7 -0
- package/dist/components/PressEnterToContinue.js +10 -0
- package/dist/components/PressEnterToContinue.js.map +7 -0
- package/dist/components/ProjectOnboarding.js +99 -0
- package/dist/components/ProjectOnboarding.js.map +7 -0
- package/dist/components/PromptInput.js +755 -0
- package/dist/components/PromptInput.js.map +7 -0
- package/dist/components/QuitSummary.js +81 -0
- package/dist/components/QuitSummary.js.map +7 -0
- package/dist/components/SentryErrorBoundary.js +27 -0
- package/dist/components/SentryErrorBoundary.js.map +7 -0
- package/dist/components/Spinner.js +101 -0
- package/dist/components/Spinner.js.map +7 -0
- package/dist/components/SpinnerSymbol.js +78 -0
- package/dist/components/SpinnerSymbol.js.map +7 -0
- package/dist/components/StreamingBashOutput.js +70 -0
- package/dist/components/StreamingBashOutput.js.map +7 -0
- package/dist/components/StructuredDiff.js +148 -0
- package/dist/components/StructuredDiff.js.map +7 -0
- package/dist/components/SubagentBlock.js +157 -0
- package/dist/components/SubagentBlock.js.map +7 -0
- package/dist/components/SubagentManager.js +65 -0
- package/dist/components/SubagentManager.js.map +7 -0
- package/dist/components/SubagentProgress.js +109 -0
- package/dist/components/SubagentProgress.js.map +7 -0
- package/dist/components/SubagentStatusMarker.js +37 -0
- package/dist/components/SubagentStatusMarker.js.map +7 -0
- package/dist/components/TaskCard.js +170 -0
- package/dist/components/TaskCard.js.map +7 -0
- package/dist/components/TextInput.js +100 -0
- package/dist/components/TextInput.js.map +7 -0
- package/dist/components/TimelineRenderer.js +31 -0
- package/dist/components/TimelineRenderer.js.map +7 -0
- package/dist/components/TodoChangeBlock.js +29 -0
- package/dist/components/TodoChangeBlock.js.map +7 -0
- package/dist/components/TodoChangeLine.js +22 -0
- package/dist/components/TodoChangeLine.js.map +7 -0
- package/dist/components/TodoItem.js +35 -0
- package/dist/components/TodoItem.js.map +7 -0
- package/dist/components/TodoPanel.js +55 -0
- package/dist/components/TodoPanel.js.map +7 -0
- package/dist/components/TokenWarning.js +19 -0
- package/dist/components/TokenWarning.js.map +7 -0
- package/dist/components/ToolExecutionBlock.js +18 -0
- package/dist/components/ToolExecutionBlock.js.map +7 -0
- package/dist/components/ToolUseLoader.js +24 -0
- package/dist/components/ToolUseLoader.js.map +7 -0
- package/dist/components/TrustDialog.js +71 -0
- package/dist/components/TrustDialog.js.map +7 -0
- package/dist/components/UserQueryBlock.js +12 -0
- package/dist/components/UserQueryBlock.js.map +7 -0
- package/dist/components/binary-feedback/BinaryFeedback.js +50 -0
- package/dist/components/binary-feedback/BinaryFeedback.js.map +7 -0
- package/dist/components/binary-feedback/BinaryFeedbackOption.js +94 -0
- package/dist/components/binary-feedback/BinaryFeedbackOption.js.map +7 -0
- package/dist/components/binary-feedback/BinaryFeedbackView.js +139 -0
- package/dist/components/binary-feedback/BinaryFeedbackView.js.map +7 -0
- package/dist/components/binary-feedback/utils.js +108 -0
- package/dist/components/binary-feedback/utils.js.map +7 -0
- package/dist/components/messages/AssistantBashOutputMessage.js +23 -0
- package/dist/components/messages/AssistantBashOutputMessage.js.map +7 -0
- package/dist/components/messages/AssistantLocalCommandOutputMessage.js +36 -0
- package/dist/components/messages/AssistantLocalCommandOutputMessage.js.map +7 -0
- package/dist/components/messages/AssistantRedactedThinkingMessage.js +12 -0
- package/dist/components/messages/AssistantRedactedThinkingMessage.js.map +7 -0
- package/dist/components/messages/AssistantTextMessage.js +78 -0
- package/dist/components/messages/AssistantTextMessage.js.map +7 -0
- package/dist/components/messages/AssistantThinkingMessage.js +27 -0
- package/dist/components/messages/AssistantThinkingMessage.js.map +7 -0
- package/dist/components/messages/AssistantToolUseMessage.js +91 -0
- package/dist/components/messages/AssistantToolUseMessage.js.map +7 -0
- package/dist/components/messages/TaskProgressMessage.js +11 -0
- package/dist/components/messages/TaskProgressMessage.js.map +7 -0
- package/dist/components/messages/TaskToolMessage.js +39 -0
- package/dist/components/messages/TaskToolMessage.js.map +7 -0
- package/dist/components/messages/UserBashInputMessage.js +18 -0
- package/dist/components/messages/UserBashInputMessage.js.map +7 -0
- package/dist/components/messages/UserCommandMessage.js +20 -0
- package/dist/components/messages/UserCommandMessage.js.map +7 -0
- package/dist/components/messages/UserKodingInputMessage.js +18 -0
- package/dist/components/messages/UserKodingInputMessage.js.map +7 -0
- package/dist/components/messages/UserPromptMessage.js +20 -0
- package/dist/components/messages/UserPromptMessage.js.map +7 -0
- package/dist/components/messages/UserTextMessage.js +25 -0
- package/dist/components/messages/UserTextMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js +10 -0
- package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolErrorMessage.js +15 -0
- package/dist/components/messages/UserToolResultMessage/UserToolErrorMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js +25 -0
- package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js +47 -0
- package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +23 -0
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/utils.js +50 -0
- package/dist/components/messages/UserToolResultMessage/utils.js.map +7 -0
- package/dist/components/permissions/BashPermissionRequest/BashPermissionRequest.js +112 -0
- package/dist/components/permissions/BashPermissionRequest/BashPermissionRequest.js.map +7 -0
- package/dist/components/permissions/FallbackPermissionRequest.js +131 -0
- package/dist/components/permissions/FallbackPermissionRequest.js.map +7 -0
- package/dist/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js +159 -0
- package/dist/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js.map +7 -0
- package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js +58 -0
- package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js.map +7 -0
- package/dist/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js +153 -0
- package/dist/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js.map +7 -0
- package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js +70 -0
- package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js.map +7 -0
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +212 -0
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +7 -0
- package/dist/components/permissions/PermissionRequest.js +70 -0
- package/dist/components/permissions/PermissionRequest.js.map +7 -0
- package/dist/components/permissions/PermissionRequestTitle.js +52 -0
- package/dist/components/permissions/PermissionRequestTitle.js.map +7 -0
- package/dist/components/permissions/hooks.js +23 -0
- package/dist/components/permissions/hooks.js.map +7 -0
- package/dist/components/permissions/toolUseOptions.js +46 -0
- package/dist/components/permissions/toolUseOptions.js.map +7 -0
- package/dist/components/permissions/utils.js +21 -0
- package/dist/components/permissions/utils.js.map +7 -0
- package/dist/constants/claude-asterisk-ascii-art.js +242 -0
- package/dist/constants/claude-asterisk-ascii-art.js.map +7 -0
- package/dist/constants/colors.js +126 -0
- package/dist/constants/colors.js.map +7 -0
- package/dist/constants/compressionPrompts.js +73 -0
- package/dist/constants/compressionPrompts.js.map +7 -0
- package/dist/constants/figures.js +6 -0
- package/dist/constants/figures.js.map +7 -0
- package/dist/constants/macros.js +11 -0
- package/dist/constants/macros.js.map +7 -0
- package/dist/constants/modelCapabilities.js +154 -0
- package/dist/constants/modelCapabilities.js.map +7 -0
- package/dist/constants/models.js +1034 -0
- package/dist/constants/models.js.map +7 -0
- package/dist/constants/oauth.js +18 -0
- package/dist/constants/oauth.js.map +7 -0
- package/dist/constants/product.js +26 -0
- package/dist/constants/product.js.map +7 -0
- package/dist/constants/prompts.js +168 -0
- package/dist/constants/prompts.js.map +7 -0
- package/dist/constants/releaseNotes.js +9 -0
- package/dist/constants/releaseNotes.js.map +7 -0
- package/dist/constants/symbols.js +50 -0
- package/dist/constants/symbols.js.map +7 -0
- package/dist/context/PermissionContext.js +111 -0
- package/dist/context/PermissionContext.js.map +7 -0
- package/dist/context.js +278 -0
- package/dist/context.js.map +7 -0
- package/dist/cost-tracker.js +76 -0
- package/dist/cost-tracker.js.map +7 -0
- package/dist/entrypoints/cli-wrapper.js +61 -0
- package/dist/entrypoints/cli-wrapper.js.map +7 -0
- package/dist/entrypoints/cli.js +1115 -0
- package/dist/entrypoints/cli.js.map +7 -0
- package/dist/entrypoints/mcp.js +150 -0
- package/dist/entrypoints/mcp.js.map +7 -0
- package/dist/history.js +25 -0
- package/dist/history.js.map +7 -0
- package/dist/hooks/useApiKeyVerification.js +12 -0
- package/dist/hooks/useApiKeyVerification.js.map +7 -0
- package/dist/hooks/useArrowKeyHistory.js +50 -0
- package/dist/hooks/useArrowKeyHistory.js.map +7 -0
- package/dist/hooks/useCanUseTool.js +87 -0
- package/dist/hooks/useCanUseTool.js.map +7 -0
- package/dist/hooks/useCancelRequest.js +28 -0
- package/dist/hooks/useCancelRequest.js.map +7 -0
- package/dist/hooks/useDoublePress.js +31 -0
- package/dist/hooks/useDoublePress.js.map +7 -0
- package/dist/hooks/useExitOnCtrlCD.js +26 -0
- package/dist/hooks/useExitOnCtrlCD.js.map +7 -0
- package/dist/hooks/useHistorySearch.js +62 -0
- package/dist/hooks/useHistorySearch.js.map +7 -0
- package/dist/hooks/useInterval.js +18 -0
- package/dist/hooks/useInterval.js.map +7 -0
- package/dist/hooks/useLogMessages.js +14 -0
- package/dist/hooks/useLogMessages.js.map +7 -0
- package/dist/hooks/useLogStartupTime.js +10 -0
- package/dist/hooks/useLogStartupTime.js.map +7 -0
- package/dist/hooks/useNotifyAfterTimeout.js +42 -0
- package/dist/hooks/useNotifyAfterTimeout.js.map +7 -0
- package/dist/hooks/usePermissionRequestLogging.js +23 -0
- package/dist/hooks/usePermissionRequestLogging.js.map +7 -0
- package/dist/hooks/useTerminalSize.js +38 -0
- package/dist/hooks/useTerminalSize.js.map +7 -0
- package/dist/hooks/useTextInput.js +252 -0
- package/dist/hooks/useTextInput.js.map +7 -0
- package/dist/hooks/useUnifiedCompletion.js +929 -0
- package/dist/hooks/useUnifiedCompletion.js.map +7 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +7 -0
- package/dist/messages.js +33 -0
- package/dist/messages.js.map +7 -0
- package/dist/package.json +4 -0
- package/dist/permissions.js +194 -0
- package/dist/permissions.js.map +7 -0
- package/dist/query.js +499 -0
- package/dist/query.js.map +7 -0
- package/dist/screens/Doctor.js +22 -0
- package/dist/screens/Doctor.js.map +7 -0
- package/dist/screens/LogList.js +55 -0
- package/dist/screens/LogList.js.map +7 -0
- package/dist/screens/REPL.js +671 -0
- package/dist/screens/REPL.js.map +7 -0
- package/dist/screens/ResumeConversation.js +56 -0
- package/dist/screens/ResumeConversation.js.map +7 -0
- package/dist/services/adapters/base.js +29 -0
- package/dist/services/adapters/base.js.map +7 -0
- package/dist/services/adapters/chatCompletions.js +69 -0
- package/dist/services/adapters/chatCompletions.js.map +7 -0
- package/dist/services/adapters/responsesAPI.js +126 -0
- package/dist/services/adapters/responsesAPI.js.map +7 -0
- package/dist/services/claude.js +1573 -0
- package/dist/services/claude.js.map +7 -0
- package/dist/services/compressionService.js +210 -0
- package/dist/services/compressionService.js.map +7 -0
- package/dist/services/customCommands.js +437 -0
- package/dist/services/customCommands.js.map +7 -0
- package/dist/services/fileFreshness.js +275 -0
- package/dist/services/fileFreshness.js.map +7 -0
- package/dist/services/gpt5ConnectionTest.js +248 -0
- package/dist/services/gpt5ConnectionTest.js.map +7 -0
- package/dist/services/hookExecutor.js +276 -0
- package/dist/services/hookExecutor.js.map +7 -0
- package/dist/services/mainAgentCompressor.js +84 -0
- package/dist/services/mainAgentCompressor.js.map +7 -0
- package/dist/services/mcpClient.js +449 -0
- package/dist/services/mcpClient.js.map +7 -0
- package/dist/services/mcpServerApproval.js +55 -0
- package/dist/services/mcpServerApproval.js.map +7 -0
- package/dist/services/mentionProcessor.js +201 -0
- package/dist/services/mentionProcessor.js.map +7 -0
- package/dist/services/modelAdapterFactory.js +47 -0
- package/dist/services/modelAdapterFactory.js.map +7 -0
- package/dist/services/notifier.js +35 -0
- package/dist/services/notifier.js.map +7 -0
- package/dist/services/oauth.js +247 -0
- package/dist/services/oauth.js.map +7 -0
- package/dist/services/openai.js +995 -0
- package/dist/services/openai.js.map +7 -0
- package/dist/services/responseStateManager.js +68 -0
- package/dist/services/responseStateManager.js.map +7 -0
- package/dist/services/sentry.js +9 -0
- package/dist/services/sentry.js.map +7 -0
- package/dist/services/subagentAbortManager.js +95 -0
- package/dist/services/subagentAbortManager.js.map +7 -0
- package/dist/services/subagentCompressor.js +146 -0
- package/dist/services/subagentCompressor.js.map +7 -0
- package/dist/services/systemReminder.js +335 -0
- package/dist/services/systemReminder.js.map +7 -0
- package/dist/services/vcr.js +133 -0
- package/dist/services/vcr.js.map +7 -0
- package/dist/tools/ArchitectTool/ArchitectTool.js +119 -0
- package/dist/tools/ArchitectTool/ArchitectTool.js.map +7 -0
- package/dist/tools/ArchitectTool/prompt.js +18 -0
- package/dist/tools/ArchitectTool/prompt.js.map +7 -0
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +423 -0
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +7 -0
- package/dist/tools/BashOutputTool/BashOutputTool.js +120 -0
- package/dist/tools/BashOutputTool/BashOutputTool.js.map +7 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +11 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +7 -0
- package/dist/tools/BashOutputTool/prompt.js +13 -0
- package/dist/tools/BashOutputTool/prompt.js.map +7 -0
- package/dist/tools/BashTool/BashTool.js +209 -0
- package/dist/tools/BashTool/BashTool.js.map +7 -0
- package/dist/tools/BashTool/BashToolResultMessage.js +21 -0
- package/dist/tools/BashTool/BashToolResultMessage.js.map +7 -0
- package/dist/tools/BashTool/OutputLine.js +30 -0
- package/dist/tools/BashTool/OutputLine.js.map +7 -0
- package/dist/tools/BashTool/prompt.js +180 -0
- package/dist/tools/BashTool/prompt.js.map +7 -0
- package/dist/tools/BashTool/utils.js +51 -0
- package/dist/tools/BashTool/utils.js.map +7 -0
- package/dist/tools/FileEditTool/FileEditTool.js +226 -0
- package/dist/tools/FileEditTool/FileEditTool.js.map +7 -0
- package/dist/tools/FileEditTool/prompt.js +54 -0
- package/dist/tools/FileEditTool/prompt.js.map +7 -0
- package/dist/tools/FileEditTool/utils.js +42 -0
- package/dist/tools/FileEditTool/utils.js.map +7 -0
- package/dist/tools/FileReadTool/FileReadTool.js +272 -0
- package/dist/tools/FileReadTool/FileReadTool.js.map +7 -0
- package/dist/tools/FileReadTool/prompt.js +10 -0
- package/dist/tools/FileReadTool/prompt.js.map +7 -0
- package/dist/tools/FileWriteTool/FileWriteTool.js +202 -0
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +7 -0
- package/dist/tools/FileWriteTool/prompt.js +14 -0
- package/dist/tools/FileWriteTool/prompt.js.map +7 -0
- package/dist/tools/GlobTool/GlobTool.js +88 -0
- package/dist/tools/GlobTool/GlobTool.js.map +7 -0
- package/dist/tools/GlobTool/prompt.js +12 -0
- package/dist/tools/GlobTool/prompt.js.map +7 -0
- package/dist/tools/GrepTool/GrepTool.js +107 -0
- package/dist/tools/GrepTool/GrepTool.js.map +7 -0
- package/dist/tools/GrepTool/prompt.js +15 -0
- package/dist/tools/GrepTool/prompt.js.map +7 -0
- package/dist/tools/KillShellTool/KillShellTool.js +92 -0
- package/dist/tools/KillShellTool/KillShellTool.js.map +7 -0
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js +11 -0
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +7 -0
- package/dist/tools/KillShellTool/prompt.js +12 -0
- package/dist/tools/KillShellTool/prompt.js.map +7 -0
- package/dist/tools/MCPTool/MCPTool.js +90 -0
- package/dist/tools/MCPTool/MCPTool.js.map +7 -0
- package/dist/tools/MCPTool/prompt.js +7 -0
- package/dist/tools/MCPTool/prompt.js.map +7 -0
- package/dist/tools/MemoryReadTool/MemoryReadTool.js +103 -0
- package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +7 -0
- package/dist/tools/MemoryReadTool/prompt.js +7 -0
- package/dist/tools/MemoryReadTool/prompt.js.map +7 -0
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +77 -0
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +7 -0
- package/dist/tools/MemoryWriteTool/prompt.js +7 -0
- package/dist/tools/MemoryWriteTool/prompt.js.map +7 -0
- package/dist/tools/MultiEditTool/MultiEditTool.js +301 -0
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +7 -0
- package/dist/tools/MultiEditTool/prompt.js +48 -0
- package/dist/tools/MultiEditTool/prompt.js.map +7 -0
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +238 -0
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +7 -0
- package/dist/tools/NotebookEditTool/prompt.js +7 -0
- package/dist/tools/NotebookEditTool/prompt.js.map +7 -0
- package/dist/tools/NotebookReadTool/NotebookReadTool.js +212 -0
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +7 -0
- package/dist/tools/NotebookReadTool/prompt.js +7 -0
- package/dist/tools/NotebookReadTool/prompt.js.map +7 -0
- package/dist/tools/SkillTool/SkillTool.js +209 -0
- package/dist/tools/SkillTool/SkillTool.js.map +7 -0
- package/dist/tools/SkillTool/prompt.js +81 -0
- package/dist/tools/SkillTool/prompt.js.map +7 -0
- package/dist/tools/TaskTool/TaskTool.js +381 -0
- package/dist/tools/TaskTool/TaskTool.js.map +7 -0
- package/dist/tools/TaskTool/constants.js +5 -0
- package/dist/tools/TaskTool/constants.js.map +7 -0
- package/dist/tools/TaskTool/prompt.js +111 -0
- package/dist/tools/TaskTool/prompt.js.map +7 -0
- package/dist/tools/ThinkTool/ThinkTool.js +40 -0
- package/dist/tools/ThinkTool/ThinkTool.js.map +7 -0
- package/dist/tools/ThinkTool/prompt.js +16 -0
- package/dist/tools/ThinkTool/prompt.js.map +7 -0
- package/dist/tools/TodoWriteTool/TodoWriteTool.js +243 -0
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +7 -0
- package/dist/tools/TodoWriteTool/prompt.js +66 -0
- package/dist/tools/TodoWriteTool/prompt.js.map +7 -0
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +137 -0
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +7 -0
- package/dist/tools/URLFetcherTool/cache.js +45 -0
- package/dist/tools/URLFetcherTool/cache.js.map +7 -0
- package/dist/tools/URLFetcherTool/htmlToMarkdown.js +42 -0
- package/dist/tools/URLFetcherTool/htmlToMarkdown.js.map +7 -0
- package/dist/tools/URLFetcherTool/prompt.js +22 -0
- package/dist/tools/URLFetcherTool/prompt.js.map +7 -0
- package/dist/tools/WebSearchTool/WebSearchTool.js +86 -0
- package/dist/tools/WebSearchTool/WebSearchTool.js.map +7 -0
- package/dist/tools/WebSearchTool/prompt.js +17 -0
- package/dist/tools/WebSearchTool/prompt.js.map +7 -0
- package/dist/tools/WebSearchTool/searchProviders.js +48 -0
- package/dist/tools/WebSearchTool/searchProviders.js.map +7 -0
- package/dist/tools/lsTool/lsTool.js +201 -0
- package/dist/tools/lsTool/lsTool.js.map +7 -0
- package/dist/tools/lsTool/prompt.js +5 -0
- package/dist/tools/lsTool/prompt.js.map +7 -0
- package/dist/tools.js +70 -0
- package/dist/tools.js.map +7 -0
- package/dist/types/PermissionMode.js +82 -0
- package/dist/types/PermissionMode.js.map +7 -0
- package/dist/types/RequestContext.js +47 -0
- package/dist/types/RequestContext.js.map +7 -0
- package/dist/types/common.d.js +1 -0
- package/dist/types/common.d.js.map +7 -0
- package/dist/types/conversation.js +1 -0
- package/dist/types/conversation.js.map +7 -0
- package/dist/types/hooks.js +38 -0
- package/dist/types/hooks.js.map +7 -0
- package/dist/types/interactionRound.js +1 -0
- package/dist/types/interactionRound.js.map +7 -0
- package/dist/types/logs.js +1 -0
- package/dist/types/logs.js.map +7 -0
- package/dist/types/marketplace.js +101 -0
- package/dist/types/marketplace.js.map +7 -0
- package/dist/types/modelCapabilities.js +1 -0
- package/dist/types/modelCapabilities.js.map +7 -0
- package/dist/types/notebook.js +1 -0
- package/dist/types/notebook.js.map +7 -0
- package/dist/types/plugin.js +83 -0
- package/dist/types/plugin.js.map +7 -0
- package/dist/types/subagent.js +1 -0
- package/dist/types/subagent.js.map +7 -0
- package/dist/utils/BackgroundShellManager.js +215 -0
- package/dist/utils/BackgroundShellManager.js.map +7 -0
- package/dist/utils/Cursor.js +315 -0
- package/dist/utils/Cursor.js.map +7 -0
- package/dist/utils/PersistentShell.js +371 -0
- package/dist/utils/PersistentShell.js.map +7 -0
- package/dist/utils/advancedFuzzyMatcher.js +206 -0
- package/dist/utils/advancedFuzzyMatcher.js.map +7 -0
- package/dist/utils/agentLoader.js +244 -0
- package/dist/utils/agentLoader.js.map +7 -0
- package/dist/utils/agentStorage.js +59 -0
- package/dist/utils/agentStorage.js.map +7 -0
- package/dist/utils/array.js +7 -0
- package/dist/utils/array.js.map +7 -0
- package/dist/utils/ask.js +77 -0
- package/dist/utils/ask.js.map +7 -0
- package/dist/utils/auth.js +11 -0
- package/dist/utils/auth.js.map +7 -0
- package/dist/utils/autoCompactCore.js +126 -0
- package/dist/utils/autoCompactCore.js.map +7 -0
- package/dist/utils/autoUpdater.js +107 -0
- package/dist/utils/autoUpdater.js.map +7 -0
- package/dist/utils/browser.js +15 -0
- package/dist/utils/browser.js.map +7 -0
- package/dist/utils/cleanup.js +54 -0
- package/dist/utils/cleanup.js.map +7 -0
- package/dist/utils/commands.js +207 -0
- package/dist/utils/commands.js.map +7 -0
- package/dist/utils/commonUnixCommands.js +687 -0
- package/dist/utils/commonUnixCommands.js.map +7 -0
- package/dist/utils/compressionMode.js +47 -0
- package/dist/utils/compressionMode.js.map +7 -0
- package/dist/utils/config.js +651 -0
- package/dist/utils/config.js.map +7 -0
- package/dist/utils/conversationRecovery.js +35 -0
- package/dist/utils/conversationRecovery.js.map +7 -0
- package/dist/utils/debugLogger.js +889 -0
- package/dist/utils/debugLogger.js.map +7 -0
- package/dist/utils/diff.js +32 -0
- package/dist/utils/diff.js.map +7 -0
- package/dist/utils/env.js +44 -0
- package/dist/utils/env.js.map +7 -0
- package/dist/utils/errors.js +23 -0
- package/dist/utils/errors.js.map +7 -0
- package/dist/utils/execFileNoThrow.js +44 -0
- package/dist/utils/execFileNoThrow.js.map +7 -0
- package/dist/utils/expertChatStorage.js +78 -0
- package/dist/utils/expertChatStorage.js.map +7 -0
- package/dist/utils/file.js +282 -0
- package/dist/utils/file.js.map +7 -0
- package/dist/utils/fileRecoveryCore.js +41 -0
- package/dist/utils/fileRecoveryCore.js.map +7 -0
- package/dist/utils/format.js +41 -0
- package/dist/utils/format.js.map +7 -0
- package/dist/utils/fuzzyMatcher.js +252 -0
- package/dist/utils/fuzzyMatcher.js.map +7 -0
- package/dist/utils/generators.js +46 -0
- package/dist/utils/generators.js.map +7 -0
- package/dist/utils/git.js +83 -0
- package/dist/utils/git.js.map +7 -0
- package/dist/utils/hookManager.js +238 -0
- package/dist/utils/hookManager.js.map +7 -0
- package/dist/utils/http.js +7 -0
- package/dist/utils/http.js.map +7 -0
- package/dist/utils/imagePaste.js +29 -0
- package/dist/utils/imagePaste.js.map +7 -0
- package/dist/utils/json.js +16 -0
- package/dist/utils/json.js.map +7 -0
- package/dist/utils/log.js +329 -0
- package/dist/utils/log.js.map +7 -0
- package/dist/utils/markdown.js +187 -0
- package/dist/utils/markdown.js.map +7 -0
- package/dist/utils/marketplaceManager.js +474 -0
- package/dist/utils/marketplaceManager.js.map +7 -0
- package/dist/utils/messageContextManager.js +195 -0
- package/dist/utils/messageContextManager.js.map +7 -0
- package/dist/utils/messages.js +650 -0
- package/dist/utils/messages.js.map +7 -0
- package/dist/utils/model.js +677 -0
- package/dist/utils/model.js.map +7 -0
- package/dist/utils/permissions/filesystem.js +80 -0
- package/dist/utils/permissions/filesystem.js.map +7 -0
- package/dist/utils/pluginInstaller.js +491 -0
- package/dist/utils/pluginInstaller.js.map +7 -0
- package/dist/utils/pluginLoader.js +582 -0
- package/dist/utils/pluginLoader.js.map +7 -0
- package/dist/utils/pluginRegistry.js +111 -0
- package/dist/utils/pluginRegistry.js.map +7 -0
- package/dist/utils/pluginValidator.js +774 -0
- package/dist/utils/pluginValidator.js.map +7 -0
- package/dist/utils/ptyCompat.js +125 -0
- package/dist/utils/ptyCompat.js.map +7 -0
- package/dist/utils/replStateMachine.js +145 -0
- package/dist/utils/replStateMachine.js.map +7 -0
- package/dist/utils/ripgrep.js +131 -0
- package/dist/utils/ripgrep.js.map +7 -0
- package/dist/utils/roundConverter.js +262 -0
- package/dist/utils/roundConverter.js.map +7 -0
- package/dist/utils/secureFile.js +483 -0
- package/dist/utils/secureFile.js.map +7 -0
- package/dist/utils/sessionState.js +22 -0
- package/dist/utils/sessionState.js.map +7 -0
- package/dist/utils/skillLoader.js +79 -0
- package/dist/utils/skillLoader.js.map +7 -0
- package/dist/utils/state.js +24 -0
- package/dist/utils/state.js.map +7 -0
- package/dist/utils/style.js +31 -0
- package/dist/utils/style.js.map +7 -0
- package/dist/utils/terminal.js +47 -0
- package/dist/utils/terminal.js.map +7 -0
- package/dist/utils/theme.js +102 -0
- package/dist/utils/theme.js.map +7 -0
- package/dist/utils/thinking.js +59 -0
- package/dist/utils/thinking.js.map +7 -0
- package/dist/utils/todoChangeCalculator.js +64 -0
- package/dist/utils/todoChangeCalculator.js.map +7 -0
- package/dist/utils/todoStorage.js +291 -0
- package/dist/utils/todoStorage.js.map +7 -0
- package/dist/utils/tokens.js +30 -0
- package/dist/utils/tokens.js.map +7 -0
- package/dist/utils/toolExecutionController.js +109 -0
- package/dist/utils/toolExecutionController.js.map +7 -0
- package/dist/utils/unaryLogging.js +6 -0
- package/dist/utils/unaryLogging.js.map +7 -0
- package/dist/utils/user.js +40 -0
- package/dist/utils/user.js.map +7 -0
- package/dist/utils/validate.js +132 -0
- package/dist/utils/validate.js.map +7 -0
- package/dist/version.js +7 -0
- package/dist/version.js.map +7 -0
- package/dist/yoga.wasm +0 -0
- package/package.json +113 -0
- package/scripts/postinstall.js +18 -0
- package/yoga.wasm +0 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { Box, Text } from "ink";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { getTheme } from "../utils/theme.js";
|
|
4
|
+
import { useMemo } from "react";
|
|
5
|
+
import { wrapText } from "../utils/format.js";
|
|
6
|
+
function StructuredDiff({
|
|
7
|
+
patch,
|
|
8
|
+
dim,
|
|
9
|
+
width,
|
|
10
|
+
overrideTheme
|
|
11
|
+
}) {
|
|
12
|
+
const diff = useMemo(
|
|
13
|
+
() => formatDiff(patch.lines, patch.oldStart, width, dim, overrideTheme),
|
|
14
|
+
[patch.lines, patch.oldStart, width, dim, overrideTheme]
|
|
15
|
+
);
|
|
16
|
+
return diff.map((_, i) => /* @__PURE__ */ React.createElement(Box, { key: i }, _));
|
|
17
|
+
}
|
|
18
|
+
function formatDiff(lines, startingLineNumber, width, dim, overrideTheme) {
|
|
19
|
+
const theme = getTheme(overrideTheme);
|
|
20
|
+
const ls = numberDiffLines(
|
|
21
|
+
lines.map((code) => {
|
|
22
|
+
if (code.startsWith("+")) {
|
|
23
|
+
return {
|
|
24
|
+
code: " " + code.slice(1),
|
|
25
|
+
i: 0,
|
|
26
|
+
type: "add"
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
if (code.startsWith("-")) {
|
|
30
|
+
return {
|
|
31
|
+
code: " " + code.slice(1),
|
|
32
|
+
i: 0,
|
|
33
|
+
type: "remove"
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return { code, i: 0, type: "nochange" };
|
|
37
|
+
}),
|
|
38
|
+
startingLineNumber
|
|
39
|
+
);
|
|
40
|
+
const maxLineNumber = Math.max(...ls.map(({ i }) => i));
|
|
41
|
+
const maxWidth = maxLineNumber.toString().length;
|
|
42
|
+
return ls.flatMap(({ type, code, i }) => {
|
|
43
|
+
const wrappedLines = wrapText(code, width - maxWidth);
|
|
44
|
+
return wrappedLines.map((line, lineIndex) => {
|
|
45
|
+
const key = `${type}-${i}-${lineIndex}`;
|
|
46
|
+
switch (type) {
|
|
47
|
+
case "add":
|
|
48
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, { key }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(
|
|
49
|
+
LineNumber,
|
|
50
|
+
{
|
|
51
|
+
i: lineIndex === 0 ? i : void 0,
|
|
52
|
+
width: maxWidth
|
|
53
|
+
}
|
|
54
|
+
), /* @__PURE__ */ React.createElement(
|
|
55
|
+
Text,
|
|
56
|
+
{
|
|
57
|
+
color: overrideTheme ? theme.text : void 0,
|
|
58
|
+
backgroundColor: dim ? theme.diff.addedDimmed : theme.diff.added,
|
|
59
|
+
dimColor: dim
|
|
60
|
+
},
|
|
61
|
+
line
|
|
62
|
+
)));
|
|
63
|
+
case "remove":
|
|
64
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, { key }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(
|
|
65
|
+
LineNumber,
|
|
66
|
+
{
|
|
67
|
+
i: lineIndex === 0 ? i : void 0,
|
|
68
|
+
width: maxWidth
|
|
69
|
+
}
|
|
70
|
+
), /* @__PURE__ */ React.createElement(
|
|
71
|
+
Text,
|
|
72
|
+
{
|
|
73
|
+
color: overrideTheme ? theme.text : void 0,
|
|
74
|
+
backgroundColor: dim ? theme.diff.removedDimmed : theme.diff.removed,
|
|
75
|
+
dimColor: dim
|
|
76
|
+
},
|
|
77
|
+
line
|
|
78
|
+
)));
|
|
79
|
+
case "nochange":
|
|
80
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, { key }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(
|
|
81
|
+
LineNumber,
|
|
82
|
+
{
|
|
83
|
+
i: lineIndex === 0 ? i : void 0,
|
|
84
|
+
width: maxWidth
|
|
85
|
+
}
|
|
86
|
+
), /* @__PURE__ */ React.createElement(
|
|
87
|
+
Text,
|
|
88
|
+
{
|
|
89
|
+
color: overrideTheme ? theme.text : void 0,
|
|
90
|
+
dimColor: dim
|
|
91
|
+
},
|
|
92
|
+
line
|
|
93
|
+
)));
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
function LineNumber({
|
|
99
|
+
i,
|
|
100
|
+
width
|
|
101
|
+
}) {
|
|
102
|
+
return /* @__PURE__ */ React.createElement(Text, { color: getTheme().secondaryText }, i !== void 0 ? i.toString().padStart(width) : " ".repeat(width), " ");
|
|
103
|
+
}
|
|
104
|
+
function numberDiffLines(diff, startLine) {
|
|
105
|
+
let i = startLine;
|
|
106
|
+
const result = [];
|
|
107
|
+
const queue = [...diff];
|
|
108
|
+
while (queue.length > 0) {
|
|
109
|
+
const { code, type } = queue.shift();
|
|
110
|
+
const line = {
|
|
111
|
+
code,
|
|
112
|
+
type,
|
|
113
|
+
i
|
|
114
|
+
};
|
|
115
|
+
switch (type) {
|
|
116
|
+
case "nochange":
|
|
117
|
+
i++;
|
|
118
|
+
result.push(line);
|
|
119
|
+
break;
|
|
120
|
+
case "add":
|
|
121
|
+
i++;
|
|
122
|
+
result.push(line);
|
|
123
|
+
break;
|
|
124
|
+
case "remove": {
|
|
125
|
+
result.push(line);
|
|
126
|
+
let numRemoved = 0;
|
|
127
|
+
while (queue[0]?.type === "remove") {
|
|
128
|
+
i++;
|
|
129
|
+
const { code: code2, type: type2 } = queue.shift();
|
|
130
|
+
const line2 = {
|
|
131
|
+
code: code2,
|
|
132
|
+
type: type2,
|
|
133
|
+
i
|
|
134
|
+
};
|
|
135
|
+
result.push(line2);
|
|
136
|
+
numRemoved++;
|
|
137
|
+
}
|
|
138
|
+
i -= numRemoved;
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
export {
|
|
146
|
+
StructuredDiff
|
|
147
|
+
};
|
|
148
|
+
//# sourceMappingURL=StructuredDiff.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/StructuredDiff.tsx"],
|
|
4
|
+
"sourcesContent": ["import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { Hunk } from 'diff'\nimport { getTheme, ThemeNames } from '@utils/theme'\nimport { useMemo } from 'react'\nimport { wrapText } from '@utils/format'\n\ntype Props = {\n patch: Hunk\n dim: boolean\n width: number\n overrideTheme?: ThemeNames // custom theme for previews\n key?: React.Key\n}\n\nexport function StructuredDiff({\n patch,\n dim,\n width,\n overrideTheme,\n}: Props): React.ReactNode {\n const diff = useMemo(\n () => formatDiff(patch.lines, patch.oldStart, width, dim, overrideTheme),\n [patch.lines, patch.oldStart, width, dim, overrideTheme],\n )\n\n return diff.map((_, i) => <Box key={i}>{_}</Box>)\n}\n\nfunction formatDiff(\n lines: string[],\n startingLineNumber: number,\n width: number,\n dim: boolean,\n overrideTheme?: ThemeNames,\n): React.ReactNode[] {\n const theme = getTheme(overrideTheme)\n\n const ls = numberDiffLines(\n lines.map(code => {\n if (code.startsWith('+')) {\n return {\n code: ' ' + code.slice(1),\n i: 0,\n type: 'add',\n }\n }\n if (code.startsWith('-')) {\n return {\n code: ' ' + code.slice(1),\n i: 0,\n type: 'remove',\n }\n }\n return { code, i: 0, type: 'nochange' }\n }),\n startingLineNumber,\n )\n\n const maxLineNumber = Math.max(...ls.map(({ i }) => i))\n const maxWidth = maxLineNumber.toString().length\n\n return ls.flatMap(({ type, code, i }) => {\n const wrappedLines = wrapText(code, width - maxWidth)\n return wrappedLines.map((line, lineIndex) => {\n const key = `${type}-${i}-${lineIndex}`\n switch (type) {\n case 'add':\n return (\n <React.Fragment key={key}>\n <Text>\n <LineNumber\n i={lineIndex === 0 ? i : undefined}\n width={maxWidth}\n />\n <Text\n color={overrideTheme ? theme.text : undefined}\n backgroundColor={\n dim ? theme.diff.addedDimmed : theme.diff.added\n }\n dimColor={dim}\n >\n {line}\n </Text>\n </Text>\n </React.Fragment>\n )\n case 'remove':\n return (\n <React.Fragment key={key}>\n <Text>\n <LineNumber\n i={lineIndex === 0 ? i : undefined}\n width={maxWidth}\n />\n <Text\n color={overrideTheme ? theme.text : undefined}\n backgroundColor={\n dim ? theme.diff.removedDimmed : theme.diff.removed\n }\n dimColor={dim}\n >\n {line}\n </Text>\n </Text>\n </React.Fragment>\n )\n case 'nochange':\n return (\n <React.Fragment key={key}>\n <Text>\n <LineNumber\n i={lineIndex === 0 ? i : undefined}\n width={maxWidth}\n />\n <Text\n color={overrideTheme ? theme.text : undefined}\n dimColor={dim}\n >\n {line}\n </Text>\n </Text>\n </React.Fragment>\n )\n }\n })\n })\n}\n\nfunction LineNumber({\n i,\n width,\n}: {\n i: number | undefined\n width: number\n}): React.ReactNode {\n return (\n <Text color={getTheme().secondaryText}>\n {i !== undefined ? i.toString().padStart(width) : ' '.repeat(width)}{' '}\n </Text>\n )\n}\n\nfunction numberDiffLines(\n diff: { code: string; type: string }[],\n startLine: number,\n): { code: string; type: string; i: number }[] {\n let i = startLine\n const result: { code: string; type: string; i: number }[] = []\n const queue = [...diff]\n\n while (queue.length > 0) {\n const { code, type } = queue.shift()!\n const line = {\n code: code,\n type,\n i,\n }\n\n // Update counters based on change type\n switch (type) {\n case 'nochange':\n i++\n result.push(line)\n break\n case 'add':\n i++\n result.push(line)\n break\n case 'remove': {\n result.push(line)\n let numRemoved = 0\n while (queue[0]?.type === 'remove') {\n i++\n const { code, type } = queue.shift()!\n const line = {\n code: code,\n type,\n i,\n }\n result.push(line)\n numRemoved++\n }\n i -= numRemoved\n break\n }\n }\n }\n\n return result\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["code", "type", "line"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { getTheme } from "../utils/theme.js";
|
|
4
|
+
import { getTodoStatusSymbol } from "../constants/symbols.js";
|
|
5
|
+
import { AgentThinkingBlock } from "./AgentThinkingBlock.js";
|
|
6
|
+
import { ToolExecutionBlock } from "./ToolExecutionBlock.js";
|
|
7
|
+
import { AgentResponseBlock } from "./AgentResponseBlock.js";
|
|
8
|
+
function SubagentBlock({
|
|
9
|
+
subagent,
|
|
10
|
+
indent = 0,
|
|
11
|
+
isExpanded = false
|
|
12
|
+
}) {
|
|
13
|
+
const theme = getTheme();
|
|
14
|
+
const [expanded, setExpanded] = useState(isExpanded);
|
|
15
|
+
const marginLeft = indent * 2;
|
|
16
|
+
const todos = extractSubagentTodos(subagent);
|
|
17
|
+
const thinking = extractThinkingMessage(subagent);
|
|
18
|
+
const toolExecutions = extractToolExecutions(subagent);
|
|
19
|
+
const response = extractResponse(subagent);
|
|
20
|
+
const duration = subagent.metrics.endTime ? ((subagent.metrics.endTime - subagent.metrics.startTime) / 1e3).toFixed(
|
|
21
|
+
1
|
|
22
|
+
) : "...";
|
|
23
|
+
const tokenCount = subagent.metrics.tokenCount || 0;
|
|
24
|
+
const statusIndicator = getStatusIndicator(subagent.status);
|
|
25
|
+
const statusColor = getStatusColor(subagent.status, theme);
|
|
26
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft, marginTop: 1 }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.brand }, "\u{1F916} "), /* @__PURE__ */ React.createElement(Text, null, "Launching subagent: ", /* @__PURE__ */ React.createElement(Text, { bold: true }, subagent.agentType))), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, "\u251C\u2500 "), /* @__PURE__ */ React.createElement(Text, null, "Task: ", subagent.taskName)), expanded && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, "\u2502"), todos && todos.length > 0 && /* @__PURE__ */ React.createElement(SubagentTodosSection, { todos, theme }), thinking && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, "\u2502 "), /* @__PURE__ */ React.createElement(
|
|
27
|
+
AgentThinkingBlock,
|
|
28
|
+
{
|
|
29
|
+
message: thinking.message,
|
|
30
|
+
startTime: thinking.startTime,
|
|
31
|
+
showSpinner: subagent.status === "running",
|
|
32
|
+
showElapsedTime: false
|
|
33
|
+
}
|
|
34
|
+
)), toolExecutions.map((tool, idx) => /* @__PURE__ */ React.createElement(Box, { key: idx, flexDirection: "column", marginLeft: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, "\u2502 "), /* @__PURE__ */ React.createElement(ToolExecutionBlock, { tool, indent: 0 }))), response && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, "\u2502 "), /* @__PURE__ */ React.createElement(
|
|
35
|
+
AgentResponseBlock,
|
|
36
|
+
{
|
|
37
|
+
message: response,
|
|
38
|
+
indent: 0,
|
|
39
|
+
isSubagent: true
|
|
40
|
+
}
|
|
41
|
+
)), /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, "\u2502")), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, "\u2514\u2500 "), /* @__PURE__ */ React.createElement(Text, { color: statusColor }, statusIndicator, " ", getStatusLabel(subagent.status)), subagent.status === "completed" && /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, " ", "(", duration, "s, ", tokenCount, " tokens)")), !expanded && /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginLeft: 4 }, /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Ctrl+O"), " to expand details")));
|
|
42
|
+
}
|
|
43
|
+
function SubagentTodosSection({
|
|
44
|
+
todos,
|
|
45
|
+
theme
|
|
46
|
+
}) {
|
|
47
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft: 1, marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, "\u2502 "), /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, "Subtasks:")), todos.map((todo, idx) => /* @__PURE__ */ React.createElement(Box, { key: idx, flexDirection: "row", marginLeft: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, "\u2502 "), /* @__PURE__ */ React.createElement(Text, null, getTodoStatusSymbol(todo.status), " "), /* @__PURE__ */ React.createElement(
|
|
48
|
+
Text,
|
|
49
|
+
{
|
|
50
|
+
color: todo.status === "completed" ? theme.dim : void 0,
|
|
51
|
+
strikethrough: todo.status === "completed"
|
|
52
|
+
},
|
|
53
|
+
todo.content
|
|
54
|
+
))));
|
|
55
|
+
}
|
|
56
|
+
function extractSubagentTodos(subagent) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
function extractThinkingMessage(subagent) {
|
|
60
|
+
for (const msg of subagent.messages) {
|
|
61
|
+
if (msg.type === "assistant" && "message" in msg) {
|
|
62
|
+
const thinkingBlock = msg.message.content.find(
|
|
63
|
+
(block) => block.type === "thinking"
|
|
64
|
+
);
|
|
65
|
+
if (thinkingBlock && "thinking" in thinkingBlock) {
|
|
66
|
+
return {
|
|
67
|
+
message: thinkingBlock.thinking || "Thinking...",
|
|
68
|
+
startTime: subagent.metrics.startTime
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
function extractToolExecutions(subagent) {
|
|
76
|
+
const tools = [];
|
|
77
|
+
for (const msg of subagent.messages) {
|
|
78
|
+
if (msg.type === "assistant" && "message" in msg) {
|
|
79
|
+
const toolBlocks = msg.message.content.filter(
|
|
80
|
+
(block) => block.type === "tool_use"
|
|
81
|
+
);
|
|
82
|
+
for (const toolBlock of toolBlocks) {
|
|
83
|
+
if ("name" in toolBlock && "id" in toolBlock) {
|
|
84
|
+
tools.push({
|
|
85
|
+
id: toolBlock.id,
|
|
86
|
+
name: toolBlock.name,
|
|
87
|
+
input: toolBlock.input,
|
|
88
|
+
status: "completed",
|
|
89
|
+
// Simplified for now
|
|
90
|
+
startTime: subagent.metrics.startTime,
|
|
91
|
+
durationMs: 100
|
|
92
|
+
// Placeholder
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return tools;
|
|
99
|
+
}
|
|
100
|
+
function extractResponse(subagent) {
|
|
101
|
+
for (let i = subagent.messages.length - 1; i >= 0; i--) {
|
|
102
|
+
const msg = subagent.messages[i];
|
|
103
|
+
if (msg.type === "assistant" && "message" in msg) {
|
|
104
|
+
const hasText = msg.message.content.some(
|
|
105
|
+
(block) => block.type === "text" && block.text.trim()
|
|
106
|
+
);
|
|
107
|
+
if (hasText) {
|
|
108
|
+
return msg;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
function getStatusIndicator(status) {
|
|
115
|
+
switch (status) {
|
|
116
|
+
case "initializing":
|
|
117
|
+
return "\u25CB";
|
|
118
|
+
case "queued":
|
|
119
|
+
return "\u2139";
|
|
120
|
+
case "running":
|
|
121
|
+
return "\u22EF";
|
|
122
|
+
case "completed":
|
|
123
|
+
return "\u2713";
|
|
124
|
+
case "error":
|
|
125
|
+
return "\u2716";
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function getStatusColor(status, theme) {
|
|
129
|
+
switch (status) {
|
|
130
|
+
case "completed":
|
|
131
|
+
return theme.success;
|
|
132
|
+
case "error":
|
|
133
|
+
return theme.error;
|
|
134
|
+
case "running":
|
|
135
|
+
return theme.brand;
|
|
136
|
+
default:
|
|
137
|
+
return theme.dimmedText;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function getStatusLabel(status) {
|
|
141
|
+
switch (status) {
|
|
142
|
+
case "initializing":
|
|
143
|
+
return "Initializing...";
|
|
144
|
+
case "queued":
|
|
145
|
+
return "Queued";
|
|
146
|
+
case "running":
|
|
147
|
+
return "Running...";
|
|
148
|
+
case "completed":
|
|
149
|
+
return "Completed";
|
|
150
|
+
case "error":
|
|
151
|
+
return "Error";
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
export {
|
|
155
|
+
SubagentBlock
|
|
156
|
+
};
|
|
157
|
+
//# sourceMappingURL=SubagentBlock.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/SubagentBlock.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * SubagentBlock - Embedded subagent execution display\n *\n * Renders a complete subagent execution hierarchically with:\n * - Header (task name, agent type, status)\n * - Optional: Subtasks (if subagent has todos)\n * - Optional: Thinking phase\n * - Optional: Tool executions\n * - Optional: Response\n * - Footer (completion status)\n *\n * Supports collapsible internal content\n */\n\nimport React, { useState } from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { SYMBOLS, getTodoStatusSymbol } from '@constants/symbols'\nimport { AgentThinkingBlock } from './AgentThinkingBlock'\nimport { ToolExecutionBlock } from './ToolExecutionBlock'\nimport { AgentResponseBlock } from './AgentResponseBlock'\nimport type { SubagentState } from '@minto-types/subagent'\nimport type { TodoItem } from '@utils/todoStorage'\nimport type { AssistantMessage } from '@minto-types/conversation'\nimport type { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\n\ninterface Props {\n subagent: SubagentState\n indent?: number\n isExpanded?: boolean\n}\n\n/**\n * SubagentBlock - Hierarchical embedded subagent display\n *\n * Visual format (indent=1):\n * ```\n * \uD83E\uDD16 Launching subagent: backend-architect\n * \u251C\u2500 Task: Design authentication system\n * \u2502\n * \u2502 \uD83E\uDD14 Analyzing requirements... (300ms)\n * \u2502\n * \u2502 \uD83D\uDD27 Tool: Read package.json\n * \u2502 \u2514\u2500 \u2713 Read 50 lines (80ms)\n * \u2502\n * \u2502 \uD83D\uDCAC I recommend using JWT...\n * \u2502\n * \u2514\u2500 \u2713 Completed (2.5s, 1200 tokens)\n * ```\n */\nexport function SubagentBlock({\n subagent,\n indent = 0,\n isExpanded = false,\n}: Props): React.ReactNode {\n const theme = getTheme()\n const [expanded, setExpanded] = useState(isExpanded)\n const marginLeft = indent * 2\n\n // Extract todos if present (from subagent execution)\n const todos = extractSubagentTodos(subagent)\n const thinking = extractThinkingMessage(subagent)\n const toolExecutions = extractToolExecutions(subagent)\n const response = extractResponse(subagent)\n\n // Calculate metrics\n const duration = subagent.metrics.endTime\n ? ((subagent.metrics.endTime - subagent.metrics.startTime) / 1000).toFixed(\n 1,\n )\n : '...'\n const tokenCount = subagent.metrics.tokenCount || 0\n\n // Status indicator\n const statusIndicator = getStatusIndicator(subagent.status)\n const statusColor = getStatusColor(subagent.status, theme)\n\n return (\n <Box flexDirection=\"column\" marginLeft={marginLeft} marginTop={1}>\n {/* Subagent Header */}\n <Box flexDirection=\"row\">\n <Text color={theme.brand}>\uD83E\uDD16 </Text>\n <Text>\n Launching subagent: <Text bold>{subagent.agentType}</Text>\n </Text>\n </Box>\n\n {/* Task description */}\n <Box flexDirection=\"row\" marginLeft={2}>\n <Text color={theme.dimmedText}>\u251C\u2500 </Text>\n <Text>Task: {subagent.taskName}</Text>\n </Box>\n\n {/* Collapsible internal content */}\n {expanded && (\n <Box flexDirection=\"column\" marginLeft={2}>\n <Text color={theme.dimmedText}>\u2502</Text>\n\n {/* Subagent subtasks (if present) */}\n {todos && todos.length > 0 && (\n <SubagentTodosSection todos={todos} theme={theme} />\n )}\n\n {/* Subagent thinking */}\n {thinking && (\n <Box flexDirection=\"column\" marginLeft={1}>\n <Text color={theme.dimmedText}>\u2502 </Text>\n <AgentThinkingBlock\n message={thinking.message}\n startTime={thinking.startTime}\n showSpinner={subagent.status === 'running'}\n showElapsedTime={false}\n />\n </Box>\n )}\n\n {/* Subagent tool executions */}\n {toolExecutions.map((tool, idx) => (\n <Box key={idx} flexDirection=\"column\" marginLeft={1}>\n <Text color={theme.dimmedText}>\u2502 </Text>\n <ToolExecutionBlock tool={tool} indent={0} />\n </Box>\n ))}\n\n {/* Subagent response */}\n {response && (\n <Box flexDirection=\"column\" marginLeft={1}>\n <Text color={theme.dimmedText}>\u2502 </Text>\n <AgentResponseBlock\n message={response}\n indent={0}\n isSubagent={true}\n />\n </Box>\n )}\n\n <Text color={theme.dimmedText}>\u2502</Text>\n </Box>\n )}\n\n {/* Subagent Footer (completion status) */}\n <Box flexDirection=\"row\" marginLeft={2}>\n <Text color={theme.dimmedText}>\u2514\u2500 </Text>\n <Text color={statusColor}>\n {statusIndicator} {getStatusLabel(subagent.status)}\n </Text>\n {subagent.status === 'completed' && (\n <Text color={theme.mutedText}>\n {' '}\n ({duration}s, {tokenCount} tokens)\n </Text>\n )}\n </Box>\n\n {/* Expand/collapse hint (only when collapsed) */}\n {!expanded && (\n <Box flexDirection=\"row\" marginLeft={4}>\n <Text color={theme.mutedText}>\n Press <Text bold>Ctrl+O</Text> to expand details\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * SubagentTodosSection - Renders subagent's subtasks\n */\nfunction SubagentTodosSection({\n todos,\n theme,\n}: {\n todos: TodoItem[]\n theme: ReturnType<typeof getTheme>\n}) {\n return (\n <Box flexDirection=\"column\" marginLeft={1} marginY={1}>\n <Box flexDirection=\"row\">\n <Text color={theme.dimmedText}>\u2502 </Text>\n <Text color={theme.dimmedText}>Subtasks:</Text>\n </Box>\n {todos.map((todo, idx) => (\n <Box key={idx} flexDirection=\"row\" marginLeft={1}>\n <Text color={theme.dimmedText}>\u2502 </Text>\n <Text>{getTodoStatusSymbol(todo.status)} </Text>\n <Text\n color={todo.status === 'completed' ? theme.dim : undefined}\n strikethrough={todo.status === 'completed'}\n >\n {todo.content}\n </Text>\n </Box>\n ))}\n </Box>\n )\n}\n\n/**\n * Helper: Extract todos from subagent messages\n * (This would be populated from TodoWriteTool calls within the subagent)\n */\nfunction extractSubagentTodos(subagent: SubagentState): TodoItem[] | null {\n // TODO: Implement extraction of todos from subagent messages\n // For now, return null (will be implemented in Phase 4)\n return null\n}\n\n/**\n * Helper: Extract thinking message from subagent\n */\nfunction extractThinkingMessage(\n subagent: SubagentState,\n): { message: string; startTime: number } | null {\n // Find thinking blocks in messages\n for (const msg of subagent.messages) {\n if (msg.type === 'assistant' && 'message' in msg) {\n const thinkingBlock = msg.message.content.find(\n (block: any) => block.type === 'thinking',\n )\n if (thinkingBlock && 'thinking' in thinkingBlock) {\n return {\n message: thinkingBlock.thinking || 'Thinking...',\n startTime: subagent.metrics.startTime,\n }\n }\n }\n }\n return null\n}\n\n/**\n * Helper: Extract tool executions from subagent\n */\nfunction extractToolExecutions(subagent: SubagentState): Array<{\n id: string\n name: string\n input: any\n status: 'pending' | 'running' | 'completed' | 'error'\n startTime: number\n durationMs?: number\n}> {\n const tools: Array<any> = []\n\n // Extract tool_use blocks from messages\n for (const msg of subagent.messages) {\n if (msg.type === 'assistant' && 'message' in msg) {\n const toolBlocks = msg.message.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n for (const toolBlock of toolBlocks) {\n if ('name' in toolBlock && 'id' in toolBlock) {\n tools.push({\n id: toolBlock.id,\n name: toolBlock.name,\n input: toolBlock.input,\n status: 'completed', // Simplified for now\n startTime: subagent.metrics.startTime,\n durationMs: 100, // Placeholder\n })\n }\n }\n }\n }\n\n return tools\n}\n\n/**\n * Helper: Extract response message from subagent\n */\nfunction extractResponse(subagent: SubagentState): AssistantMessage | null {\n // Find last assistant message with text content\n for (let i = subagent.messages.length - 1; i >= 0; i--) {\n const msg = subagent.messages[i]\n if (msg.type === 'assistant' && 'message' in msg) {\n const hasText = msg.message.content.some(\n (block: any) => block.type === 'text' && block.text.trim(),\n )\n if (hasText) {\n return msg as AssistantMessage\n }\n }\n }\n return null\n}\n\n/**\n * Helper: Get status indicator symbol\n */\nfunction getStatusIndicator(status: SubagentState['status']): string {\n switch (status) {\n case 'initializing':\n return '\u25CB'\n case 'queued':\n return '\u2139'\n case 'running':\n return '\u22EF'\n case 'completed':\n return '\u2713'\n case 'error':\n return '\u2716'\n }\n}\n\n/**\n * Helper: Get status color\n */\nfunction getStatusColor(\n status: SubagentState['status'],\n theme: ReturnType<typeof getTheme>,\n): string {\n switch (status) {\n case 'completed':\n return theme.success\n case 'error':\n return theme.error\n case 'running':\n return theme.brand\n default:\n return theme.dimmedText\n }\n}\n\n/**\n * Helper: Get status label\n */\nfunction getStatusLabel(status: SubagentState['status']): string {\n switch (status) {\n case 'initializing':\n return 'Initializing...'\n case 'queued':\n return 'Queued'\n case 'running':\n return 'Running...'\n case 'completed':\n return 'Completed'\n case 'error':\n return 'Error'\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import React, { useMemo, useState } from "react";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { TaskCard } from "./TaskCard.js";
|
|
4
|
+
import { getTheme } from "../utils/theme.js";
|
|
5
|
+
function SubagentManager({
|
|
6
|
+
subagents,
|
|
7
|
+
showDetails,
|
|
8
|
+
tools = [],
|
|
9
|
+
verbose = false,
|
|
10
|
+
debug = false
|
|
11
|
+
}) {
|
|
12
|
+
const theme = getTheme();
|
|
13
|
+
const [expandedTasks, setExpandedTasks] = useState(/* @__PURE__ */ new Set());
|
|
14
|
+
const sortedSubagents = useMemo(() => {
|
|
15
|
+
const arr = Array.from(subagents.values());
|
|
16
|
+
return arr.sort((a, b) => a.metrics.startTime - b.metrics.startTime);
|
|
17
|
+
}, [subagents]);
|
|
18
|
+
const runningSubagents = sortedSubagents.filter(
|
|
19
|
+
(s) => s.status === "initializing" || s.status === "queued" || s.status === "running"
|
|
20
|
+
);
|
|
21
|
+
if (runningSubagents.length === 0) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const visibleSubagents = runningSubagents;
|
|
25
|
+
const limitedSubagents = visibleSubagents.slice(0, 20);
|
|
26
|
+
const totalTasks = limitedSubagents.length;
|
|
27
|
+
const runningCount = limitedSubagents.filter(
|
|
28
|
+
(s) => s.status === "running"
|
|
29
|
+
).length;
|
|
30
|
+
const queuedCount = limitedSubagents.filter((s) => s.status === "queued").length;
|
|
31
|
+
const toggleExpand = (taskId) => {
|
|
32
|
+
setExpandedTasks((prev) => {
|
|
33
|
+
const next = new Set(prev);
|
|
34
|
+
if (next.has(taskId)) {
|
|
35
|
+
next.delete(taskId);
|
|
36
|
+
} else {
|
|
37
|
+
next.add(taskId);
|
|
38
|
+
}
|
|
39
|
+
return next;
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, totalTasks > 1 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.brand, bold: true }, "\u26A1 Multi-Task Execution"), /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, " ", "\xB7 ", totalTasks, " task", totalTasks !== 1 ? "s" : "")), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, "\u251C\u2500 "), /* @__PURE__ */ React.createElement(Text, { color: theme.brand }, runningCount, " running"), queuedCount > 0 && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, queuedCount, " queued"))), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, "\u2514\u2500 "), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Ctrl+O"), " to", " ", showDetails ? "collapse" : "expand", " all"))), limitedSubagents.map((subagent, index) => /* @__PURE__ */ React.createElement(
|
|
43
|
+
Box,
|
|
44
|
+
{
|
|
45
|
+
key: subagent.id,
|
|
46
|
+
marginBottom: index < limitedSubagents.length - 1 ? 1 : 0
|
|
47
|
+
},
|
|
48
|
+
/* @__PURE__ */ React.createElement(
|
|
49
|
+
TaskCard,
|
|
50
|
+
{
|
|
51
|
+
subagent,
|
|
52
|
+
isExpanded: showDetails || expandedTasks.has(subagent.id),
|
|
53
|
+
isHighlighted: index === 0 && runningCount === 1,
|
|
54
|
+
tools,
|
|
55
|
+
verbose,
|
|
56
|
+
debug,
|
|
57
|
+
onToggleExpand: () => toggleExpand(subagent.id)
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
)), visibleSubagents.length > 20 && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, "... and ", visibleSubagents.length - 20, " more agent(s)")));
|
|
61
|
+
}
|
|
62
|
+
export {
|
|
63
|
+
SubagentManager
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=SubagentManager.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/SubagentManager.tsx"],
|
|
4
|
+
"sourcesContent": ["import React, { useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport { TaskCard } from './TaskCard'\nimport type { SubagentState } from '@minto-types/subagent'\nimport type { Tool } from '@tool'\nimport { getTheme } from '@utils/theme'\n\ninterface SubagentManagerProps {\n /** \u6240\u6709 subagent \u7684\u72B6\u6001\u6620\u5C04 */\n subagents: Map<string, SubagentState>\n /** \u662F\u5426\u663E\u793A\u8BE6\u7EC6\u4FE1\u606F\uFF08\u7531 Ctrl+O \u63A7\u5236\uFF09 */\n showDetails: boolean\n /** \u53EF\u7528\u5DE5\u5177\u5217\u8868 */\n tools?: Tool[]\n /** \u662F\u5426\u542F\u7528 verbose \u6A21\u5F0F */\n verbose?: boolean\n /** \u662F\u5426\u542F\u7528 debug \u6A21\u5F0F */\n debug?: boolean\n}\n\n/**\n * Subagent \u7BA1\u7406\u5668\u7EC4\u4EF6 (Claude Code CLI \u98CE\u683C)\n *\n * \u8D1F\u8D23\u7BA1\u7406\u548C\u663E\u793A\u6240\u6709\u5E76\u53D1\u6267\u884C\u7684 subagent\uFF1A\n * - \u4F7F\u7528 TaskCard \u5361\u7247\u5F0F\u5E03\u5C40\n * - \u6309\u72B6\u6001\u5206\u7EC4\uFF08running > queued > completed > error\uFF09\n * - \u9650\u5236\u540C\u65F6\u663E\u793A\u7684\u6570\u91CF\uFF08\u907F\u514D\u7EC8\u7AEF\u6EDA\u52A8\u8FC7\u591A\uFF09\n * - \u652F\u6301 Ctrl+O \u5207\u6362\u5C55\u5F00/\u6298\u53E0\n * - \u663E\u793A\u6574\u4F53\u534F\u8C03\u5668\u72B6\u6001\n */\nexport function SubagentManager({\n subagents,\n showDetails,\n tools = [],\n verbose = false,\n debug = false,\n}: SubagentManagerProps) {\n const theme = getTheme()\n\n // \u4E2A\u522B\u4EFB\u52A1\u7684\u5C55\u5F00\u72B6\u6001\uFF08\u72EC\u7ACB\u4E8E showDetails \u5168\u5C40\u63A7\u5236\uFF09\n const [expandedTasks, setExpandedTasks] = useState<Set<string>>(new Set())\n\n // \u5C06 Map \u8F6C\u6362\u4E3A\u6570\u7EC4\u5E76\u6309\u5F00\u59CB\u65F6\u95F4\u6392\u5E8F\uFF08\u4FDD\u6301\u542F\u52A8\u987A\u5E8F\uFF09\n const sortedSubagents = useMemo(() => {\n const arr = Array.from(subagents.values())\n\n // \u6309\u5F00\u59CB\u65F6\u95F4\u6392\u5E8F\uFF0C\u4FDD\u6301\u4EFB\u52A1\u542F\u52A8\u7684\u65F6\u95F4\u987A\u5E8F\n // \u8FD9\u6837\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1\u4F1A\u4FDD\u6301\u5728\u539F\u4F4D\u7F6E\n return arr.sort((a, b) => a.metrics.startTime - b.metrics.startTime)\n }, [subagents])\n\n // \u53EA\u663E\u793A\u8FD0\u884C\u4E2D\u7684\u4EFB\u52A1\uFF08initializing, queued, running\uFF09\n // \u5DF2\u5B8C\u6210\u548C\u51FA\u9519\u7684\u4EFB\u52A1\u4F1A\u5728\u6D88\u606F\u6D41\u7684\u6B63\u786E\u65F6\u95F4\u4F4D\u7F6E\u663E\u793A\n const runningSubagents = sortedSubagents.filter(\n s =>\n s.status === 'initializing' ||\n s.status === 'queued' ||\n s.status === 'running',\n )\n\n // \u5982\u679C\u6CA1\u6709\u8FD0\u884C\u4E2D\u7684 subagent\uFF0C\u4E0D\u6E32\u67D3\n if (runningSubagents.length === 0) {\n return null\n }\n\n const visibleSubagents = runningSubagents\n\n // \u9650\u5236\u6700\u591A\u663E\u793A 20 \u4E2A\uFF08\u9632\u6B62\u7EC8\u7AEF\u88AB\u5237\u5C4F\uFF09\n const limitedSubagents = visibleSubagents.slice(0, 20)\n\n // \u8BA1\u7B97\u6574\u4F53\u7EDF\u8BA1\n const totalTasks = limitedSubagents.length\n const runningCount = limitedSubagents.filter(\n s => s.status === 'running',\n ).length\n const queuedCount = limitedSubagents.filter(s => s.status === 'queued').length\n\n // \u5207\u6362\u5355\u4E2A\u4EFB\u52A1\u7684\u5C55\u5F00\u72B6\u6001\n const toggleExpand = (taskId: string) => {\n setExpandedTasks(prev => {\n const next = new Set(prev)\n if (next.has(taskId)) {\n next.delete(taskId)\n } else {\n next.add(taskId)\n }\n return next\n })\n }\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n {/* \u534F\u8C03\u5668\u72B6\u6001\u5934\u90E8\uFF08\u591A\u4EFB\u52A1\u5E76\u53D1\u65F6\u663E\u793A\uFF09*/}\n {totalTasks > 1 && (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box flexDirection=\"row\">\n <Text color={theme.brand} bold>\n \u26A1 Multi-Task Execution\n </Text>\n <Text color={theme.dimmedText}>\n {' '}\n \u00B7 {totalTasks} task{totalTasks !== 1 ? 's' : ''}\n </Text>\n </Box>\n <Box flexDirection=\"row\" marginLeft={2}>\n <Text color={theme.dimmedText}>\u251C\u2500 </Text>\n <Text color={theme.brand}>{runningCount} running</Text>\n {queuedCount > 0 && (\n <>\n <Text color={theme.mutedText}> \u00B7 </Text>\n <Text color={theme.dimmedText}>{queuedCount} queued</Text>\n </>\n )}\n </Box>\n <Box flexDirection=\"row\" marginLeft={2}>\n <Text color={theme.dimmedText}>\u2514\u2500 </Text>\n <Text color={theme.mutedText}>\n Press <Text bold>Ctrl+O</Text> to{' '}\n {showDetails ? 'collapse' : 'expand'} all\n </Text>\n </Box>\n </Box>\n )}\n\n {/* \u4EFB\u52A1\u5361\u7247\u5217\u8868 */}\n {limitedSubagents.map((subagent, index) => (\n <Box\n key={subagent.id}\n marginBottom={index < limitedSubagents.length - 1 ? 1 : 0}\n >\n <TaskCard\n subagent={subagent}\n isExpanded={showDetails || expandedTasks.has(subagent.id)}\n isHighlighted={index === 0 && runningCount === 1}\n tools={tools}\n verbose={verbose}\n debug={debug}\n onToggleExpand={() => toggleExpand(subagent.id)}\n />\n </Box>\n ))}\n\n {/* \u5982\u679C\u6709\u9690\u85CF\u7684 subagent\uFF0C\u663E\u793A\u63D0\u793A */}\n {visibleSubagents.length > 20 && (\n <Box marginTop={1}>\n <Text color={theme.mutedText}>\n ... and {visibleSubagents.length - 20} more agent(s)\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import React, { useState, useEffect } from "react";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { getTheme } from "../utils/theme.js";
|
|
4
|
+
import { formatNumber, formatDuration } from "../utils/format.js";
|
|
5
|
+
import { getAgentColor } from "../constants/colors.js";
|
|
6
|
+
import { SpinnerSymbol } from "./SpinnerSymbol.js";
|
|
7
|
+
import { Message } from "./Message.js";
|
|
8
|
+
function SubagentProgress({
|
|
9
|
+
subagent,
|
|
10
|
+
isExpanded,
|
|
11
|
+
tools = [],
|
|
12
|
+
verbose = false,
|
|
13
|
+
debug = false
|
|
14
|
+
}) {
|
|
15
|
+
const theme = getTheme();
|
|
16
|
+
const { metrics, taskName, status, messages, agentType, agentColor } = subagent;
|
|
17
|
+
const color = getAgentColor(agentColor, theme);
|
|
18
|
+
const isRunning = status === "initializing" || status === "running" || status === "queued";
|
|
19
|
+
const [, setTick] = useState(0);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (isRunning) {
|
|
22
|
+
const timer = setInterval(() => {
|
|
23
|
+
setTick((prev) => prev + 1);
|
|
24
|
+
}, 1e3);
|
|
25
|
+
return () => clearInterval(timer);
|
|
26
|
+
}
|
|
27
|
+
}, [isRunning]);
|
|
28
|
+
const duration = metrics.endTime ? metrics.endTime - metrics.startTime : Date.now() - metrics.startTime;
|
|
29
|
+
const statusText = getStatusText(status);
|
|
30
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 0 }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(SpinnerSymbol, { isRunning, color: agentColor }), /* @__PURE__ */ React.createElement(Text, null, " Task(", taskName, ")")), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.dim }, " \u23BFS1 "), /* @__PURE__ */ React.createElement(Text, { color: getStatusColor(status, theme) }, statusText), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, metrics.toolUseCount, " tool use", metrics.toolUseCount !== 1 ? "s" : ""), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, formatNumber(metrics.tokenCount), " tokens"), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, formatDuration(duration)), !isExpanded && /* @__PURE__ */ React.createElement(Text, { color: theme.dim }, " \xB7 (ctrl-o to expand)")), isExpanded && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginTop: 0 }, renderExpandedView(subagent, theme, tools, verbose)));
|
|
31
|
+
}
|
|
32
|
+
function renderExpandedView(subagent, theme, tools, verbose) {
|
|
33
|
+
const { prompt, messages, status, metrics } = subagent;
|
|
34
|
+
const duration = metrics.endTime ? metrics.endTime - metrics.startTime : Date.now() - metrics.startTime;
|
|
35
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, prompt && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.dim }, " \u23BFS2 "), /* @__PURE__ */ React.createElement(Text, null, "Prompt:")), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft: 7 }, /* @__PURE__ */ React.createElement(Text, null, prompt))), messages.map((msg, idx) => {
|
|
36
|
+
if (msg.type === "assistant") {
|
|
37
|
+
return msg.message.content.map((content, contentIdx) => {
|
|
38
|
+
if (content.type === "tool_use") {
|
|
39
|
+
const tool = tools.find((t) => t.name === content.name);
|
|
40
|
+
const toolName = (tool?.userFacingName && typeof tool.userFacingName === "function" ? tool.userFacingName() : void 0) || content.name;
|
|
41
|
+
return /* @__PURE__ */ React.createElement(Box, { key: `${idx}-${contentIdx}`, flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.dim }, " \u23BFS3 "), /* @__PURE__ */ React.createElement(Text, null, toolName));
|
|
42
|
+
} else if (content.type === "text" && content.text.trim()) {
|
|
43
|
+
const lines = content.text.trim().split("\n");
|
|
44
|
+
return /* @__PURE__ */ React.createElement(Box, { key: `${idx}-${contentIdx}`, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.dim }, " \u23BFS4 "), /* @__PURE__ */ React.createElement(Text, null, "Response:")), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft: 7 }, lines.map((line, lineIdx) => /* @__PURE__ */ React.createElement(Text, { key: lineIdx }, line))));
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}).filter((item) => item !== null);
|
|
48
|
+
} else if (msg.type === "user") {
|
|
49
|
+
return msg.message.content.map((content, contentIdx) => {
|
|
50
|
+
if (content.type === "tool_result") {
|
|
51
|
+
const resultContent = Array.isArray(content.content) ? content.content.find((c) => c.type === "text")?.text : typeof content.content === "string" ? content.content : "";
|
|
52
|
+
if (resultContent && resultContent.trim()) {
|
|
53
|
+
const lines = resultContent.trim().split("\n");
|
|
54
|
+
const preview = lines.length > 3 ? lines.slice(0, 3).join("\n") + "\n..." : resultContent.trim();
|
|
55
|
+
return /* @__PURE__ */ React.createElement(Box, { key: `${idx}-${contentIdx}`, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.dim }, " \u23BFS5 "), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, preview.split("\n")[0])), preview.split("\n").slice(1).map((line, lineIdx) => /* @__PURE__ */ React.createElement(Box, { key: lineIdx, marginLeft: 7 }, /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, line))));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}).filter((item) => item !== null);
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}).flat().filter((item) => item !== null), status === "completed" && /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.dim }, " \u23BFS6 "), /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Done"), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " ", "(", metrics.toolUseCount, " tool use", metrics.toolUseCount !== 1 ? "s" : "", " \xB7", " ", formatNumber(metrics.tokenCount), " tokens \xB7", " ", formatDuration(duration), ")")));
|
|
63
|
+
}
|
|
64
|
+
function getStatusText(status) {
|
|
65
|
+
switch (status) {
|
|
66
|
+
case "initializing":
|
|
67
|
+
return "Initialize\u2026";
|
|
68
|
+
case "queued":
|
|
69
|
+
return "Queued\u2026";
|
|
70
|
+
case "running":
|
|
71
|
+
return "In progress\u2026";
|
|
72
|
+
case "completed":
|
|
73
|
+
return "Completed";
|
|
74
|
+
case "error":
|
|
75
|
+
return "Error";
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function getStatusColor(status, theme) {
|
|
79
|
+
switch (status) {
|
|
80
|
+
case "initializing":
|
|
81
|
+
return theme.secondaryText;
|
|
82
|
+
case "queued":
|
|
83
|
+
return theme.secondaryText;
|
|
84
|
+
case "running":
|
|
85
|
+
return theme.minto;
|
|
86
|
+
case "completed":
|
|
87
|
+
return theme.success;
|
|
88
|
+
case "error":
|
|
89
|
+
return theme.error;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function renderMessagePreview(message, theme, tools, verbose) {
|
|
93
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft: 2 }, /* @__PURE__ */ React.createElement(
|
|
94
|
+
Message,
|
|
95
|
+
{
|
|
96
|
+
message,
|
|
97
|
+
tools,
|
|
98
|
+
verbose,
|
|
99
|
+
debug: false,
|
|
100
|
+
erroredToolUseIDs: /* @__PURE__ */ new Set(),
|
|
101
|
+
inProgressToolUseIDs: /* @__PURE__ */ new Set(),
|
|
102
|
+
unresolvedToolUseIDs: /* @__PURE__ */ new Set()
|
|
103
|
+
}
|
|
104
|
+
));
|
|
105
|
+
}
|
|
106
|
+
export {
|
|
107
|
+
SubagentProgress
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=SubagentProgress.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/SubagentProgress.tsx"],
|
|
4
|
+
"sourcesContent": ["import React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { formatNumber, formatDuration } from '@utils/format'\nimport { SYMBOLS } from '@constants/symbols'\nimport { getAgentColor } from '@constants/colors'\nimport { SpinnerSymbol } from './SpinnerSymbol'\nimport type { SubagentState } from '@minto-types/subagent'\nimport { Message } from './Message'\nimport type { Tool } from '@tool'\n\ninterface SubagentProgressProps {\n subagent: SubagentState\n isExpanded: boolean\n tools?: Tool[]\n verbose?: boolean\n debug?: boolean\n}\n\n/**\n * \u5355\u4E2A Subagent \u7684\u8FDB\u5EA6\u663E\u793A\u7EC4\u4EF6\n *\n * \u7EDF\u4E00\u663E\u793A\u683C\u5F0F\uFF1A\n * - \u7B2C1\u884C\uFF1ASpinner + Task\u540D\u79F0 + Agent\u7C7B\u578B + Status + Metrics\u6458\u8981\n * - Ctrl+O\u5C55\u5F00\u540E\uFF1A\u663E\u793A\u8BE6\u7EC6\u7684\u6D88\u606F\u6D41\n */\nexport function SubagentProgress({\n subagent,\n isExpanded,\n tools = [],\n verbose = false,\n debug = false,\n}: SubagentProgressProps) {\n const theme = getTheme()\n const { metrics, taskName, status, messages, agentType, agentColor } =\n subagent\n\n // \u83B7\u53D6 agent \u989C\u8272\n const color = getAgentColor(agentColor, theme)\n\n // \u5224\u65AD\u662F\u5426\u6B63\u5728\u8FD0\u884C\uFF08\u51B3\u5B9A\u662F\u5426\u95EA\u70C1\uFF09\n const isRunning =\n status === 'initializing' || status === 'running' || status === 'queued'\n\n // \u5B9E\u65F6\u66F4\u65B0\u65F6\u95F4\uFF1A\u6BCF\u79D2\u5F3A\u5236\u91CD\u65B0\u6E32\u67D3\n const [, setTick] = useState(0)\n useEffect(() => {\n if (isRunning) {\n // \u53EA\u5728\u4EFB\u52A1\u8FD0\u884C\u65F6\u542F\u52A8\u5B9A\u65F6\u5668\n const timer = setInterval(() => {\n setTick(prev => prev + 1)\n }, 1000) // \u6BCF\u79D2\u66F4\u65B0\u4E00\u6B21\n\n return () => clearInterval(timer)\n }\n }, [isRunning])\n\n // \u8BA1\u7B97\u6301\u7EED\u65F6\u95F4\uFF08\u5728\u6BCF\u6B21\u6E32\u67D3\u65F6\u91CD\u65B0\u8BA1\u7B97\uFF09\n const duration = metrics.endTime\n ? metrics.endTime - metrics.startTime\n : Date.now() - metrics.startTime\n\n // \u72B6\u6001\u6587\u672C\n const statusText = getStatusText(status)\n\n return (\n <Box flexDirection=\"column\" marginY={0}>\n {/* \u7B2C1\u884C\uFF1A\u4EFB\u52A1\u540D\u79F0 */}\n <Box flexDirection=\"row\">\n <SpinnerSymbol isRunning={isRunning} color={agentColor} />\n <Text> Task({taskName})</Text>\n </Box>\n\n {/* \u7B2C2\u884C\uFF1A\u8BE6\u7EC6\u4FE1\u606F\uFF08\u72B6\u6001\u3001\u6307\u6807\uFF09 - Claude Code CLI \u6807\u51C6\u683C\u5F0F */}\n <Box flexDirection=\"row\">\n <Text color={theme.dim}> \u23BFS1 </Text>\n <Text color={getStatusColor(status, theme)}>{statusText}</Text>\n <Text color={theme.secondaryText}> \u00B7 </Text>\n <Text color={theme.secondaryText}>\n {metrics.toolUseCount} tool use{metrics.toolUseCount !== 1 ? 's' : ''}\n </Text>\n <Text color={theme.secondaryText}> \u00B7 </Text>\n <Text color={theme.secondaryText}>\n {formatNumber(metrics.tokenCount)} tokens\n </Text>\n <Text color={theme.secondaryText}> \u00B7 </Text>\n <Text color={theme.secondaryText}>{formatDuration(duration)}</Text>\n {!isExpanded && <Text color={theme.dim}> \u00B7 (ctrl-o to expand)</Text>}\n </Box>\n\n {/* Ctrl+O \u5C55\u5F00\u540E\u663E\u793A\u8BE6\u7EC6\u6D88\u606F\u6D41 - Claude Code CLI \u6807\u51C6\u683C\u5F0F */}\n {isExpanded && (\n <Box flexDirection=\"column\" marginTop={0}>\n {renderExpandedView(subagent, theme, tools, verbose)}\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * \u6E32\u67D3\u5C55\u5F00\u89C6\u56FE - Claude Code CLI \u6807\u51C6\u683C\u5F0F\n */\nfunction renderExpandedView(\n subagent: SubagentState,\n theme: ReturnType<typeof getTheme>,\n tools: Tool[],\n verbose: boolean,\n) {\n const { prompt, messages, status, metrics } = subagent\n const duration = metrics.endTime\n ? metrics.endTime - metrics.startTime\n : Date.now() - metrics.startTime\n\n return (\n <Box flexDirection=\"column\">\n {/* Prompt \u90E8\u5206 */}\n {prompt && (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\">\n <Text color={theme.dim}> \u23BFS2 </Text>\n <Text>Prompt:</Text>\n </Box>\n <Box flexDirection=\"column\" marginLeft={7}>\n <Text>{prompt}</Text>\n </Box>\n </Box>\n )}\n\n {/* \u5DE5\u5177\u8C03\u7528\u3001\u7ED3\u679C\u548C\u54CD\u5E94 */}\n {messages\n .map((msg, idx) => {\n if (msg.type === 'assistant') {\n return msg.message.content\n .map((content, contentIdx) => {\n if (content.type === 'tool_use') {\n const tool = tools.find(t => t.name === content.name)\n const toolName =\n (tool?.userFacingName && typeof tool.userFacingName === 'function' ? tool.userFacingName() : undefined) || content.name\n return (\n <Box key={`${idx}-${contentIdx}`} flexDirection=\"row\">\n <Text color={theme.dim}> \u23BFS3 </Text>\n <Text>{toolName}</Text>\n </Box>\n )\n } else if (content.type === 'text' && content.text.trim()) {\n // \u663E\u793A Response \u6587\u672C\n const lines = content.text.trim().split('\\n')\n return (\n <Box key={`${idx}-${contentIdx}`} flexDirection=\"column\">\n <Box flexDirection=\"row\">\n <Text color={theme.dim}> \u23BFS4 </Text>\n <Text>Response:</Text>\n </Box>\n <Box flexDirection=\"column\" marginLeft={7}>\n {lines.map((line, lineIdx) => (\n <Text key={lineIdx}>{line}</Text>\n ))}\n </Box>\n </Box>\n )\n }\n return null\n })\n .filter(item => item !== null)\n } else if (msg.type === 'user') {\n // \u5DE5\u5177\u7ED3\u679C\n return msg.message.content\n .map((content, contentIdx) => {\n if (content.type === 'tool_result') {\n const resultContent = Array.isArray(content.content)\n ? content.content.find(c => c.type === 'text')?.text\n : typeof content.content === 'string'\n ? content.content\n : ''\n\n if (resultContent && resultContent.trim()) {\n const lines = resultContent.trim().split('\\n')\n const preview =\n lines.length > 3\n ? lines.slice(0, 3).join('\\n') + '\\n...'\n : resultContent.trim()\n return (\n <Box key={`${idx}-${contentIdx}`} flexDirection=\"column\">\n <Box flexDirection=\"row\">\n <Text color={theme.dim}> \u23BFS5 </Text>\n <Text color={theme.secondaryText}>\n {preview.split('\\n')[0]}\n </Text>\n </Box>\n {preview\n .split('\\n')\n .slice(1)\n .map((line, lineIdx) => (\n <Box key={lineIdx} marginLeft={7}>\n <Text color={theme.secondaryText}>{line}</Text>\n </Box>\n ))}\n </Box>\n )\n }\n }\n return null\n })\n .filter(item => item !== null)\n }\n return null\n })\n .flat()\n .filter(item => item !== null)}\n\n {/* Done \u72B6\u6001\uFF08\u4EC5\u5728\u5B8C\u6210\u65F6\u663E\u793A\uFF09 */}\n {status === 'completed' && (\n <Box flexDirection=\"row\">\n <Text color={theme.dim}> \u23BFS6 </Text>\n <Text color={theme.success}>Done</Text>\n <Text color={theme.secondaryText}>\n {' '}\n ({metrics.toolUseCount} tool use\n {metrics.toolUseCount !== 1 ? 's' : ''} \u00B7{' '}\n {formatNumber(metrics.tokenCount)} tokens \u00B7{' '}\n {formatDuration(duration)})\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * \u83B7\u53D6\u72B6\u6001\u6587\u672C\n */\nfunction getStatusText(status: SubagentState['status']): string {\n switch (status) {\n case 'initializing':\n return 'Initialize\u2026'\n case 'queued':\n return 'Queued\u2026'\n case 'running':\n return 'In progress\u2026'\n case 'completed':\n return 'Completed'\n case 'error':\n return 'Error'\n }\n}\n\n/**\n * \u83B7\u53D6\u72B6\u6001\u989C\u8272\n */\nfunction getStatusColor(\n status: SubagentState['status'],\n theme: ReturnType<typeof getTheme>,\n): string {\n switch (status) {\n case 'initializing':\n return theme.secondaryText\n case 'queued':\n return theme.secondaryText\n case 'running':\n return theme.minto\n case 'completed':\n return theme.success\n case 'error':\n return theme.error\n }\n}\n\n/**\n * \u6E32\u67D3\u6D88\u606F\u9884\u89C8 - \u4F7F\u7528\u5B8C\u6574\u7684 Message \u7EC4\u4EF6\u6765\u663E\u793A\u5DE5\u5177\u8C03\u7528\u548C\u7ED3\u679C\n */\nfunction renderMessagePreview(\n message: any,\n theme: ReturnType<typeof getTheme>,\n tools: Tool[],\n verbose: boolean,\n) {\n // \u4F7F\u7528 Message \u7EC4\u4EF6\u6765\u6E32\u67D3\uFF0C\u8FD9\u6837\u53EF\u4EE5\u663E\u793A\u5B8C\u6574\u7684\u5DE5\u5177\u8C03\u7528\u548C\u7ED3\u679C\n return (\n <Box flexDirection=\"column\" marginLeft={2}>\n <Message\n message={message}\n tools={tools}\n verbose={verbose}\n debug={false}\n erroredToolUseIDs={new Set()}\n inProgressToolUseIDs={new Set()}\n unresolvedToolUseIDs={new Set()}\n />\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|