@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/HotkeyHelpPanel.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Hotkey Help Panel Component\n *\n * Displays a compact overlay showing available keyboard shortcuts.\n * Toggled with Ctrl+? or Ctrl+/ for quick reference.\n */\n\nimport { Box, Text, useInput } from 'ink'\nimport * as React from 'react'\nimport {
|
|
5
|
-
"mappings": "AAOA,SAAS,KAAK,MAAM,gBAAgB;AACpC,YAAY,WAAW;AACvB,SAAS,
|
|
4
|
+
"sourcesContent": ["/**\n * Hotkey Help Panel Component\n *\n * Displays a compact overlay showing available keyboard shortcuts.\n * Toggled with Ctrl+? or Ctrl+/ for quick reference.\n */\n\nimport { Box, Text, useInput } from 'ink'\nimport * as React from 'react'\nimport { t } from '@i18n'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\n\ninterface HotkeyGroup {\n title: string\n hotkeys: Array<{\n keys: string\n description: string\n }>\n}\n\nconst HOTKEY_GROUPS: HotkeyGroup[] = [\n {\n title: 'Navigation',\n hotkeys: [\n { keys: '\u2191/\u2193', description: 'Browse command history' },\n { keys: 'Ctrl+R', description: 'Search command history' },\n { keys: 'Tab', description: 'Autocomplete commands/paths' },\n { keys: 'Esc Esc', description: 'Rollback last response' },\n ],\n },\n {\n title: 'Control',\n hotkeys: [\n { keys: 'Ctrl+C', description: 'Cancel current operation' },\n { keys: 'Ctrl+D', description: 'Exit (press twice)' },\n { keys: 'Ctrl+L', description: 'Clear screen' },\n { keys: 'Enter', description: 'Submit prompt' },\n ],\n },\n {\n title: 'Features',\n hotkeys: [\n { keys: 'Ctrl+T', description: 'Toggle todo panel' },\n { keys: 'Ctrl+O', description: 'Cycle display mode' },\n { keys: 'Ctrl+B', description: 'Execute as bash command' },\n { keys: 'Ctrl+?', description: 'Show/hide this help' },\n ],\n },\n {\n title: 'Input Modes',\n hotkeys: [\n { keys: '/', description: 'Start a slash command' },\n { keys: '!', description: 'Execute bash command' },\n { keys: '#', description: 'Add note to KODING.md' },\n ],\n },\n]\n\ninterface Props {\n onClose: () => void\n isVisible: boolean\n}\n\nexport function HotkeyHelpPanel({\n onClose,\n isVisible,\n}: Props): React.ReactNode {\n // Handle Escape or Ctrl+? to close\n useInput(\n (input, key) => {\n if (key.escape || (key.ctrl && (input === '?' || input === '/'))) {\n onClose()\n }\n },\n { isActive: isVisible },\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={BRAND_GRADIENT.START}\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Box marginBottom={1}>\n <Text bold color={BRAND_GRADIENT.START}>\n \u2328\uFE0F {t('ui.hints.shortcuts')}\n </Text>\n <Text color={SEMANTIC_COLORS.secondary}>\n {' '}\n ({t('ui.hints.pressEsc')})\n </Text>\n </Box>\n\n <Box flexDirection=\"row\" gap={4}>\n {HOTKEY_GROUPS.map((group, groupIndex) => (\n <Box key={groupIndex} flexDirection=\"column\" minWidth={28}>\n <Text bold underline color={SEMANTIC_COLORS.secondary}>\n {group.title}\n </Text>\n {group.hotkeys.map((hotkey, hotkeyIndex) => (\n <Box key={hotkeyIndex}>\n <Box width={12}>\n <Text bold color={BRAND_GRADIENT.MIDDLE}>\n {hotkey.keys}\n </Text>\n </Box>\n <Text color={SEMANTIC_COLORS.primary}>\n {hotkey.description}\n </Text>\n </Box>\n ))}\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>{t('ui.hints.tip')}</Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Compact inline hotkey hint shown in the prompt area\n */\nexport function HotkeyHint(): React.ReactNode {\n return <Text color={SEMANTIC_COLORS.dim}>Ctrl+? for shortcuts</Text>\n}\n\n/**\n * Context state for determining which hints to show\n */\nexport type InputContext =\n | 'idle' // Empty input, ready for new command\n | 'typing' // User is typing a prompt\n | 'loading' // Request is being processed\n | 'completion' // Autocomplete suggestions visible\n | 'history_search' // Ctrl+R history search active\n | 'slash_command' // Typing a slash command\n\ninterface ContextHint {\n keys: string\n description: string\n}\n\n/**\n * Get context-specific hotkey hints based on current input state\n */\nfunction getContextHints(context: InputContext): ContextHint[] {\n switch (context) {\n case 'idle':\n return [\n { keys: '!', description: 'for bash mode' },\n { keys: '#', description: 'for MINTO.md' },\n { keys: '/', description: 'for commands' },\n { keys: 'ctrl+c', description: 'cancel' },\n { keys: 'ctrl+l', description: 'clear' },\n ]\n case 'typing':\n return [\n { keys: 'Enter', description: t('ui.hints.send') },\n { keys: 'Tab', description: t('ui.hints.complete') },\n { keys: 'Ctrl+B', description: t('ui.hints.bash') },\n { keys: 'Esc', description: t('common.clear') },\n ]\n case 'loading':\n return [\n { keys: 'Ctrl+C', description: t('common.cancel') },\n { keys: 'Esc Esc', description: t('ui.hints.rollback') },\n ]\n case 'completion':\n return [\n { keys: '\u2191/\u2193', description: t('ui.hints.select') },\n { keys: 'Tab', description: t('ui.hints.confirm') },\n { keys: 'Esc', description: t('ui.hints.close') },\n ]\n case 'history_search':\n return [\n { keys: '\u2191/\u2193', description: t('ui.hints.browse') },\n { keys: 'Enter', description: t('ui.hints.select') },\n { keys: 'Esc', description: t('common.cancel') },\n ]\n case 'slash_command':\n return [\n { keys: 'Tab', description: t('ui.hints.completeCommand') },\n { keys: 'Enter', description: t('ui.hints.execute') },\n { keys: 'Esc', description: t('common.cancel') },\n ]\n default:\n return [{ keys: 'Ctrl+?', description: t('common.help') }]\n }\n}\n\ninterface ContextAwareHintsProps {\n context: InputContext\n compact?: boolean // When true, show minimal hints\n}\n\n/**\n * Context-aware hotkey hints that adapt based on user's current activity\n * Shows relevant shortcuts for the current state without overwhelming the user\n */\nexport function ContextAwareHints({\n context,\n compact = true,\n}: ContextAwareHintsProps): React.ReactNode {\n const hints = getContextHints(context)\n\n if (compact) {\n // Single line, condensed format (0.1.7 style with \u00B7 separator)\n return (\n <Box>\n {hints.map((hint, i) => (\n <React.Fragment key={i}>\n {i > 0 && <Text color={SEMANTIC_COLORS.dim}> \u00B7 </Text>}\n <Text color={SEMANTIC_COLORS.dim}>\n {hint.keys} {hint.description}\n </Text>\n </React.Fragment>\n ))}\n </Box>\n )\n }\n\n // Expanded format with more padding\n return (\n <Box gap={2}>\n {hints.map((hint, i) => (\n <Box key={i}>\n <Text bold color={BRAND_GRADIENT.MIDDLE}>\n {hint.keys}\n </Text>\n <Text color={SEMANTIC_COLORS.secondary}> {hint.description}</Text>\n </Box>\n ))}\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -5,6 +5,7 @@ import { Select } from "./CustomSelect/select.js";
|
|
|
5
5
|
import { render } from "ink";
|
|
6
6
|
import { writeFileSync } from "fs";
|
|
7
7
|
import { useExitOnCtrlCD } from "../hooks/useExitOnCtrlCD.js";
|
|
8
|
+
import { SEMANTIC_COLORS } from "../constants/colors.js";
|
|
8
9
|
function InvalidConfigDialog({
|
|
9
10
|
filePath,
|
|
10
11
|
errorDescription,
|
|
@@ -47,7 +48,7 @@ function InvalidConfigDialog({
|
|
|
47
48
|
onChange: handleSelect
|
|
48
49
|
}
|
|
49
50
|
))
|
|
50
|
-
), exitState.pending ? /* @__PURE__ */ React.createElement(Text, {
|
|
51
|
+
), exitState.pending ? /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press ", exitState.keyName, " again to exit") : /* @__PURE__ */ React.createElement(Newline, null));
|
|
51
52
|
}
|
|
52
53
|
function showInvalidConfigDialog({
|
|
53
54
|
error
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/components/InvalidConfigDialog.tsx"],
|
|
4
|
-
"sourcesContent": ["import React from 'react'\nimport { Box, Newline, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { Select } from './CustomSelect/select'\nimport { render } from 'ink'\nimport { writeFileSync } from 'fs'\nimport { ConfigParseError } from '@utils/errors'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\ninterface InvalidConfigHandlerProps {\n error: ConfigParseError\n}\n\ninterface InvalidConfigDialogProps {\n filePath: string\n errorDescription: string\n onExit: () => void\n onReset: () => void\n}\n\n/**\n * Dialog shown when the Minto config file contains invalid JSON\n */\nfunction InvalidConfigDialog({\n filePath,\n errorDescription,\n onExit,\n onReset,\n}: InvalidConfigDialogProps): React.ReactNode {\n const theme = getTheme()\n\n // Handle escape key\n useInput((_, key) => {\n if (key.escape) {\n onExit()\n }\n })\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n // Handler for Select onChange\n const handleSelect = (value: string) => {\n if (value === 'exit') {\n onExit()\n } else {\n onReset()\n }\n }\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n borderColor={theme.error}\n borderStyle=\"round\"\n padding={1}\n width={70}\n gap={1}\n >\n <Text bold>Configuration Error</Text>\n\n <Box flexDirection=\"column\" gap={1}>\n <Text>\n The configuration file at <Text bold>{filePath}</Text> contains\n invalid JSON.\n </Text>\n <Text>{errorDescription}</Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text bold>Choose an option:</Text>\n <Select\n options={[\n { label: 'Exit and fix manually', value: 'exit' },\n { label: 'Reset with default configuration', value: 'reset' },\n ]}\n onChange={handleSelect}\n />\n </Box>\n </Box>\n {exitState.pending ? (\n <Text
|
|
5
|
-
"mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,SAAS,MAAM,gBAAgB;AAC7C,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,cAAc;AACvB,SAAS,qBAAqB;AAE9B,SAAS,uBAAuB;AAehC,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8C;AAC5C,QAAM,QAAQ,SAAS;AAGvB,WAAS,CAAC,GAAG,QAAQ;AACnB,QAAI,IAAI,QAAQ;AACd,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,QAAM,YAAY,gBAAgB,MAAM,QAAQ,KAAK,CAAC,CAAC;AAGvD,QAAM,eAAe,CAAC,UAAkB;AACtC,QAAI,UAAU,QAAQ;AACpB,aAAO;AAAA,IACT,OAAO;AACL,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,SACE,0DACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAa,MAAM;AAAA,MACnB,aAAY;AAAA,MACZ,SAAS;AAAA,MACT,OAAO;AAAA,MACP,KAAK;AAAA;AAAA,IAEL,oCAAC,QAAK,MAAI,QAAC,qBAAmB;AAAA,IAE9B,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B,oCAAC,YAAK,8BACsB,oCAAC,QAAK,MAAI,QAAE,QAAS,GAAO,yBAExD,GACA,oCAAC,YAAM,gBAAiB,CAC1B;AAAA,IAEA,oCAAC,OAAI,eAAc,YACjB,oCAAC,QAAK,MAAI,QAAC,mBAAiB,GAC5B;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,UACP,EAAE,OAAO,yBAAyB,OAAO,OAAO;AAAA,UAChD,EAAE,OAAO,oCAAoC,OAAO,QAAQ;AAAA,QAC9D;AAAA,QACA,UAAU;AAAA;AAAA,IACZ,CACF;AAAA,EACF,GACC,UAAU,UACT,oCAAC,QAAK,
|
|
4
|
+
"sourcesContent": ["import React from 'react'\nimport { Box, Newline, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { Select } from './CustomSelect/select'\nimport { render } from 'ink'\nimport { writeFileSync } from 'fs'\nimport { ConfigParseError } from '@utils/errors'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\nimport { SEMANTIC_COLORS } from '@constants/colors'\ninterface InvalidConfigHandlerProps {\n error: ConfigParseError\n}\n\ninterface InvalidConfigDialogProps {\n filePath: string\n errorDescription: string\n onExit: () => void\n onReset: () => void\n}\n\n/**\n * Dialog shown when the Minto config file contains invalid JSON\n */\nfunction InvalidConfigDialog({\n filePath,\n errorDescription,\n onExit,\n onReset,\n}: InvalidConfigDialogProps): React.ReactNode {\n const theme = getTheme()\n\n // Handle escape key\n useInput((_, key) => {\n if (key.escape) {\n onExit()\n }\n })\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n // Handler for Select onChange\n const handleSelect = (value: string) => {\n if (value === 'exit') {\n onExit()\n } else {\n onReset()\n }\n }\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n borderColor={theme.error}\n borderStyle=\"round\"\n padding={1}\n width={70}\n gap={1}\n >\n <Text bold>Configuration Error</Text>\n\n <Box flexDirection=\"column\" gap={1}>\n <Text>\n The configuration file at <Text bold>{filePath}</Text> contains\n invalid JSON.\n </Text>\n <Text>{errorDescription}</Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text bold>Choose an option:</Text>\n <Select\n options={[\n { label: 'Exit and fix manually', value: 'exit' },\n { label: 'Reset with default configuration', value: 'reset' },\n ]}\n onChange={handleSelect}\n />\n </Box>\n </Box>\n {exitState.pending ? (\n <Text color={SEMANTIC_COLORS.dim}>\n Press {exitState.keyName} again to exit\n </Text>\n ) : (\n <Newline />\n )}\n </>\n )\n}\n\nexport function showInvalidConfigDialog({\n error,\n}: InvalidConfigHandlerProps): Promise<void> {\n return new Promise(resolve => {\n render(\n <InvalidConfigDialog\n filePath={error.filePath}\n errorDescription={error.message}\n onExit={() => {\n resolve()\n process.exit(1)\n }}\n onReset={() => {\n writeFileSync(\n error.filePath,\n JSON.stringify(error.defaultConfig, null, 2),\n )\n resolve()\n process.exit(0)\n }}\n />,\n { exitOnCtrlC: false },\n )\n })\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,SAAS,MAAM,gBAAgB;AAC7C,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,cAAc;AACvB,SAAS,qBAAqB;AAE9B,SAAS,uBAAuB;AAChC,SAAS,uBAAuB;AAehC,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8C;AAC5C,QAAM,QAAQ,SAAS;AAGvB,WAAS,CAAC,GAAG,QAAQ;AACnB,QAAI,IAAI,QAAQ;AACd,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,QAAM,YAAY,gBAAgB,MAAM,QAAQ,KAAK,CAAC,CAAC;AAGvD,QAAM,eAAe,CAAC,UAAkB;AACtC,QAAI,UAAU,QAAQ;AACpB,aAAO;AAAA,IACT,OAAO;AACL,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,SACE,0DACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAa,MAAM;AAAA,MACnB,aAAY;AAAA,MACZ,SAAS;AAAA,MACT,OAAO;AAAA,MACP,KAAK;AAAA;AAAA,IAEL,oCAAC,QAAK,MAAI,QAAC,qBAAmB;AAAA,IAE9B,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B,oCAAC,YAAK,8BACsB,oCAAC,QAAK,MAAI,QAAE,QAAS,GAAO,yBAExD,GACA,oCAAC,YAAM,gBAAiB,CAC1B;AAAA,IAEA,oCAAC,OAAI,eAAc,YACjB,oCAAC,QAAK,MAAI,QAAC,mBAAiB,GAC5B;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,UACP,EAAE,OAAO,yBAAyB,OAAO,OAAO;AAAA,UAChD,EAAE,OAAO,oCAAoC,OAAO,QAAQ;AAAA,QAC9D;AAAA,QACA,UAAU;AAAA;AAAA,IACZ,CACF;AAAA,EACF,GACC,UAAU,UACT,oCAAC,QAAK,OAAO,gBAAgB,OAAK,UACzB,UAAU,SAAQ,gBAC3B,IAEA,oCAAC,aAAQ,CAEb;AAEJ;AAEO,SAAS,wBAAwB;AAAA,EACtC;AACF,GAA6C;AAC3C,SAAO,IAAI,QAAQ,aAAW;AAC5B;AAAA,MACE;AAAA,QAAC;AAAA;AAAA,UACC,UAAU,MAAM;AAAA,UAChB,kBAAkB,MAAM;AAAA,UACxB,QAAQ,MAAM;AACZ,oBAAQ;AACR,oBAAQ,KAAK,CAAC;AAAA,UAChB;AAAA,UACA,SAAS,MAAM;AACb;AAAA,cACE,MAAM;AAAA,cACN,KAAK,UAAU,MAAM,eAAe,MAAM,CAAC;AAAA,YAC7C;AACA,oBAAQ;AACR,oBAAQ,KAAK,CAAC;AAAA,UAChB;AAAA;AAAA,MACF;AAAA,MACA,EAAE,aAAa,MAAM;AAAA,IACvB;AAAA,EACF,CAAC;AACH;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/components/Logo.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { Box, Text } from "ink";
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { getTheme } from "../utils/theme.js";
|
|
4
|
-
import { getAnthropicApiKey, getGlobalConfig } from "../utils/config.js";
|
|
5
4
|
import { getCwd } from "../utils/state.js";
|
|
6
|
-
import { AsciiLogo } from "./AsciiLogo.js";
|
|
7
|
-
import { getModelManager } from "../utils/model.js";
|
|
8
5
|
import { MACRO } from "../constants/macros.js";
|
|
9
6
|
import { t } from "../i18n/index.js";
|
|
7
|
+
import path from "path";
|
|
8
|
+
import { BRAND_GRADIENT, SEMANTIC_COLORS } from "../constants/colors.js";
|
|
10
9
|
const MIN_LOGO_WIDTH = 50;
|
|
10
|
+
function getTerminalWidth() {
|
|
11
|
+
return process.stdout.columns || 80;
|
|
12
|
+
}
|
|
11
13
|
const DEFAULT_UPDATE_COMMANDS = [
|
|
12
14
|
"bun add -g @within-7/minto@latest",
|
|
13
15
|
"npm install -g @within-7/minto@latest"
|
|
@@ -18,75 +20,29 @@ function Logo({
|
|
|
18
20
|
updateBannerVersion,
|
|
19
21
|
updateBannerCommands
|
|
20
22
|
}) {
|
|
21
|
-
const width = Math.max(MIN_LOGO_WIDTH, getCwd().length + 12);
|
|
22
23
|
const theme = getTheme();
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
const hasOverrides = Boolean(
|
|
29
|
-
process.env.ANTHROPIC_API_KEY || process.env.DISABLE_PROMPT_CACHING || process.env.API_TIMEOUT_MS || process.env.MAX_THINKING_TOKENS
|
|
30
|
-
);
|
|
31
|
-
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(
|
|
24
|
+
const cwd = getCwd();
|
|
25
|
+
const projectName = path.basename(cwd);
|
|
26
|
+
const logoLines = ["\u2588\u2580\u2584\u2580\u2588 \u2588 \u2588\u2584 \u2588 \u2580\u2588\u2580 \u2588\u2580\u2588", "\u2588 \u2580 \u2588 \u2588 \u2588 \u2580\u2588 \u2588 \u2588\u2584\u2588"];
|
|
27
|
+
const terminalWidth = getTerminalWidth();
|
|
28
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width: terminalWidth }, updateBannerVersion ? /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingX: 1, marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.running }, "New version available: ", updateBannerVersion, " (current:", " ", MACRO.VERSION, ")"), /* @__PURE__ */ React.createElement(Text, null, "Run the following command to update:"), /* @__PURE__ */ React.createElement(Text, null, " ", updateBannerCommands?.[1] ?? DEFAULT_UPDATE_COMMANDS[1]), process.platform !== "win32" && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, 'Note: you may need to prefix with "sudo" on macOS/Linux.')) : null, /* @__PURE__ */ React.createElement(
|
|
32
29
|
Box,
|
|
33
30
|
{
|
|
34
|
-
borderColor: theme.minto,
|
|
35
|
-
borderStyle: "round",
|
|
36
31
|
flexDirection: "column",
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
32
|
+
borderTop: true,
|
|
33
|
+
borderBottom: true,
|
|
34
|
+
borderLeft: false,
|
|
35
|
+
borderRight: false,
|
|
36
|
+
borderColor: BRAND_GRADIENT.START,
|
|
37
|
+
borderStyle: "single",
|
|
38
|
+
width: terminalWidth,
|
|
39
|
+
paddingX: 1,
|
|
40
|
+
paddingY: 1
|
|
41
41
|
},
|
|
42
|
-
|
|
43
|
-
/* @__PURE__ */ React.createElement(
|
|
44
|
-
/* @__PURE__ */ React.createElement(
|
|
45
|
-
/* @__PURE__ */ React.createElement(
|
|
46
|
-
Box,
|
|
47
|
-
{
|
|
48
|
-
borderColor: theme.secondaryBorder,
|
|
49
|
-
borderStyle: "single",
|
|
50
|
-
borderBottom: false,
|
|
51
|
-
borderLeft: false,
|
|
52
|
-
borderRight: false,
|
|
53
|
-
borderTop: true,
|
|
54
|
-
flexDirection: "column",
|
|
55
|
-
marginLeft: 2,
|
|
56
|
-
marginRight: 1,
|
|
57
|
-
paddingTop: 1
|
|
58
|
-
},
|
|
59
|
-
/* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "Overrides (via env):")),
|
|
60
|
-
process.env.ANTHROPIC_API_KEY && apiKey ? /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "\u2022 API Key:", " ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "sk-ant-\u2026", apiKey.slice(-width + 25))) : null,
|
|
61
|
-
process.env.DISABLE_PROMPT_CACHING ? /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "\u2022 Prompt caching:", " ", /* @__PURE__ */ React.createElement(Text, { color: theme.error, bold: true }, "off")) : null,
|
|
62
|
-
process.env.API_TIMEOUT_MS ? /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "\u2022 API timeout:", " ", /* @__PURE__ */ React.createElement(Text, { bold: true }, process.env.API_TIMEOUT_MS, "ms")) : null,
|
|
63
|
-
process.env.MAX_THINKING_TOKENS ? /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "\u2022 Max thinking tokens:", " ", /* @__PURE__ */ React.createElement(Text, { bold: true }, process.env.MAX_THINKING_TOKENS)) : null,
|
|
64
|
-
process.env.ANTHROPIC_BASE_URL ? /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "\u2022 API Base URL:", " ", /* @__PURE__ */ React.createElement(Text, { bold: true }, process.env.ANTHROPIC_BASE_URL)) : null
|
|
65
|
-
)),
|
|
66
|
-
mcpClients.length ? /* @__PURE__ */ React.createElement(
|
|
67
|
-
Box,
|
|
68
|
-
{
|
|
69
|
-
borderColor: theme.secondaryBorder,
|
|
70
|
-
borderStyle: "single",
|
|
71
|
-
borderBottom: false,
|
|
72
|
-
borderLeft: false,
|
|
73
|
-
borderRight: false,
|
|
74
|
-
borderTop: true,
|
|
75
|
-
flexDirection: "column",
|
|
76
|
-
marginLeft: 2,
|
|
77
|
-
marginRight: 1,
|
|
78
|
-
paddingTop: 1
|
|
79
|
-
},
|
|
80
|
-
/* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, t("ui.welcome.mcpServers"), ":")),
|
|
81
|
-
mcpClients.map((client, idx) => /* @__PURE__ */ React.createElement(Box, { key: idx, width: width - 6 }, /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "\u2022 ", client.name), /* @__PURE__ */ React.createElement(Box, { flexGrow: 1 }), /* @__PURE__ */ React.createElement(
|
|
82
|
-
Text,
|
|
83
|
-
{
|
|
84
|
-
bold: true,
|
|
85
|
-
color: client.type === "connected" ? theme.success : theme.error
|
|
86
|
-
},
|
|
87
|
-
client.type === "connected" ? t("common.connected") : t("common.failed")
|
|
88
|
-
)))
|
|
89
|
-
) : null
|
|
42
|
+
/* @__PURE__ */ React.createElement(Box, { flexDirection: "column", alignItems: "center" }, /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START }, "\u25C6"), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", alignItems: "center", marginY: 1 }, /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START, bold: true }, logoLines[0]), /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.END, bold: true }, logoLines[1])), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START }, "Strategic AI"), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.END }, "Global Excellence"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " \xB7 v", MACRO.VERSION))),
|
|
43
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START }, "\u273B"), " ", t("ui.welcome.title"))),
|
|
44
|
+
/* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, t("ui.welcome.quickStart"), ":"), /* @__PURE__ */ React.createElement(Text, null, "\u2022 ", t("ui.welcome.tip1")), /* @__PURE__ */ React.createElement(Text, null, "\u2022 ", t("ui.welcome.tip2")), /* @__PURE__ */ React.createElement(Text, null, "\u2022 ", t("ui.welcome.tip3"))),
|
|
45
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "\u{1F4C2} ", projectName))
|
|
90
46
|
));
|
|
91
47
|
}
|
|
92
48
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/components/Logo.tsx"],
|
|
4
|
-
"sourcesContent": ["import { Box, Text
|
|
5
|
-
"mappings": "AAAA,SAAS,KAAK,
|
|
4
|
+
"sourcesContent": ["import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { getTheme } from '@utils/theme'\nimport { getCwd } from '@utils/state'\nimport type { WrappedClient } from '@services/mcpClient'\nimport { MACRO } from '@constants/macros'\nimport { t } from '@i18n'\nimport path from 'path'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\n\nexport const MIN_LOGO_WIDTH = 50\n\n/**\n * Get terminal width directly from stdout.\n * This is critical for Static component re-renders after clearTerminal,\n * as Ink's yoga-layout may not correctly infer the terminal width.\n */\nfunction getTerminalWidth(): number {\n return process.stdout.columns || 80\n}\n\nconst DEFAULT_UPDATE_COMMANDS = [\n 'bun add -g @within-7/minto@latest',\n 'npm install -g @within-7/minto@latest',\n] as const\n\nexport function Logo({\n mcpClients,\n isDefaultModel = false,\n updateBannerVersion,\n updateBannerCommands,\n}: {\n mcpClients: WrappedClient[]\n isDefaultModel?: boolean\n updateBannerVersion?: string | null\n updateBannerCommands?: string[] | null\n}): React.ReactNode {\n const theme = getTheme()\n const cwd = getCwd()\n const projectName = path.basename(cwd)\n const logoLines = ['\u2588\u2580\u2584\u2580\u2588 \u2588 \u2588\u2584 \u2588 \u2580\u2588\u2580 \u2588\u2580\u2588', '\u2588 \u2580 \u2588 \u2588 \u2588 \u2580\u2588 \u2588 \u2588\u2584\u2588']\n\n // Use explicit terminal width to ensure full-width rendering\n // This is critical after clearTerminal() when Ink's Static re-renders\n const terminalWidth = getTerminalWidth()\n\n return (\n <Box flexDirection=\"column\" width={terminalWidth}>\n {/* Update banner - outside the bordered area */}\n {updateBannerVersion ? (\n <Box flexDirection=\"column\" paddingX={1} marginBottom={1}>\n <Text color={SEMANTIC_COLORS.running}>\n New version available: {updateBannerVersion} (current:{' '}\n {MACRO.VERSION})\n </Text>\n <Text>Run the following command to update:</Text>\n <Text>\n {' '}\n {updateBannerCommands?.[1] ?? DEFAULT_UPDATE_COMMANDS[1]}\n </Text>\n {process.platform !== 'win32' && (\n <Text color={SEMANTIC_COLORS.dim}>\n Note: you may need to prefix with \"sudo\" on macOS/Linux.\n </Text>\n )}\n </Box>\n ) : null}\n\n {/* Main header with top/bottom borders */}\n <Box\n flexDirection=\"column\"\n borderTop={true}\n borderBottom={true}\n borderLeft={false}\n borderRight={false}\n borderColor={BRAND_GRADIENT.START}\n borderStyle=\"single\"\n width={terminalWidth}\n paddingX={1}\n paddingY={1}\n >\n {/* Logo section - centered */}\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text color={BRAND_GRADIENT.START}>\u25C6</Text>\n <Box flexDirection=\"column\" alignItems=\"center\" marginY={1}>\n <Text color={BRAND_GRADIENT.START} bold>\n {logoLines[0]}\n </Text>\n <Text color={BRAND_GRADIENT.END} bold>\n {logoLines[1]}\n </Text>\n </Box>\n <Text>\n <Text color={BRAND_GRADIENT.START}>Strategic AI</Text>\n <Text color={theme.secondaryText}> \u00B7 </Text>\n <Text color={BRAND_GRADIENT.END}>Global Excellence</Text>\n <Text color={SEMANTIC_COLORS.dim}> \u00B7 v{MACRO.VERSION}</Text>\n </Text>\n </Box>\n\n {/* Welcome message */}\n <Box marginTop={1}>\n <Text>\n <Text color={BRAND_GRADIENT.START}>\u273B</Text> {t('ui.welcome.title')}\n </Text>\n </Box>\n\n {/* Quick start tips */}\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold>{t('ui.welcome.quickStart')}:</Text>\n <Text>\u2022 {t('ui.welcome.tip1')}</Text>\n <Text>\u2022 {t('ui.welcome.tip2')}</Text>\n <Text>\u2022 {t('ui.welcome.tip3')}</Text>\n </Box>\n\n {/* Project folder */}\n <Box marginTop={1}>\n <Text color={theme.secondaryText}>\uD83D\uDCC2 {projectName}</Text>\n </Box>\n </Box>\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,KAAK,YAAY;AAC1B,YAAY,WAAW;AACvB,SAAS,gBAAgB;AACzB,SAAS,cAAc;AAEvB,SAAS,aAAa;AACtB,SAAS,SAAS;AAClB,OAAO,UAAU;AACjB,SAAS,gBAAgB,uBAAuB;AAEzC,MAAM,iBAAiB;AAO9B,SAAS,mBAA2B;AAClC,SAAO,QAAQ,OAAO,WAAW;AACnC;AAEA,MAAM,0BAA0B;AAAA,EAC9B;AAAA,EACA;AACF;AAEO,SAAS,KAAK;AAAA,EACnB;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AACF,GAKoB;AAClB,QAAM,QAAQ,SAAS;AACvB,QAAM,MAAM,OAAO;AACnB,QAAM,cAAc,KAAK,SAAS,GAAG;AACrC,QAAM,YAAY,CAAC,mGAAwB,6EAAsB;AAIjE,QAAM,gBAAgB,iBAAiB;AAEvC,SACE,oCAAC,OAAI,eAAc,UAAS,OAAO,iBAEhC,sBACC,oCAAC,OAAI,eAAc,UAAS,UAAU,GAAG,cAAc,KACrD,oCAAC,QAAK,OAAO,gBAAgB,WAAS,2BACZ,qBAAoB,cAAW,KACtD,MAAM,SAAQ,GACjB,GACA,oCAAC,YAAK,sCAAoC,GAC1C,oCAAC,YACE,MACA,uBAAuB,CAAC,KAAK,wBAAwB,CAAC,CACzD,GACC,QAAQ,aAAa,WACpB,oCAAC,QAAK,OAAO,gBAAgB,OAAK,0DAElC,CAEJ,IACE,MAGJ;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,WAAW;AAAA,MACX,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,aAAa,eAAe;AAAA,MAC5B,aAAY;AAAA,MACZ,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,IAGV,oCAAC,OAAI,eAAc,UAAS,YAAW,YACrC,oCAAC,QAAK,OAAO,eAAe,SAAO,QAAC,GACpC,oCAAC,OAAI,eAAc,UAAS,YAAW,UAAS,SAAS,KACvD,oCAAC,QAAK,OAAO,eAAe,OAAO,MAAI,QACpC,UAAU,CAAC,CACd,GACA,oCAAC,QAAK,OAAO,eAAe,KAAK,MAAI,QAClC,UAAU,CAAC,CACd,CACF,GACA,oCAAC,YACC,oCAAC,QAAK,OAAO,eAAe,SAAO,cAAY,GAC/C,oCAAC,QAAK,OAAO,MAAM,iBAAe,QAAG,GACrC,oCAAC,QAAK,OAAO,eAAe,OAAK,mBAAiB,GAClD,oCAAC,QAAK,OAAO,gBAAgB,OAAK,WAAK,MAAM,OAAQ,CACvD,CACF;AAAA,IAGA,oCAAC,OAAI,WAAW,KACd,oCAAC,YACC,oCAAC,QAAK,OAAO,eAAe,SAAO,QAAC,GAAO,KAAE,EAAE,kBAAkB,CACnE,CACF;AAAA,IAGA,oCAAC,OAAI,eAAc,UAAS,WAAW,KACrC,oCAAC,QAAK,MAAI,QAAE,EAAE,uBAAuB,GAAE,GAAC,GACxC,oCAAC,YAAK,WAAG,EAAE,iBAAiB,CAAE,GAC9B,oCAAC,YAAK,WAAG,EAAE,iBAAiB,CAAE,GAC9B,oCAAC,YAAK,WAAG,EAAE,iBAAiB,CAAE,CAChC;AAAA,IAGA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAO,MAAM,iBAAe,cAAI,WAAY,CACpD;AAAA,EACF,CACF;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
} from "../utils/config.js";
|
|
9
9
|
import { MCPServerDialogCopy } from "./MCPServerDialogCopy.js";
|
|
10
10
|
import { useExitOnCtrlCD } from "../hooks/useExitOnCtrlCD.js";
|
|
11
|
+
import { SEMANTIC_COLORS } from "../constants/colors.js";
|
|
11
12
|
function MCPServerApprovalDialog({
|
|
12
13
|
serverName,
|
|
13
14
|
onDone
|
|
@@ -71,7 +72,7 @@ function MCPServerApprovalDialog({
|
|
|
71
72
|
onChange: (value) => onChange(value)
|
|
72
73
|
}
|
|
73
74
|
)
|
|
74
|
-
), /* @__PURE__ */ React.createElement(Box, { marginLeft: 3 }, /* @__PURE__ */ React.createElement(Text, {
|
|
75
|
+
), /* @__PURE__ */ React.createElement(Box, { marginLeft: 3 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, exitState.pending ? /* @__PURE__ */ React.createElement(React.Fragment, null, "Press ", exitState.keyName, " again to exit") : /* @__PURE__ */ React.createElement(React.Fragment, null, "Enter to confirm \xB7 Esc to reject"))));
|
|
75
76
|
}
|
|
76
77
|
export {
|
|
77
78
|
MCPServerApprovalDialog
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/components/MCPServerApprovalDialog.tsx"],
|
|
4
|
-
"sourcesContent": ["import React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { Select } from './CustomSelect/select'\nimport {\n saveCurrentProjectConfig,\n getCurrentProjectConfig,\n} from '@utils/config'\nimport { MCPServerDialogCopy } from './MCPServerDialogCopy'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\n\ntype Props = {\n serverName: string\n onDone(): void\n}\n\nexport function MCPServerApprovalDialog({\n serverName,\n onDone,\n}: Props): React.ReactNode {\n const theme = getTheme()\n function onChange(value: 'yes' | 'no') {\n const config = getCurrentProjectConfig()\n switch (value) {\n case 'yes': {\n if (!config.approvedMcprcServers) {\n config.approvedMcprcServers = []\n }\n if (!config.approvedMcprcServers.includes(serverName)) {\n config.approvedMcprcServers.push(serverName)\n }\n saveCurrentProjectConfig(config)\n onDone()\n break\n }\n case 'no': {\n if (!config.rejectedMcprcServers) {\n config.rejectedMcprcServers = []\n }\n if (!config.rejectedMcprcServers.includes(serverName)) {\n config.rejectedMcprcServers.push(serverName)\n }\n saveCurrentProjectConfig(config)\n onDone()\n break\n }\n }\n }\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n useInput((_input, key) => {\n if (key.escape) {\n onDone()\n return\n }\n })\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n gap={1}\n padding={1}\n borderStyle=\"round\"\n borderColor={theme.warning}\n >\n <Text bold color={theme.warning}>\n New MCP Server Detected\n </Text>\n <Text>\n This project contains a .mcprc file with an MCP server that requires\n your approval:\n </Text>\n <Text bold>{serverName}</Text>\n\n <MCPServerDialogCopy />\n\n <Text>Do you want to approve this MCP server?</Text>\n\n <Select\n options={[\n { label: 'Yes, approve this server', value: 'yes' },\n { label: 'No, reject this server', value: 'no' },\n ]}\n onChange={value => onChange(value as 'yes' | 'no')}\n />\n </Box>\n <Box marginLeft={3}>\n <Text
|
|
5
|
-
"mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAOzB,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,QAAQ,SAAS;AACvB,WAAS,SAAS,OAAqB;AACrC,UAAM,SAAS,wBAAwB;AACvC,YAAQ,OAAO;AAAA,MACb,KAAK,OAAO;AACV,YAAI,CAAC,OAAO,sBAAsB;AAChC,iBAAO,uBAAuB,CAAC;AAAA,QACjC;AACA,YAAI,CAAC,OAAO,qBAAqB,SAAS,UAAU,GAAG;AACrD,iBAAO,qBAAqB,KAAK,UAAU;AAAA,QAC7C;AACA,iCAAyB,MAAM;AAC/B,eAAO;AACP;AAAA,MACF;AAAA,MACA,KAAK,MAAM;AACT,YAAI,CAAC,OAAO,sBAAsB;AAChC,iBAAO,uBAAuB,CAAC;AAAA,QACjC;AACA,YAAI,CAAC,OAAO,qBAAqB,SAAS,UAAU,GAAG;AACrD,iBAAO,qBAAqB,KAAK,UAAU;AAAA,QAC7C;AACA,iCAAyB,MAAM;AAC/B,eAAO;AACP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,gBAAgB,MAAM,QAAQ,KAAK,CAAC,CAAC;AAEvD,WAAS,CAAC,QAAQ,QAAQ;AACxB,QAAI,IAAI,QAAQ;AACd,aAAO;AACP;AAAA,IACF;AAAA,EACF,CAAC;AAED,SACE,0DACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,KAAK;AAAA,MACL,SAAS;AAAA,MACT,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA;AAAA,IAEnB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,yBAEjC;AAAA,IACA,oCAAC,YAAK,qFAGN;AAAA,IACA,oCAAC,QAAK,MAAI,QAAE,UAAW;AAAA,IAEvB,oCAAC,yBAAoB;AAAA,IAErB,oCAAC,YAAK,yCAAuC;AAAA,IAE7C;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,UACP,EAAE,OAAO,4BAA4B,OAAO,MAAM;AAAA,UAClD,EAAE,OAAO,0BAA0B,OAAO,KAAK;AAAA,QACjD;AAAA,QACA,UAAU,WAAS,SAAS,KAAqB;AAAA;AAAA,IACnD;AAAA,EACF,GACA,oCAAC,OAAI,YAAY,KACf,oCAAC,QAAK,
|
|
4
|
+
"sourcesContent": ["import React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { Select } from './CustomSelect/select'\nimport {\n saveCurrentProjectConfig,\n getCurrentProjectConfig,\n} from '@utils/config'\nimport { MCPServerDialogCopy } from './MCPServerDialogCopy'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ntype Props = {\n serverName: string\n onDone(): void\n}\n\nexport function MCPServerApprovalDialog({\n serverName,\n onDone,\n}: Props): React.ReactNode {\n const theme = getTheme()\n function onChange(value: 'yes' | 'no') {\n const config = getCurrentProjectConfig()\n switch (value) {\n case 'yes': {\n if (!config.approvedMcprcServers) {\n config.approvedMcprcServers = []\n }\n if (!config.approvedMcprcServers.includes(serverName)) {\n config.approvedMcprcServers.push(serverName)\n }\n saveCurrentProjectConfig(config)\n onDone()\n break\n }\n case 'no': {\n if (!config.rejectedMcprcServers) {\n config.rejectedMcprcServers = []\n }\n if (!config.rejectedMcprcServers.includes(serverName)) {\n config.rejectedMcprcServers.push(serverName)\n }\n saveCurrentProjectConfig(config)\n onDone()\n break\n }\n }\n }\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n useInput((_input, key) => {\n if (key.escape) {\n onDone()\n return\n }\n })\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n gap={1}\n padding={1}\n borderStyle=\"round\"\n borderColor={theme.warning}\n >\n <Text bold color={theme.warning}>\n New MCP Server Detected\n </Text>\n <Text>\n This project contains a .mcprc file with an MCP server that requires\n your approval:\n </Text>\n <Text bold>{serverName}</Text>\n\n <MCPServerDialogCopy />\n\n <Text>Do you want to approve this MCP server?</Text>\n\n <Select\n options={[\n { label: 'Yes, approve this server', value: 'yes' },\n { label: 'No, reject this server', value: 'no' },\n ]}\n onChange={value => onChange(value as 'yes' | 'no')}\n />\n </Box>\n <Box marginLeft={3}>\n <Text color={SEMANTIC_COLORS.dim}>\n {exitState.pending ? (\n <>Press {exitState.keyName} again to exit</>\n ) : (\n <>Enter to confirm \u00B7 Esc to reject</>\n )}\n </Text>\n </Box>\n </>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAChC,SAAS,uBAAuB;AAOzB,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,QAAQ,SAAS;AACvB,WAAS,SAAS,OAAqB;AACrC,UAAM,SAAS,wBAAwB;AACvC,YAAQ,OAAO;AAAA,MACb,KAAK,OAAO;AACV,YAAI,CAAC,OAAO,sBAAsB;AAChC,iBAAO,uBAAuB,CAAC;AAAA,QACjC;AACA,YAAI,CAAC,OAAO,qBAAqB,SAAS,UAAU,GAAG;AACrD,iBAAO,qBAAqB,KAAK,UAAU;AAAA,QAC7C;AACA,iCAAyB,MAAM;AAC/B,eAAO;AACP;AAAA,MACF;AAAA,MACA,KAAK,MAAM;AACT,YAAI,CAAC,OAAO,sBAAsB;AAChC,iBAAO,uBAAuB,CAAC;AAAA,QACjC;AACA,YAAI,CAAC,OAAO,qBAAqB,SAAS,UAAU,GAAG;AACrD,iBAAO,qBAAqB,KAAK,UAAU;AAAA,QAC7C;AACA,iCAAyB,MAAM;AAC/B,eAAO;AACP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,gBAAgB,MAAM,QAAQ,KAAK,CAAC,CAAC;AAEvD,WAAS,CAAC,QAAQ,QAAQ;AACxB,QAAI,IAAI,QAAQ;AACd,aAAO;AACP;AAAA,IACF;AAAA,EACF,CAAC;AAED,SACE,0DACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,KAAK;AAAA,MACL,SAAS;AAAA,MACT,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA;AAAA,IAEnB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,yBAEjC;AAAA,IACA,oCAAC,YAAK,qFAGN;AAAA,IACA,oCAAC,QAAK,MAAI,QAAE,UAAW;AAAA,IAEvB,oCAAC,yBAAoB;AAAA,IAErB,oCAAC,YAAK,yCAAuC;AAAA,IAE7C;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,UACP,EAAE,OAAO,4BAA4B,OAAO,MAAM;AAAA,UAClD,EAAE,OAAO,0BAA0B,OAAO,KAAK;AAAA,QACjD;AAAA,QACA,UAAU,WAAS,SAAS,KAAqB;AAAA;AAAA,IACnD;AAAA,EACF,GACA,oCAAC,OAAI,YAAY,KACf,oCAAC,QAAK,OAAO,gBAAgB,OAC1B,UAAU,UACT,0DAAE,UAAO,UAAU,SAAQ,gBAAc,IAEzC,0DAAE,qCAAgC,CAEtC,CACF,CACF;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -2,8 +2,9 @@ import React from "react";
|
|
|
2
2
|
import { Text } from "ink";
|
|
3
3
|
import Link from "ink-link";
|
|
4
4
|
import { PRODUCT_NAME, PRODUCT_COMMAND } from "../constants/product.js";
|
|
5
|
+
import { SEMANTIC_COLORS } from "../constants/colors.js";
|
|
5
6
|
function MCPServerDialogCopy() {
|
|
6
|
-
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, "MCP servers provide additional functionality to ", PRODUCT_NAME, ". They may execute code, make network requests, or access system resources via tool calls. All tool calls will require your explicit approval before execution. For more information, see", " ", /* @__PURE__ */ React.createElement(Link, { url: "https://docs.anthropic.com/s/claude-code-mcp" }, "MCP documentation")), /* @__PURE__ */ React.createElement(Text, {
|
|
7
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, "MCP servers provide additional functionality to ", PRODUCT_NAME, ". They may execute code, make network requests, or access system resources via tool calls. All tool calls will require your explicit approval before execution. For more information, see", " ", /* @__PURE__ */ React.createElement(Link, { url: "https://docs.anthropic.com/s/claude-code-mcp" }, "MCP documentation")), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Remember: You can always change these choices later by running `", PRODUCT_COMMAND, " mcp reset-mcprc-choices`"));
|
|
7
8
|
}
|
|
8
9
|
export {
|
|
9
10
|
MCPServerDialogCopy
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/components/MCPServerDialogCopy.tsx"],
|
|
4
|
-
"sourcesContent": ["import React from 'react'\nimport { Text } from 'ink'\nimport Link from 'ink-link'\nimport { PRODUCT_NAME, PRODUCT_COMMAND } from '@constants/product'\n\nexport function MCPServerDialogCopy(): React.ReactNode {\n return (\n <>\n <Text>\n MCP servers provide additional functionality to {PRODUCT_NAME}. They may\n execute code, make network requests, or access system resources via tool\n calls. All tool calls will require your explicit approval before\n execution. For more information, see{' '}\n <Link url=\"https://docs.anthropic.com/s/claude-code-mcp\">\n MCP documentation\n </Link>\n </Text>\n\n <Text
|
|
5
|
-
"mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,YAAY;AACrB,OAAO,UAAU;AACjB,SAAS,cAAc,uBAAuB;
|
|
4
|
+
"sourcesContent": ["import React from 'react'\nimport { Text } from 'ink'\nimport Link from 'ink-link'\nimport { PRODUCT_NAME, PRODUCT_COMMAND } from '@constants/product'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\nexport function MCPServerDialogCopy(): React.ReactNode {\n return (\n <>\n <Text>\n MCP servers provide additional functionality to {PRODUCT_NAME}. They may\n execute code, make network requests, or access system resources via tool\n calls. All tool calls will require your explicit approval before\n execution. For more information, see{' '}\n <Link url=\"https://docs.anthropic.com/s/claude-code-mcp\">\n MCP documentation\n </Link>\n </Text>\n\n <Text color={SEMANTIC_COLORS.dim}>\n Remember: You can always change these choices later by running `\n {PRODUCT_COMMAND} mcp reset-mcprc-choices`\n </Text>\n </>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,YAAY;AACrB,OAAO,UAAU;AACjB,SAAS,cAAc,uBAAuB;AAC9C,SAAS,uBAAuB;AAEzB,SAAS,sBAAuC;AACrD,SACE,0DACE,oCAAC,YAAK,oDAC6C,cAAa,6LAGzB,KACrC,oCAAC,QAAK,KAAI,kDAA+C,mBAEzD,CACF,GAEA,oCAAC,QAAK,OAAO,gBAAgB,OAAK,oEAE/B,iBAAgB,2BACnB,CACF;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
import { partition } from "lodash-es";
|
|
10
10
|
import { MCPServerDialogCopy } from "./MCPServerDialogCopy.js";
|
|
11
11
|
import { useExitOnCtrlCD } from "../hooks/useExitOnCtrlCD.js";
|
|
12
|
+
import { SEMANTIC_COLORS } from "../constants/colors.js";
|
|
12
13
|
function MCPServerMultiselectDialog({
|
|
13
14
|
serverNames,
|
|
14
15
|
onDone
|
|
@@ -72,7 +73,7 @@ function MCPServerMultiselectDialog({
|
|
|
72
73
|
onSubmit
|
|
73
74
|
}
|
|
74
75
|
)
|
|
75
|
-
), /* @__PURE__ */ React.createElement(Box, { marginLeft: 3 }, /* @__PURE__ */ React.createElement(Text, {
|
|
76
|
+
), /* @__PURE__ */ React.createElement(Box, { marginLeft: 3 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, exitState.pending ? /* @__PURE__ */ React.createElement(React.Fragment, null, "Press ", exitState.keyName, " again to exit") : /* @__PURE__ */ React.createElement(React.Fragment, null, "Space to select \xB7 Enter to confirm \xB7 Esc to reject all"))));
|
|
76
77
|
}
|
|
77
78
|
export {
|
|
78
79
|
MCPServerMultiselectDialog
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/components/MCPServerMultiselectDialog.tsx"],
|
|
4
|
-
"sourcesContent": ["import React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { MultiSelect } from '@inkjs/ui'\nimport {\n saveCurrentProjectConfig,\n getCurrentProjectConfig,\n} from '@utils/config'\nimport { partition } from 'lodash-es'\nimport { MCPServerDialogCopy } from './MCPServerDialogCopy'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\n\ntype Props = {\n serverNames: string[]\n onDone(): void\n}\n\nexport function MCPServerMultiselectDialog({\n serverNames,\n onDone,\n}: Props): React.ReactNode {\n const theme = getTheme()\n function onSubmit(selectedServers: string[]) {\n const config = getCurrentProjectConfig()\n\n // Initialize arrays if they don't exist\n if (!config.approvedMcprcServers) {\n config.approvedMcprcServers = []\n }\n if (!config.rejectedMcprcServers) {\n config.rejectedMcprcServers = []\n }\n\n // Use partition to separate approved and rejected servers\n const [approvedServers, rejectedServers] = partition(serverNames, server =>\n selectedServers.includes(server),\n )\n\n // Add new servers directly to the respective lists\n config.approvedMcprcServers.push(...approvedServers)\n config.rejectedMcprcServers.push(...rejectedServers)\n\n saveCurrentProjectConfig(config)\n onDone()\n }\n\n const exitState = useExitOnCtrlCD(() => process.exit())\n\n useInput((_input, key) => {\n if (key.escape) {\n // On escape, treat all servers as rejected\n const config = getCurrentProjectConfig()\n if (!config.rejectedMcprcServers) {\n config.rejectedMcprcServers = []\n }\n\n for (const server of serverNames) {\n if (!config.rejectedMcprcServers.includes(server)) {\n config.rejectedMcprcServers.push(server)\n }\n }\n\n saveCurrentProjectConfig(config)\n onDone()\n return\n }\n })\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n gap={1}\n padding={1}\n borderStyle=\"round\"\n borderColor={theme.warning}\n >\n <Text bold color={theme.warning}>\n New MCP Servers Detected\n </Text>\n <Text>\n This project contains a .mcprc file with {serverNames.length} MCP\n servers that require your approval.\n </Text>\n <MCPServerDialogCopy />\n\n <Text>Please select the servers you want to enable:</Text>\n\n <MultiSelect\n options={serverNames.map(server => ({\n label: server,\n value: server,\n }))}\n defaultValue={serverNames}\n onSubmit={onSubmit}\n />\n </Box>\n <Box marginLeft={3}>\n <Text
|
|
5
|
-
"mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB;AAC1B,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAOzB,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,QAAQ,SAAS;AACvB,WAAS,SAAS,iBAA2B;AAC3C,UAAM,SAAS,wBAAwB;AAGvC,QAAI,CAAC,OAAO,sBAAsB;AAChC,aAAO,uBAAuB,CAAC;AAAA,IACjC;AACA,QAAI,CAAC,OAAO,sBAAsB;AAChC,aAAO,uBAAuB,CAAC;AAAA,IACjC;AAGA,UAAM,CAAC,iBAAiB,eAAe,IAAI;AAAA,MAAU;AAAA,MAAa,YAChE,gBAAgB,SAAS,MAAM;AAAA,IACjC;AAGA,WAAO,qBAAqB,KAAK,GAAG,eAAe;AACnD,WAAO,qBAAqB,KAAK,GAAG,eAAe;AAEnD,6BAAyB,MAAM;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,gBAAgB,MAAM,QAAQ,KAAK,CAAC;AAEtD,WAAS,CAAC,QAAQ,QAAQ;AACxB,QAAI,IAAI,QAAQ;AAEd,YAAM,SAAS,wBAAwB;AACvC,UAAI,CAAC,OAAO,sBAAsB;AAChC,eAAO,uBAAuB,CAAC;AAAA,MACjC;AAEA,iBAAW,UAAU,aAAa;AAChC,YAAI,CAAC,OAAO,qBAAqB,SAAS,MAAM,GAAG;AACjD,iBAAO,qBAAqB,KAAK,MAAM;AAAA,QACzC;AAAA,MACF;AAEA,+BAAyB,MAAM;AAC/B,aAAO;AACP;AAAA,IACF;AAAA,EACF,CAAC;AAED,SACE,0DACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,KAAK;AAAA,MACL,SAAS;AAAA,MACT,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA;AAAA,IAEnB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,0BAEjC;AAAA,IACA,oCAAC,YAAK,6CACsC,YAAY,QAAO,0CAE/D;AAAA,IACA,oCAAC,yBAAoB;AAAA,IAErB,oCAAC,YAAK,+CAA6C;AAAA,IAEnD;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,YAAY,IAAI,aAAW;AAAA,UAClC,OAAO;AAAA,UACP,OAAO;AAAA,QACT,EAAE;AAAA,QACF,cAAc;AAAA,QACd;AAAA;AAAA,IACF;AAAA,EACF,GACA,oCAAC,OAAI,YAAY,KACf,oCAAC,QAAK,
|
|
4
|
+
"sourcesContent": ["import React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { MultiSelect } from '@inkjs/ui'\nimport {\n saveCurrentProjectConfig,\n getCurrentProjectConfig,\n} from '@utils/config'\nimport { partition } from 'lodash-es'\nimport { MCPServerDialogCopy } from './MCPServerDialogCopy'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ntype Props = {\n serverNames: string[]\n onDone(): void\n}\n\nexport function MCPServerMultiselectDialog({\n serverNames,\n onDone,\n}: Props): React.ReactNode {\n const theme = getTheme()\n function onSubmit(selectedServers: string[]) {\n const config = getCurrentProjectConfig()\n\n // Initialize arrays if they don't exist\n if (!config.approvedMcprcServers) {\n config.approvedMcprcServers = []\n }\n if (!config.rejectedMcprcServers) {\n config.rejectedMcprcServers = []\n }\n\n // Use partition to separate approved and rejected servers\n const [approvedServers, rejectedServers] = partition(serverNames, server =>\n selectedServers.includes(server),\n )\n\n // Add new servers directly to the respective lists\n config.approvedMcprcServers.push(...approvedServers)\n config.rejectedMcprcServers.push(...rejectedServers)\n\n saveCurrentProjectConfig(config)\n onDone()\n }\n\n const exitState = useExitOnCtrlCD(() => process.exit())\n\n useInput((_input, key) => {\n if (key.escape) {\n // On escape, treat all servers as rejected\n const config = getCurrentProjectConfig()\n if (!config.rejectedMcprcServers) {\n config.rejectedMcprcServers = []\n }\n\n for (const server of serverNames) {\n if (!config.rejectedMcprcServers.includes(server)) {\n config.rejectedMcprcServers.push(server)\n }\n }\n\n saveCurrentProjectConfig(config)\n onDone()\n return\n }\n })\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n gap={1}\n padding={1}\n borderStyle=\"round\"\n borderColor={theme.warning}\n >\n <Text bold color={theme.warning}>\n New MCP Servers Detected\n </Text>\n <Text>\n This project contains a .mcprc file with {serverNames.length} MCP\n servers that require your approval.\n </Text>\n <MCPServerDialogCopy />\n\n <Text>Please select the servers you want to enable:</Text>\n\n <MultiSelect\n options={serverNames.map(server => ({\n label: server,\n value: server,\n }))}\n defaultValue={serverNames}\n onSubmit={onSubmit}\n />\n </Box>\n <Box marginLeft={3}>\n <Text color={SEMANTIC_COLORS.dim}>\n {exitState.pending ? (\n <>Press {exitState.keyName} again to exit</>\n ) : (\n <>Space to select \u00B7 Enter to confirm \u00B7 Esc to reject all</>\n )}\n </Text>\n </Box>\n </>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB;AAC1B,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAChC,SAAS,uBAAuB;AAOzB,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,QAAQ,SAAS;AACvB,WAAS,SAAS,iBAA2B;AAC3C,UAAM,SAAS,wBAAwB;AAGvC,QAAI,CAAC,OAAO,sBAAsB;AAChC,aAAO,uBAAuB,CAAC;AAAA,IACjC;AACA,QAAI,CAAC,OAAO,sBAAsB;AAChC,aAAO,uBAAuB,CAAC;AAAA,IACjC;AAGA,UAAM,CAAC,iBAAiB,eAAe,IAAI;AAAA,MAAU;AAAA,MAAa,YAChE,gBAAgB,SAAS,MAAM;AAAA,IACjC;AAGA,WAAO,qBAAqB,KAAK,GAAG,eAAe;AACnD,WAAO,qBAAqB,KAAK,GAAG,eAAe;AAEnD,6BAAyB,MAAM;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,gBAAgB,MAAM,QAAQ,KAAK,CAAC;AAEtD,WAAS,CAAC,QAAQ,QAAQ;AACxB,QAAI,IAAI,QAAQ;AAEd,YAAM,SAAS,wBAAwB;AACvC,UAAI,CAAC,OAAO,sBAAsB;AAChC,eAAO,uBAAuB,CAAC;AAAA,MACjC;AAEA,iBAAW,UAAU,aAAa;AAChC,YAAI,CAAC,OAAO,qBAAqB,SAAS,MAAM,GAAG;AACjD,iBAAO,qBAAqB,KAAK,MAAM;AAAA,QACzC;AAAA,MACF;AAEA,+BAAyB,MAAM;AAC/B,aAAO;AACP;AAAA,IACF;AAAA,EACF,CAAC;AAED,SACE,0DACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,KAAK;AAAA,MACL,SAAS;AAAA,MACT,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA;AAAA,IAEnB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,0BAEjC;AAAA,IACA,oCAAC,YAAK,6CACsC,YAAY,QAAO,0CAE/D;AAAA,IACA,oCAAC,yBAAoB;AAAA,IAErB,oCAAC,YAAK,+CAA6C;AAAA,IAEnD;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,YAAY,IAAI,aAAW;AAAA,UAClC,OAAO;AAAA,UACP,OAAO;AAAA,QACT,EAAE;AAAA,QACF,cAAc;AAAA,QACd;AAAA;AAAA,IACF;AAAA,EACF,GACA,oCAAC,OAAI,YAAY,KACf,oCAAC,QAAK,OAAO,gBAAgB,OAC1B,UAAU,UACT,0DAAE,UAAO,UAAU,SAAQ,gBAAc,IAEzC,0DAAE,8DAAsD,CAE5D,CACF,CACF;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
normalizeMessages
|
|
13
13
|
} from "../utils/messages.js";
|
|
14
14
|
import { useExitOnCtrlCD } from "../hooks/useExitOnCtrlCD.js";
|
|
15
|
+
import { BRAND_GRADIENT, SEMANTIC_COLORS } from "../constants/colors.js";
|
|
15
16
|
const MAX_VISIBLE_MESSAGES = 7;
|
|
16
17
|
function MessageSelector({
|
|
17
18
|
erroredToolUseIDs,
|
|
@@ -95,12 +96,12 @@ function MessageSelector({
|
|
|
95
96
|
paddingX: 1,
|
|
96
97
|
marginTop: 1
|
|
97
98
|
},
|
|
98
|
-
/* @__PURE__ */ React.createElement(Box, { flexDirection: "column", minHeight: 2, marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Jump to a previous message"), /* @__PURE__ */ React.createElement(Text, {
|
|
99
|
+
/* @__PURE__ */ React.createElement(Box, { flexDirection: "column", minHeight: 2, marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Jump to a previous message"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "This will fork the conversation")),
|
|
99
100
|
allItems.slice(firstVisibleIndex, firstVisibleIndex + MAX_VISIBLE_MESSAGES).map((msg, index) => {
|
|
100
101
|
const actualIndex = firstVisibleIndex + index;
|
|
101
102
|
const isSelected = actualIndex === selectedIndex;
|
|
102
103
|
const isCurrent = msg.uuid === currentUUID;
|
|
103
|
-
return /* @__PURE__ */ React.createElement(Box, { key: msg.uuid, flexDirection: "row", height: 2, minHeight: 2 }, /* @__PURE__ */ React.createElement(Box, { width: 7 }, isSelected ? /* @__PURE__ */ React.createElement(Text, { color:
|
|
104
|
+
return /* @__PURE__ */ React.createElement(Box, { key: msg.uuid, flexDirection: "row", height: 2, minHeight: 2 }, /* @__PURE__ */ React.createElement(Box, { width: 7 }, isSelected ? /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START, bold: true }, figures.pointer, " ", firstVisibleIndex + index + 1, " ") : /* @__PURE__ */ React.createElement(Text, null, " ", firstVisibleIndex + index + 1, " ")), /* @__PURE__ */ React.createElement(Box, { height: 1, overflow: "hidden", width: 100 }, isCurrent ? /* @__PURE__ */ React.createElement(Box, { width: "100%" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim, italic: true }, "(current)")) : Array.isArray(msg.message.content) && msg.message.content[0]?.type === "text" && isEmptyMessageText(msg.message.content[0].text) ? /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim, italic: true }, "(empty message)") : /* @__PURE__ */ React.createElement(
|
|
104
105
|
MessageComponent,
|
|
105
106
|
{
|
|
106
107
|
message: msg,
|
|
@@ -117,7 +118,7 @@ function MessageSelector({
|
|
|
117
118
|
}
|
|
118
119
|
)));
|
|
119
120
|
})
|
|
120
|
-
), /* @__PURE__ */ React.createElement(Box, { marginLeft: 3 }, /* @__PURE__ */ React.createElement(Text, {
|
|
121
|
+
), /* @__PURE__ */ React.createElement(Box, { marginLeft: 3 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, exitState.pending ? /* @__PURE__ */ React.createElement(React.Fragment, null, "Press ", exitState.keyName, " again to exit") : /* @__PURE__ */ React.createElement(React.Fragment, null, "\u2191/\u2193 to select \xB7 Enter to confirm \xB7 Tab/Esc to cancel"))));
|
|
121
122
|
}
|
|
122
123
|
export {
|
|
123
124
|
MessageSelector
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/components/MessageSelector.tsx"],
|
|
4
|
-
"sourcesContent": ["import { Box, Text, useInput } from 'ink'\nimport * as React from 'react'\nimport { useMemo, useState, useEffect } from 'react'\nimport figures from 'figures'\nimport { getTheme } from '@utils/theme'\nimport { Message as MessageComponent } from './Message'\nimport { randomUUID } from 'crypto'\nimport { type Tool } from '@tool'\nimport {\n createUserMessage,\n isEmptyMessageText,\n isNotEmptyMessage,\n normalizeMessages,\n} from '@utils/messages'\nimport type { AssistantMessage, UserMessage } from '@query'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\n\ntype Props = {\n erroredToolUseIDs: Set<string>\n messages: (UserMessage | AssistantMessage)[]\n onSelect: (message: UserMessage) => void\n onEscape: () => void\n tools: Tool[]\n unresolvedToolUseIDs: Set<string>\n}\n\nconst MAX_VISIBLE_MESSAGES = 7\n\nexport function MessageSelector({\n erroredToolUseIDs,\n messages,\n onSelect,\n onEscape,\n tools,\n unresolvedToolUseIDs,\n}: Props): React.ReactNode {\n const currentUUID = useMemo(randomUUID, [])\n\n useEffect(() => {}, [])\n\n function handleSelect(message: UserMessage) {\n const indexFromEnd = messages.length - 1 - messages.indexOf(message)\n onSelect(message)\n }\n\n function handleEscape() {\n onEscape()\n }\n\n // Add current prompt as a virtual message\n const allItems = useMemo(\n () => [\n // Filter out tool results\n ...messages\n .filter(\n _ =>\n !(\n _.type === 'user' &&\n Array.isArray(_.message.content) &&\n _.message.content[0]?.type === 'tool_result'\n ),\n )\n // Filter out assistant messages, until we have a way to kick off the tool use loop from REPL\n .filter(_ => _.type !== 'assistant'),\n { ...createUserMessage(''), uuid: currentUUID } as UserMessage,\n ],\n [messages, currentUUID],\n )\n const [selectedIndex, setSelectedIndex] = useState(allItems.length - 1)\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n useInput((input, key) => {\n if (key.tab || key.escape) {\n handleEscape()\n return\n }\n if (key.return) {\n handleSelect(allItems[selectedIndex]!)\n return\n }\n if (key.upArrow) {\n if (key.ctrl || key.shift || key.meta) {\n // Jump to top with any modifier key\n setSelectedIndex(0)\n } else {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n }\n }\n if (key.downArrow) {\n if (key.ctrl || key.shift || key.meta) {\n // Jump to bottom with any modifier key\n setSelectedIndex(allItems.length - 1)\n } else {\n setSelectedIndex(prev => Math.min(allItems.length - 1, prev + 1))\n }\n }\n\n // Handle number keys (1-9)\n const num = Number(input)\n if (!isNaN(num) && num >= 1 && num <= Math.min(9, allItems.length)) {\n if (!allItems[num - 1]) {\n return\n }\n handleSelect(allItems[num - 1]!)\n }\n })\n\n const firstVisibleIndex = Math.max(\n 0,\n Math.min(\n selectedIndex - Math.floor(MAX_VISIBLE_MESSAGES / 2),\n allItems.length - MAX_VISIBLE_MESSAGES,\n ),\n )\n\n const normalizedMessages = useMemo(\n () => normalizeMessages(messages).filter(isNotEmptyMessage),\n [messages],\n )\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={getTheme().secondaryBorder}\n height={4 + Math.min(MAX_VISIBLE_MESSAGES, allItems.length) * 2}\n paddingX={1}\n marginTop={1}\n >\n <Box flexDirection=\"column\" minHeight={2} marginBottom={1}>\n <Text bold>Jump to a previous message</Text>\n <Text
|
|
5
|
-
"mappings": "AAAA,SAAS,KAAK,MAAM,gBAAgB;AACpC,YAAY,WAAW;AACvB,SAAS,SAAS,UAAU,iBAAiB;AAC7C,OAAO,aAAa;AACpB,SAAS,gBAAgB;AACzB,SAAS,WAAW,wBAAwB;AAC5C,SAAS,kBAAkB;AAE3B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,uBAAuB;
|
|
4
|
+
"sourcesContent": ["import { Box, Text, useInput } from 'ink'\nimport * as React from 'react'\nimport { useMemo, useState, useEffect } from 'react'\nimport figures from 'figures'\nimport { getTheme } from '@utils/theme'\nimport { Message as MessageComponent } from './Message'\nimport { randomUUID } from 'crypto'\nimport { type Tool } from '@tool'\nimport {\n createUserMessage,\n isEmptyMessageText,\n isNotEmptyMessage,\n normalizeMessages,\n} from '@utils/messages'\nimport type { AssistantMessage, UserMessage } from '@query'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\n\ntype Props = {\n erroredToolUseIDs: Set<string>\n messages: (UserMessage | AssistantMessage)[]\n onSelect: (message: UserMessage) => void\n onEscape: () => void\n tools: Tool[]\n unresolvedToolUseIDs: Set<string>\n}\n\nconst MAX_VISIBLE_MESSAGES = 7\n\nexport function MessageSelector({\n erroredToolUseIDs,\n messages,\n onSelect,\n onEscape,\n tools,\n unresolvedToolUseIDs,\n}: Props): React.ReactNode {\n const currentUUID = useMemo(randomUUID, [])\n\n useEffect(() => {}, [])\n\n function handleSelect(message: UserMessage) {\n const indexFromEnd = messages.length - 1 - messages.indexOf(message)\n onSelect(message)\n }\n\n function handleEscape() {\n onEscape()\n }\n\n // Add current prompt as a virtual message\n const allItems = useMemo(\n () => [\n // Filter out tool results\n ...messages\n .filter(\n _ =>\n !(\n _.type === 'user' &&\n Array.isArray(_.message.content) &&\n _.message.content[0]?.type === 'tool_result'\n ),\n )\n // Filter out assistant messages, until we have a way to kick off the tool use loop from REPL\n .filter(_ => _.type !== 'assistant'),\n { ...createUserMessage(''), uuid: currentUUID } as UserMessage,\n ],\n [messages, currentUUID],\n )\n const [selectedIndex, setSelectedIndex] = useState(allItems.length - 1)\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n useInput((input, key) => {\n if (key.tab || key.escape) {\n handleEscape()\n return\n }\n if (key.return) {\n handleSelect(allItems[selectedIndex]!)\n return\n }\n if (key.upArrow) {\n if (key.ctrl || key.shift || key.meta) {\n // Jump to top with any modifier key\n setSelectedIndex(0)\n } else {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n }\n }\n if (key.downArrow) {\n if (key.ctrl || key.shift || key.meta) {\n // Jump to bottom with any modifier key\n setSelectedIndex(allItems.length - 1)\n } else {\n setSelectedIndex(prev => Math.min(allItems.length - 1, prev + 1))\n }\n }\n\n // Handle number keys (1-9)\n const num = Number(input)\n if (!isNaN(num) && num >= 1 && num <= Math.min(9, allItems.length)) {\n if (!allItems[num - 1]) {\n return\n }\n handleSelect(allItems[num - 1]!)\n }\n })\n\n const firstVisibleIndex = Math.max(\n 0,\n Math.min(\n selectedIndex - Math.floor(MAX_VISIBLE_MESSAGES / 2),\n allItems.length - MAX_VISIBLE_MESSAGES,\n ),\n )\n\n const normalizedMessages = useMemo(\n () => normalizeMessages(messages).filter(isNotEmptyMessage),\n [messages],\n )\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={getTheme().secondaryBorder}\n height={4 + Math.min(MAX_VISIBLE_MESSAGES, allItems.length) * 2}\n paddingX={1}\n marginTop={1}\n >\n <Box flexDirection=\"column\" minHeight={2} marginBottom={1}>\n <Text bold>Jump to a previous message</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n This will fork the conversation\n </Text>\n </Box>\n {allItems\n .slice(firstVisibleIndex, firstVisibleIndex + MAX_VISIBLE_MESSAGES)\n .map((msg, index) => {\n const actualIndex = firstVisibleIndex + index\n const isSelected = actualIndex === selectedIndex\n const isCurrent = msg.uuid === currentUUID\n\n return (\n <Box key={msg.uuid} flexDirection=\"row\" height={2} minHeight={2}>\n <Box width={7}>\n {isSelected ? (\n <Text color={BRAND_GRADIENT.START} bold>\n {figures.pointer} {firstVisibleIndex + index + 1}{' '}\n </Text>\n ) : (\n <Text>\n {' '}\n {firstVisibleIndex + index + 1}{' '}\n </Text>\n )}\n </Box>\n <Box height={1} overflow=\"hidden\" width={100}>\n {isCurrent ? (\n <Box width=\"100%\">\n <Text color={SEMANTIC_COLORS.dim} italic>\n {'(current)'}\n </Text>\n </Box>\n ) : Array.isArray(msg.message.content) &&\n msg.message.content[0]?.type === 'text' &&\n isEmptyMessageText(msg.message.content[0].text) ? (\n <Text color={SEMANTIC_COLORS.dim} italic>\n (empty message)\n </Text>\n ) : (\n <MessageComponent\n message={msg}\n messages={normalizedMessages}\n addMargin={false}\n tools={tools}\n verbose={false}\n debug={false}\n erroredToolUseIDs={erroredToolUseIDs}\n inProgressToolUseIDs={new Set()}\n unresolvedToolUseIDs={unresolvedToolUseIDs}\n shouldAnimate={false}\n shouldShowDot={false}\n />\n )}\n </Box>\n </Box>\n )\n })}\n </Box>\n <Box marginLeft={3}>\n <Text color={SEMANTIC_COLORS.dim}>\n {exitState.pending ? (\n <>Press {exitState.keyName} again to exit</>\n ) : (\n <>\u2191/\u2193 to select \u00B7 Enter to confirm \u00B7 Tab/Esc to cancel</>\n )}\n </Text>\n </Box>\n </>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,KAAK,MAAM,gBAAgB;AACpC,YAAY,WAAW;AACvB,SAAS,SAAS,UAAU,iBAAiB;AAC7C,OAAO,aAAa;AACpB,SAAS,gBAAgB;AACzB,SAAS,WAAW,wBAAwB;AAC5C,SAAS,kBAAkB;AAE3B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,uBAAuB;AAChC,SAAS,gBAAgB,uBAAuB;AAWhD,MAAM,uBAAuB;AAEtB,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,cAAc,QAAQ,YAAY,CAAC,CAAC;AAE1C,YAAU,MAAM;AAAA,EAAC,GAAG,CAAC,CAAC;AAEtB,WAAS,aAAa,SAAsB;AAC1C,UAAM,eAAe,SAAS,SAAS,IAAI,SAAS,QAAQ,OAAO;AACnE,aAAS,OAAO;AAAA,EAClB;AAEA,WAAS,eAAe;AACtB,aAAS;AAAA,EACX;AAGA,QAAM,WAAW;AAAA,IACf,MAAM;AAAA;AAAA,MAEJ,GAAG,SACA;AAAA,QACC,OACE,EACE,EAAE,SAAS,UACX,MAAM,QAAQ,EAAE,QAAQ,OAAO,KAC/B,EAAE,QAAQ,QAAQ,CAAC,GAAG,SAAS;AAAA,MAErC,EAEC,OAAO,OAAK,EAAE,SAAS,WAAW;AAAA,MACrC,EAAE,GAAG,kBAAkB,EAAE,GAAG,MAAM,YAAY;AAAA,IAChD;AAAA,IACA,CAAC,UAAU,WAAW;AAAA,EACxB;AACA,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,SAAS,SAAS,CAAC;AAEtE,QAAM,YAAY,gBAAgB,MAAM,QAAQ,KAAK,CAAC,CAAC;AAEvD,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,OAAO,IAAI,QAAQ;AACzB,mBAAa;AACb;AAAA,IACF;AACA,QAAI,IAAI,QAAQ;AACd,mBAAa,SAAS,aAAa,CAAE;AACrC;AAAA,IACF;AACA,QAAI,IAAI,SAAS;AACf,UAAI,IAAI,QAAQ,IAAI,SAAS,IAAI,MAAM;AAErC,yBAAiB,CAAC;AAAA,MACpB,OAAO;AACL,yBAAiB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,MAChD;AAAA,IACF;AACA,QAAI,IAAI,WAAW;AACjB,UAAI,IAAI,QAAQ,IAAI,SAAS,IAAI,MAAM;AAErC,yBAAiB,SAAS,SAAS,CAAC;AAAA,MACtC,OAAO;AACL,yBAAiB,UAAQ,KAAK,IAAI,SAAS,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,MAClE;AAAA,IACF;AAGA,UAAM,MAAM,OAAO,KAAK;AACxB,QAAI,CAAC,MAAM,GAAG,KAAK,OAAO,KAAK,OAAO,KAAK,IAAI,GAAG,SAAS,MAAM,GAAG;AAClE,UAAI,CAAC,SAAS,MAAM,CAAC,GAAG;AACtB;AAAA,MACF;AACA,mBAAa,SAAS,MAAM,CAAC,CAAE;AAAA,IACjC;AAAA,EACF,CAAC;AAED,QAAM,oBAAoB,KAAK;AAAA,IAC7B;AAAA,IACA,KAAK;AAAA,MACH,gBAAgB,KAAK,MAAM,uBAAuB,CAAC;AAAA,MACnD,SAAS,SAAS;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,qBAAqB;AAAA,IACzB,MAAM,kBAAkB,QAAQ,EAAE,OAAO,iBAAiB;AAAA,IAC1D,CAAC,QAAQ;AAAA,EACX;AAEA,SACE,0DACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,SAAS,EAAE;AAAA,MACxB,QAAQ,IAAI,KAAK,IAAI,sBAAsB,SAAS,MAAM,IAAI;AAAA,MAC9D,UAAU;AAAA,MACV,WAAW;AAAA;AAAA,IAEX,oCAAC,OAAI,eAAc,UAAS,WAAW,GAAG,cAAc,KACtD,oCAAC,QAAK,MAAI,QAAC,4BAA0B,GACrC,oCAAC,QAAK,OAAO,gBAAgB,OAAK,iCAElC,CACF;AAAA,IACC,SACE,MAAM,mBAAmB,oBAAoB,oBAAoB,EACjE,IAAI,CAAC,KAAK,UAAU;AACnB,YAAM,cAAc,oBAAoB;AACxC,YAAM,aAAa,gBAAgB;AACnC,YAAM,YAAY,IAAI,SAAS;AAE/B,aACE,oCAAC,OAAI,KAAK,IAAI,MAAM,eAAc,OAAM,QAAQ,GAAG,WAAW,KAC5D,oCAAC,OAAI,OAAO,KACT,aACC,oCAAC,QAAK,OAAO,eAAe,OAAO,MAAI,QACpC,QAAQ,SAAQ,KAAE,oBAAoB,QAAQ,GAAG,GACpD,IAEA,oCAAC,YACE,MACA,oBAAoB,QAAQ,GAAG,GAClC,CAEJ,GACA,oCAAC,OAAI,QAAQ,GAAG,UAAS,UAAS,OAAO,OACtC,YACC,oCAAC,OAAI,OAAM,UACT,oCAAC,QAAK,OAAO,gBAAgB,KAAK,QAAM,QACrC,WACH,CACF,IACE,MAAM,QAAQ,IAAI,QAAQ,OAAO,KACnC,IAAI,QAAQ,QAAQ,CAAC,GAAG,SAAS,UACjC,mBAAmB,IAAI,QAAQ,QAAQ,CAAC,EAAE,IAAI,IAC9C,oCAAC,QAAK,OAAO,gBAAgB,KAAK,QAAM,QAAC,iBAEzC,IAEA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,UAAU;AAAA,UACV,WAAW;AAAA,UACX;AAAA,UACA,SAAS;AAAA,UACT,OAAO;AAAA,UACP;AAAA,UACA,sBAAsB,oBAAI,IAAI;AAAA,UAC9B;AAAA,UACA,eAAe;AAAA,UACf,eAAe;AAAA;AAAA,MACjB,CAEJ,CACF;AAAA,IAEJ,CAAC;AAAA,EACL,GACA,oCAAC,OAAI,YAAY,KACf,oCAAC,QAAK,OAAO,gBAAgB,OAC1B,UAAU,UACT,0DAAE,UAAO,UAAU,SAAQ,gBAAc,IAEzC,0DAAE,sEAAoD,CAE1D,CACF,CACF;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -2,6 +2,7 @@ import React from "react";
|
|
|
2
2
|
import { Box, Text } from "ink";
|
|
3
3
|
import { usePermissionContext } from "../context/PermissionContext.js";
|
|
4
4
|
import { getTheme } from "../utils/theme.js";
|
|
5
|
+
import { SEMANTIC_COLORS } from "../constants/colors.js";
|
|
5
6
|
function ModeIndicator({
|
|
6
7
|
showTransitionCount = false
|
|
7
8
|
}) {
|
|
@@ -11,7 +12,7 @@ function ModeIndicator({
|
|
|
11
12
|
if (currentMode === "default" && !showTransitionCount) {
|
|
12
13
|
return null;
|
|
13
14
|
}
|
|
14
|
-
return /* @__PURE__ */ React.createElement(Box, { borderStyle: "single", padding: 1, marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", alignItems: "center" }, /* @__PURE__ */ React.createElement(Text, { color: getThemeColor(modeConfig.color, theme), bold: true }, modeConfig.icon, " ", modeConfig.label)), /* @__PURE__ */ React.createElement(Text, { color:
|
|
15
|
+
return /* @__PURE__ */ React.createElement(Box, { borderStyle: "single", padding: 1, marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", alignItems: "center" }, /* @__PURE__ */ React.createElement(Text, { color: getThemeColor(modeConfig.color, theme), bold: true }, modeConfig.icon, " ", modeConfig.label)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, modeConfig.description), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", justifyContent: "space-between", marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press Shift+Tab to cycle modes"), showTransitionCount && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Switches: ", permissionContext.metadata.transitionCount)), currentMode === "plan" && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.info }, "Available tools: ", permissionContext.allowedTools.join(", ")), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.running }, "Use exit_plan_mode tool when ready to execute"))));
|
|
15
16
|
}
|
|
16
17
|
function getThemeColor(colorName, theme) {
|
|
17
18
|
const colorMap = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/components/ModeIndicator.tsx"],
|
|
4
|
-
"sourcesContent": ["import React from 'react'\nimport { Box, Text } from 'ink'\nimport { usePermissionContext } from '@context/PermissionContext'\nimport { getTheme } from '@utils/theme'\n\ninterface ModeIndicatorProps {\n showTransitionCount?: boolean\n}\n\nexport function ModeIndicator({\n showTransitionCount = false,\n}: ModeIndicatorProps) {\n const { currentMode, permissionContext, getModeConfig } =\n usePermissionContext()\n const theme = getTheme()\n const modeConfig = getModeConfig()\n\n // Don't show indicator for default mode unless explicitly requested\n if (currentMode === 'default' && !showTransitionCount) {\n return null\n }\n\n return (\n <Box borderStyle=\"single\" padding={1} marginY={1}>\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Text color={getThemeColor(modeConfig.color, theme)} bold>\n {modeConfig.icon} {modeConfig.label}\n </Text>\n </Box>\n\n <Text color
|
|
5
|
-
"mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,YAAY;AAC1B,SAAS,4BAA4B;AACrC,SAAS,gBAAgB;
|
|
4
|
+
"sourcesContent": ["import React from 'react'\nimport { Box, Text } from 'ink'\nimport { usePermissionContext } from '@context/PermissionContext'\nimport { getTheme } from '@utils/theme'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ninterface ModeIndicatorProps {\n showTransitionCount?: boolean\n}\n\nexport function ModeIndicator({\n showTransitionCount = false,\n}: ModeIndicatorProps) {\n const { currentMode, permissionContext, getModeConfig } =\n usePermissionContext()\n const theme = getTheme()\n const modeConfig = getModeConfig()\n\n // Don't show indicator for default mode unless explicitly requested\n if (currentMode === 'default' && !showTransitionCount) {\n return null\n }\n\n return (\n <Box borderStyle=\"single\" padding={1} marginY={1}>\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Text color={getThemeColor(modeConfig.color, theme)} bold>\n {modeConfig.icon} {modeConfig.label}\n </Text>\n </Box>\n\n <Text color={SEMANTIC_COLORS.dim}>{modeConfig.description}</Text>\n\n <Box flexDirection=\"row\" justifyContent=\"space-between\" marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n Press Shift+Tab to cycle modes\n </Text>\n {showTransitionCount && (\n <Text color={SEMANTIC_COLORS.dim}>\n Switches: {permissionContext.metadata.transitionCount}\n </Text>\n )}\n </Box>\n\n {currentMode === 'plan' && (\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.info}>\n Available tools: {permissionContext.allowedTools.join(', ')}\n </Text>\n <Text color={SEMANTIC_COLORS.running}>\n Use exit_plan_mode tool when ready to execute\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n )\n}\n\nfunction getThemeColor(colorName: string, theme: any): string {\n const colorMap: Record<string, string> = {\n blue: theme.primary || 'blue',\n green: theme.success || 'green',\n yellow: theme.warning || 'yellow',\n red: theme.error || 'red',\n }\n\n return colorMap[colorName] || colorName\n}\n\n// Compact mode indicator for status bar\nexport function CompactModeIndicator() {\n const { currentMode, getModeConfig } = usePermissionContext()\n const modeConfig = getModeConfig()\n const theme = getTheme()\n\n if (currentMode === 'default') {\n return null\n }\n\n return (\n <Text color={getThemeColor(modeConfig.color, theme)}>\n {modeConfig.icon} {modeConfig.name}\n </Text>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,YAAY;AAC1B,SAAS,4BAA4B;AACrC,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAMzB,SAAS,cAAc;AAAA,EAC5B,sBAAsB;AACxB,GAAuB;AACrB,QAAM,EAAE,aAAa,mBAAmB,cAAc,IACpD,qBAAqB;AACvB,QAAM,QAAQ,SAAS;AACvB,QAAM,aAAa,cAAc;AAGjC,MAAI,gBAAgB,aAAa,CAAC,qBAAqB;AACrD,WAAO;AAAA,EACT;AAEA,SACE,oCAAC,OAAI,aAAY,UAAS,SAAS,GAAG,SAAS,KAC7C,oCAAC,OAAI,eAAc,YACjB,oCAAC,OAAI,eAAc,OAAM,YAAW,YAClC,oCAAC,QAAK,OAAO,cAAc,WAAW,OAAO,KAAK,GAAG,MAAI,QACtD,WAAW,MAAK,KAAE,WAAW,KAChC,CACF,GAEA,oCAAC,QAAK,OAAO,gBAAgB,OAAM,WAAW,WAAY,GAE1D,oCAAC,OAAI,eAAc,OAAM,gBAAe,iBAAgB,WAAW,KACjE,oCAAC,QAAK,OAAO,gBAAgB,OAAK,gCAElC,GACC,uBACC,oCAAC,QAAK,OAAO,gBAAgB,OAAK,cACrB,kBAAkB,SAAS,eACxC,CAEJ,GAEC,gBAAgB,UACf,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAO,gBAAgB,QAAM,qBACf,kBAAkB,aAAa,KAAK,IAAI,CAC5D,GACA,oCAAC,QAAK,OAAO,gBAAgB,WAAS,+CAEtC,CACF,CAEJ,CACF;AAEJ;AAEA,SAAS,cAAc,WAAmB,OAAoB;AAC5D,QAAM,WAAmC;AAAA,IACvC,MAAM,MAAM,WAAW;AAAA,IACvB,OAAO,MAAM,WAAW;AAAA,IACxB,QAAQ,MAAM,WAAW;AAAA,IACzB,KAAK,MAAM,SAAS;AAAA,EACtB;AAEA,SAAO,SAAS,SAAS,KAAK;AAChC;AAGO,SAAS,uBAAuB;AACrC,QAAM,EAAE,aAAa,cAAc,IAAI,qBAAqB;AAC5D,QAAM,aAAa,cAAc;AACjC,QAAM,QAAQ,SAAS;AAEvB,MAAI,gBAAgB,WAAW;AAC7B,WAAO;AAAA,EACT;AAEA,SACE,oCAAC,QAAK,OAAO,cAAc,WAAW,OAAO,KAAK,KAC/C,WAAW,MAAK,KAAE,WAAW,IAChC;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|