@within-7/minto 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/agents/AgentsCommand.js +22 -24
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/context.js +2 -1
- package/dist/commands/context.js.map +2 -2
- package/dist/commands/export.js +2 -1
- package/dist/commands/export.js.map +2 -2
- package/dist/commands/mcp-interactive.js +7 -6
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/model.js +3 -2
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/permissions.js +4 -3
- package/dist/commands/permissions.js.map +2 -2
- package/dist/commands/plugin/AddMarketplaceForm.js +3 -2
- package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
- package/dist/commands/plugin/ConfirmDialog.js +2 -1
- package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
- package/dist/commands/plugin/ErrorView.js +2 -1
- package/dist/commands/plugin/ErrorView.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js +5 -4
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsManager.js +5 -4
- package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
- package/dist/commands/plugin/MainMenu.js +2 -1
- package/dist/commands/plugin/MainMenu.js.map +2 -2
- package/dist/commands/plugin/MarketplaceManager.js +5 -4
- package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
- package/dist/commands/plugin/MarketplaceSelector.js +4 -3
- package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
- package/dist/commands/plugin/PlaceholderScreen.js +3 -2
- package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
- package/dist/commands/plugin/PluginBrowser.js +6 -5
- package/dist/commands/plugin/PluginBrowser.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsInstall.js +5 -4
- package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsManage.js +4 -3
- package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
- package/dist/commands/plugin.js +16 -15
- package/dist/commands/plugin.js.map +2 -2
- package/dist/commands/sandbox.js +4 -3
- package/dist/commands/sandbox.js.map +2 -2
- package/dist/commands/setup.js +2 -1
- package/dist/commands/setup.js.map +2 -2
- package/dist/commands/status.js +2 -1
- package/dist/commands/status.js.map +2 -2
- package/dist/commands/undo.js +245 -0
- package/dist/commands/undo.js.map +7 -0
- package/dist/commands.js +2 -0
- package/dist/commands.js.map +2 -2
- package/dist/components/AgentThinkingBlock.js +1 -1
- package/dist/components/AgentThinkingBlock.js.map +2 -2
- package/dist/components/AsciiLogo.js +7 -8
- package/dist/components/AsciiLogo.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/QuestionView.js +2 -1
- package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
- package/dist/components/CollapsibleHint.js +2 -1
- package/dist/components/CollapsibleHint.js.map +2 -2
- package/dist/components/Config.js +3 -2
- package/dist/components/Config.js.map +2 -2
- package/dist/components/ConsoleOAuthFlow.js +2 -1
- package/dist/components/ConsoleOAuthFlow.js.map +2 -2
- package/dist/components/Cost.js +2 -1
- package/dist/components/Cost.js.map +2 -2
- package/dist/components/HeaderBar.js +13 -8
- package/dist/components/HeaderBar.js.map +2 -2
- package/dist/components/HistorySearchOverlay.js +4 -3
- package/dist/components/HistorySearchOverlay.js.map +2 -2
- package/dist/components/HotkeyHelpPanel.js +8 -11
- package/dist/components/HotkeyHelpPanel.js.map +2 -2
- package/dist/components/InvalidConfigDialog.js +2 -1
- package/dist/components/InvalidConfigDialog.js.map +2 -2
- package/dist/components/Logo.js +23 -67
- package/dist/components/Logo.js.map +2 -2
- package/dist/components/MCPServerApprovalDialog.js +2 -1
- package/dist/components/MCPServerApprovalDialog.js.map +2 -2
- package/dist/components/MCPServerDialogCopy.js +2 -1
- package/dist/components/MCPServerDialogCopy.js.map +2 -2
- package/dist/components/MCPServerMultiselectDialog.js +2 -1
- package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
- package/dist/components/MessageSelector.js +4 -3
- package/dist/components/MessageSelector.js.map +2 -2
- package/dist/components/ModeIndicator.js +2 -1
- package/dist/components/ModeIndicator.js.map +2 -2
- package/dist/components/ModelConfig.js +4 -3
- package/dist/components/ModelConfig.js.map +2 -2
- package/dist/components/ModelListManager.js +4 -3
- package/dist/components/ModelListManager.js.map +2 -2
- package/dist/components/ModelSelector/ModelSelector.js +26 -13
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/Onboarding.js +3 -2
- package/dist/components/Onboarding.js.map +2 -2
- package/dist/components/OperationSummary.js +130 -0
- package/dist/components/OperationSummary.js.map +7 -0
- package/dist/components/PromptInput.js +88 -75
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/SensitiveFileWarning.js +31 -0
- package/dist/components/SensitiveFileWarning.js.map +7 -0
- package/dist/components/Spinner.js +71 -22
- package/dist/components/Spinner.js.map +2 -2
- package/dist/components/StructuredDiff.js +6 -8
- package/dist/components/StructuredDiff.js.map +2 -2
- package/dist/components/SubagentBlock.js +4 -2
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/SubagentProgress.js +7 -4
- package/dist/components/SubagentProgress.js.map +2 -2
- package/dist/components/TaskCard.js +14 -11
- package/dist/components/TaskCard.js.map +2 -2
- package/dist/components/TextInput.js +9 -1
- package/dist/components/TextInput.js.map +2 -2
- package/dist/components/TodoPanel.js +44 -26
- package/dist/components/TodoPanel.js.map +2 -2
- package/dist/components/ToolUseLoader.js +2 -2
- package/dist/components/ToolUseLoader.js.map +2 -2
- package/dist/components/TreeConnector.js +4 -3
- package/dist/components/TreeConnector.js.map +2 -2
- package/dist/components/TrustDialog.js +2 -1
- package/dist/components/TrustDialog.js.map +2 -2
- package/dist/components/binary-feedback/BinaryFeedbackView.js +2 -1
- package/dist/components/binary-feedback/BinaryFeedbackView.js.map +2 -2
- package/dist/components/messages/AssistantTextMessage.js +17 -9
- package/dist/components/messages/AssistantTextMessage.js.map +2 -2
- package/dist/components/messages/AssistantToolUseMessage.js +8 -4
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/components/messages/GroupRenderer.js +2 -1
- package/dist/components/messages/GroupRenderer.js.map +2 -2
- package/dist/components/messages/NestedTasksPreview.js +13 -1
- package/dist/components/messages/NestedTasksPreview.js.map +2 -2
- package/dist/components/messages/ParallelTasksGroupView.js +4 -3
- package/dist/components/messages/ParallelTasksGroupView.js.map +2 -2
- package/dist/components/messages/TaskInModuleView.js +35 -15
- package/dist/components/messages/TaskInModuleView.js.map +2 -2
- package/dist/components/messages/TaskOutputContent.js +9 -6
- package/dist/components/messages/TaskOutputContent.js.map +2 -2
- package/dist/components/messages/UserPromptMessage.js +2 -2
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/constants/colors.js +90 -72
- package/dist/constants/colors.js.map +2 -2
- package/dist/constants/toolInputExamples.js +84 -0
- package/dist/constants/toolInputExamples.js.map +7 -0
- package/dist/core/backupManager.js +321 -0
- package/dist/core/backupManager.js.map +7 -0
- package/dist/core/costTracker.js +9 -18
- package/dist/core/costTracker.js.map +2 -2
- package/dist/core/gitAutoCommit.js +287 -0
- package/dist/core/gitAutoCommit.js.map +7 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +2 -2
- package/dist/core/operationTracker.js +212 -0
- package/dist/core/operationTracker.js.map +7 -0
- package/dist/core/permissions/rules/allowedToolsRule.js +1 -1
- package/dist/core/permissions/rules/allowedToolsRule.js.map +2 -2
- package/dist/core/permissions/rules/autoEscalationRule.js +5 -0
- package/dist/core/permissions/rules/autoEscalationRule.js.map +2 -2
- package/dist/core/permissions/rules/projectBoundaryRule.js +5 -0
- package/dist/core/permissions/rules/projectBoundaryRule.js.map +2 -2
- package/dist/core/permissions/rules/sensitivePathsRule.js +5 -0
- package/dist/core/permissions/rules/sensitivePathsRule.js.map +2 -2
- package/dist/core/tokenStats.js +9 -0
- package/dist/core/tokenStats.js.map +7 -0
- package/dist/core/tokenStatsManager.js +331 -0
- package/dist/core/tokenStatsManager.js.map +7 -0
- package/dist/entrypoints/cli.js +115 -87
- package/dist/entrypoints/cli.js.map +2 -2
- package/dist/hooks/useAgentTokenStats.js +72 -0
- package/dist/hooks/useAgentTokenStats.js.map +7 -0
- package/dist/hooks/useAgentTranscripts.js +30 -6
- package/dist/hooks/useAgentTranscripts.js.map +2 -2
- package/dist/hooks/useLogMessages.js +12 -1
- package/dist/hooks/useLogMessages.js.map +2 -2
- package/dist/i18n/locales/en.js +6 -5
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.js +6 -5
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/i18n/types.js.map +1 -1
- package/dist/permissions.js +28 -1
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +78 -4
- package/dist/query.js.map +3 -3
- package/dist/screens/REPL.js +23 -3
- package/dist/screens/REPL.js.map +2 -2
- package/dist/services/claude.js +54 -3
- package/dist/services/claude.js.map +2 -2
- package/dist/services/intelligentCompactor.js +1 -1
- package/dist/services/intelligentCompactor.js.map +2 -2
- package/dist/services/mcpClient.js +81 -25
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/sandbox/filesystemBoundary.js +58 -17
- package/dist/services/sandbox/filesystemBoundary.js.map +2 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +3 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +2 -1
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
- package/dist/tools/BashTool/BashTool.js +22 -3
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/BashTool/prompt.js +178 -34
- package/dist/tools/BashTool/prompt.js.map +2 -2
- package/dist/tools/FileEditTool/prompt.js +6 -3
- package/dist/tools/FileEditTool/prompt.js.map +2 -2
- package/dist/tools/FileWriteTool/prompt.js +4 -2
- package/dist/tools/FileWriteTool/prompt.js.map +2 -2
- package/dist/tools/MultiEditTool/prompt.js +5 -3
- package/dist/tools/MultiEditTool/prompt.js.map +2 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -1
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +3 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +3 -2
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/prompt.js +1 -1
- package/dist/tools/PlanModeTool/prompt.js.map +1 -1
- package/dist/tools/SkillTool/SkillTool.js +4 -3
- package/dist/tools/SkillTool/SkillTool.js.map +2 -2
- package/dist/tools/SkillTool/prompt.js +1 -1
- package/dist/tools/SkillTool/prompt.js.map +1 -1
- package/dist/tools/TaskOutputTool/TaskOutputTool.js +3 -2
- package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +2 -2
- package/dist/tools/TaskTool/TaskTool.js +8 -0
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/utils/CircuitBreaker.js +242 -0
- package/dist/utils/CircuitBreaker.js.map +7 -0
- package/dist/utils/ask.js +2 -0
- package/dist/utils/ask.js.map +2 -2
- package/dist/utils/config.js +47 -5
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/credentials/CredentialStore.js +1 -0
- package/dist/utils/credentials/CredentialStore.js.map +7 -0
- package/dist/utils/credentials/EncryptedFileStore.js +157 -0
- package/dist/utils/credentials/EncryptedFileStore.js.map +7 -0
- package/dist/utils/credentials/index.js +37 -0
- package/dist/utils/credentials/index.js.map +7 -0
- package/dist/utils/credentials/migration.js +82 -0
- package/dist/utils/credentials/migration.js.map +7 -0
- package/dist/utils/markdown.js +13 -1
- package/dist/utils/markdown.js.map +2 -2
- package/dist/utils/permissions/filesystem.js +5 -1
- package/dist/utils/permissions/filesystem.js.map +2 -2
- package/dist/utils/safePath.js +132 -0
- package/dist/utils/safePath.js.map +7 -0
- package/dist/utils/sensitiveFiles.js +125 -0
- package/dist/utils/sensitiveFiles.js.map +7 -0
- package/dist/utils/taskDisplayUtils.js +9 -9
- package/dist/utils/taskDisplayUtils.js.map +2 -2
- package/dist/utils/theme.js +6 -6
- package/dist/utils/theme.js.map +1 -1
- package/dist/utils/toolRiskClassification.js +207 -0
- package/dist/utils/toolRiskClassification.js.map +7 -0
- package/dist/utils/tooling/safeRender.js +5 -4
- package/dist/utils/tooling/safeRender.js.map +2 -2
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +9 -7
- package/dist/hooks/useCancelRequest.js +0 -31
- package/dist/hooks/useCancelRequest.js.map +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/messages/TaskInModuleView.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Task In Module View\n *\n * Renders a single Task within a parallel module or standalone.\n * Supports intermediate state display and final output embedding.\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport type { AgentTranscript } from '@utils/agentTranscripts'\nimport type { DisplayConfig } from '@minto-types/messageGroup'\nimport { ToolUseLoader } from '@components/ToolUseLoader'\nimport { TreeContinuation } from '@components/TreeConnector'\nimport { TaskToolMessage } from './TaskToolMessage'\nimport {\n getTaskDisplayContent,\n getStatusIcon,\n getStatusColor,\n getToolUseHistoryForDisplay,\n getToolDisplayName,\n truncate,\n formatMetaInfo,\n type MetaInfo,\n} from '@utils/taskDisplayUtils'\nimport { formatDuration } from '@utils/format'\nimport { NestedTasksPreview } from './NestedTasksPreview'\nimport { TaskOutputContent, TaskOutputSummary } from './TaskOutputContent'\nimport { CollapsibleHint } from '@components/CollapsibleHint'\nimport { formatStats, formatCount } from '@constants/formatRules'\nimport { SYMBOLS } from '@constants/symbols'\nimport {\n SEMANTIC_COLORS,\n STATUS_COLORS,\n VALUE_TIER_COLORS,\n} from '@constants/colors'\n\n/**\n * Format token count with K suffix for readability\n */\nfunction formatTokens(count: number): string {\n if (count >= 1000) {\n return `${(count / 1000).toFixed(1)}k`\n }\n return String(count)\n}\n\n/**\n * Tool Use History Display Component\n *\n * Displays tool use history for completed tasks.\n * - Normal mode: Shows recent N tools with truncated descriptions\n * - Verbose mode: Shows all tools with longer descriptions\n */\ninterface ToolUseHistoryDisplayProps {\n transcript: AgentTranscript\n config: DisplayConfig\n inModule: boolean\n isLastInModule: boolean\n /** When true, forces all tools to show as completed (not executing) */\n isTaskCompleted?: boolean\n}\n\nfunction ToolUseHistoryDisplay({\n transcript,\n config,\n inModule,\n isLastInModule,\n isTaskCompleted = false,\n}: ToolUseHistoryDisplayProps): React.ReactNode {\n const { tools: rawTools, hiddenCount } = getToolUseHistoryForDisplay(\n transcript,\n config,\n )\n\n // When task is completed, force all tools to show as not executing\n // This prevents color flashing due to race conditions in transcript updates\n const tools = isTaskCompleted\n ? rawTools.map(tool => ({ ...tool, isExecuting: false }))\n : rawTools\n\n // Don't render if no tools\n if (tools.length === 0) {\n return null\n }\n\n // Determine max chars for description based on mode\n const maxDescChars = config.showAllChildren\n ? config.maxCharsPerChild // verbose: 200 chars\n : config.maxCharsWithoutChildren // normal: 80 chars\n\n // Helper to render a row with proper tree continuation\n const renderRow = (key: string, content: React.ReactNode) => (\n <Box key={key} flexDirection=\"row\">\n {inModule && <TreeContinuation parentIsLast={isLastInModule} />}\n {!inModule && <Box minWidth={4} />}\n {content}\n </Box>\n )\n\n return (\n <Box flexDirection=\"column\">\n {/* Hidden count indicator */}\n {hiddenCount > 0 &&\n renderRow(\n 'hidden-count',\n <Text dimColor>... {hiddenCount} earlier tools hidden</Text>,\n )}\n {/* Tool list - each tool gets its own row with tree continuation */}\n {tools.map(tool => {\n const displayName = getToolDisplayName(tool.name)\n const description = truncate(tool.description, maxDescChars)\n return renderRow(\n tool.id,\n <Box flexDirection=\"row\">\n {/* \u4F7F\u7528 REPL \u89C4\u8303\u5B9A\u4E49\u7684\u7B26\u53F7\uFF1A\u6267\u884C\u4E2D \u25D0\uFF0C\u5B8C\u6210 \u23BF */}\n {tool.isExecuting ? (\n <Text color={SEMANTIC_COLORS.running}>\n {SYMBOLS.TOOL_RUNNING}{' '}\n </Text>\n ) : (\n <Text color={SEMANTIC_COLORS.dim}>{SYMBOLS.CHILD_OUTPUT} </Text>\n )}\n {/* \u5DE5\u5177\u540D\u4F7F\u7528 secondary \u8272\uFF0C\u53C2\u6570\u4F7F\u7528 dim \u8272 */}\n <Text\n color={\n tool.isExecuting\n ? SEMANTIC_COLORS.running\n : SEMANTIC_COLORS.secondary\n }\n >\n {displayName}\n </Text>\n {description && (\n <Text\n color={\n tool.isExecuting\n ? SEMANTIC_COLORS.running\n : SEMANTIC_COLORS.dim\n }\n >\n ({description})\n </Text>\n )}\n {tool.isExecuting && (\n <Text color={SEMANTIC_COLORS.running}>\n {SYMBOLS.SUFFIX_RUNNING}\n </Text>\n )}\n </Box>,\n )\n })}\n </Box>\n )\n}\n\ninterface Props {\n /** Tool use ID of this task */\n toolUseId: string\n /** Task description */\n description: string\n /** Agent type */\n agentType: string\n /** Transcript if available */\n transcript: AgentTranscript | null\n /** Output if completed */\n output: ToolResultBlockParam | null\n /** Display configuration */\n config: DisplayConfig\n /** Whether to animate */\n shouldAnimate: boolean\n /** Whether this is inside a parallel module */\n inModule?: boolean\n /** Whether this is the last item in the module (for tree continuation lines) */\n isLastInModule?: boolean\n}\n\nexport function TaskInModuleView({\n toolUseId,\n description,\n agentType,\n transcript,\n output,\n config,\n shouldAnimate,\n inModule = false,\n isLastInModule = false,\n}: Props): React.ReactNode {\n // Determine completion status: use transcript status if available, or check if output exists\n const transcriptStatus = transcript?.status || 'pending'\n // If output exists but transcript shows pending, the task is actually completed\n const status =\n output && transcriptStatus === 'pending' ? 'completed' : transcriptStatus\n const statusIcon = getStatusIcon(status)\n const statusColor = getStatusColor(status)\n\n // Get display content for intermediate state\n const displayContent = transcript\n ? getTaskDisplayContent(transcript, config)\n : null\n\n const isCompleted = status === 'completed' || !!output\n const isError = status === 'failed'\n const isRunning = status === 'running'\n\n // Real-time elapsed time counter for running tasks\n const [elapsedMs, setElapsedMs] = useState(() => {\n if (transcript?.startTime && isRunning) {\n return Date.now() - transcript.startTime\n }\n return 0\n })\n\n useEffect(() => {\n if (!isRunning || !transcript?.startTime) {\n return\n }\n\n // Update elapsed time every second\n const interval = setInterval(() => {\n setElapsedMs(Date.now() - transcript.startTime)\n }, 1000)\n\n return () => clearInterval(interval)\n }, [isRunning, transcript?.startTime])\n\n // Calculate duration for display\n const getDurationDisplay = (): string | null => {\n if (!transcript) return null\n if (transcript.endTime && transcript.startTime) {\n return formatDuration(transcript.endTime - transcript.startTime)\n }\n if (isRunning && transcript.startTime) {\n // Use real-time elapsed time for running tasks\n return formatDuration(elapsedMs)\n }\n return null\n }\n\n const duration = getDurationDisplay()\n const totalTokens = transcript\n ? transcript.tokenUsage.inputTokens + transcript.tokenUsage.outputTokens\n : 0\n\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n {/* Task header with inline stats for completed tasks */}\n <Box flexDirection=\"row\">\n {!inModule && (\n <ToolUseLoader\n shouldAnimate={shouldAnimate && !isCompleted}\n isUnresolved={!isCompleted}\n isError={isError}\n />\n )}\n {inModule && <Text color={statusColor}>{statusIcon} </Text>}\n <TaskToolMessage\n agentType={agentType}\n bold={true}\n children={description}\n />\n {/* Inline stats for completed tasks in module */}\n {inModule && isCompleted && transcript && (\n <>\n {config.showMetaInfo ? (\n // Verbose mode: \u4F7F\u7528 formatMetaInfo \u663E\u793A \"\u8017\u65F6 \u00B7 \u6A21\u578B \u00B7 \u65F6\u95F4\"\n <Text color={VALUE_TIER_COLORS.meta}>\n {' '}\n (\n {formatMetaInfo({\n duration: transcript.endTime\n ? transcript.endTime - transcript.startTime\n : undefined,\n model: transcript.model,\n timestamp: transcript.endTime,\n })}\n {transcript.toolUseCount > 0 &&\n ` \u00B7 ${formatCount(transcript.toolUseCount, 'tool')}`}\n )\n </Text>\n ) : (\n // Normal mode: \u7B80\u6D01\u663E\u793A\n <Text dimColor>\n {' '}\n (\n {formatStats([\n formatCount(transcript.toolUseCount, 'tool'),\n `${formatTokens(totalTokens)} tokens`,\n duration,\n ])}\n )\n </Text>\n )}\n </>\n )}\n {/* Running indicator with elapsed time, tokens, and model */}\n {inModule && status === 'running' && transcript && (\n <Text color={VALUE_TIER_COLORS.meta}>\n {' '}\n (\n {config.showMetaInfo\n ? formatMetaInfo({\n model: transcript.model,\n timestamp: Date.now(),\n })\n : formatStats([\n transcript.toolUseCount > 0\n ? formatCount(transcript.toolUseCount, 'tool')\n : null,\n duration,\n // Show output tokens with \u2193 indicator (tokens being received)\n transcript.tokenUsage.outputTokens > 0\n ? `\u2193 ${formatTokens(transcript.tokenUsage.outputTokens)} tokens`\n : null,\n ])}\n )\n </Text>\n )}\n {/* Agent ID for non-module view */}\n {!inModule && transcript && (\n <Text dimColor> [{transcript.agentId.slice(0, 8)}]</Text>\n )}\n </Box>\n\n {/* Detailed metadata row for non-module view */}\n {!inModule && transcript && (\n <Box marginLeft={4}>\n {config.showMetaInfo ? (\n // Verbose mode: \u4F7F\u7528\u5143\u4FE1\u606F\u683C\u5F0F \"\u8017\u65F6 \u00B7 \u6A21\u578B \u00B7 \u65F6\u95F4\"\n <Text color={VALUE_TIER_COLORS.meta}>\n {status === 'completed' ? '\u2713' : '\u22EF'}{' '}\n {formatMetaInfo({\n duration: transcript.endTime\n ? transcript.endTime - transcript.startTime\n : undefined,\n model: transcript.model,\n timestamp: transcript.endTime || Date.now(),\n })}\n {' \u00B7 '}Tools: {transcript.toolUseCount} \u00B7 Tokens:{' '}\n {formatTokens(totalTokens)}\n </Text>\n ) : (\n // Normal mode: \u7B80\u6D01\u663E\u793A\n <Text dimColor>\n {status === 'completed' ? '\u2713' : '\u22EF'} Tools:{' '}\n {transcript.toolUseCount} | Tokens: {formatTokens(totalTokens)}\n {duration ? ` | ${duration}` : ''}\n </Text>\n )}\n </Box>\n )}\n\n {/* Tool use history - show in BOTH running and completed states for real-time visibility */}\n {transcript && (\n <ToolUseHistoryDisplay\n transcript={transcript}\n config={config}\n inModule={inModule}\n isLastInModule={isLastInModule}\n isTaskCompleted={isCompleted}\n />\n )}\n\n {/* Nested tasks preview (when running and has nested tasks) */}\n {displayContent &&\n status === 'running' &&\n displayContent.type === 'nested' && (\n <Box flexDirection=\"row\">\n {inModule && <TreeContinuation parentIsLast={isLastInModule} />}\n {!inModule && <Box minWidth={4} />}\n <Box>\n <NestedTasksPreview\n tasks={displayContent.children || []}\n hiddenCount={displayContent.hiddenCount || 0}\n />\n </Box>\n </Box>\n )}\n\n {/* Final output (when completed) - respects verbose/normal mode */}\n {output && isCompleted && (\n <Box flexDirection=\"row\">\n {/* Show tree continuation line when in module */}\n {inModule && <TreeContinuation parentIsLast={isLastInModule} />}\n {!inModule && <Box minWidth={4} />}\n <Box flexDirection=\"column\">\n {config.showAllChildren ? (\n // Verbose mode: show full output with header\n <>\n <Text dimColor>Output \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500</Text>\n <Box marginLeft={2}>\n <TaskOutputContent content={output.content} />\n </Box>\n </>\n ) : (\n // Normal mode: show compact summary with expand hint\n <Box flexDirection=\"row\">\n <TaskOutputSummary\n content={output.content}\n maxChars={config.maxCharsWithoutChildren}\n />\n <CollapsibleHint canExpand={true} />\n </Box>\n )}\n </Box>\n </Box>\n )}\n </Box>\n )\n}\n"],
|
|
5
|
-
"mappings": "AAOA,OAAO,SAAS,UAAU,iBAAiB;AAC3C,SAAS,KAAK,YAAY;AAI1B,SAAS,qBAAqB;AAC9B,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,sBAAsB;AAC/B,SAAS,0BAA0B;AACnC,SAAS,mBAAmB,yBAAyB;AACrD,SAAS,uBAAuB;AAChC,SAAS,aAAa,mBAAmB;AACzC,SAAS,eAAe;AACxB;AAAA,EACE;AAAA,EAEA;AAAA,OACK;AAKP,SAAS,aAAa,OAAuB;AAC3C,MAAI,SAAS,KAAM;AACjB,WAAO,IAAI,QAAQ,KAAM,QAAQ,CAAC,CAAC;AAAA,EACrC;AACA,SAAO,OAAO,KAAK;AACrB;AAkBA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AACpB,GAAgD;AAC9C,QAAM,EAAE,OAAO,UAAU,YAAY,IAAI;AAAA,IACvC;AAAA,IACA;AAAA,EACF;AAIA,QAAM,QAAQ,kBACV,SAAS,IAAI,WAAS,EAAE,GAAG,MAAM,aAAa,MAAM,EAAE,IACtD;AAGJ,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAGA,QAAM,eAAe,OAAO,kBACxB,OAAO,mBACP,OAAO;AAGX,QAAM,YAAY,CAAC,KAAa,YAC9B,oCAAC,OAAI,KAAU,eAAc,SAC1B,YAAY,oCAAC,oBAAiB,cAAc,gBAAgB,GAC5D,CAAC,YAAY,oCAAC,OAAI,UAAU,GAAG,GAC/B,OACH;AAGF,SACE,oCAAC,OAAI,eAAc,YAEhB,cAAc,KACb;AAAA,IACE;AAAA,IACA,oCAAC,QAAK,
|
|
4
|
+
"sourcesContent": ["/**\n * Task In Module View\n *\n * Renders a single Task within a parallel module or standalone.\n * Supports intermediate state display and final output embedding.\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport type { AgentTranscript } from '@utils/agentTranscripts'\nimport type { DisplayConfig } from '@minto-types/messageGroup'\nimport { ToolUseLoader } from '@components/ToolUseLoader'\nimport { TreeContinuation } from '@components/TreeConnector'\nimport { TaskToolMessage } from './TaskToolMessage'\nimport {\n getTaskDisplayContent,\n getStatusIcon,\n getStatusColor,\n getToolUseHistoryForDisplay,\n getToolDisplayName,\n truncate,\n formatMetaInfo,\n type MetaInfo,\n} from '@utils/taskDisplayUtils'\nimport { formatDuration } from '@utils/format'\nimport { NestedTasksPreview } from './NestedTasksPreview'\nimport { TaskOutputContent, TaskOutputSummary } from './TaskOutputContent'\nimport { CollapsibleHint } from '@components/CollapsibleHint'\nimport { formatStats, formatCount } from '@constants/formatRules'\nimport { SYMBOLS } from '@constants/symbols'\nimport {\n SEMANTIC_COLORS,\n STATUS_COLORS,\n VALUE_TIER_COLORS,\n SYMBOL_COLORS,\n} from '@constants/colors'\n\n/**\n * Format token count with K suffix for readability\n */\nfunction formatTokens(count: number): string {\n if (count >= 1000) {\n return `${(count / 1000).toFixed(1)}k`\n }\n return String(count)\n}\n\n/**\n * Format bidirectional token usage: \u2191input \u2193output\n * Uses compact format without spaces: \u21911.2k \u2193329\n * Distinguishes from global stats which use the spaced format: \u2191 1.2k \u00B7 \u2193 329\n */\nfunction formatBidirectionalTokens(\n inputTokens: number,\n outputTokens: number,\n): string {\n const parts: string[] = []\n if (inputTokens > 0) {\n parts.push(`\u2191${formatTokens(inputTokens)}`)\n }\n if (outputTokens > 0) {\n parts.push(`\u2193${formatTokens(outputTokens)}`)\n }\n return parts.join(' ')\n}\n\n/**\n * Tool Use History Display Component\n *\n * Displays tool use history for completed tasks.\n * - Normal mode: Shows recent N tools with truncated descriptions\n * - Verbose mode: Shows all tools with longer descriptions\n */\ninterface ToolUseHistoryDisplayProps {\n transcript: AgentTranscript\n config: DisplayConfig\n inModule: boolean\n isLastInModule: boolean\n /** When true, forces all tools to show as completed (not executing) */\n isTaskCompleted?: boolean\n}\n\nfunction ToolUseHistoryDisplay({\n transcript,\n config,\n inModule,\n isLastInModule,\n isTaskCompleted = false,\n}: ToolUseHistoryDisplayProps): React.ReactNode {\n const { tools: rawTools, hiddenCount } = getToolUseHistoryForDisplay(\n transcript,\n config,\n )\n\n // When task is completed, force all tools to show as not executing\n // This prevents color flashing due to race conditions in transcript updates\n const tools = isTaskCompleted\n ? rawTools.map(tool => ({ ...tool, isExecuting: false }))\n : rawTools\n\n // Don't render if no tools\n if (tools.length === 0) {\n return null\n }\n\n // Determine max chars for description based on mode\n const maxDescChars = config.showAllChildren\n ? config.maxCharsPerChild // verbose: 200 chars\n : config.maxCharsWithoutChildren // normal: 80 chars\n\n // Helper to render a row with proper tree continuation\n const renderRow = (key: string, content: React.ReactNode) => (\n <Box key={key} flexDirection=\"row\">\n {inModule && <TreeContinuation parentIsLast={isLastInModule} />}\n {!inModule && <Box minWidth={4} />}\n {content}\n </Box>\n )\n\n return (\n <Box flexDirection=\"column\">\n {/* Hidden count indicator */}\n {hiddenCount > 0 &&\n renderRow(\n 'hidden-count',\n <Text color={SEMANTIC_COLORS.dim}>\n ... {hiddenCount} earlier tools hidden\n </Text>,\n )}\n {/* Tool list - each tool gets its own row with tree continuation */}\n {tools.map(tool => {\n const displayName = getToolDisplayName(tool.name)\n const description = truncate(tool.description, maxDescChars)\n return renderRow(\n tool.id,\n <Box flexDirection=\"row\">\n {/* \u4F7F\u7528 SYMBOL_COLORS \u4E0E Logo \u54C1\u724C\u914D\u8272\u4FDD\u6301\u4E00\u81F4 */}\n {tool.isExecuting ? (\n <Text color={SYMBOL_COLORS.running}>{SYMBOLS.TOOL_RUNNING} </Text>\n ) : (\n <Text color={SYMBOL_COLORS.child}>{SYMBOLS.CHILD_OUTPUT} </Text>\n )}\n {/* \u5DE5\u5177\u540D\u4F7F\u7528 secondary \u8272\uFF0C\u53C2\u6570\u4F7F\u7528 dim \u8272 */}\n <Text\n color={\n tool.isExecuting\n ? SYMBOL_COLORS.running\n : SEMANTIC_COLORS.secondary\n }\n >\n {displayName}\n </Text>\n {description && (\n <Text\n color={\n tool.isExecuting ? SYMBOL_COLORS.running : SEMANTIC_COLORS.dim\n }\n >\n ({description})\n </Text>\n )}\n {tool.isExecuting && (\n <Text color={SYMBOL_COLORS.running}>\n {SYMBOLS.SUFFIX_RUNNING}\n </Text>\n )}\n </Box>,\n )\n })}\n </Box>\n )\n}\n\ninterface Props {\n /** Tool use ID of this task */\n toolUseId: string\n /** Task description */\n description: string\n /** Agent type */\n agentType: string\n /** Transcript if available */\n transcript: AgentTranscript | null\n /** Output if completed */\n output: ToolResultBlockParam | null\n /** Display configuration */\n config: DisplayConfig\n /** Whether to animate */\n shouldAnimate: boolean\n /** Whether this is inside a parallel module */\n inModule?: boolean\n /** Whether this is the last item in the module (for tree continuation lines) */\n isLastInModule?: boolean\n}\n\nexport function TaskInModuleView({\n toolUseId,\n description,\n agentType,\n transcript,\n output,\n config,\n shouldAnimate,\n inModule = false,\n isLastInModule = false,\n}: Props): React.ReactNode {\n // Determine completion status: use transcript status if available, or check if output exists\n const transcriptStatus = transcript?.status || 'pending'\n // If output exists but transcript shows pending, the task is actually completed\n const status =\n output && transcriptStatus === 'pending' ? 'completed' : transcriptStatus\n const statusIcon = getStatusIcon(status)\n const statusColor = getStatusColor(status)\n\n // Get display content for intermediate state\n const displayContent = transcript\n ? getTaskDisplayContent(transcript, config)\n : null\n\n const isCompleted = status === 'completed' || !!output\n const isError = status === 'failed'\n const isRunning = status === 'running'\n\n // Real-time elapsed time counter for running tasks\n const [elapsedMs, setElapsedMs] = useState(() => {\n if (transcript?.startTime && isRunning) {\n return Date.now() - transcript.startTime\n }\n return 0\n })\n\n useEffect(() => {\n if (!isRunning || !transcript?.startTime) {\n return\n }\n\n // Update elapsed time every second\n const interval = setInterval(() => {\n setElapsedMs(Date.now() - transcript.startTime)\n }, 1000)\n\n return () => clearInterval(interval)\n }, [isRunning, transcript?.startTime])\n\n // Calculate duration for display\n const getDurationDisplay = (): string | null => {\n if (!transcript) return null\n if (transcript.endTime && transcript.startTime) {\n return formatDuration(transcript.endTime - transcript.startTime)\n }\n if (isRunning && transcript.startTime) {\n // Use real-time elapsed time for running tasks\n return formatDuration(elapsedMs)\n }\n return null\n }\n\n const duration = getDurationDisplay()\n const totalTokens = transcript\n ? transcript.tokenUsage.inputTokens + transcript.tokenUsage.outputTokens\n : 0\n\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n {/* Task header with inline stats for completed tasks */}\n <Box flexDirection=\"row\">\n {!inModule && (\n <ToolUseLoader\n shouldAnimate={shouldAnimate && !isCompleted}\n isUnresolved={!isCompleted}\n isError={isError}\n />\n )}\n {inModule && <Text color={statusColor}>{statusIcon} </Text>}\n <TaskToolMessage\n agentType={agentType}\n bold={true}\n children={description}\n />\n {/* Inline stats for completed tasks in module */}\n {inModule && isCompleted && transcript && (\n <>\n {config.showMetaInfo ? (\n // Verbose mode: \u4F7F\u7528 formatMetaInfo \u663E\u793A \"\u8017\u65F6 \u00B7 \u6A21\u578B \u00B7 \u65F6\u95F4\"\n <Text color={VALUE_TIER_COLORS.meta}>\n {' '}\n (\n {formatMetaInfo({\n duration: transcript.endTime\n ? transcript.endTime - transcript.startTime\n : undefined,\n model: transcript.model,\n timestamp: transcript.endTime,\n })}\n {transcript.toolUseCount > 0 &&\n ` \u00B7 ${formatCount(transcript.toolUseCount, 'tool')}`}\n )\n </Text>\n ) : (\n // Normal mode: compact stats with bidirectional tokens\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n (\n {formatStats([\n formatCount(transcript.toolUseCount, 'tool'),\n formatBidirectionalTokens(\n transcript.tokenUsage.inputTokens,\n transcript.tokenUsage.outputTokens,\n ),\n duration,\n ])}\n )\n </Text>\n )}\n </>\n )}\n {/* Running indicator with elapsed time, tokens, and model */}\n {inModule && status === 'running' && transcript && (\n <Text color={VALUE_TIER_COLORS.meta}>\n {' '}\n (\n {config.showMetaInfo\n ? formatMetaInfo({\n model: transcript.model,\n timestamp: Date.now(),\n })\n : formatStats([\n transcript.toolUseCount > 0\n ? formatCount(transcript.toolUseCount, 'tool')\n : null,\n duration,\n // Show bidirectional tokens: \u2191input \u2193output\n formatBidirectionalTokens(\n transcript.tokenUsage.inputTokens,\n transcript.tokenUsage.outputTokens,\n ) || null,\n ])}\n )\n </Text>\n )}\n {/* Agent ID for non-module view */}\n {!inModule && transcript && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n [{transcript.agentId.slice(0, 8)}]\n </Text>\n )}\n </Box>\n\n {/* Detailed metadata row for non-module view */}\n {!inModule && transcript && (\n <Box marginLeft={4}>\n {config.showMetaInfo ? (\n // Verbose mode: \u4F7F\u7528\u5143\u4FE1\u606F\u683C\u5F0F \"\u8017\u65F6 \u00B7 \u6A21\u578B \u00B7 \u65F6\u95F4\"\n <Text color={VALUE_TIER_COLORS.meta}>\n {status === 'completed' ? '\u2713' : '\u22EF'}{' '}\n {formatMetaInfo({\n duration: transcript.endTime\n ? transcript.endTime - transcript.startTime\n : undefined,\n model: transcript.model,\n timestamp: transcript.endTime || Date.now(),\n })}\n {' \u00B7 '}Tools: {transcript.toolUseCount} \u00B7 Tokens:{' '}\n {formatTokens(totalTokens)}\n </Text>\n ) : (\n // Normal mode: compact display with bidirectional tokens\n <Text color={SEMANTIC_COLORS.dim}>\n {status === 'completed' ? '\u2713' : '\u22EF'} Tools:{' '}\n {transcript.toolUseCount} |{' '}\n {formatBidirectionalTokens(\n transcript.tokenUsage.inputTokens,\n transcript.tokenUsage.outputTokens,\n )}\n {duration ? ` | ${duration}` : ''}\n </Text>\n )}\n </Box>\n )}\n\n {/* Tool use history - show in BOTH running and completed states for real-time visibility */}\n {transcript && (\n <ToolUseHistoryDisplay\n transcript={transcript}\n config={config}\n inModule={inModule}\n isLastInModule={isLastInModule}\n isTaskCompleted={isCompleted}\n />\n )}\n\n {/* Nested tasks preview (when running and has nested tasks) */}\n {displayContent &&\n status === 'running' &&\n displayContent.type === 'nested' && (\n <Box flexDirection=\"row\">\n {inModule && <TreeContinuation parentIsLast={isLastInModule} />}\n {!inModule && <Box minWidth={4} />}\n <Box>\n <NestedTasksPreview\n tasks={displayContent.children || []}\n hiddenCount={displayContent.hiddenCount || 0}\n />\n </Box>\n </Box>\n )}\n\n {/* Final output (when completed) - respects verbose/normal mode */}\n {output && isCompleted && (\n <Box flexDirection=\"row\">\n {/* Show tree continuation line when in module */}\n {inModule && <TreeContinuation parentIsLast={isLastInModule} />}\n {!inModule && <Box minWidth={4} />}\n <Box flexDirection=\"column\">\n {config.showAllChildren ? (\n // Verbose mode: show full output with header\n <>\n <Text color={SEMANTIC_COLORS.dim}>\n Output \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n </Text>\n <Box marginLeft={2}>\n <TaskOutputContent content={output.content} />\n </Box>\n </>\n ) : (\n // Normal mode: show compact summary with expand hint\n <Box flexDirection=\"row\">\n <TaskOutputSummary\n content={output.content}\n maxChars={config.maxCharsWithoutChildren}\n />\n <CollapsibleHint canExpand={true} />\n </Box>\n )}\n </Box>\n </Box>\n )}\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,29 +1,32 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { Box, Text } from "ink";
|
|
3
3
|
import { PREVIEW_SEPARATOR } from "../../constants/formatRules.js";
|
|
4
|
+
import { SEMANTIC_COLORS, SYMBOL_COLORS } from "../../constants/colors.js";
|
|
5
|
+
import { applyMarkdown } from "../../utils/markdown.js";
|
|
4
6
|
function TaskOutputContent({
|
|
5
7
|
content
|
|
6
8
|
}) {
|
|
7
9
|
if (!content) {
|
|
8
|
-
return /* @__PURE__ */ React.createElement(Text, {
|
|
10
|
+
return /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "[No output]");
|
|
9
11
|
}
|
|
10
12
|
if (typeof content === "string") {
|
|
11
|
-
return /* @__PURE__ */ React.createElement(Text,
|
|
13
|
+
return /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, applyMarkdown(content));
|
|
12
14
|
}
|
|
13
15
|
if (Array.isArray(content)) {
|
|
14
16
|
const texts = content.filter(
|
|
15
17
|
(block) => block.type === "text"
|
|
16
18
|
).map((block) => block.text);
|
|
17
|
-
|
|
19
|
+
const combinedText = texts.join("\n\n");
|
|
20
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, applyMarkdown(combinedText)));
|
|
18
21
|
}
|
|
19
|
-
return /* @__PURE__ */ React.createElement(Text, {
|
|
22
|
+
return /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "[Unknown content format]");
|
|
20
23
|
}
|
|
21
24
|
function TaskOutputSummary({
|
|
22
25
|
content,
|
|
23
26
|
maxChars = 80
|
|
24
27
|
}) {
|
|
25
28
|
if (!content) {
|
|
26
|
-
return /* @__PURE__ */ React.createElement(Text, {
|
|
29
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: SYMBOL_COLORS.child }, "\u23BF "), /* @__PURE__ */ React.createElement(Text, { color: SYMBOL_COLORS.success }, "Done"));
|
|
27
30
|
}
|
|
28
31
|
let totalLength = 0;
|
|
29
32
|
let firstLine = "";
|
|
@@ -44,7 +47,7 @@ function TaskOutputSummary({
|
|
|
44
47
|
}
|
|
45
48
|
}
|
|
46
49
|
const truncatedPreview = firstLine.length > maxChars ? firstLine.substring(0, maxChars) + "..." : firstLine;
|
|
47
|
-
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, {
|
|
50
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: SYMBOL_COLORS.child }, "\u23BF "), /* @__PURE__ */ React.createElement(Text, { color: SYMBOL_COLORS.success }, "Done"), truncatedPreview && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, PREVIEW_SEPARATOR, truncatedPreview));
|
|
48
51
|
}
|
|
49
52
|
export {
|
|
50
53
|
TaskOutputContent,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/messages/TaskOutputContent.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Task Output Content Component\n *\n * Renders the content of a TaskOutput tool result.\n * Handles both string and array content formats.\n */\n\nimport React from 'react'\nimport { Box, Text } from 'ink'\nimport type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { PREVIEW_SEPARATOR, ABBREVIATIONS } from '@constants/formatRules'\n\ninterface TaskOutputContentProps {\n content: ToolResultBlockParam['content']\n}\n\nexport function TaskOutputContent({\n content,\n}: TaskOutputContentProps): React.ReactNode {\n if (!content) {\n return <Text
|
|
5
|
-
"mappings": "AAOA,OAAO,WAAW;AAClB,SAAS,KAAK,YAAY;AAE1B,SAAS,yBAAwC;
|
|
4
|
+
"sourcesContent": ["/**\n * Task Output Content Component\n *\n * Renders the content of a TaskOutput tool result with Markdown support.\n * Handles both string and array content formats.\n */\n\nimport React from 'react'\nimport { Box, Text } from 'ink'\nimport type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { PREVIEW_SEPARATOR, ABBREVIATIONS } from '@constants/formatRules'\nimport { SEMANTIC_COLORS, SYMBOL_COLORS } from '@constants/colors'\nimport { applyMarkdown } from '@utils/markdown'\n\ninterface TaskOutputContentProps {\n content: ToolResultBlockParam['content']\n}\n\nexport function TaskOutputContent({\n content,\n}: TaskOutputContentProps): React.ReactNode {\n if (!content) {\n return <Text color={SEMANTIC_COLORS.dim}>[No output]</Text>\n }\n\n if (typeof content === 'string') {\n // Apply Markdown formatting for rich text display\n return <Text color={SEMANTIC_COLORS.primary}>{applyMarkdown(content)}</Text>\n }\n\n if (Array.isArray(content)) {\n // Array of content blocks - extract text from text blocks\n const texts = content\n .filter(\n (block): block is { type: 'text'; text: string } =>\n block.type === 'text',\n )\n .map(block => block.text)\n\n // Join all text blocks and apply Markdown formatting\n const combinedText = texts.join('\\n\\n')\n return (\n <Box flexDirection=\"column\">\n <Text color={SEMANTIC_COLORS.primary}>\n {applyMarkdown(combinedText)}\n </Text>\n </Box>\n )\n }\n\n return <Text color={SEMANTIC_COLORS.dim}>[Unknown content format]</Text>\n}\n\n/**\n * Task Output Summary Component\n *\n * Shows a compact summary of task output for non-verbose mode.\n * Displays character count and optional truncated preview.\n */\ninterface TaskOutputSummaryProps {\n content: ToolResultBlockParam['content']\n maxChars?: number\n}\n\nexport function TaskOutputSummary({\n content,\n maxChars = 80,\n}: TaskOutputSummaryProps): React.ReactNode {\n if (!content) {\n return (\n <Box flexDirection=\"row\">\n <Text color={SYMBOL_COLORS.child}>\u23BF </Text>\n <Text color={SYMBOL_COLORS.success}>Done</Text>\n </Box>\n )\n }\n\n // Calculate total content length\n let totalLength = 0\n let firstLine = ''\n\n if (typeof content === 'string') {\n totalLength = content.length\n firstLine = content.split('\\n')[0] || ''\n } else if (Array.isArray(content)) {\n const texts = content\n .filter(\n (block): block is { type: 'text'; text: string } =>\n block.type === 'text',\n )\n .map(block => block.text)\n totalLength = texts.reduce((sum, t) => sum + t.length, 0)\n // Get first non-empty line\n for (const text of texts) {\n const lines = text.split('\\n').filter(l => l.trim())\n if (lines[0]) {\n firstLine = lines[0]\n break\n }\n }\n }\n\n // Truncate first line if too long\n const truncatedPreview =\n firstLine.length > maxChars\n ? firstLine.substring(0, maxChars) + '...'\n : firstLine\n\n // Format: \"Done\" or \"Done \u00B7 preview\" (simplified from Claude Code's style)\n return (\n <Box flexDirection=\"row\">\n <Text color={SYMBOL_COLORS.child}>\u23BF </Text>\n <Text color={SYMBOL_COLORS.success}>Done</Text>\n {truncatedPreview && (\n <Text color={SEMANTIC_COLORS.dim}>\n {PREVIEW_SEPARATOR}\n {truncatedPreview}\n </Text>\n )}\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAOA,OAAO,WAAW;AAClB,SAAS,KAAK,YAAY;AAE1B,SAAS,yBAAwC;AACjD,SAAS,iBAAiB,qBAAqB;AAC/C,SAAS,qBAAqB;AAMvB,SAAS,kBAAkB;AAAA,EAChC;AACF,GAA4C;AAC1C,MAAI,CAAC,SAAS;AACZ,WAAO,oCAAC,QAAK,OAAO,gBAAgB,OAAK,aAAW;AAAA,EACtD;AAEA,MAAI,OAAO,YAAY,UAAU;AAE/B,WAAO,oCAAC,QAAK,OAAO,gBAAgB,WAAU,cAAc,OAAO,CAAE;AAAA,EACvE;AAEA,MAAI,MAAM,QAAQ,OAAO,GAAG;AAE1B,UAAM,QAAQ,QACX;AAAA,MACC,CAAC,UACC,MAAM,SAAS;AAAA,IACnB,EACC,IAAI,WAAS,MAAM,IAAI;AAG1B,UAAM,eAAe,MAAM,KAAK,MAAM;AACtC,WACE,oCAAC,OAAI,eAAc,YACjB,oCAAC,QAAK,OAAO,gBAAgB,WAC1B,cAAc,YAAY,CAC7B,CACF;AAAA,EAEJ;AAEA,SAAO,oCAAC,QAAK,OAAO,gBAAgB,OAAK,0BAAwB;AACnE;AAaO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,WAAW;AACb,GAA4C;AAC1C,MAAI,CAAC,SAAS;AACZ,WACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,cAAc,SAAO,SAAE,GACpC,oCAAC,QAAK,OAAO,cAAc,WAAS,MAAI,CAC1C;AAAA,EAEJ;AAGA,MAAI,cAAc;AAClB,MAAI,YAAY;AAEhB,MAAI,OAAO,YAAY,UAAU;AAC/B,kBAAc,QAAQ;AACtB,gBAAY,QAAQ,MAAM,IAAI,EAAE,CAAC,KAAK;AAAA,EACxC,WAAW,MAAM,QAAQ,OAAO,GAAG;AACjC,UAAM,QAAQ,QACX;AAAA,MACC,CAAC,UACC,MAAM,SAAS;AAAA,IACnB,EACC,IAAI,WAAS,MAAM,IAAI;AAC1B,kBAAc,MAAM,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,CAAC;AAExD,eAAW,QAAQ,OAAO;AACxB,YAAM,QAAQ,KAAK,MAAM,IAAI,EAAE,OAAO,OAAK,EAAE,KAAK,CAAC;AACnD,UAAI,MAAM,CAAC,GAAG;AACZ,oBAAY,MAAM,CAAC;AACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,mBACJ,UAAU,SAAS,WACf,UAAU,UAAU,GAAG,QAAQ,IAAI,QACnC;AAGN,SACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,cAAc,SAAO,SAAE,GACpC,oCAAC,QAAK,OAAO,cAAc,WAAS,MAAI,GACvC,oBACC,oCAAC,QAAK,OAAO,gBAAgB,OAC1B,mBACA,gBACH,CAEJ;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { Box, Text } from "ink";
|
|
3
|
-
import { getTheme } from "../../utils/theme.js";
|
|
4
3
|
import { logError } from "../../utils/log.js";
|
|
5
4
|
import { useTerminalSize } from "../../hooks/useTerminalSize.js";
|
|
5
|
+
import { BRAND_GRADIENT, SEMANTIC_COLORS } from "../../constants/colors.js";
|
|
6
6
|
function UserPromptMessage({
|
|
7
7
|
addMargin,
|
|
8
8
|
param: { text }
|
|
@@ -12,7 +12,7 @@ function UserPromptMessage({
|
|
|
12
12
|
logError("No content found in user prompt message");
|
|
13
13
|
return null;
|
|
14
14
|
}
|
|
15
|
-
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginTop: addMargin ? 1 : 0, width: "100%" }, /* @__PURE__ */ React.createElement(Box, { minWidth: 2, width: 2 }, /* @__PURE__ */ React.createElement(Text, { color:
|
|
15
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginTop: addMargin ? 1 : 0, width: "100%" }, /* @__PURE__ */ React.createElement(Box, { minWidth: 2, width: 2 }, /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START, bold: true }, "\u276F")), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width: columns - 4 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary, wrap: "wrap" }, text)));
|
|
16
16
|
}
|
|
17
17
|
export {
|
|
18
18
|
UserPromptMessage
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/messages/UserPromptMessage.tsx"],
|
|
4
|
-
"sourcesContent": ["import React from 'react'\nimport { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Box, Text } from 'ink'\nimport {
|
|
5
|
-
"mappings": "AAAA,OAAO,WAAW;AAElB,SAAS,KAAK,YAAY;AAC1B,SAAS,gBAAgB;AACzB,SAAS,
|
|
4
|
+
"sourcesContent": ["import React from 'react'\nimport { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Box, Text } from 'ink'\nimport { logError } from '@utils/log'\nimport { useTerminalSize } from '@hooks/useTerminalSize'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\n\ntype Props = {\n addMargin: boolean\n param: TextBlockParam\n}\n\nexport function UserPromptMessage({\n addMargin,\n param: { text },\n}: Props): React.ReactNode {\n const { columns } = useTerminalSize()\n if (!text) {\n logError('No content found in user prompt message')\n return null\n }\n\n return (\n <Box flexDirection=\"row\" marginTop={addMargin ? 1 : 0} width=\"100%\">\n <Box minWidth={2} width={2}>\n <Text color={BRAND_GRADIENT.START} bold>\n \u276F\n </Text>\n </Box>\n <Box flexDirection=\"column\" width={columns - 4}>\n <Text color={SEMANTIC_COLORS.secondary} wrap=\"wrap\">\n {text}\n </Text>\n </Box>\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,WAAW;AAElB,SAAS,KAAK,YAAY;AAC1B,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC,SAAS,gBAAgB,uBAAuB;AAOzC,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,OAAO,EAAE,KAAK;AAChB,GAA2B;AACzB,QAAM,EAAE,QAAQ,IAAI,gBAAgB;AACpC,MAAI,CAAC,MAAM;AACT,aAAS,yCAAyC;AAClD,WAAO;AAAA,EACT;AAEA,SACE,oCAAC,OAAI,eAAc,OAAM,WAAW,YAAY,IAAI,GAAG,OAAM,UAC3D,oCAAC,OAAI,UAAU,GAAG,OAAO,KACvB,oCAAC,QAAK,OAAO,eAAe,OAAO,MAAI,QAAC,QAExC,CACF,GACA,oCAAC,OAAI,eAAc,UAAS,OAAO,UAAU,KAC3C,oCAAC,QAAK,OAAO,gBAAgB,WAAW,MAAK,UAC1C,IACH,CACF,CACF;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/constants/colors.js
CHANGED
|
@@ -1,75 +1,97 @@
|
|
|
1
|
+
const BRAND_GRADIENT = {
|
|
2
|
+
/** 起始色 - 紫蓝 (智慧、专业) */
|
|
3
|
+
START: "#667EEA",
|
|
4
|
+
/** 中间色 - 粉紫 (创意、活力) */
|
|
5
|
+
MIDDLE: "#B668C8",
|
|
6
|
+
/** 结束色 - 珊瑚红 (热情、能量) */
|
|
7
|
+
END: "#F5576C"
|
|
8
|
+
};
|
|
1
9
|
const TEXT_COLORS = {
|
|
2
|
-
/** 主要文本 -
|
|
10
|
+
/** 主要文本 - 重要内容、标题、用户输入 */
|
|
3
11
|
PRIMARY: "#FFFFFF",
|
|
4
|
-
/** 次要文本 -
|
|
12
|
+
/** 次要文本 - 说明信息、普通提示 */
|
|
5
13
|
SECONDARY: "#CCCCCC",
|
|
6
|
-
/**
|
|
14
|
+
/** 辅助文本 - 补充信息、快捷键提示 */
|
|
7
15
|
DIMMED: "#888888",
|
|
8
|
-
/**
|
|
16
|
+
/** 最淡文本 - 时间戳、元数据 */
|
|
9
17
|
MUTED: "#555555"
|
|
10
18
|
};
|
|
11
19
|
const FUNCTIONAL_COLORS = {
|
|
12
|
-
/**
|
|
13
|
-
BRAND: "#
|
|
14
|
-
/**
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
|
|
18
|
-
/**
|
|
20
|
+
/** 品牌色 - 紫蓝,用于品牌标识 */
|
|
21
|
+
BRAND: "#667EEA",
|
|
22
|
+
/** 强调色 - 珊瑚红,用于高亮重要元素 */
|
|
23
|
+
ACCENT: "#F5576C",
|
|
24
|
+
/** 成功 - 完成、新增、通过 */
|
|
25
|
+
SUCCESS: "#4EBA65",
|
|
26
|
+
/** 错误 - 失败、删除、警告 */
|
|
27
|
+
ERROR: "#FF6B80",
|
|
28
|
+
/** 警告 - 需要注意、确认 */
|
|
19
29
|
WARNING: "#FFB86C",
|
|
20
|
-
/**
|
|
21
|
-
INFO: "#
|
|
30
|
+
/** 信息 - 提示、链接、说明 */
|
|
31
|
+
INFO: "#5DADE2",
|
|
32
|
+
/** 进行中 - 正在处理、等待 */
|
|
33
|
+
RUNNING: "#B668C8"
|
|
22
34
|
};
|
|
23
35
|
const BACKGROUND_COLORS = {
|
|
24
|
-
/**
|
|
36
|
+
/** 头部背景 */
|
|
25
37
|
HEADER: "#2E2E3E",
|
|
26
|
-
/** 代码块背景
|
|
38
|
+
/** 代码块背景 */
|
|
27
39
|
CODE_BLOCK: "#1E1E1E",
|
|
28
|
-
/**
|
|
40
|
+
/** 选中高亮 */
|
|
29
41
|
SELECTION: "#3C3C3C",
|
|
30
|
-
/**
|
|
42
|
+
/** 透明背景 */
|
|
31
43
|
TRANSPARENT: "transparent"
|
|
32
44
|
};
|
|
33
45
|
const MINTO_COLORS = {
|
|
34
|
-
/**
|
|
46
|
+
/** 命令模式边框 */
|
|
35
47
|
BASH_BORDER: "#FFB86C",
|
|
36
|
-
/**
|
|
37
|
-
KODING_BORDER: "#
|
|
38
|
-
/**
|
|
39
|
-
SUBAGENT_PROGRESS: "#
|
|
40
|
-
/**
|
|
41
|
-
TODO_MAIN: "#
|
|
48
|
+
/** 笔记模式边框 */
|
|
49
|
+
KODING_BORDER: "#5DADE2",
|
|
50
|
+
/** 任务进度条 */
|
|
51
|
+
SUBAGENT_PROGRESS: "#B668C8",
|
|
52
|
+
/** 待办面板主色 */
|
|
53
|
+
TODO_MAIN: "#667EEA"
|
|
42
54
|
};
|
|
43
55
|
const SEMANTIC_COLORS = {
|
|
44
|
-
/** 品牌色 -
|
|
45
|
-
brand: "#
|
|
46
|
-
/**
|
|
56
|
+
/** 品牌色 - 紫蓝 */
|
|
57
|
+
brand: "#667EEA",
|
|
58
|
+
/** 强调色 - 珊瑚红 */
|
|
59
|
+
accent: "#F5576C",
|
|
60
|
+
/** 主要文本 */
|
|
47
61
|
primary: "#FFFFFF",
|
|
48
|
-
/**
|
|
62
|
+
/** 次要文本 */
|
|
49
63
|
secondary: "#CCCCCC",
|
|
50
|
-
/**
|
|
64
|
+
/** 辅助文本 */
|
|
51
65
|
dim: "#888888",
|
|
52
|
-
/**
|
|
66
|
+
/** 最淡文本 */
|
|
53
67
|
muted: "#555555",
|
|
54
|
-
/**
|
|
55
|
-
running: "#
|
|
56
|
-
/**
|
|
68
|
+
/** 进行中 - 粉紫 */
|
|
69
|
+
running: "#B668C8",
|
|
70
|
+
/** 成功 */
|
|
57
71
|
success: "#4EBA65",
|
|
58
|
-
/**
|
|
72
|
+
/** 错误 */
|
|
59
73
|
error: "#FF6B80",
|
|
60
|
-
/**
|
|
74
|
+
/** 信息 */
|
|
61
75
|
info: "#5DADE2"
|
|
62
76
|
};
|
|
63
77
|
function getSemanticColor(color) {
|
|
64
78
|
return SEMANTIC_COLORS[color];
|
|
65
79
|
}
|
|
66
|
-
const
|
|
67
|
-
/**
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
|
|
80
|
+
const SYMBOL_COLORS = {
|
|
81
|
+
/** 完成状态 (✓) - 使用品牌起始色紫蓝 */
|
|
82
|
+
success: BRAND_GRADIENT.START,
|
|
83
|
+
/** 进行中状态 (◐) - 使用品牌中间色粉紫 */
|
|
84
|
+
running: BRAND_GRADIENT.MIDDLE,
|
|
85
|
+
/** 错误状态 (✗) - 使用品牌结束色珊瑚红 */
|
|
86
|
+
error: BRAND_GRADIENT.END,
|
|
87
|
+
/** 待处理状态 - 使用 dim */
|
|
88
|
+
pending: SEMANTIC_COLORS.dim,
|
|
89
|
+
/** 子输出连接符 (⎿) - 使用 dim 保持层级感 */
|
|
90
|
+
child: SEMANTIC_COLORS.dim,
|
|
91
|
+
/** Todo 更新 (⏺) - 使用品牌起始色 */
|
|
92
|
+
todo: BRAND_GRADIENT.START,
|
|
93
|
+
/** 并行任务组 (◈) - 使用品牌中间色 */
|
|
94
|
+
parallel: BRAND_GRADIENT.MIDDLE
|
|
73
95
|
};
|
|
74
96
|
const STATUS_COLORS = {
|
|
75
97
|
running: SEMANTIC_COLORS.running,
|
|
@@ -83,6 +105,14 @@ const STATUS_COLORS = {
|
|
|
83
105
|
function getStatusColorHex(status) {
|
|
84
106
|
return STATUS_COLORS[status] || SEMANTIC_COLORS.dim;
|
|
85
107
|
}
|
|
108
|
+
const VALUE_TIER_COLORS = {
|
|
109
|
+
/** 核心信息 */
|
|
110
|
+
core: SEMANTIC_COLORS.secondary,
|
|
111
|
+
/** 辅助信息 */
|
|
112
|
+
auxiliary: SEMANTIC_COLORS.dim,
|
|
113
|
+
/** 元信息 */
|
|
114
|
+
meta: SEMANTIC_COLORS.muted
|
|
115
|
+
};
|
|
86
116
|
const CLAUDE_COLORS = {
|
|
87
117
|
...TEXT_COLORS,
|
|
88
118
|
...FUNCTIONAL_COLORS,
|
|
@@ -90,39 +120,25 @@ const CLAUDE_COLORS = {
|
|
|
90
120
|
...MINTO_COLORS
|
|
91
121
|
};
|
|
92
122
|
const AGENT_COLORS = {
|
|
93
|
-
red: "#
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
purple: "#FF55FF",
|
|
102
|
-
// 紫色
|
|
103
|
-
orange: "#FFA500",
|
|
104
|
-
// 橙色
|
|
105
|
-
pink: "#FFB6C1",
|
|
106
|
-
// 粉色
|
|
107
|
-
cyan: "#00FFFF",
|
|
108
|
-
// 青色
|
|
123
|
+
red: "#FF6B80",
|
|
124
|
+
blue: "#667EEA",
|
|
125
|
+
green: "#4EBA65",
|
|
126
|
+
yellow: "#FFB86C",
|
|
127
|
+
purple: "#B668C8",
|
|
128
|
+
orange: "#F5576C",
|
|
129
|
+
pink: "#DC75A8",
|
|
130
|
+
cyan: "#5DADE2",
|
|
109
131
|
auto: "#FFFFFF"
|
|
110
|
-
// 默认白色
|
|
111
132
|
};
|
|
112
133
|
const AGENT_COLOR_RECOMMENDATIONS = {
|
|
113
|
-
red: ["\
|
|
114
|
-
blue: [
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
],
|
|
120
|
-
|
|
121
|
-
yellow: ["\u6570\u636E\u79D1\u5B66", "data-scientist", "data-engineer", "ml-engineer"],
|
|
122
|
-
purple: ["\u63A2\u7D22", "\u8C03\u7814", "research-expert", "explorer"],
|
|
123
|
-
orange: ["\u6784\u5EFA", "\u90E8\u7F72", "deployment-engineer", "devops-automator"],
|
|
124
|
-
pink: ["\u6587\u6863", "\u6587\u6848", "content-writer", "docs-architect"],
|
|
125
|
-
cyan: ["\u8C03\u8BD5", "\u8BCA\u65AD", "debugger", "performance-engineer"],
|
|
134
|
+
red: ["\u5BA1\u6838", "\u98CE\u9669\u8BC4\u4F30", "code-reviewer", "security-auditor"],
|
|
135
|
+
blue: ["\u5206\u6790", "\u7814\u7A76", "general-purpose", "research"],
|
|
136
|
+
green: ["\u9A8C\u8BC1", "\u6D4B\u8BD5", "test-automator", "validator"],
|
|
137
|
+
yellow: ["\u6570\u636E\u5206\u6790", "\u62A5\u544A", "data-scientist", "analyst"],
|
|
138
|
+
purple: ["\u63A2\u7D22", "\u521B\u610F", "explorer", "creative"],
|
|
139
|
+
orange: ["\u6267\u884C", "\u90E8\u7F72", "deployment", "action"],
|
|
140
|
+
pink: ["\u5199\u4F5C", "\u6587\u6863", "content-writer", "docs"],
|
|
141
|
+
cyan: ["\u8BCA\u65AD", "\u4F18\u5316", "debugger", "optimizer"],
|
|
126
142
|
auto: ["\u9ED8\u8BA4"]
|
|
127
143
|
};
|
|
128
144
|
function getAgentColor(color, theme) {
|
|
@@ -158,11 +174,13 @@ export {
|
|
|
158
174
|
AGENT_COLORS,
|
|
159
175
|
AGENT_COLOR_RECOMMENDATIONS,
|
|
160
176
|
BACKGROUND_COLORS,
|
|
177
|
+
BRAND_GRADIENT,
|
|
161
178
|
CLAUDE_COLORS,
|
|
162
179
|
FUNCTIONAL_COLORS,
|
|
163
180
|
MINTO_COLORS,
|
|
164
181
|
SEMANTIC_COLORS,
|
|
165
182
|
STATUS_COLORS,
|
|
183
|
+
SYMBOL_COLORS,
|
|
166
184
|
TEXT_COLORS,
|
|
167
185
|
VALUE_TIER_COLORS,
|
|
168
186
|
getAgentColor,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/constants/colors.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Minto \u914D\u8272\u7CFB\u7EDF - Claude Code CLI \u98CE\u683C\n *\n * \u57FA\u4E8E 24-bit True Color\uFF0C\u63D0\u4F9B\u6E05\u6670\u7684\u4FE1\u606F\u5C42\u7EA7\u548C\u529F\u80FD\u72B6\u6001\u7684\u89C6\u89C9\u533A\u5206\n *\n * \u5305\u542B\uFF1A\n * 1. \u6587\u672C\u524D\u666F\u8272 - 4\u7EA7\u7070\u5EA6\u5C42\u7EA7\n * 2. \u529F\u80FD\u5F3A\u8C03\u8272 - \u72B6\u6001\u548C\u64CD\u4F5C\n * 3. \u80CC\u666F\u8272 - \u89C6\u89C9\u5206\u5272\n * 4. Agent \u989C\u8272\u7CFB\u7EDF - \u591A Agent \u53EF\u89C6\u5316\n */\n\nimport type { getTheme } from '@utils/theme'\n\n// ============================================================================\n// Claude Code CLI \u98CE\u683C\u914D\u8272\u7CFB\u7EDF\n// ============================================================================\n\n/**\n * \u6587\u672C\u524D\u666F\u8272 - \u901A\u8FC7\u4EAE\u5EA6\u5DEE\u5F02\u533A\u5206\u4FE1\u606F\u4E3B\u6B21\u5C42\u7EA7\n */\nexport const TEXT_COLORS = {\n /** \u4E3B\u8981\u6587\u672C - \u7528\u6237\u8F93\u5165\u3001AI \u6700\u7EC8\u56DE\u7B54 (#FFFFFF) */\n PRIMARY: '#FFFFFF',\n\n /** \u6B21\u8981\u6587\u672C - \u9875\u7709\u4FE1\u606F\u3001\u666E\u901A\u63D0\u793A (#CCCCCC) */\n SECONDARY: '#CCCCCC',\n\n /** \u6697\u6DE1\u6587\u672C - \u601D\u8003\u8FC7\u7A0B\u3001\u52A0\u8F7D\u72B6\u6001\u3001\u5FEB\u6377\u952E\u63D0\u793A (#888888) */\n DIMMED: '#888888',\n\n /** \u6781\u6697\u6587\u672C - \u65F6\u95F4\u6233\u3001\u6781\u6B21\u8981\u5143\u6570\u636E (#555555) */\n MUTED: '#555555',\n} as const\n\n/**\n * \u529F\u80FD\u5F3A\u8C03\u8272 - \u4F20\u8FBE\u72B6\u6001\u3001\u8EAB\u4EFD\u548C\u5173\u952E\u64CD\u4F5C\n */\nexport const FUNCTIONAL_COLORS = {\n /** \u54C1\u724C\u5F3A\u8C03\u8272 - Claude \u6807\u8BB0\u3001\u7279\u6B8A\u63D0\u793A\u7B26 (#D4BBFF \u85B0\u8863\u8349\u7D2B) */\n BRAND: '#D4BBFF',\n\n /** \u6210\u529F/\u65B0\u589E - Diff \u65B0\u589E\u884C\u3001\u6210\u529F\u6D88\u606F (#3DDC84 \u9C9C\u7EFF) */\n SUCCESS: '#3DDC84',\n\n /** \u9519\u8BEF/\u5220\u9664 - Diff \u5220\u9664\u884C\u3001\u9519\u8BEF\u6D88\u606F (#FF5555 \u9C9C\u7EA2) */\n ERROR: '#FF5555',\n\n /** \u8B66\u544A/\u786E\u8BA4 - \u786E\u8BA4\u63D0\u793A\u3001\u8B66\u544A\u4FE1\u606F (#FFB86C \u6A59\u9EC4) */\n WARNING: '#FFB86C',\n\n /** \u94FE\u63A5/\u4FE1\u606F - URL\u3001\u4FE1\u606F\u63D0\u793A (#58A6FF \u5929\u84DD) */\n INFO: '#58A6FF',\n} as const\n\n/**\n * \u80CC\u666F\u8272 - \u7528\u4E8E\u89C6\u89C9\u5206\u5272\u548C\u5185\u5BB9\u51F8\u663E\n */\nexport const BACKGROUND_COLORS = {\n /** \u9875\u7709\u80CC\u666F - \u9876\u90E8\u56FA\u5B9A\u72B6\u6001\u680F (#2E2E3E \u6DF1\u84DD\u7D2B\u77F3\u677F\u7070) */\n HEADER: '#2E2E3E',\n\n /** \u4EE3\u7801\u5757\u80CC\u666F - Markdown \u4EE3\u7801\u7247\u6BB5 (#1E1E1E \u6BD4\u7EAF\u9ED1\u7A0D\u4EAE) */\n CODE_BLOCK: '#1E1E1E',\n\n /** \u9009\u4E2D\u6001 - \u5217\u8868\u9879\u9AD8\u4EAE (#3C3C3C) */\n SELECTION: '#3C3C3C',\n\n /** \u7EC8\u7AEF\u9ED8\u8BA4\u80CC\u666F - \u900F\u660E\uFF0C\u4F9D\u8D56\u7528\u6237\u7EC8\u7AEF\u8BBE\u7F6E */\n TRANSPARENT: 'transparent',\n} as const\n\n/**\n * Minto \u7279\u8272\u529F\u80FD\u7684\u989D\u5916\u914D\u8272\n */\nexport const MINTO_COLORS = {\n /** Bash \u6A21\u5F0F\u8FB9\u6846 */\n BASH_BORDER: '#FFB86C',\n\n /** Koding \u6A21\u5F0F\u8FB9\u6846 (\u7B14\u8BB0\u6A21\u5F0F) */\n KODING_BORDER: '#58A6FF',\n\n /** Subagent \u8FDB\u5EA6\u6761 */\n SUBAGENT_PROGRESS: '#3DDC84',\n\n /** TODO \u9762\u677F\u4E3B\u8272 */\n TODO_MAIN: '#D4BBFF',\n} as const\n\n// ============================================================================\n// \u8BED\u4E49\u989C\u8272\u7CFB\u7EDF (Semantic Color System)\n// \u57FA\u4E8E REPL \u663E\u793A\u89C4\u8303\uFF0C\u5B9A\u4E49 9 \u79CD\u8BED\u4E49\u989C\u8272\u53CA\u5176\u4F7F\u7528\u573A\u666F\n// ============================================================================\n\n/**\n * \u8BED\u4E49\u989C\u8272 - \u6309\u4FE1\u606F\u7C7B\u578B\u548C\u72B6\u6001\u5B9A\u4E49\u7684\u989C\u8272\n *\n * \u4F7F\u7528\u573A\u666F\uFF1A\n * - brand: Logo\u3001\u6B22\u8FCE\u4FE1\u606F\u3001\u54C1\u724C\u5F3A\u8C03\n * - primary: \u7528\u6237\u8F93\u5165\u3001AI \u4E3B\u8F93\u51FA\u3001\u91CD\u8981\u6807\u9898\n * - secondary: \u5DE5\u5177\u540D\u79F0\u3001\u64CD\u4F5C\u7C7B\u578B\u3001\u6838\u5FC3\u4FE1\u606F\n * - dim: \u53C2\u6570\u3001\u8DEF\u5F84\u3001\u8F85\u52A9\u4FE1\u606F\n * - muted: \u5143\u4FE1\u606F\uFF08\u8017\u65F6\u3001\u6A21\u578B\u3001\u65F6\u95F4\uFF09\n * - running: \u8FDB\u884C\u4E2D\u72B6\u6001\u3001\u7B49\u5F85\u4E2D\n * - success: \u5B8C\u6210\u72B6\u6001\u3001\u6210\u529F\u64CD\u4F5C\n * - error: \u5931\u8D25\u3001\u9519\u8BEF\u3001\u62D2\u7EDD\n * - info: \u4FE1\u606F\u63D0\u793A\u3001Todo \u66F4\u65B0\u3001\u94FE\u63A5\n */\nexport const SEMANTIC_COLORS = {\n /** \u54C1\u724C\u8272 - Logo\u3001\u6B22\u8FCE\u4FE1\u606F */\n brand: '#FFC233',\n\n /** \u4E3B\u8981\u6587\u672C - \u7528\u6237\u8F93\u5165\u3001AI \u8F93\u51FA */\n primary: '#FFFFFF',\n\n /** \u6838\u5FC3\u4FE1\u606F - \u5DE5\u5177\u540D\u79F0\u3001\u64CD\u4F5C\u7C7B\u578B */\n secondary: '#CCCCCC',\n\n /** \u8F85\u52A9\u4FE1\u606F - \u53C2\u6570\u3001\u8DEF\u5F84 */\n dim: '#888888',\n\n /** \u5143\u4FE1\u606F - \u8017\u65F6\u3001\u6A21\u578B\u3001\u65F6\u95F4 */\n muted: '#555555',\n\n /** \u8FDB\u884C\u4E2D\u72B6\u6001 */\n running: '#FFC107',\n\n /** \u6210\u529F\u72B6\u6001 */\n success: '#4EBA65',\n\n /** \u9519\u8BEF\u72B6\u6001 */\n error: '#FF6B80',\n\n /** \u4FE1\u606F\u63D0\u793A */\n info: '#5DADE2',\n} as const\n\n/**\n * \u8BED\u4E49\u989C\u8272\u7C7B\u578B\n */\nexport type SemanticColor = keyof typeof SEMANTIC_COLORS\n\n/**\n * \u83B7\u53D6\u8BED\u4E49\u989C\u8272\u503C\n */\nexport function getSemanticColor(color: SemanticColor): string {\n return SEMANTIC_COLORS[color]\n}\n\n/**\n * \u884C\u5185\u4FE1\u606F\u4EF7\u503C\u5C42\u6B21\u989C\u8272\n * \u7528\u4E8E\u540C\u4E00\u884C\u5185\u4E0D\u540C\u4FE1\u606F\u7684\u989C\u8272\u533A\u5206\n */\nexport const VALUE_TIER_COLORS = {\n /** \u6838\u5FC3\u4FE1\u606F - \u7528\u6237\u5FC5\u987B\u5173\u6CE8 */\n core: SEMANTIC_COLORS.secondary,\n\n /** \u8F85\u52A9\u4FE1\u606F - \u5E2E\u52A9\u7406\u89E3\u4E0A\u4E0B\u6587 */\n auxiliary: SEMANTIC_COLORS.dim,\n\n /** \u5143\u4FE1\u606F - \u53EF\u9009\u53C2\u8003 */\n meta: SEMANTIC_COLORS.muted,\n} as const\n\n/**\n * \u72B6\u6001\u989C\u8272\u6620\u5C04\n * \u7528\u4E8E\u5DE5\u5177\u8C03\u7528\u3001\u4EFB\u52A1\u7B49\u7684\u72B6\u6001\u7740\u8272\n */\nexport const STATUS_COLORS = {\n running: SEMANTIC_COLORS.running,\n pending: SEMANTIC_COLORS.dim,\n success: SEMANTIC_COLORS.success,\n completed: SEMANTIC_COLORS.success,\n error: SEMANTIC_COLORS.error,\n failed: SEMANTIC_COLORS.error,\n done: SEMANTIC_COLORS.success,\n} as const\n\n/**\n * \u83B7\u53D6\u72B6\u6001\u989C\u8272\n */\nexport function getStatusColorHex(\n status: keyof typeof STATUS_COLORS | string,\n): string {\n return (\n STATUS_COLORS[status as keyof typeof STATUS_COLORS] || SEMANTIC_COLORS.dim\n )\n}\n\n/**\n * \u7EDF\u4E00\u7684\u914D\u8272\u5BFC\u51FA\n */\nexport const CLAUDE_COLORS = {\n ...TEXT_COLORS,\n ...FUNCTIONAL_COLORS,\n ...BACKGROUND_COLORS,\n ...MINTO_COLORS,\n} as const\n\n// ============================================================================\n// Agent \u989C\u8272\u7CFB\u7EDF\n// ============================================================================\n\n/**\n * \u652F\u6301\u7684\u989C\u8272\u5173\u952E\u5B57\u4E0E\u7EC8\u7AEF\u663E\u793A\u6548\u679C\uFF1A\n * - red: \u4EAE\u7EA2\u8272\uFF0C\u63A8\u8350\u7528\u4E8E\u4EE3\u7801\u5BA1\u67E5/\u5B89\u5168\u5BA1\u8BA1\n * - blue: \u6DF1\u84DD\u8272\uFF0C\u63A8\u8350\u7528\u4E8E\u901A\u7528\u5F00\u53D1\n * - green: \u58A8\u7EFF\u8272\uFF0C\u63A8\u8350\u7528\u4E8E\u6D4B\u8BD5/CI\n * - yellow: \u4EAE\u9EC4\u8272\uFF0C\u63A8\u8350\u7528\u4E8E\u6570\u636E\u79D1\u5B66\n * - purple: \u7D2B\u8272\uFF0C\u63A8\u8350\u7528\u4E8E\u63A2\u7D22/\u8C03\u7814\n * - orange: \u6A59\u8272\uFF0C\u63A8\u8350\u7528\u4E8E\u6784\u5EFA/\u90E8\u7F72\n * - pink: \u7C89\u8272\uFF0C\u63A8\u8350\u7528\u4E8E\u6587\u6863/\u6587\u6848\n * - cyan: \u9752\u8272\uFF0C\u63A8\u8350\u7528\u4E8E\u8C03\u8BD5/\u8BCA\u65AD\n * - auto: \u7CFB\u7EDF\u9ED8\u8BA4\uFF0C\u4F7F\u7528\u4E3B\u9898\u8272\n */\n\n/**\n * Agent \u989C\u8272\u7C7B\u578B\u5B9A\u4E49\n */\nexport type AgentColor =\n | 'red'\n | 'blue'\n | 'green'\n | 'yellow'\n | 'purple'\n | 'orange'\n | 'pink'\n | 'cyan'\n | 'auto'\n\n/**\n * Agent \u989C\u8272\u6620\u5C04\u8868\uFF08Hex \u683C\u5F0F\uFF09\n */\nexport const AGENT_COLORS: Record<AgentColor, string> = {\n red: '#FF5555', // \u4EAE\u7EA2\u8272\n blue: '#5555FF', // \u6DF1\u84DD\u8272\n green: '#55FF55', // \u58A8\u7EFF\u8272\n yellow: '#FFFF55', // \u4EAE\u9EC4\u8272\n purple: '#FF55FF', // \u7D2B\u8272\n orange: '#FFA500', // \u6A59\u8272\n pink: '#FFB6C1', // \u7C89\u8272\n cyan: '#00FFFF', // \u9752\u8272\n auto: '#FFFFFF', // \u9ED8\u8BA4\u767D\u8272\n} as const\n\n/**\n * Agent \u989C\u8272\u63A8\u8350\u573A\u666F\n */\nexport const AGENT_COLOR_RECOMMENDATIONS: Record<AgentColor, string[]> = {\n red: ['\u4EE3\u7801\u5BA1\u67E5', '\u5B89\u5168\u5BA1\u8BA1', 'code-reviewer', 'security-auditor'],\n blue: [\n '\u901A\u7528\u5F00\u53D1',\n 'general-purpose',\n 'backend-developer',\n 'frontend-developer',\n ],\n green: ['\u6D4B\u8BD5', 'CI', 'test-automator', 'unit-test-builder'],\n yellow: ['\u6570\u636E\u79D1\u5B66', 'data-scientist', 'data-engineer', 'ml-engineer'],\n purple: ['\u63A2\u7D22', '\u8C03\u7814', 'research-expert', 'explorer'],\n orange: ['\u6784\u5EFA', '\u90E8\u7F72', 'deployment-engineer', 'devops-automator'],\n pink: ['\u6587\u6863', '\u6587\u6848', 'content-writer', 'docs-architect'],\n cyan: ['\u8C03\u8BD5', '\u8BCA\u65AD', 'debugger', 'performance-engineer'],\n auto: ['\u9ED8\u8BA4'],\n}\n\n/**\n * \u83B7\u53D6 Agent \u989C\u8272\n *\n * @param color - Agent \u914D\u7F6E\u4E2D\u7684\u989C\u8272\u5B57\u6BB5\n * @param theme - \u5F53\u524D\u4E3B\u9898\n * @returns \u6700\u7EC8\u4F7F\u7528\u7684\u989C\u8272 Hex \u503C\n */\nexport function getAgentColor(\n color: string | undefined,\n theme: ReturnType<typeof getTheme>,\n): string {\n // \u5982\u679C\u6CA1\u6709\u914D\u7F6E\u989C\u8272\u6216\u914D\u7F6E\u4E3A auto\uFF0C\u4F7F\u7528\u4E3B\u9898\u9ED8\u8BA4\u8272\n if (!color || color === 'auto') {\n return theme.minto\n }\n\n // \u68C0\u67E5\u662F\u5426\u4E3A\u6709\u6548\u7684\u989C\u8272\u5173\u952E\u5B57\n const normalizedColor = color.toLowerCase() as AgentColor\n if (normalizedColor in AGENT_COLORS) {\n return AGENT_COLORS[normalizedColor]\n }\n\n // \u5982\u679C\u989C\u8272\u5173\u952E\u5B57\u65E0\u6548\uFF0C\u56DE\u9000\u5230\u4E3B\u9898\u8272\n return theme.minto\n}\n\n/**\n * \u6839\u636E Agent \u7C7B\u578B\u63A8\u8350\u989C\u8272\n *\n * @param agentType - Agent \u7C7B\u578B\u540D\u79F0\n * @returns \u63A8\u8350\u7684\u989C\u8272\u5173\u952E\u5B57\n */\nexport function recommendColorForAgent(agentType: string): AgentColor {\n const lowerType = agentType.toLowerCase()\n\n for (const [color, keywords] of Object.entries(AGENT_COLOR_RECOMMENDATIONS)) {\n for (const keyword of keywords) {\n if (lowerType.includes(keyword.toLowerCase())) {\n return color as AgentColor\n }\n }\n }\n\n return 'auto'\n}\n\n/**\n * \u83B7\u53D6\u989C\u8272\u7684\u5BF9\u6BD4\u6587\u672C\u989C\u8272\uFF08\u786E\u4FDD\u53EF\u8BFB\u6027\uFF09\n *\n * @param backgroundColor - \u80CC\u666F\u989C\u8272 Hex \u503C\n * @returns 'black' \u6216 'white'\n */\nexport function getContrastTextColor(\n backgroundColor: string,\n): 'black' | 'white' {\n // \u79FB\u9664 # \u524D\u7F00\n const hex = backgroundColor.replace('#', '')\n\n // \u8F6C\u6362\u4E3A RGB\n const r = parseInt(hex.substring(0, 2), 16)\n const g = parseInt(hex.substring(2, 4), 16)\n const b = parseInt(hex.substring(4, 6), 16)\n\n // \u8BA1\u7B97\u4EAE\u5EA6\uFF08YIQ \u516C\u5F0F\uFF09\n const yiq = (r * 299 + g * 587 + b * 114) / 1000\n\n // \u4EAE\u5EA6\u5927\u4E8E 128 \u65F6\u4F7F\u7528\u9ED1\u8272\u6587\u5B57\uFF0C\u5426\u5219\u4F7F\u7528\u767D\u8272\n return yiq >= 128 ? 'black' : 'white'\n}\n"],
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["/**\n * Minto \u914D\u8272\u7CFB\u7EDF - \u9762\u5411\u5546\u4E1A\u7528\u6237\u7684\u6218\u7565 AI \u52A9\u624B\n *\n * \u8BBE\u8BA1\u7406\u5FF5\uFF1A\n * - \u7D2B\u84DD\u2192\u73CA\u745A\u6E10\u53D8\uFF1A\u70ED\u60C5\u3001\u4E13\u4E1A\u3001\u73B0\u4EE3\n * - \u6E05\u6670\u7684\u4FE1\u606F\u5C42\u7EA7\uFF1A\u91CD\u8981\u4FE1\u606F\u7A81\u51FA\uFF0C\u6B21\u8981\u4FE1\u606F\u6DE1\u5316\n * - \u5BF9\u975E\u6280\u672F\u7528\u6237\u53CB\u597D\uFF1A\u6E29\u6696\u3001\u4E13\u4E1A\u3001\u6613\u8BFB\n */\n\nimport type { getTheme } from '@utils/theme'\n\n// ============================================================================\n// \u54C1\u724C\u6E10\u53D8\u8272\u7CFB\u7EDF (Brand Gradient System)\n// ============================================================================\n\n/**\n * Minto \u54C1\u724C\u6E10\u53D8\u8272\n * \u7D2B\u84DD\u2192\u7C89\u7D2B\u2192\u73CA\u745A\u7EA2\uFF0C\u4F20\u9012\u70ED\u60C5\u4E0E\u4E13\u4E1A\n */\nexport const BRAND_GRADIENT = {\n /** \u8D77\u59CB\u8272 - \u7D2B\u84DD (\u667A\u6167\u3001\u4E13\u4E1A) */\n START: '#667EEA',\n\n /** \u4E2D\u95F4\u8272 - \u7C89\u7D2B (\u521B\u610F\u3001\u6D3B\u529B) */\n MIDDLE: '#B668C8',\n\n /** \u7ED3\u675F\u8272 - \u73CA\u745A\u7EA2 (\u70ED\u60C5\u3001\u80FD\u91CF) */\n END: '#F5576C',\n} as const\n\n// ============================================================================\n// \u6587\u672C\u989C\u8272\u7CFB\u7EDF (Text Color System)\n// ============================================================================\n\n/**\n * \u6587\u672C\u989C\u8272 - \u901A\u8FC7\u4EAE\u5EA6\u5DEE\u5F02\u533A\u5206\u4FE1\u606F\u5C42\u7EA7\n */\nexport const TEXT_COLORS = {\n /** \u4E3B\u8981\u6587\u672C - \u91CD\u8981\u5185\u5BB9\u3001\u6807\u9898\u3001\u7528\u6237\u8F93\u5165 */\n PRIMARY: '#FFFFFF',\n\n /** \u6B21\u8981\u6587\u672C - \u8BF4\u660E\u4FE1\u606F\u3001\u666E\u901A\u63D0\u793A */\n SECONDARY: '#CCCCCC',\n\n /** \u8F85\u52A9\u6587\u672C - \u8865\u5145\u4FE1\u606F\u3001\u5FEB\u6377\u952E\u63D0\u793A */\n DIMMED: '#888888',\n\n /** \u6700\u6DE1\u6587\u672C - \u65F6\u95F4\u6233\u3001\u5143\u6570\u636E */\n MUTED: '#555555',\n} as const\n\n// ============================================================================\n// \u529F\u80FD\u989C\u8272\u7CFB\u7EDF (Functional Color System)\n// ============================================================================\n\n/**\n * \u529F\u80FD\u989C\u8272 - \u4F20\u8FBE\u72B6\u6001\u548C\u5173\u952E\u64CD\u4F5C\n */\nexport const FUNCTIONAL_COLORS = {\n /** \u54C1\u724C\u8272 - \u7D2B\u84DD\uFF0C\u7528\u4E8E\u54C1\u724C\u6807\u8BC6 */\n BRAND: '#667EEA',\n\n /** \u5F3A\u8C03\u8272 - \u73CA\u745A\u7EA2\uFF0C\u7528\u4E8E\u9AD8\u4EAE\u91CD\u8981\u5143\u7D20 */\n ACCENT: '#F5576C',\n\n /** \u6210\u529F - \u5B8C\u6210\u3001\u65B0\u589E\u3001\u901A\u8FC7 */\n SUCCESS: '#4EBA65',\n\n /** \u9519\u8BEF - \u5931\u8D25\u3001\u5220\u9664\u3001\u8B66\u544A */\n ERROR: '#FF6B80',\n\n /** \u8B66\u544A - \u9700\u8981\u6CE8\u610F\u3001\u786E\u8BA4 */\n WARNING: '#FFB86C',\n\n /** \u4FE1\u606F - \u63D0\u793A\u3001\u94FE\u63A5\u3001\u8BF4\u660E */\n INFO: '#5DADE2',\n\n /** \u8FDB\u884C\u4E2D - \u6B63\u5728\u5904\u7406\u3001\u7B49\u5F85 */\n RUNNING: '#B668C8',\n} as const\n\n// ============================================================================\n// \u80CC\u666F\u989C\u8272\u7CFB\u7EDF (Background Color System)\n// ============================================================================\n\n/**\n * \u80CC\u666F\u989C\u8272 - \u7528\u4E8E\u89C6\u89C9\u5206\u5272\n */\nexport const BACKGROUND_COLORS = {\n /** \u5934\u90E8\u80CC\u666F */\n HEADER: '#2E2E3E',\n\n /** \u4EE3\u7801\u5757\u80CC\u666F */\n CODE_BLOCK: '#1E1E1E',\n\n /** \u9009\u4E2D\u9AD8\u4EAE */\n SELECTION: '#3C3C3C',\n\n /** \u900F\u660E\u80CC\u666F */\n TRANSPARENT: 'transparent',\n} as const\n\n// ============================================================================\n// Minto \u7279\u8272\u989C\u8272 (Minto Feature Colors)\n// ============================================================================\n\n/**\n * Minto \u7279\u8272\u529F\u80FD\u914D\u8272\n */\nexport const MINTO_COLORS = {\n /** \u547D\u4EE4\u6A21\u5F0F\u8FB9\u6846 */\n BASH_BORDER: '#FFB86C',\n\n /** \u7B14\u8BB0\u6A21\u5F0F\u8FB9\u6846 */\n KODING_BORDER: '#5DADE2',\n\n /** \u4EFB\u52A1\u8FDB\u5EA6\u6761 */\n SUBAGENT_PROGRESS: '#B668C8',\n\n /** \u5F85\u529E\u9762\u677F\u4E3B\u8272 */\n TODO_MAIN: '#667EEA',\n} as const\n\n// ============================================================================\n// \u8BED\u4E49\u989C\u8272\u7CFB\u7EDF (Semantic Color System)\n// ============================================================================\n\n/**\n * \u8BED\u4E49\u989C\u8272 - \u6309\u4FE1\u606F\u7C7B\u578B\u5B9A\u4E49\u7684\u989C\u8272\n *\n * \u4F7F\u7528\u573A\u666F\uFF1A\n * - brand: \u54C1\u724C\u6807\u8BC6\u3001\u6B22\u8FCE\u4FE1\u606F\n * - accent: \u91CD\u8981\u9AD8\u4EAE\u3001\u884C\u52A8\u53EC\u5524\n * - primary: \u4E3B\u8981\u5185\u5BB9\u3001\u7528\u6237\u8F93\u5165\n * - secondary: \u8BF4\u660E\u4FE1\u606F\u3001\u64CD\u4F5C\u540D\u79F0\n * - dim: \u8865\u5145\u4FE1\u606F\u3001\u53C2\u6570\n * - muted: \u5143\u6570\u636E\u3001\u65F6\u95F4\u6233\n * - running: \u6B63\u5728\u5904\u7406\n * - success: \u5B8C\u6210\u3001\u6210\u529F\n * - error: \u5931\u8D25\u3001\u9519\u8BEF\n * - info: \u63D0\u793A\u3001\u94FE\u63A5\n */\nexport const SEMANTIC_COLORS = {\n /** \u54C1\u724C\u8272 - \u7D2B\u84DD */\n brand: '#667EEA',\n\n /** \u5F3A\u8C03\u8272 - \u73CA\u745A\u7EA2 */\n accent: '#F5576C',\n\n /** \u4E3B\u8981\u6587\u672C */\n primary: '#FFFFFF',\n\n /** \u6B21\u8981\u6587\u672C */\n secondary: '#CCCCCC',\n\n /** \u8F85\u52A9\u6587\u672C */\n dim: '#888888',\n\n /** \u6700\u6DE1\u6587\u672C */\n muted: '#555555',\n\n /** \u8FDB\u884C\u4E2D - \u7C89\u7D2B */\n running: '#B668C8',\n\n /** \u6210\u529F */\n success: '#4EBA65',\n\n /** \u9519\u8BEF */\n error: '#FF6B80',\n\n /** \u4FE1\u606F */\n info: '#5DADE2',\n} as const\n\n/**\n * \u8BED\u4E49\u989C\u8272\u7C7B\u578B\n */\nexport type SemanticColor = keyof typeof SEMANTIC_COLORS\n\n/**\n * \u83B7\u53D6\u8BED\u4E49\u989C\u8272\u503C\n */\nexport function getSemanticColor(color: SemanticColor): string {\n return SEMANTIC_COLORS[color]\n}\n\n// ============================================================================\n// \u72B6\u6001\u7B26\u53F7\u989C\u8272\u7CFB\u7EDF (Status Symbol Color System)\n// \u4E0E Logo \u914D\u8272\u4FDD\u6301\u4E00\u81F4\uFF0C\u4F7F\u7528 BRAND_GRADIENT\n// ============================================================================\n\n/**\n * \u72B6\u6001\u7B26\u53F7\u989C\u8272 - \u4E0E Logo \u4FDD\u6301\u4E00\u81F4\u7684\u54C1\u724C\u914D\u8272\n *\n * \u7528\u4E8E REPL \u4EA4\u4E92\u4E2D\u7684\u72B6\u6001\u6807\u8BB0\u7B26\u53F7\uFF08\u2713\u3001\u25D0\u3001\u23FA\u3001\u23BF \u7B49\uFF09\n * \u786E\u4FDD\u89C6\u89C9\u4E00\u81F4\u6027\u548C\u54C1\u724C\u8BC6\u522B\u5EA6\n */\nexport const SYMBOL_COLORS = {\n /** \u5B8C\u6210\u72B6\u6001 (\u2713) - \u4F7F\u7528\u54C1\u724C\u8D77\u59CB\u8272\u7D2B\u84DD */\n success: BRAND_GRADIENT.START,\n\n /** \u8FDB\u884C\u4E2D\u72B6\u6001 (\u25D0) - \u4F7F\u7528\u54C1\u724C\u4E2D\u95F4\u8272\u7C89\u7D2B */\n running: BRAND_GRADIENT.MIDDLE,\n\n /** \u9519\u8BEF\u72B6\u6001 (\u2717) - \u4F7F\u7528\u54C1\u724C\u7ED3\u675F\u8272\u73CA\u745A\u7EA2 */\n error: BRAND_GRADIENT.END,\n\n /** \u5F85\u5904\u7406\u72B6\u6001 - \u4F7F\u7528 dim */\n pending: SEMANTIC_COLORS.dim,\n\n /** \u5B50\u8F93\u51FA\u8FDE\u63A5\u7B26 (\u23BF) - \u4F7F\u7528 dim \u4FDD\u6301\u5C42\u7EA7\u611F */\n child: SEMANTIC_COLORS.dim,\n\n /** Todo \u66F4\u65B0 (\u23FA) - \u4F7F\u7528\u54C1\u724C\u8D77\u59CB\u8272 */\n todo: BRAND_GRADIENT.START,\n\n /** \u5E76\u884C\u4EFB\u52A1\u7EC4 (\u25C8) - \u4F7F\u7528\u54C1\u724C\u4E2D\u95F4\u8272 */\n parallel: BRAND_GRADIENT.MIDDLE,\n} as const\n\n// ============================================================================\n// \u72B6\u6001\u989C\u8272\u6620\u5C04 (Status Color Mapping)\n// ============================================================================\n\n/**\n * \u72B6\u6001\u989C\u8272\u6620\u5C04\n */\nexport const STATUS_COLORS = {\n running: SEMANTIC_COLORS.running,\n pending: SEMANTIC_COLORS.dim,\n success: SEMANTIC_COLORS.success,\n completed: SEMANTIC_COLORS.success,\n error: SEMANTIC_COLORS.error,\n failed: SEMANTIC_COLORS.error,\n done: SEMANTIC_COLORS.success,\n} as const\n\n/**\n * \u83B7\u53D6\u72B6\u6001\u989C\u8272\n */\nexport function getStatusColorHex(\n status: keyof typeof STATUS_COLORS | string,\n): string {\n return (\n STATUS_COLORS[status as keyof typeof STATUS_COLORS] || SEMANTIC_COLORS.dim\n )\n}\n\n/**\n * \u4FE1\u606F\u5C42\u7EA7\u989C\u8272\n */\nexport const VALUE_TIER_COLORS = {\n /** \u6838\u5FC3\u4FE1\u606F */\n core: SEMANTIC_COLORS.secondary,\n\n /** \u8F85\u52A9\u4FE1\u606F */\n auxiliary: SEMANTIC_COLORS.dim,\n\n /** \u5143\u4FE1\u606F */\n meta: SEMANTIC_COLORS.muted,\n} as const\n\n// ============================================================================\n// \u7EDF\u4E00\u5BFC\u51FA (Unified Export)\n// ============================================================================\n\nexport const CLAUDE_COLORS = {\n ...TEXT_COLORS,\n ...FUNCTIONAL_COLORS,\n ...BACKGROUND_COLORS,\n ...MINTO_COLORS,\n} as const\n\n// ============================================================================\n// Agent \u989C\u8272\u7CFB\u7EDF (Agent Color System)\n// ============================================================================\n\n/**\n * Agent \u989C\u8272\u7C7B\u578B\n */\nexport type AgentColor =\n | 'red'\n | 'blue'\n | 'green'\n | 'yellow'\n | 'purple'\n | 'orange'\n | 'pink'\n | 'cyan'\n | 'auto'\n\n/**\n * Agent \u989C\u8272\u6620\u5C04\u8868\n */\nexport const AGENT_COLORS: Record<AgentColor, string> = {\n red: '#FF6B80',\n blue: '#667EEA',\n green: '#4EBA65',\n yellow: '#FFB86C',\n purple: '#B668C8',\n orange: '#F5576C',\n pink: '#DC75A8',\n cyan: '#5DADE2',\n auto: '#FFFFFF',\n} as const\n\n/**\n * Agent \u989C\u8272\u63A8\u8350\u573A\u666F\uFF08\u9762\u5411\u5546\u4E1A\u7528\u6237\uFF09\n */\nexport const AGENT_COLOR_RECOMMENDATIONS: Record<AgentColor, string[]> = {\n red: ['\u5BA1\u6838', '\u98CE\u9669\u8BC4\u4F30', 'code-reviewer', 'security-auditor'],\n blue: ['\u5206\u6790', '\u7814\u7A76', 'general-purpose', 'research'],\n green: ['\u9A8C\u8BC1', '\u6D4B\u8BD5', 'test-automator', 'validator'],\n yellow: ['\u6570\u636E\u5206\u6790', '\u62A5\u544A', 'data-scientist', 'analyst'],\n purple: ['\u63A2\u7D22', '\u521B\u610F', 'explorer', 'creative'],\n orange: ['\u6267\u884C', '\u90E8\u7F72', 'deployment', 'action'],\n pink: ['\u5199\u4F5C', '\u6587\u6863', 'content-writer', 'docs'],\n cyan: ['\u8BCA\u65AD', '\u4F18\u5316', 'debugger', 'optimizer'],\n auto: ['\u9ED8\u8BA4'],\n}\n\n/**\n * \u83B7\u53D6 Agent \u989C\u8272\n */\nexport function getAgentColor(\n color: string | undefined,\n theme: ReturnType<typeof getTheme>,\n): string {\n if (!color || color === 'auto') {\n return theme.minto\n }\n\n const normalizedColor = color.toLowerCase() as AgentColor\n if (normalizedColor in AGENT_COLORS) {\n return AGENT_COLORS[normalizedColor]\n }\n\n return theme.minto\n}\n\n/**\n * \u6839\u636E Agent \u7C7B\u578B\u63A8\u8350\u989C\u8272\n */\nexport function recommendColorForAgent(agentType: string): AgentColor {\n const lowerType = agentType.toLowerCase()\n\n for (const [color, keywords] of Object.entries(AGENT_COLOR_RECOMMENDATIONS)) {\n for (const keyword of keywords) {\n if (lowerType.includes(keyword.toLowerCase())) {\n return color as AgentColor\n }\n }\n }\n\n return 'auto'\n}\n\n/**\n * \u83B7\u53D6\u5BF9\u6BD4\u6587\u672C\u989C\u8272\n */\nexport function getContrastTextColor(\n backgroundColor: string,\n): 'black' | 'white' {\n const hex = backgroundColor.replace('#', '')\n const r = parseInt(hex.substring(0, 2), 16)\n const g = parseInt(hex.substring(2, 4), 16)\n const b = parseInt(hex.substring(4, 6), 16)\n const yiq = (r * 299 + g * 587 + b * 114) / 1000\n return yiq >= 128 ? 'black' : 'white'\n}\n"],
|
|
5
|
+
"mappings": "AAmBO,MAAM,iBAAiB;AAAA;AAAA,EAE5B,OAAO;AAAA;AAAA,EAGP,QAAQ;AAAA;AAAA,EAGR,KAAK;AACP;AASO,MAAM,cAAc;AAAA;AAAA,EAEzB,SAAS;AAAA;AAAA,EAGT,WAAW;AAAA;AAAA,EAGX,QAAQ;AAAA;AAAA,EAGR,OAAO;AACT;AASO,MAAM,oBAAoB;AAAA;AAAA,EAE/B,OAAO;AAAA;AAAA,EAGP,QAAQ;AAAA;AAAA,EAGR,SAAS;AAAA;AAAA,EAGT,OAAO;AAAA;AAAA,EAGP,SAAS;AAAA;AAAA,EAGT,MAAM;AAAA;AAAA,EAGN,SAAS;AACX;AASO,MAAM,oBAAoB;AAAA;AAAA,EAE/B,QAAQ;AAAA;AAAA,EAGR,YAAY;AAAA;AAAA,EAGZ,WAAW;AAAA;AAAA,EAGX,aAAa;AACf;AASO,MAAM,eAAe;AAAA;AAAA,EAE1B,aAAa;AAAA;AAAA,EAGb,eAAe;AAAA;AAAA,EAGf,mBAAmB;AAAA;AAAA,EAGnB,WAAW;AACb;AAqBO,MAAM,kBAAkB;AAAA;AAAA,EAE7B,OAAO;AAAA;AAAA,EAGP,QAAQ;AAAA;AAAA,EAGR,SAAS;AAAA;AAAA,EAGT,WAAW;AAAA;AAAA,EAGX,KAAK;AAAA;AAAA,EAGL,OAAO;AAAA;AAAA,EAGP,SAAS;AAAA;AAAA,EAGT,SAAS;AAAA;AAAA,EAGT,OAAO;AAAA;AAAA,EAGP,MAAM;AACR;AAUO,SAAS,iBAAiB,OAA8B;AAC7D,SAAO,gBAAgB,KAAK;AAC9B;AAaO,MAAM,gBAAgB;AAAA;AAAA,EAE3B,SAAS,eAAe;AAAA;AAAA,EAGxB,SAAS,eAAe;AAAA;AAAA,EAGxB,OAAO,eAAe;AAAA;AAAA,EAGtB,SAAS,gBAAgB;AAAA;AAAA,EAGzB,OAAO,gBAAgB;AAAA;AAAA,EAGvB,MAAM,eAAe;AAAA;AAAA,EAGrB,UAAU,eAAe;AAC3B;AASO,MAAM,gBAAgB;AAAA,EAC3B,SAAS,gBAAgB;AAAA,EACzB,SAAS,gBAAgB;AAAA,EACzB,SAAS,gBAAgB;AAAA,EACzB,WAAW,gBAAgB;AAAA,EAC3B,OAAO,gBAAgB;AAAA,EACvB,QAAQ,gBAAgB;AAAA,EACxB,MAAM,gBAAgB;AACxB;AAKO,SAAS,kBACd,QACQ;AACR,SACE,cAAc,MAAoC,KAAK,gBAAgB;AAE3E;AAKO,MAAM,oBAAoB;AAAA;AAAA,EAE/B,MAAM,gBAAgB;AAAA;AAAA,EAGtB,WAAW,gBAAgB;AAAA;AAAA,EAG3B,MAAM,gBAAgB;AACxB;AAMO,MAAM,gBAAgB;AAAA,EAC3B,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAuBO,MAAM,eAA2C;AAAA,EACtD,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAKO,MAAM,8BAA4D;AAAA,EACvE,KAAK,CAAC,gBAAM,4BAAQ,iBAAiB,kBAAkB;AAAA,EACvD,MAAM,CAAC,gBAAM,gBAAM,mBAAmB,UAAU;AAAA,EAChD,OAAO,CAAC,gBAAM,gBAAM,kBAAkB,WAAW;AAAA,EACjD,QAAQ,CAAC,4BAAQ,gBAAM,kBAAkB,SAAS;AAAA,EAClD,QAAQ,CAAC,gBAAM,gBAAM,YAAY,UAAU;AAAA,EAC3C,QAAQ,CAAC,gBAAM,gBAAM,cAAc,QAAQ;AAAA,EAC3C,MAAM,CAAC,gBAAM,gBAAM,kBAAkB,MAAM;AAAA,EAC3C,MAAM,CAAC,gBAAM,gBAAM,YAAY,WAAW;AAAA,EAC1C,MAAM,CAAC,cAAI;AACb;AAKO,SAAS,cACd,OACA,OACQ;AACR,MAAI,CAAC,SAAS,UAAU,QAAQ;AAC9B,WAAO,MAAM;AAAA,EACf;AAEA,QAAM,kBAAkB,MAAM,YAAY;AAC1C,MAAI,mBAAmB,cAAc;AACnC,WAAO,aAAa,eAAe;AAAA,EACrC;AAEA,SAAO,MAAM;AACf;AAKO,SAAS,uBAAuB,WAA+B;AACpE,QAAM,YAAY,UAAU,YAAY;AAExC,aAAW,CAAC,OAAO,QAAQ,KAAK,OAAO,QAAQ,2BAA2B,GAAG;AAC3E,eAAW,WAAW,UAAU;AAC9B,UAAI,UAAU,SAAS,QAAQ,YAAY,CAAC,GAAG;AAC7C,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,qBACd,iBACmB;AACnB,QAAM,MAAM,gBAAgB,QAAQ,KAAK,EAAE;AAC3C,QAAM,IAAI,SAAS,IAAI,UAAU,GAAG,CAAC,GAAG,EAAE;AAC1C,QAAM,IAAI,SAAS,IAAI,UAAU,GAAG,CAAC,GAAG,EAAE;AAC1C,QAAM,IAAI,SAAS,IAAI,UAAU,GAAG,CAAC,GAAG,EAAE;AAC1C,QAAM,OAAO,IAAI,MAAM,IAAI,MAAM,IAAI,OAAO;AAC5C,SAAO,OAAO,MAAM,UAAU;AAChC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|