@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,37 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { getTheme } from "../utils/theme.js";
|
|
4
|
+
import { getAgentColor } from "../constants/colors.js";
|
|
5
|
+
import { formatNumber, formatDuration } from "../utils/format.js";
|
|
6
|
+
function SubagentStatusMarker({
|
|
7
|
+
status,
|
|
8
|
+
taskName,
|
|
9
|
+
agentType,
|
|
10
|
+
agentColor,
|
|
11
|
+
metrics,
|
|
12
|
+
errorMessage
|
|
13
|
+
}) {
|
|
14
|
+
const theme = getTheme();
|
|
15
|
+
const color = agentColor ? getAgentColor(agentColor, theme) : theme.brand;
|
|
16
|
+
const duration = metrics && metrics.endTime ? metrics.endTime - metrics.startTime : void 0;
|
|
17
|
+
if (status === "complete") {
|
|
18
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 0 }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\u23FA "), /* @__PURE__ */ React.createElement(Text, { bold: true }, "Task"), /* @__PURE__ */ React.createElement(Text, null, "(", taskName, ")")), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, " \u23BF "), /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Done "), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, "(", metrics?.toolUseCount || 0, " tool use", (metrics?.toolUseCount || 0) !== 1 ? "s" : "", " \xB7", " ", formatNumber(metrics?.tokenCount || 0), " tokens", duration ? ` \xB7 ${formatDuration(duration)}` : "", ")")));
|
|
19
|
+
}
|
|
20
|
+
if (status === "error") {
|
|
21
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 0 }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\u23FA "), /* @__PURE__ */ React.createElement(Text, { bold: true }, "Task"), /* @__PURE__ */ React.createElement(Text, null, "(", taskName, ")")), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, " \u23BF "), /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Error: ", errorMessage || "Task failed")));
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
function CompactSubagentStatusMarker({
|
|
26
|
+
status,
|
|
27
|
+
taskName
|
|
28
|
+
}) {
|
|
29
|
+
const theme = getTheme();
|
|
30
|
+
const config = status === "start" ? { symbol: "\u23FA", color: theme.info } : status === "complete" ? { symbol: "\u2713", color: theme.success } : { symbol: "\u2715", color: theme.error };
|
|
31
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: config.color }, config.symbol, " ", taskName));
|
|
32
|
+
}
|
|
33
|
+
export {
|
|
34
|
+
CompactSubagentStatusMarker,
|
|
35
|
+
SubagentStatusMarker
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=SubagentStatusMarker.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/SubagentStatusMarker.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * SubagentStatusMarker - Subagent \u72B6\u6001\u6807\u8BB0\u7EC4\u4EF6\n *\n * \u8BBE\u8BA1\u539F\u5219\uFF1A\n * 1. **\u7C7B\u4F3C\u5DE5\u5177\u8C03\u7528** - \u5728\u6D88\u606F\u6D41\u4E2D\u663E\u793A subagent \u7684\u72B6\u6001\u6807\u8BB0\n * 2. **\u6E05\u6670\u7684\u72B6\u6001\u7B26\u53F7** - \u23FA \u5F00\u59CB, \u23F3 \u8FDB\u884C\u4E2D, \u2713 \u5B8C\u6210, \u2715 \u9519\u8BEF\n * 3. **\u7D27\u51D1\u5E03\u5C40** - \u4E0D\u5360\u7528\u8FC7\u591A\u7A7A\u95F4\n * 4. **\u65F6\u5E8F\u4E00\u81F4** - \u5728\u6D88\u606F\u6D41\u7684\u6B63\u786E\u4F4D\u7F6E\u663E\u793A\n *\n * \u7528\u6CD5\uFF1A\n * - start: \u663E\u793A \"\u23FA Launched: Task Name \u00B7 agent-type\"\n * - complete: \u663E\u793A \"\u2713 Completed: Task Name \u00B7 3 tools \u00B7 5.2k tokens \u00B7 12s\"\n * - error: \u663E\u793A \"\u2715 Failed: Task Name \u00B7 Error message\"\n */\n\nimport React from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { getAgentColor } from '@constants/colors'\nimport type { SubagentState, SubagentStatus } from '@minto-types/subagent'\nimport { formatNumber, formatDuration } from '@utils/format'\nimport type { AgentColor } from '@constants/colors'\n\ninterface SubagentStatusMarkerProps {\n /** \u72B6\u6001\u7C7B\u578B */\n status: 'start' | 'complete' | 'error'\n\n /** \u4EFB\u52A1\u540D\u79F0 */\n taskName: string\n\n /** Agent \u7C7B\u578B */\n agentType: string\n\n /** Agent \u989C\u8272 */\n agentColor?: AgentColor\n\n /** \u6027\u80FD\u6307\u6807\uFF08complete \u65F6\u9700\u8981\uFF09 */\n metrics?: {\n toolUseCount: number\n tokenCount: number\n startTime: number\n endTime?: number\n }\n\n /** \u9519\u8BEF\u4FE1\u606F\uFF08error \u65F6\u9700\u8981\uFF09 */\n errorMessage?: string\n}\n\n/**\n * SubagentStatusMarker - Claude Code CLI \u98CE\u683C\u7684\u4EFB\u52A1\u72B6\u6001\u663E\u793A\n *\n * \u89C6\u89C9\u6837\u5F0F\uFF08\u5339\u914D Claude Code\uFF09\uFF1A\n * ```\n * \u23FA Task(Analyze ARM_HAMMER file)\n * \u23BF Done (1 tool use \u00B7 52.7k tokens \u00B7 46.3s)\n * ```\n *\n * Note: This component is currently NOT rendered in the main message stream.\n * Task status is displayed via TaskCard component instead.\n */\nexport function SubagentStatusMarker({\n status,\n taskName,\n agentType,\n agentColor,\n metrics,\n errorMessage,\n}: SubagentStatusMarkerProps): React.ReactNode {\n const theme = getTheme()\n const color = agentColor ? getAgentColor(agentColor, theme) : theme.brand\n\n // \u8BA1\u7B97\u6301\u7EED\u65F6\u95F4\n const duration =\n metrics && metrics.endTime ? metrics.endTime - metrics.startTime : undefined\n\n // \u4EC5\u5728\u5B8C\u6210\u65F6\u663E\u793A\n if (status === 'complete') {\n return (\n <Box flexDirection=\"column\" marginY={0}>\n {/* \u7B2C1\u884C\uFF1A\u23FA Task(\u4EFB\u52A1\u540D\u79F0) */}\n <Box flexDirection=\"row\">\n <Text>\u23FA </Text>\n <Text bold>Task</Text>\n <Text>({taskName})</Text>\n </Box>\n\n {/* \u7B2C2\u884C\uFF1A\u23BF Done (\u7EDF\u8BA1\u4FE1\u606F) */}\n <Box flexDirection=\"row\">\n <Text color={theme.dimmedText}> \u23BF </Text>\n <Text color={theme.success}>Done </Text>\n <Text color={theme.mutedText}>\n ({metrics?.toolUseCount || 0} tool use\n {(metrics?.toolUseCount || 0) !== 1 ? 's' : ''} \u00B7{' '}\n {formatNumber(metrics?.tokenCount || 0)} tokens\n {duration ? ` \u00B7 ${formatDuration(duration)}` : ''})\n </Text>\n </Box>\n </Box>\n )\n }\n\n // Error \u72B6\u6001\u663E\u793A\n if (status === 'error') {\n return (\n <Box flexDirection=\"column\" marginY={0}>\n {/* \u7B2C1\u884C\uFF1A\u23FA Task(\u4EFB\u52A1\u540D\u79F0) */}\n <Box flexDirection=\"row\">\n <Text>\u23FA </Text>\n <Text bold>Task</Text>\n <Text>({taskName})</Text>\n </Box>\n\n {/* \u7B2C2\u884C\uFF1A\u23BF Error */}\n <Box flexDirection=\"row\">\n <Text color={theme.dimmedText}> \u23BF </Text>\n <Text color={theme.error}>\n Error: {errorMessage || 'Task failed'}\n </Text>\n </Box>\n </Box>\n )\n }\n\n // Start \u72B6\u6001\uFF1A\u4E0D\u663E\u793A\uFF08\u4EFB\u52A1\u542F\u52A8\u65F6\u65E0\u9700\u6807\u8BB0\uFF09\n return null\n}\n\n/**\n * \u7D27\u51D1\u7248\u72B6\u6001\u6807\u8BB0\uFF08\u7528\u4E8E\u8BE6\u7EC6\u89C6\u56FE\u4E2D\uFF09\n */\nexport function CompactSubagentStatusMarker({\n status,\n taskName,\n}: {\n status: 'start' | 'complete' | 'error'\n taskName: string\n}): React.ReactNode {\n const theme = getTheme()\n\n const config =\n status === 'start'\n ? { symbol: '\u23FA', color: theme.info }\n : status === 'complete'\n ? { symbol: '\u2713', color: theme.success }\n : { symbol: '\u2715', color: theme.error }\n\n return (\n <Box flexDirection=\"row\">\n <Text color={config.color}>\n {config.symbol} {taskName}\n </Text>\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAeA,OAAO,WAAW;AAClB,SAAS,KAAK,YAAY;AAC1B,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAE9B,SAAS,cAAc,sBAAsB;AAwCtC,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+C;AAC7C,QAAM,QAAQ,SAAS;AACvB,QAAM,QAAQ,aAAa,cAAc,YAAY,KAAK,IAAI,MAAM;AAGpE,QAAM,WACJ,WAAW,QAAQ,UAAU,QAAQ,UAAU,QAAQ,YAAY;AAGrE,MAAI,WAAW,YAAY;AACzB,WACE,oCAAC,OAAI,eAAc,UAAS,SAAS,KAEnC,oCAAC,OAAI,eAAc,SACjB,oCAAC,YAAK,SAAE,GACR,oCAAC,QAAK,MAAI,QAAC,MAAI,GACf,oCAAC,YAAK,KAAE,UAAS,GAAC,CACpB,GAGA,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,MAAM,cAAY,UAAG,GAClC,oCAAC,QAAK,OAAO,MAAM,WAAS,OAAK,GACjC,oCAAC,QAAK,OAAO,MAAM,aAAW,KAC1B,SAAS,gBAAgB,GAAE,cAC3B,SAAS,gBAAgB,OAAO,IAAI,MAAM,IAAG,SAAG,KACjD,aAAa,SAAS,cAAc,CAAC,GAAE,WACvC,WAAW,SAAM,eAAe,QAAQ,CAAC,KAAK,IAAG,GACpD,CACF,CACF;AAAA,EAEJ;AAGA,MAAI,WAAW,SAAS;AACtB,WACE,oCAAC,OAAI,eAAc,UAAS,SAAS,KAEnC,oCAAC,OAAI,eAAc,SACjB,oCAAC,YAAK,SAAE,GACR,oCAAC,QAAK,MAAI,QAAC,MAAI,GACf,oCAAC,YAAK,KAAE,UAAS,GAAC,CACpB,GAGA,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,MAAM,cAAY,UAAG,GAClC,oCAAC,QAAK,OAAO,MAAM,SAAO,WAChB,gBAAgB,aAC1B,CACF,CACF;AAAA,EAEJ;AAGA,SAAO;AACT;AAKO,SAAS,4BAA4B;AAAA,EAC1C;AAAA,EACA;AACF,GAGoB;AAClB,QAAM,QAAQ,SAAS;AAEvB,QAAM,SACJ,WAAW,UACP,EAAE,QAAQ,UAAK,OAAO,MAAM,KAAK,IACjC,WAAW,aACT,EAAE,QAAQ,UAAK,OAAO,MAAM,QAAQ,IACpC,EAAE,QAAQ,UAAK,OAAO,MAAM,MAAM;AAE1C,SACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,OAAO,SACjB,OAAO,QAAO,KAAE,QACnB,CACF;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
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
|
+
function TaskCard({
|
|
7
|
+
subagent,
|
|
8
|
+
isExpanded = false,
|
|
9
|
+
isHighlighted = false,
|
|
10
|
+
tools = [],
|
|
11
|
+
verbose = false,
|
|
12
|
+
debug = false,
|
|
13
|
+
onToggleExpand
|
|
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 statusIcon = getStatusIcon(status, isRunning);
|
|
30
|
+
const statusText = getStatusText(status);
|
|
31
|
+
const statusColor = getStatusColor(status, theme);
|
|
32
|
+
const latestMessage = getLatestMessage(messages);
|
|
33
|
+
const cardBgColor = isHighlighted ? theme.selectionBg : "#6A7B8E";
|
|
34
|
+
const isCompleted = status === "completed" || status === "error";
|
|
35
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 0 }, !isCompleted && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color }, statusIcon, " "), /* @__PURE__ */ React.createElement(Text, { bold: true }, taskName), /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, " \xB7 ", agentType)), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, "\u251C\u2500 "), /* @__PURE__ */ React.createElement(Text, { color: statusColor }, statusText), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, metrics.toolUseCount, " tool", metrics.toolUseCount !== 1 ? "s" : ""), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, formatNumber(metrics.tokenCount), " tokens"), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, formatDuration(duration))), latestMessage && /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, "\u2514\u2500 "), /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, latestMessage)), messages.length > 0 && messages.map((msg, idx) => {
|
|
36
|
+
let content = "";
|
|
37
|
+
let prefix = "\u2190 ";
|
|
38
|
+
if (msg.type === "assistant") {
|
|
39
|
+
prefix = "\u2192 ";
|
|
40
|
+
const blocks = msg.message.content;
|
|
41
|
+
content = blocks.filter((block) => block.type === "text").map((block) => block.text).join(" ");
|
|
42
|
+
} else if (msg.type === "user") {
|
|
43
|
+
const msgParam = msg.message;
|
|
44
|
+
if (typeof msgParam.content === "string") {
|
|
45
|
+
content = msgParam.content;
|
|
46
|
+
} else if (Array.isArray(msgParam.content)) {
|
|
47
|
+
content = msgParam.content.filter((block) => block.type === "text").map((block) => block.text).join(" ");
|
|
48
|
+
}
|
|
49
|
+
} else if (msg.type === "progress") {
|
|
50
|
+
prefix = "\u2699 ";
|
|
51
|
+
const blocks = msg.content.message.content;
|
|
52
|
+
content = blocks.filter((block) => block.type === "text").map((block) => block.text).join(" ");
|
|
53
|
+
}
|
|
54
|
+
if (!content || content.trim().length === 0) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
return /* @__PURE__ */ React.createElement(Box, { key: idx, flexDirection: "row", marginLeft: 4 }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, prefix), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, content.substring(0, 80), content.length > 80 ? "..." : ""));
|
|
58
|
+
}).filter(Boolean)), isCompleted && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color }, statusIcon, " "), /* @__PURE__ */ React.createElement(Text, { bold: true }, taskName), /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, " \xB7 ", agentType)), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, "\u2514\u2500 "), /* @__PURE__ */ React.createElement(Text, { color: statusColor }, statusText), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, metrics.toolUseCount, " tool", metrics.toolUseCount !== 1 ? "s" : ""), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, formatNumber(metrics.tokenCount), " tokens"), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, formatDuration(duration)), /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, " (Ctrl+O to expand)")), isExpanded && messages.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft: 4, marginTop: 1 }, renderTaskOutputLog(subagent, theme, tools, verbose))), debug && /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.info }, "[View Details]"), /* @__PURE__ */ React.createElement(Text, null, " "), isRunning && /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "[Cancel]")));
|
|
59
|
+
}
|
|
60
|
+
function getStatusIcon(status, isRunning) {
|
|
61
|
+
if (isRunning) {
|
|
62
|
+
const spinnerFrames = ["\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826", "\u2827", "\u2807", "\u280F"];
|
|
63
|
+
const frame = Math.floor(Date.now() / 120) % spinnerFrames.length;
|
|
64
|
+
return spinnerFrames[frame] || "\u280B";
|
|
65
|
+
}
|
|
66
|
+
switch (status) {
|
|
67
|
+
case "completed":
|
|
68
|
+
return "\u2713";
|
|
69
|
+
case "error":
|
|
70
|
+
return "\u2715";
|
|
71
|
+
case "queued":
|
|
72
|
+
return "\u2026";
|
|
73
|
+
default:
|
|
74
|
+
return "\u25E6";
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function getStatusText(status) {
|
|
78
|
+
switch (status) {
|
|
79
|
+
case "initializing":
|
|
80
|
+
return "Initializing";
|
|
81
|
+
case "queued":
|
|
82
|
+
return "Queued";
|
|
83
|
+
case "running":
|
|
84
|
+
return "Running";
|
|
85
|
+
case "completed":
|
|
86
|
+
return "Completed";
|
|
87
|
+
case "error":
|
|
88
|
+
return "Error";
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function getStatusColor(status, theme) {
|
|
92
|
+
switch (status) {
|
|
93
|
+
case "initializing":
|
|
94
|
+
case "queued":
|
|
95
|
+
return "#ADD8E6";
|
|
96
|
+
// Pending Task (浅蓝)
|
|
97
|
+
case "running":
|
|
98
|
+
return theme.brand;
|
|
99
|
+
// #D4BBFF (品牌色,表示活跃)
|
|
100
|
+
case "completed":
|
|
101
|
+
return theme.success;
|
|
102
|
+
// #3DDC84 (鲜绿)
|
|
103
|
+
case "error":
|
|
104
|
+
return theme.error;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function getLatestMessage(messages) {
|
|
108
|
+
if (messages.length === 0) return null;
|
|
109
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
110
|
+
const msg = messages[i];
|
|
111
|
+
if (msg?.type === "assistant" && msg.message?.content) {
|
|
112
|
+
for (const content of msg.message.content) {
|
|
113
|
+
if (content.type === "text" && content.text.trim()) {
|
|
114
|
+
const text = content.text.trim();
|
|
115
|
+
return text.length > 60 ? text.substring(0, 60) + "..." : text;
|
|
116
|
+
}
|
|
117
|
+
if (content.type === "tool_use") {
|
|
118
|
+
return `Using ${content.name}...`;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
function renderTaskOutputLog(subagent, theme, tools, verbose) {
|
|
126
|
+
const { messages } = subagent;
|
|
127
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, messages.map((msg, idx) => {
|
|
128
|
+
if (msg.type === "assistant") {
|
|
129
|
+
return msg.message.content.map((content, contentIdx) => {
|
|
130
|
+
if (content.type === "tool_use") {
|
|
131
|
+
const tool = tools.find((t) => t.name === content.name);
|
|
132
|
+
const toolName = tool?.userFacingName ? typeof tool.userFacingName === "function" ? tool.userFacingName() : tool.userFacingName : content.name;
|
|
133
|
+
return /* @__PURE__ */ React.createElement(Box, { key: `${idx}-${contentIdx}`, flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.info }, "\u{1F527} ", toolName));
|
|
134
|
+
} else if (content.type === "text" && content.text.trim()) {
|
|
135
|
+
const lines = content.text.trim().split("\n");
|
|
136
|
+
return /* @__PURE__ */ React.createElement(Box, { key: `${idx}-${contentIdx}`, flexDirection: "column" }, lines.map((line, lineIdx) => /* @__PURE__ */ React.createElement(Text, { key: lineIdx, color: theme.secondaryTextNew }, line)));
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
});
|
|
140
|
+
} else if (msg.type === "user") {
|
|
141
|
+
return msg.message.content.map((content, contentIdx) => {
|
|
142
|
+
if (content.type === "tool_result") {
|
|
143
|
+
const resultContent = Array.isArray(content.content) ? content.content.find((c) => c.type === "text")?.text : typeof content.content === "string" ? content.content : "";
|
|
144
|
+
if (resultContent && resultContent.trim()) {
|
|
145
|
+
const lines = resultContent.trim().split("\n");
|
|
146
|
+
const preview = lines.length > 5 ? lines.slice(0, 5).join("\n") + "\n..." : resultContent.trim();
|
|
147
|
+
return /* @__PURE__ */ React.createElement(Box, { key: `${idx}-${contentIdx}`, flexDirection: "column" }, preview.split("\n").map((line, lineIdx) => /* @__PURE__ */ React.createElement(Text, { key: lineIdx, color: theme.mutedText }, line)));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return null;
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
function CompactTaskCard({
|
|
157
|
+
subagent
|
|
158
|
+
}) {
|
|
159
|
+
const theme = getTheme();
|
|
160
|
+
const { taskName, status, agentColor } = subagent;
|
|
161
|
+
const color = getAgentColor(agentColor, theme);
|
|
162
|
+
const isRunning = status === "initializing" || status === "running" || status === "queued";
|
|
163
|
+
const statusIcon = getStatusIcon(status, isRunning);
|
|
164
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color }, statusIcon, " ", taskName), /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, " \xB7 ", getStatusText(status)));
|
|
165
|
+
}
|
|
166
|
+
export {
|
|
167
|
+
CompactTaskCard,
|
|
168
|
+
TaskCard
|
|
169
|
+
};
|
|
170
|
+
//# sourceMappingURL=TaskCard.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/TaskCard.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * TaskCard - Claude Code CLI \u98CE\u683C\u7684\u4EFB\u52A1\u5361\u7247\u7EC4\u4EF6\n *\n * \u6838\u5FC3\u7279\u6027\uFF1A\n * 1. **\u5361\u7247\u5F0F\u8BBE\u8BA1** - \u72EC\u7ACB\u7684\u89C6\u89C9\u5355\u5143\uFF0C\u4E0E\u4E3B\u5BF9\u8BDD\u6D41\u533A\u5206\n * 2. **\u72B6\u6001\u6E05\u6670** - \u901A\u8FC7\u56FE\u6807\u548C\u989C\u8272\u660E\u786E\u4F20\u8FBE\u4EFB\u52A1\u72B6\u6001\n * 3. **\u53EF\u6298\u53E0** - \u8BE6\u7EC6\u65E5\u5FD7\u53EF\u6298\u53E0\uFF0C\u8282\u7701\u7A7A\u95F4\n * 4. **\u8FDB\u5EA6\u53EF\u89C6\u5316** - \u663E\u793A\u4EFB\u52A1\u8FDB\u5EA6\u767E\u5206\u6BD4\u548C\u6307\u6807\n * 5. **\u5E76\u53D1\u53CB\u597D** - \u591A\u4E2A\u5361\u7247\u5E76\u5217\u663E\u793A\u4E0D\u6DF7\u4E71\n *\n * \u57FA\u4E8E Claude Code CLI \u7684 TaskCardBlock \u89C4\u8303\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { formatNumber, formatDuration } from '@utils/format'\nimport { getAgentColor } from '@constants/colors'\nimport type { SubagentState } from '@minto-types/subagent'\nimport type { Tool } from '@tool'\n\ninterface TaskCardProps {\n /** \u5B50\u4EFB\u52A1\u72B6\u6001 */\n subagent: SubagentState\n\n /** \u662F\u5426\u5C55\u5F00\u8BE6\u7EC6\u65E5\u5FD7 */\n isExpanded?: boolean\n\n /** \u662F\u5426\u9AD8\u4EAE\uFF08\u9700\u8981\u7528\u6237\u5173\u6CE8\uFF09 */\n isHighlighted?: boolean\n\n /** \u5DE5\u5177\u5217\u8868 */\n tools?: Tool[]\n\n /** \u662F\u5426\u663E\u793A\u8BE6\u7EC6\u4FE1\u606F */\n verbose?: boolean\n\n /** \u8C03\u8BD5\u6A21\u5F0F */\n debug?: boolean\n\n /** \u6298\u53E0/\u5C55\u5F00\u56DE\u8C03 */\n onToggleExpand?: () => void\n}\n\n/**\n * TaskCard - \u5355\u4E2A\u5B50\u4EFB\u52A1\u7684\u52A8\u6001\u5C55\u793A\uFF08\u65E0\u8FB9\u6846\uFF09\n *\n * \u8FD0\u884C\u4E2D\u5E03\u5C40\uFF08\u81EA\u52A8\u5C55\u5F00\uFF09:\n * ```\n * \u280B Feature Implementation \u00B7 backend-architect\n * \u251C\u2500 Running \u00B7 3 tools \u00B7 5.2k tokens \u00B7 12s\n * \u2514\u2500 Analyzing code structure...\n * \u2192 Tool call output message...\n * \u2190 Assistant response...\n * ```\n *\n * \u5B8C\u6210\u540E\u5E03\u5C40\uFF08\u81EA\u52A8\u6298\u53E0\uFF09:\n * ```\n * \u2713 Feature Implementation \u00B7 backend-architect\n * \u2514\u2500 Done \u00B7 5 tools \u00B7 8.3k tokens \u00B7 24s (Ctrl+O to expand)\n * ```\n *\n * \u5B8C\u6210\u540E\u5C55\u5F00\uFF08Ctrl+O\uFF09:\n * ```\n * \u2713 Feature Implementation \u00B7 backend-architect\n * \u2514\u2500 Done \u00B7 5 tools \u00B7 8.3k tokens \u00B7 24s (Ctrl+O to expand)\n * [\u8BE6\u7EC6\u7684\u6267\u884C\u8FC7\u7A0B\u65E5\u5FD7]\n * ```\n */\nexport function TaskCard({\n subagent,\n isExpanded = false,\n isHighlighted = false,\n tools = [],\n verbose = false,\n debug = false,\n onToggleExpand,\n}: TaskCardProps): React.ReactNode {\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\n const isRunning =\n status === 'initializing' || status === 'running' || status === 'queued'\n\n // \u5B9E\u65F6\u66F4\u65B0\u65F6\u95F4\n const [, setTick] = useState(0)\n useEffect(() => {\n if (isRunning) {\n const timer = setInterval(() => {\n setTick(prev => prev + 1)\n }, 1000)\n return () => clearInterval(timer)\n }\n }, [isRunning])\n\n // \u8BA1\u7B97\u6301\u7EED\u65F6\u95F4\n const duration = metrics.endTime\n ? metrics.endTime - metrics.startTime\n : Date.now() - metrics.startTime\n\n // \u72B6\u6001\u56FE\u6807\u548C\u6587\u672C\n const statusIcon = getStatusIcon(status, isRunning)\n const statusText = getStatusText(status)\n const statusColor = getStatusColor(status, theme)\n\n // \u83B7\u53D6\u6700\u65B0\u7684\u72B6\u6001\u6D88\u606F\n const latestMessage = getLatestMessage(messages)\n\n // \u5361\u7247\u80CC\u666F\u8272\uFF08\u6839\u636E\u72B6\u6001\u548C\u9AD8\u4EAE\uFF09\n const cardBgColor = isHighlighted\n ? theme.selectionBg // #3C3C3C\n : '#6A7B8E' // Task Card BG\n\n // \u5224\u65AD\u662F\u5426\u5DF2\u5B8C\u6210\uFF08completed \u6216 error\uFF09\n const isCompleted = status === 'completed' || status === 'error'\n\n return (\n <Box flexDirection=\"column\" marginY={0}>\n {/* \u8FD0\u884C\u4E2D\uFF1A\u5C55\u5F00\u663E\u793A\u6240\u6709\u5185\u5BB9 */}\n {!isCompleted && (\n <>\n {/* TaskHeader - \u4EFB\u52A1\u540D\u79F0\u548C Agent \u7C7B\u578B */}\n <Box flexDirection=\"row\">\n <Text color={color}>{statusIcon} </Text>\n <Text bold>{taskName}</Text>\n <Text color={theme.dimmedText}> \u00B7 {agentType}</Text>\n </Box>\n\n {/* TaskProgress - \u72B6\u6001\u548C\u6307\u6807 */}\n <Box flexDirection=\"row\" marginLeft={2}>\n <Text color={theme.dimmedText}>\u251C\u2500 </Text>\n <Text color={statusColor}>{statusText}</Text>\n <Text color={theme.mutedText}> \u00B7 </Text>\n <Text color={theme.mutedText}>\n {metrics.toolUseCount} tool{metrics.toolUseCount !== 1 ? 's' : ''}\n </Text>\n <Text color={theme.mutedText}> \u00B7 </Text>\n <Text color={theme.mutedText}>\n {formatNumber(metrics.tokenCount)} tokens\n </Text>\n <Text color={theme.mutedText}> \u00B7 </Text>\n <Text color={theme.mutedText}>{formatDuration(duration)}</Text>\n </Box>\n\n {/* TaskStatusMessage - \u5F53\u524D\u6B63\u5728\u505A\u4EC0\u4E48 */}\n {latestMessage && (\n <Box flexDirection=\"row\" marginLeft={2}>\n <Text color={theme.dimmedText}>\u2514\u2500 </Text>\n <Text color={theme.dimmedText}>{latestMessage}</Text>\n </Box>\n )}\n\n {/* Output messages - \u76F4\u63A5\u663E\u793A\u4E3A\u5B50\u5C42\u7EA7\uFF0C\u65E0 \"Output Log\" \u6807\u9898 */}\n {messages.length > 0 &&\n messages\n .map((msg, idx) => {\n // Extract text content based on message type\n let content = ''\n let prefix = '\u2190 '\n\n if (msg.type === 'assistant') {\n prefix = '\u2192 '\n const blocks = msg.message.content\n content = blocks\n .filter((block: any) => block.type === 'text')\n .map((block: any) => block.text)\n .join(' ')\n } else if (msg.type === 'user') {\n const msgParam = msg.message as any\n if (typeof msgParam.content === 'string') {\n content = msgParam.content\n } else if (Array.isArray(msgParam.content)) {\n content = msgParam.content\n .filter((block: any) => block.type === 'text')\n .map((block: any) => block.text)\n .join(' ')\n }\n } else if (msg.type === 'progress') {\n prefix = '\u2699 '\n const blocks = msg.content.message.content\n content = blocks\n .filter((block: any) => block.type === 'text')\n .map((block: any) => block.text)\n .join(' ')\n }\n\n if (!content || content.trim().length === 0) {\n return null\n }\n\n return (\n <Box key={idx} flexDirection=\"row\" marginLeft={4}>\n <Text color={theme.dimmedText}>{prefix}</Text>\n <Text color={theme.mutedText}>\n {content.substring(0, 80)}\n {content.length > 80 ? '...' : ''}\n </Text>\n </Box>\n )\n })\n .filter(Boolean)}\n </>\n )}\n\n {/* \u5DF2\u5B8C\u6210\uFF1A\u6298\u53E0\u6210\u4E00\u884C\uFF0C\u5E26\u5C55\u5F00\u63D0\u793A */}\n {isCompleted && (\n <>\n <Box flexDirection=\"row\">\n <Text color={color}>{statusIcon} </Text>\n <Text bold>{taskName}</Text>\n <Text color={theme.dimmedText}> \u00B7 {agentType}</Text>\n </Box>\n\n <Box flexDirection=\"row\" marginLeft={2}>\n <Text color={theme.dimmedText}>\u2514\u2500 </Text>\n <Text color={statusColor}>{statusText}</Text>\n <Text color={theme.mutedText}> \u00B7 </Text>\n <Text color={theme.mutedText}>\n {metrics.toolUseCount} tool{metrics.toolUseCount !== 1 ? 's' : ''}\n </Text>\n <Text color={theme.mutedText}> \u00B7 </Text>\n <Text color={theme.mutedText}>\n {formatNumber(metrics.tokenCount)} tokens\n </Text>\n <Text color={theme.mutedText}> \u00B7 </Text>\n <Text color={theme.mutedText}>{formatDuration(duration)}</Text>\n <Text color={theme.dimmedText}> (Ctrl+O to expand)</Text>\n </Box>\n\n {/* \u5C55\u5F00\u65F6\u663E\u793A\u8BE6\u7EC6\u8FC7\u7A0B */}\n {isExpanded && messages.length > 0 && (\n <Box flexDirection=\"column\" marginLeft={4} marginTop={1}>\n {renderTaskOutputLog(subagent, theme, tools, verbose)}\n </Box>\n )}\n </>\n )}\n\n {/* TaskActionButtons - \u64CD\u4F5C\u6309\u94AE (\u672A\u6765\u6269\u5C55) */}\n {debug && (\n <Box flexDirection=\"row\" marginTop={1}>\n <Text color={theme.info}>[View Details]</Text>\n <Text> </Text>\n {isRunning && <Text color={theme.error}>[Cancel]</Text>}\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * \u83B7\u53D6\u72B6\u6001\u56FE\u6807\n */\nfunction getStatusIcon(\n status: SubagentState['status'],\n isRunning: boolean,\n): string {\n if (isRunning) {\n // \u4F7F\u7528 Spinner \u5B57\u7B26\u8F6E\u8F6C (\u7B80\u5316\u7248)\n const spinnerFrames = ['\u280B', '\u2819', '\u2839', '\u2838', '\u283C', '\u2834', '\u2826', '\u2827', '\u2807', '\u280F']\n const frame = Math.floor(Date.now() / 120) % spinnerFrames.length\n return spinnerFrames[frame] || '\u280B'\n }\n\n switch (status) {\n case 'completed':\n return '\u2713'\n case 'error':\n return '\u2715'\n case 'queued':\n return '\u2026'\n default:\n return '\u25E6'\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 '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\n/**\n * \u83B7\u53D6\u72B6\u6001\u989C\u8272 (\u4F7F\u7528 Claude Code CLI \u914D\u8272)\n */\nfunction getStatusColor(\n status: SubagentState['status'],\n theme: ReturnType<typeof getTheme>,\n): string {\n switch (status) {\n case 'initializing':\n case 'queued':\n return '#ADD8E6' // Pending Task (\u6D45\u84DD)\n case 'running':\n return theme.brand // #D4BBFF (\u54C1\u724C\u8272\uFF0C\u8868\u793A\u6D3B\u8DC3)\n case 'completed':\n return theme.success // #3DDC84 (\u9C9C\u7EFF)\n case 'error':\n return theme.error // #FF5555 (\u9C9C\u7EA2)\n }\n}\n\n/**\n * \u83B7\u53D6\u6700\u65B0\u7684\u72B6\u6001\u6D88\u606F\n */\nfunction getLatestMessage(messages: SubagentState['messages']): string | null {\n if (messages.length === 0) return null\n\n // \u5012\u5E8F\u67E5\u627E\u6700\u65B0\u7684\u6587\u672C\u6D88\u606F\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]\n if (msg?.type === 'assistant' && msg.message?.content) {\n for (const content of msg.message.content) {\n if (content.type === 'text' && content.text.trim()) {\n // \u622A\u53D6\u524D 60 \u4E2A\u5B57\u7B26\n const text = content.text.trim()\n return text.length > 60 ? text.substring(0, 60) + '...' : text\n }\n if (content.type === 'tool_use') {\n return `Using ${content.name}...`\n }\n }\n }\n }\n\n return null\n}\n\n/**\n * \u6E32\u67D3\u8BE6\u7EC6\u7684\u8F93\u51FA\u65E5\u5FD7\n */\nfunction renderTaskOutputLog(\n subagent: SubagentState,\n theme: ReturnType<typeof getTheme>,\n tools: Tool[],\n verbose: boolean,\n): React.ReactNode {\n const { messages } = subagent\n\n return (\n <Box flexDirection=\"column\">\n {messages.map((msg, idx) => {\n if (msg.type === 'assistant') {\n return msg.message.content.map((content, contentIdx) => {\n if (content.type === 'tool_use') {\n const tool = tools.find(t => t.name === content.name)\n const toolName = tool?.userFacingName\n ? typeof tool.userFacingName === 'function'\n ? tool.userFacingName()\n : tool.userFacingName\n : content.name\n\n return (\n <Box key={`${idx}-${contentIdx}`} flexDirection=\"row\">\n <Text color={theme.info}>\uD83D\uDD27 {toolName}</Text>\n </Box>\n )\n } else if (content.type === 'text' && content.text.trim()) {\n const lines = content.text.trim().split('\\n')\n return (\n <Box key={`${idx}-${contentIdx}`} flexDirection=\"column\">\n {lines.map((line, lineIdx) => (\n <Text key={lineIdx} color={theme.secondaryTextNew}>\n {line}\n </Text>\n ))}\n </Box>\n )\n }\n return null\n })\n } else if (msg.type === 'user') {\n return msg.message.content.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 > 5\n ? lines.slice(0, 5).join('\\n') + '\\n...'\n : resultContent.trim()\n\n return (\n <Box key={`${idx}-${contentIdx}`} flexDirection=\"column\">\n {preview.split('\\n').map((line, lineIdx) => (\n <Text key={lineIdx} color={theme.mutedText}>\n {line}\n </Text>\n ))}\n </Box>\n )\n }\n }\n return null\n })\n }\n return null\n })}\n </Box>\n )\n}\n\n/**\n * \u7D27\u51D1\u7248 TaskCard (\u7528\u4E8E\u7A7A\u95F4\u53D7\u9650\u7684\u573A\u666F)\n */\nexport function CompactTaskCard({\n subagent,\n}: {\n subagent: SubagentState\n}): React.ReactNode {\n const theme = getTheme()\n const { taskName, status, agentColor } = subagent\n\n const color = getAgentColor(agentColor, theme)\n const isRunning =\n status === 'initializing' || status === 'running' || status === 'queued'\n const statusIcon = getStatusIcon(status, isRunning)\n\n return (\n <Box flexDirection=\"row\">\n <Text color={color}>\n {statusIcon} {taskName}\n </Text>\n <Text color={theme.dimmedText}> \u00B7 {getStatusText(status)}</Text>\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Text, useInput } from "ink";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { useTextInput } from "../hooks/useTextInput.js";
|
|
5
|
+
import { getTheme } from "../utils/theme.js";
|
|
6
|
+
function TextInput({
|
|
7
|
+
value: originalValue,
|
|
8
|
+
placeholder = "",
|
|
9
|
+
focus = true,
|
|
10
|
+
mask,
|
|
11
|
+
multiline = false,
|
|
12
|
+
highlightPastedText = false,
|
|
13
|
+
showCursor = true,
|
|
14
|
+
onChange,
|
|
15
|
+
onSubmit,
|
|
16
|
+
onExit,
|
|
17
|
+
onHistoryUp,
|
|
18
|
+
onHistoryDown,
|
|
19
|
+
onExitMessage,
|
|
20
|
+
onMessage,
|
|
21
|
+
onHistoryReset,
|
|
22
|
+
columns,
|
|
23
|
+
onImagePaste,
|
|
24
|
+
onPaste,
|
|
25
|
+
isDimmed = false,
|
|
26
|
+
disableCursorMovementForUpDownKeys = false,
|
|
27
|
+
onSpecialKey,
|
|
28
|
+
cursorOffset,
|
|
29
|
+
onChangeCursorOffset
|
|
30
|
+
}) {
|
|
31
|
+
const { onInput, renderedValue } = useTextInput({
|
|
32
|
+
value: originalValue,
|
|
33
|
+
onChange,
|
|
34
|
+
onSubmit,
|
|
35
|
+
onExit,
|
|
36
|
+
onExitMessage,
|
|
37
|
+
onMessage,
|
|
38
|
+
onHistoryReset,
|
|
39
|
+
onHistoryUp,
|
|
40
|
+
onHistoryDown,
|
|
41
|
+
focus,
|
|
42
|
+
mask,
|
|
43
|
+
multiline,
|
|
44
|
+
cursorChar: showCursor ? " " : "",
|
|
45
|
+
highlightPastedText,
|
|
46
|
+
invert: chalk.inverse,
|
|
47
|
+
themeText: (text) => chalk.hex(getTheme().text)(text),
|
|
48
|
+
columns,
|
|
49
|
+
onImagePaste,
|
|
50
|
+
disableCursorMovementForUpDownKeys,
|
|
51
|
+
externalOffset: cursorOffset,
|
|
52
|
+
onOffsetChange: onChangeCursorOffset
|
|
53
|
+
});
|
|
54
|
+
const [pasteState, setPasteState] = React.useState({ chunks: [], timeoutId: null });
|
|
55
|
+
const resetPasteTimeout = (currentTimeoutId) => {
|
|
56
|
+
if (currentTimeoutId) {
|
|
57
|
+
clearTimeout(currentTimeoutId);
|
|
58
|
+
}
|
|
59
|
+
return setTimeout(() => {
|
|
60
|
+
setPasteState(({ chunks }) => {
|
|
61
|
+
const pastedText = chunks.join("");
|
|
62
|
+
Promise.resolve().then(() => onPaste(pastedText));
|
|
63
|
+
return { chunks: [], timeoutId: null };
|
|
64
|
+
});
|
|
65
|
+
}, 100);
|
|
66
|
+
};
|
|
67
|
+
const wrappedOnInput = (input, key) => {
|
|
68
|
+
if (onSpecialKey && onSpecialKey(input, key)) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (key.backspace || key.delete || input === "\b" || input === "\x7F" || input === "\b") {
|
|
72
|
+
onInput(input, {
|
|
73
|
+
...key,
|
|
74
|
+
backspace: true
|
|
75
|
+
});
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (onPaste && (input.length > 800 || pasteState.timeoutId)) {
|
|
79
|
+
setPasteState(({ chunks, timeoutId }) => {
|
|
80
|
+
return {
|
|
81
|
+
chunks: [...chunks, input],
|
|
82
|
+
timeoutId: resetPasteTimeout(timeoutId)
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
onInput(input, key);
|
|
88
|
+
};
|
|
89
|
+
useInput(wrappedOnInput, { isActive: focus });
|
|
90
|
+
let renderedPlaceholder = placeholder ? chalk.hex(getTheme().secondaryText)(placeholder) : void 0;
|
|
91
|
+
if (showCursor && focus) {
|
|
92
|
+
renderedPlaceholder = placeholder.length > 0 ? chalk.inverse(placeholder[0]) + chalk.hex(getTheme().secondaryText)(placeholder.slice(1)) : chalk.inverse(" ");
|
|
93
|
+
}
|
|
94
|
+
const showPlaceholder = originalValue.length == 0 && placeholder;
|
|
95
|
+
return /* @__PURE__ */ React.createElement(Text, { wrap: "truncate-end", dimColor: isDimmed }, showPlaceholder ? renderedPlaceholder : renderedValue);
|
|
96
|
+
}
|
|
97
|
+
export {
|
|
98
|
+
TextInput as default
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=TextInput.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/TextInput.tsx"],
|
|
4
|
+
"sourcesContent": ["import React from 'react'\nimport { Text, useInput } from 'ink'\nimport chalk from 'chalk'\nimport { useTextInput } from '@hooks/useTextInput'\nimport { getTheme } from '@utils/theme'\nimport { type Key } from 'ink'\n\nexport type Props = {\n /**\n * Optional callback for handling history navigation on up arrow at start of input\n */\n readonly onHistoryUp?: () => void\n\n /**\n * Optional callback for handling history navigation on down arrow at end of input\n */\n readonly onHistoryDown?: () => void\n\n /**\n * Text to display when `value` is empty.\n */\n readonly placeholder?: string\n\n /**\n * Allow multi-line input via line ending with backslash (default: `true`)\n */\n readonly multiline?: boolean\n\n /**\n * Listen to user's input. Useful in case there are multiple input components\n * at the same time and input must be \"routed\" to a specific component.\n */\n readonly focus?: boolean\n\n /**\n * Replace all chars and mask the value. Useful for password inputs.\n */\n readonly mask?: string\n\n /**\n * Whether to show cursor and allow navigation inside text input with arrow keys.\n */\n readonly showCursor?: boolean\n\n /**\n * Highlight pasted text\n */\n readonly highlightPastedText?: boolean\n\n /**\n * Value to display in a text input.\n */\n readonly value: string\n\n /**\n * Function to call when value updates.\n */\n readonly onChange: (value: string) => void\n\n /**\n * Function to call when `Enter` is pressed, where first argument is a value of the input.\n */\n readonly onSubmit?: (value: string) => void\n\n /**\n * Function to call when Ctrl+C is pressed to exit.\n */\n readonly onExit?: () => void\n\n /**\n * Optional callback to show exit message\n */\n readonly onExitMessage?: (show: boolean, key?: string) => void\n\n /**\n * Optional callback to show custom message\n */\n readonly onMessage?: (show: boolean, message?: string) => void\n\n /**\n * Optional callback to reset history position\n */\n readonly onHistoryReset?: () => void\n\n /**\n * Number of columns to wrap text at\n */\n readonly columns: number\n\n /**\n * Optional callback when an image is pasted\n */\n readonly onImagePaste?: (base64Image: string) => void\n\n /**\n * Optional callback when a large text (over 800 chars) is pasted\n */\n readonly onPaste?: (text: string) => void\n\n /**\n * Whether the input is dimmed and non-interactive\n */\n readonly isDimmed?: boolean\n\n /**\n * Whether to disable cursor movement for up/down arrow keys\n */\n readonly disableCursorMovementForUpDownKeys?: boolean\n \n /**\n * Optional callback to handle special key combinations before input processing\n * Return true to prevent default handling\n */\n readonly onSpecialKey?: (input: string, key: Key) => boolean\n\n readonly cursorOffset: number\n\n /**\n * Callback to set the offset of the cursor\n */\n onChangeCursorOffset: (offset: number) => void\n}\n\nexport default function TextInput({\n value: originalValue,\n placeholder = '',\n focus = true,\n mask,\n multiline = false,\n highlightPastedText = false,\n showCursor = true,\n onChange,\n onSubmit,\n onExit,\n onHistoryUp,\n onHistoryDown,\n onExitMessage,\n onMessage,\n onHistoryReset,\n columns,\n onImagePaste,\n onPaste,\n isDimmed = false,\n disableCursorMovementForUpDownKeys = false,\n onSpecialKey,\n cursorOffset,\n onChangeCursorOffset,\n}: Props) {\n const { onInput, renderedValue } = useTextInput({\n value: originalValue,\n onChange,\n onSubmit,\n onExit,\n onExitMessage,\n onMessage,\n onHistoryReset,\n onHistoryUp,\n onHistoryDown,\n focus,\n mask,\n multiline,\n cursorChar: showCursor ? ' ' : '',\n highlightPastedText,\n invert: chalk.inverse,\n themeText: (text: string) => chalk.hex(getTheme().text)(text),\n columns,\n onImagePaste,\n disableCursorMovementForUpDownKeys,\n externalOffset: cursorOffset,\n onOffsetChange: onChangeCursorOffset,\n })\n\n // Paste detection state\n const [pasteState, setPasteState] = React.useState<{\n chunks: string[]\n timeoutId: ReturnType<typeof setTimeout> | null\n }>({ chunks: [], timeoutId: null })\n\n const resetPasteTimeout = (\n currentTimeoutId: ReturnType<typeof setTimeout> | null,\n ) => {\n if (currentTimeoutId) {\n clearTimeout(currentTimeoutId)\n }\n return setTimeout(() => {\n setPasteState(({ chunks }) => {\n const pastedText = chunks.join('')\n // Schedule callback after current render to avoid state updates during render\n Promise.resolve().then(() => onPaste!(pastedText))\n return { chunks: [], timeoutId: null }\n })\n }, 100)\n }\n\n const wrappedOnInput = (input: string, key: Key): void => {\n // Check for special key combinations first\n if (onSpecialKey && onSpecialKey(input, key)) {\n // Special key was handled, don't process further\n return\n }\n \n // Special handling for backspace or delete\n if (\n key.backspace ||\n key.delete ||\n input === '\\b' ||\n input === '\\x7f' ||\n input === '\\x08'\n ) {\n // Ensure backspace is handled directly\n onInput(input, {\n ...key,\n backspace: true,\n })\n return\n }\n\n // Handle pastes (>800 chars)\n // Usually we get one or two input characters at a time. If we\n // get a bunch, the user has probably pasted.\n // Unfortunately node batches long pastes, so it's possible\n // that we would see e.g. 1024 characters and then just a few\n // more in the next frame that belong with the original paste.\n // This batching number is not consistent.\n if (onPaste && (input.length > 800 || pasteState.timeoutId)) {\n setPasteState(({ chunks, timeoutId }) => {\n return {\n chunks: [...chunks, input],\n timeoutId: resetPasteTimeout(timeoutId),\n }\n })\n return\n }\n\n onInput(input, key)\n }\n\n useInput(wrappedOnInput, { isActive: focus })\n\n let renderedPlaceholder = placeholder\n ? chalk.hex(getTheme().secondaryText)(placeholder)\n : undefined\n\n // Fake mouse cursor, because we like punishment\n if (showCursor && focus) {\n renderedPlaceholder =\n placeholder.length > 0\n ? chalk.inverse(placeholder[0]) +\n chalk.hex(getTheme().secondaryText)(placeholder.slice(1))\n : chalk.inverse(' ')\n }\n\n const showPlaceholder = originalValue.length == 0 && placeholder\n return (\n <Text wrap=\"truncate-end\" dimColor={isDimmed}>\n {showPlaceholder ? renderedPlaceholder : renderedValue}\n </Text>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,MAAM,gBAAgB;AAC/B,OAAO,WAAW;AAClB,SAAS,oBAAoB;AAC7B,SAAS,gBAAgB;AAuHV,SAAR,UAA2B;AAAA,EAChC,OAAO;AAAA,EACP,cAAc;AAAA,EACd,QAAQ;AAAA,EACR;AAAA,EACA,YAAY;AAAA,EACZ,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,qCAAqC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,QAAM,EAAE,SAAS,cAAc,IAAI,aAAa;AAAA,IAC9C,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,aAAa,MAAM;AAAA,IAC/B;AAAA,IACA,QAAQ,MAAM;AAAA,IACd,WAAW,CAAC,SAAiB,MAAM,IAAI,SAAS,EAAE,IAAI,EAAE,IAAI;AAAA,IAC5D;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB,CAAC;AAGD,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAGvC,EAAE,QAAQ,CAAC,GAAG,WAAW,KAAK,CAAC;AAElC,QAAM,oBAAoB,CACxB,qBACG;AACH,QAAI,kBAAkB;AACpB,mBAAa,gBAAgB;AAAA,IAC/B;AACA,WAAO,WAAW,MAAM;AACtB,oBAAc,CAAC,EAAE,OAAO,MAAM;AAC5B,cAAM,aAAa,OAAO,KAAK,EAAE;AAEjC,gBAAQ,QAAQ,EAAE,KAAK,MAAM,QAAS,UAAU,CAAC;AACjD,eAAO,EAAE,QAAQ,CAAC,GAAG,WAAW,KAAK;AAAA,MACvC,CAAC;AAAA,IACH,GAAG,GAAG;AAAA,EACR;AAEA,QAAM,iBAAiB,CAAC,OAAe,QAAmB;AAExD,QAAI,gBAAgB,aAAa,OAAO,GAAG,GAAG;AAE5C;AAAA,IACF;AAGA,QACE,IAAI,aACJ,IAAI,UACJ,UAAU,QACV,UAAU,UACV,UAAU,MACV;AAEA,cAAQ,OAAO;AAAA,QACb,GAAG;AAAA,QACH,WAAW;AAAA,MACb,CAAC;AACD;AAAA,IACF;AASA,QAAI,YAAY,MAAM,SAAS,OAAO,WAAW,YAAY;AAC3D,oBAAc,CAAC,EAAE,QAAQ,UAAU,MAAM;AACvC,eAAO;AAAA,UACL,QAAQ,CAAC,GAAG,QAAQ,KAAK;AAAA,UACzB,WAAW,kBAAkB,SAAS;AAAA,QACxC;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,YAAQ,OAAO,GAAG;AAAA,EACpB;AAEA,WAAS,gBAAgB,EAAE,UAAU,MAAM,CAAC;AAE5C,MAAI,sBAAsB,cACtB,MAAM,IAAI,SAAS,EAAE,aAAa,EAAE,WAAW,IAC/C;AAGJ,MAAI,cAAc,OAAO;AACvB,0BACE,YAAY,SAAS,IACjB,MAAM,QAAQ,YAAY,CAAC,CAAC,IAC5B,MAAM,IAAI,SAAS,EAAE,aAAa,EAAE,YAAY,MAAM,CAAC,CAAC,IACxD,MAAM,QAAQ,GAAG;AAAA,EACzB;AAEA,QAAM,kBAAkB,cAAc,UAAU,KAAK;AACrD,SACE,oCAAC,QAAK,MAAK,gBAAe,UAAU,YACjC,kBAAkB,sBAAsB,aAC3C;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
function mergeTimeline(toolExecutions, subagentExecutions) {
|
|
2
|
+
const timeline = [];
|
|
3
|
+
for (const tool of toolExecutions) {
|
|
4
|
+
timeline.push({
|
|
5
|
+
type: "tool",
|
|
6
|
+
data: tool,
|
|
7
|
+
time: tool.startTime
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
for (const subagent of subagentExecutions) {
|
|
11
|
+
timeline.push({
|
|
12
|
+
type: "subagent",
|
|
13
|
+
data: subagent,
|
|
14
|
+
time: subagent.metrics.startTime
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
timeline.sort((a, b) => a.time - b.time);
|
|
18
|
+
return timeline;
|
|
19
|
+
}
|
|
20
|
+
function isToolExecution(item) {
|
|
21
|
+
return item.type === "tool";
|
|
22
|
+
}
|
|
23
|
+
function isSubagentExecution(item) {
|
|
24
|
+
return item.type === "subagent";
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
isSubagentExecution,
|
|
28
|
+
isToolExecution,
|
|
29
|
+
mergeTimeline
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=TimelineRenderer.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/TimelineRenderer.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * TimelineRenderer - Merges tool executions and subagent executions\n *\n * Sorts timeline items by timestamp and returns a unified array\n * for hierarchical rendering in InteractionRoundBlock.\n */\n\nimport type { SubagentState } from '@minto-types/subagent'\n\n/**\n * Tool execution data (simplified from existing tool execution tracking)\n */\nexport interface ToolExecution {\n id: string\n name: string\n input: any\n result?: any\n status: 'pending' | 'running' | 'completed' | 'error'\n startTime: number\n endTime?: number\n durationMs?: number\n}\n\n/**\n * Timeline item types\n */\nexport type TimelineItemType = 'tool' | 'subagent'\n\n/**\n * Unified timeline item\n */\nexport interface TimelineItem {\n type: TimelineItemType\n data: ToolExecution | SubagentState\n time: number\n}\n\n/**\n * Merge tool executions and subagent executions into a unified timeline\n *\n * @param toolExecutions - Array of tool execution records\n * @param subagentExecutions - Array of subagent execution records\n * @returns Sorted array of timeline items\n */\nexport function mergeTimeline(\n toolExecutions: ToolExecution[],\n subagentExecutions: SubagentState[],\n): TimelineItem[] {\n const timeline: TimelineItem[] = []\n\n // Add tool executions to timeline\n for (const tool of toolExecutions) {\n timeline.push({\n type: 'tool',\n data: tool,\n time: tool.startTime,\n })\n }\n\n // Add subagent executions to timeline\n for (const subagent of subagentExecutions) {\n timeline.push({\n type: 'subagent',\n data: subagent,\n time: subagent.metrics.startTime,\n })\n }\n\n // Sort by timestamp (ascending - earliest first)\n timeline.sort((a, b) => a.time - b.time)\n\n return timeline\n}\n\n/**\n * Type guard to check if timeline item is a tool execution\n */\nexport function isToolExecution(\n item: TimelineItem,\n): item is TimelineItem & { data: ToolExecution } {\n return item.type === 'tool'\n}\n\n/**\n * Type guard to check if timeline item is a subagent execution\n */\nexport function isSubagentExecution(\n item: TimelineItem,\n): item is TimelineItem & { data: SubagentState } {\n return item.type === 'subagent'\n}\n"],
|
|
5
|
+
"mappings": "AA4CO,SAAS,cACd,gBACA,oBACgB;AAChB,QAAM,WAA2B,CAAC;AAGlC,aAAW,QAAQ,gBAAgB;AACjC,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM,KAAK;AAAA,IACb,CAAC;AAAA,EACH;AAGA,aAAW,YAAY,oBAAoB;AACzC,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM,SAAS,QAAQ;AAAA,IACzB,CAAC;AAAA,EACH;AAGA,WAAS,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAEvC,SAAO;AACT;AAKO,SAAS,gBACd,MACgD;AAChD,SAAO,KAAK,SAAS;AACvB;AAKO,SAAS,oBACd,MACgD;AAChD,SAAO,KAAK,SAAS;AACvB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Box, Text } from "ink";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { TodoChangeLine } from "./TodoChangeLine.js";
|
|
4
|
+
import { getTheme } from "../utils/theme.js";
|
|
5
|
+
function TodoChangeBlock({
|
|
6
|
+
changes,
|
|
7
|
+
todos,
|
|
8
|
+
indent = 1
|
|
9
|
+
}) {
|
|
10
|
+
const theme = getTheme();
|
|
11
|
+
const stats = {
|
|
12
|
+
pending: todos.filter((t) => t.status === "pending").length,
|
|
13
|
+
inProgress: todos.filter((t) => t.status === "in_progress").length,
|
|
14
|
+
completed: todos.filter((t) => t.status === "completed").length
|
|
15
|
+
};
|
|
16
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft: indent * 2 }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.brand }, "\u{1F527} "), /* @__PURE__ */ React.createElement(Text, null, "Updated task list")), changes.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft: 2 }, changes.map((change, idx) => /* @__PURE__ */ React.createElement(Box, { key: `${change.todoId}-${idx}` }, /* @__PURE__ */ React.createElement(TodoChangeLine, { change })))), /* @__PURE__ */ React.createElement(
|
|
17
|
+
Box,
|
|
18
|
+
{
|
|
19
|
+
flexDirection: "row",
|
|
20
|
+
marginLeft: 2,
|
|
21
|
+
marginTop: changes.length > 0 ? 1 : 0
|
|
22
|
+
},
|
|
23
|
+
/* @__PURE__ */ React.createElement(Text, { color: theme.dim }, stats.pending, " pending \xB7 ", stats.inProgress, " in progress \xB7", " ", stats.completed, " completed")
|
|
24
|
+
));
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
TodoChangeBlock
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=TodoChangeBlock.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/TodoChangeBlock.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * TodoChangeBlock - Renders Todo changes in the conversation flow\n *\n * Displays:\n * - Tool call header \"\uD83D\uDD27 Updated task list\"\n * - Individual changes via TodoChangeLine\n * - Summary statistics (pending/in_progress/completed)\n *\n * When TodoWriteTool is called, this component shows what changed\n * in the conversation timeline, separate from the TodoPanel.\n */\n\nimport { Box, Text } from 'ink'\nimport React from 'react'\nimport type { TodoChange } from '@utils/todoChangeCalculator'\nimport type { TodoItem } from '@utils/todoStorage'\nimport { TodoChangeLine } from './TodoChangeLine'\nimport { getTheme } from '@utils/theme'\n\ninterface TodoChangeBlockProps {\n /** List of changes to display */\n changes: TodoChange[]\n /** Current complete todo list (for statistics) */\n todos: TodoItem[]\n /** Indentation level (default: 1) */\n indent?: number\n}\n\nexport function TodoChangeBlock({\n changes,\n todos,\n indent = 1,\n}: TodoChangeBlockProps) {\n const theme = getTheme()\n\n // Calculate statistics\n const stats = {\n pending: todos.filter(t => t.status === 'pending').length,\n inProgress: todos.filter(t => t.status === 'in_progress').length,\n completed: todos.filter(t => t.status === 'completed').length,\n }\n\n return (\n <Box flexDirection=\"column\" marginLeft={indent * 2}>\n {/* Tool call header */}\n <Box flexDirection=\"row\">\n <Text color={theme.brand}>\uD83D\uDD27 </Text>\n <Text>Updated task list</Text>\n </Box>\n\n {/* Changes display */}\n {changes.length > 0 && (\n <Box flexDirection=\"column\" marginLeft={2}>\n {changes.map((change, idx) => (\n <Box key={`${change.todoId}-${idx}`}>\n <TodoChangeLine change={change} />\n </Box>\n ))}\n </Box>\n )}\n\n {/* Summary statistics */}\n <Box\n flexDirection=\"row\"\n marginLeft={2}\n marginTop={changes.length > 0 ? 1 : 0}\n >\n <Text color={theme.dim}>\n {stats.pending} pending \u00B7 {stats.inProgress} in progress \u00B7{' '}\n {stats.completed} completed\n </Text>\n </Box>\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAYA,SAAS,KAAK,YAAY;AAC1B,OAAO,WAAW;AAGlB,SAAS,sBAAsB;AAC/B,SAAS,gBAAgB;AAWlB,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA,SAAS;AACX,GAAyB;AACvB,QAAM,QAAQ,SAAS;AAGvB,QAAM,QAAQ;AAAA,IACZ,SAAS,MAAM,OAAO,OAAK,EAAE,WAAW,SAAS,EAAE;AAAA,IACnD,YAAY,MAAM,OAAO,OAAK,EAAE,WAAW,aAAa,EAAE;AAAA,IAC1D,WAAW,MAAM,OAAO,OAAK,EAAE,WAAW,WAAW,EAAE;AAAA,EACzD;AAEA,SACE,oCAAC,OAAI,eAAc,UAAS,YAAY,SAAS,KAE/C,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,MAAM,SAAO,YAAG,GAC7B,oCAAC,YAAK,mBAAiB,CACzB,GAGC,QAAQ,SAAS,KAChB,oCAAC,OAAI,eAAc,UAAS,YAAY,KACrC,QAAQ,IAAI,CAAC,QAAQ,QACpB,oCAAC,OAAI,KAAK,GAAG,OAAO,MAAM,IAAI,GAAG,MAC/B,oCAAC,kBAAe,QAAgB,CAClC,CACD,CACH,GAIF;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,YAAY;AAAA,MACZ,WAAW,QAAQ,SAAS,IAAI,IAAI;AAAA;AAAA,IAEpC,oCAAC,QAAK,OAAO,MAAM,OAChB,MAAM,SAAQ,kBAAY,MAAM,YAAW,qBAAe,KAC1D,MAAM,WAAU,YACnB;AAAA,EACF,CACF;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Box, Text } from "ink";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { getTheme } from "../utils/theme.js";
|
|
4
|
+
function TodoChangeLine({ change }) {
|
|
5
|
+
const theme = getTheme();
|
|
6
|
+
switch (change.type) {
|
|
7
|
+
case "added":
|
|
8
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "+ "), /* @__PURE__ */ React.createElement(Text, null, change.newValue?.content));
|
|
9
|
+
case "removed":
|
|
10
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "- "), /* @__PURE__ */ React.createElement(Text, { strikethrough: true, color: theme.dim }, change.oldValue?.content));
|
|
11
|
+
case "status_changed":
|
|
12
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.brand }, "\u2713 "), /* @__PURE__ */ React.createElement(Text, null, change.newValue?.content), /* @__PURE__ */ React.createElement(Text, { color: theme.dim }, " ", "(", change.oldValue?.status, " \u2192 ", change.newValue?.status, ")"));
|
|
13
|
+
case "updated":
|
|
14
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.info }, "~ "), /* @__PURE__ */ React.createElement(Text, null, change.newValue?.content), change.oldValue?.priority !== change.newValue?.priority && /* @__PURE__ */ React.createElement(Text, { color: theme.dim }, " ", "(priority: ", change.oldValue?.priority, " \u2192", " ", change.newValue?.priority, ")"));
|
|
15
|
+
default:
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export {
|
|
20
|
+
TodoChangeLine
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=TodoChangeLine.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/TodoChangeLine.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * TodoChangeLine - Renders individual Todo changes\n *\n * Handles:\n * - 'added' (green +)\n * - 'removed' (red -)\n * - 'status_changed' (blue \u2713)\n * - 'updated' (default style)\n *\n * Shows old \u2192 new status for status changes\n * Uses strikethrough for removed items\n */\n\nimport { Box, Text } from 'ink'\nimport React from 'react'\nimport type { TodoChange } from '@utils/todoChangeCalculator'\nimport { getTheme } from '@utils/theme'\n\ninterface TodoChangeLineProps {\n change: TodoChange\n}\n\nexport function TodoChangeLine({ change }: TodoChangeLineProps) {\n const theme = getTheme()\n\n switch (change.type) {\n case 'added':\n return (\n <Box flexDirection=\"row\">\n <Text color={theme.success}>+ </Text>\n <Text>{change.newValue?.content}</Text>\n </Box>\n )\n\n case 'removed':\n return (\n <Box flexDirection=\"row\">\n <Text color={theme.error}>- </Text>\n <Text strikethrough color={theme.dim}>\n {change.oldValue?.content}\n </Text>\n </Box>\n )\n\n case 'status_changed':\n return (\n <Box flexDirection=\"row\">\n <Text color={theme.brand}>\u2713 </Text>\n <Text>{change.newValue?.content}</Text>\n <Text color={theme.dim}>\n {' '}\n ({change.oldValue?.status} \u2192 {change.newValue?.status})\n </Text>\n </Box>\n )\n\n case 'updated':\n return (\n <Box flexDirection=\"row\">\n <Text color={theme.info}>~ </Text>\n <Text>{change.newValue?.content}</Text>\n {change.oldValue?.priority !== change.newValue?.priority && (\n <Text color={theme.dim}>\n {' '}\n (priority: {change.oldValue?.priority} \u2192{' '}\n {change.newValue?.priority})\n </Text>\n )}\n </Box>\n )\n\n default:\n return null\n }\n}\n"],
|
|
5
|
+
"mappings": "AAaA,SAAS,KAAK,YAAY;AAC1B,OAAO,WAAW;AAElB,SAAS,gBAAgB;AAMlB,SAAS,eAAe,EAAE,OAAO,GAAwB;AAC9D,QAAM,QAAQ,SAAS;AAEvB,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,MAAM,WAAS,IAAE,GAC9B,oCAAC,YAAM,OAAO,UAAU,OAAQ,CAClC;AAAA,IAGJ,KAAK;AACH,aACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,MAAM,SAAO,IAAE,GAC5B,oCAAC,QAAK,eAAa,MAAC,OAAO,MAAM,OAC9B,OAAO,UAAU,OACpB,CACF;AAAA,IAGJ,KAAK;AACH,aACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,MAAM,SAAO,SAAE,GAC5B,oCAAC,YAAM,OAAO,UAAU,OAAQ,GAChC,oCAAC,QAAK,OAAO,MAAM,OAChB,KAAI,KACH,OAAO,UAAU,QAAO,YAAI,OAAO,UAAU,QAAO,GACxD,CACF;AAAA,IAGJ,KAAK;AACH,aACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,MAAM,QAAM,IAAE,GAC3B,oCAAC,YAAM,OAAO,UAAU,OAAQ,GAC/B,OAAO,UAAU,aAAa,OAAO,UAAU,YAC9C,oCAAC,QAAK,OAAO,MAAM,OAChB,KAAI,eACO,OAAO,UAAU,UAAS,WAAG,KACxC,OAAO,UAAU,UAAS,GAC7B,CAEJ;AAAA,IAGJ;AACE,aAAO;AAAA,EACX;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
const TodoItem = ({ todo, children }) => {
|
|
4
|
+
const statusIconMap = {
|
|
5
|
+
completed: "\u2705",
|
|
6
|
+
in_progress: "\u{1F504}",
|
|
7
|
+
pending: "\u23F8\uFE0F"
|
|
8
|
+
};
|
|
9
|
+
const statusColorMap = {
|
|
10
|
+
completed: "#008000",
|
|
11
|
+
in_progress: "#FFA500",
|
|
12
|
+
pending: "#FFD700"
|
|
13
|
+
};
|
|
14
|
+
const priorityIconMap = {
|
|
15
|
+
high: "\u{1F534}",
|
|
16
|
+
medium: "\u{1F7E1}",
|
|
17
|
+
low: "\u{1F7E2}"
|
|
18
|
+
};
|
|
19
|
+
const icon = statusIconMap[todo.status];
|
|
20
|
+
const color = statusColorMap[todo.status];
|
|
21
|
+
const priorityIcon = todo.priority ? priorityIconMap[todo.priority] : "";
|
|
22
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ React.createElement(Text, { color }, icon), priorityIcon && /* @__PURE__ */ React.createElement(Text, null, priorityIcon), /* @__PURE__ */ React.createElement(
|
|
23
|
+
Text,
|
|
24
|
+
{
|
|
25
|
+
color,
|
|
26
|
+
strikethrough: todo.status === "completed",
|
|
27
|
+
bold: todo.status === "in_progress"
|
|
28
|
+
},
|
|
29
|
+
todo.content
|
|
30
|
+
), children);
|
|
31
|
+
};
|
|
32
|
+
export {
|
|
33
|
+
TodoItem
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=TodoItem.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/TodoItem.tsx"],
|
|
4
|
+
"sourcesContent": ["import React from 'react'\nimport { Box, Text } from 'ink'\nimport type { TodoItem as TodoItemType } from '@utils/todoStorage'\n\nexport interface TodoItemProps {\n todo: TodoItemType\n children?: React.ReactNode\n}\n\nexport const TodoItem: React.FC<TodoItemProps> = ({ todo, children }) => {\n const statusIconMap = {\n completed: '\u2705',\n in_progress: '\uD83D\uDD04',\n pending: '\u23F8\uFE0F',\n }\n\n const statusColorMap = {\n completed: '#008000',\n in_progress: '#FFA500', \n pending: '#FFD700',\n }\n\n const priorityIconMap = {\n high: '\uD83D\uDD34',\n medium: '\uD83D\uDFE1',\n low: '\uD83D\uDFE2',\n }\n\n const icon = statusIconMap[todo.status]\n const color = statusColorMap[todo.status]\n const priorityIcon = todo.priority ? priorityIconMap[todo.priority] : ''\n\n return (\n <Box flexDirection=\"row\" gap={1}>\n <Text color={color}>{icon}</Text>\n {priorityIcon && <Text>{priorityIcon}</Text>}\n <Text \n color={color}\n strikethrough={todo.status === 'completed'}\n bold={todo.status === 'in_progress'}\n >\n {todo.content}\n </Text>\n {children}\n </Box>\n )\n}"],
|
|
5
|
+
"mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,YAAY;AAQnB,MAAM,WAAoC,CAAC,EAAE,MAAM,SAAS,MAAM;AACvE,QAAM,gBAAgB;AAAA,IACpB,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAEA,QAAM,iBAAiB;AAAA,IACrB,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAEA,QAAM,kBAAkB;AAAA,IACtB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK;AAAA,EACP;AAEA,QAAM,OAAO,cAAc,KAAK,MAAM;AACtC,QAAM,QAAQ,eAAe,KAAK,MAAM;AACxC,QAAM,eAAe,KAAK,WAAW,gBAAgB,KAAK,QAAQ,IAAI;AAEtE,SACE,oCAAC,OAAI,eAAc,OAAM,KAAK,KAC5B,oCAAC,QAAK,SAAe,IAAK,GACzB,gBAAgB,oCAAC,YAAM,YAAa,GACrC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,eAAe,KAAK,WAAW;AAAA,MAC/B,MAAM,KAAK,WAAW;AAAA;AAAA,IAErB,KAAK;AAAA,EACR,GACC,QACH;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|