@within-7/minto 0.3.6 → 0.3.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{cli.js → cli.cjs} +25 -23
- package/dist/commands/agents/AgentsCommand.js +459 -655
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/agents/types.js +1 -0
- package/dist/commands/agents/types.js.map +2 -2
- package/dist/commands/agents/utils/fileOperations.js +96 -36
- package/dist/commands/agents/utils/fileOperations.js.map +3 -3
- package/dist/commands/agents/utils/index.js +3 -1
- package/dist/commands/agents/utils/index.js.map +2 -2
- package/dist/commands/context.js +54 -23
- package/dist/commands/context.js.map +2 -2
- package/dist/commands/export.js +673 -93
- package/dist/commands/export.js.map +2 -2
- package/dist/commands/language.js +110 -0
- package/dist/commands/language.js.map +7 -0
- package/dist/commands/mcp-interactive.js +419 -217
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/model.js +415 -66
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/new.js +56 -0
- package/dist/commands/new.js.map +7 -0
- package/dist/commands/permissions.js +75 -49
- package/dist/commands/permissions.js.map +2 -2
- package/dist/commands/plugin.js +882 -185
- package/dist/commands/plugin.js.map +3 -3
- package/dist/commands/resume.js +251 -16
- package/dist/commands/resume.js.map +2 -2
- package/dist/commands/sandbox.js +168 -70
- package/dist/commands/sandbox.js.map +2 -2
- package/dist/commands/sessions.js +224 -0
- package/dist/commands/sessions.js.map +7 -0
- package/dist/commands/setup.js +596 -109
- package/dist/commands/setup.js.map +2 -2
- package/dist/commands/stats.js +292 -0
- package/dist/commands/stats.js.map +7 -0
- package/dist/commands/status.js +75 -7
- package/dist/commands/status.js.map +2 -2
- package/dist/commands/undo.js +154 -180
- package/dist/commands/undo.js.map +2 -2
- package/dist/commands.js +6 -0
- package/dist/commands.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
- package/dist/components/Config.js +9 -8
- package/dist/components/Config.js.map +2 -2
- package/dist/components/HeaderBar.js +2 -1
- package/dist/components/HeaderBar.js.map +2 -2
- package/dist/components/Help.js +166 -32
- package/dist/components/Help.js.map +2 -2
- package/dist/components/HotkeyHelpPanel.js +46 -44
- package/dist/components/HotkeyHelpPanel.js.map +2 -2
- package/dist/components/InfoPanel/InfoPanel.js +123 -0
- package/dist/components/InfoPanel/InfoPanel.js.map +7 -0
- package/dist/components/InfoPanel/index.js +5 -0
- package/dist/components/InfoPanel/index.js.map +7 -0
- package/dist/components/InfoPanel/types.js +1 -0
- package/dist/components/InfoPanel/types.js.map +7 -0
- package/dist/components/Logo.js +5 -2
- package/dist/components/Logo.js.map +2 -2
- package/dist/components/MCPServerApprovalDialog.js +6 -5
- package/dist/components/MCPServerApprovalDialog.js.map +2 -2
- package/dist/components/MCPServerMultiselectDialog.js +5 -4
- 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/ModelConfig.js +13 -12
- 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/BrandTextInput.js +43 -0
- package/dist/components/ModelSelector/BrandTextInput.js.map +7 -0
- package/dist/components/ModelSelector/ModelSelector.js +419 -501
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/ModelSelector/WizardContainer.js +45 -0
- package/dist/components/ModelSelector/WizardContainer.js.map +7 -0
- package/dist/components/ModelSelector/index.js +1 -3
- package/dist/components/ModelSelector/index.js.map +2 -2
- package/dist/components/PromptInput.js +77 -44
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/SensitiveFileWarning.js +12 -8
- package/dist/components/SensitiveFileWarning.js.map +2 -2
- package/dist/components/SimpleSelector/SimpleSelector.js +154 -0
- package/dist/components/SimpleSelector/SimpleSelector.js.map +7 -0
- package/dist/components/SimpleSelector/index.js +5 -0
- package/dist/components/SimpleSelector/index.js.map +7 -0
- package/dist/components/SimpleSelector/types.js +1 -0
- package/dist/components/SimpleSelector/types.js.map +7 -0
- package/dist/components/StatusOverlayContent.js +21 -0
- package/dist/components/StatusOverlayContent.js.map +7 -0
- package/dist/components/TabbedListView/ScrollableList.js +117 -0
- package/dist/components/TabbedListView/ScrollableList.js.map +7 -0
- package/dist/components/TabbedListView/SearchInput.js +23 -0
- package/dist/components/TabbedListView/SearchInput.js.map +7 -0
- package/dist/components/TabbedListView/TabBar.js +20 -0
- package/dist/components/TabbedListView/TabBar.js.map +7 -0
- package/dist/components/TabbedListView/TabbedListView.js +246 -0
- package/dist/components/TabbedListView/TabbedListView.js.map +7 -0
- package/dist/components/TabbedListView/index.js +11 -0
- package/dist/components/TabbedListView/index.js.map +7 -0
- package/dist/components/TabbedListView/types.js +1 -0
- package/dist/components/TabbedListView/types.js.map +7 -0
- package/dist/components/TodoChangeBlock.js +6 -5
- package/dist/components/TodoChangeBlock.js.map +3 -3
- package/dist/components/TodoPanel.js +6 -3
- package/dist/components/TodoPanel.js.map +3 -3
- package/dist/components/TrustDialog.js +6 -5
- package/dist/components/TrustDialog.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js +2 -1
- package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js.map +2 -2
- package/dist/constants/macros.js +1 -1
- package/dist/constants/macros.js.map +1 -1
- package/dist/constants/product.js +2 -2
- package/dist/constants/product.js.map +1 -1
- package/dist/constants/prompts.js +17 -0
- package/dist/constants/prompts.js.map +2 -2
- package/dist/constants/toolInputExamples.js +5 -1
- package/dist/constants/toolInputExamples.js.map +2 -2
- package/dist/core/backupHook.js +29 -0
- package/dist/core/backupHook.js.map +7 -0
- package/dist/core/config/defaults.js +8 -2
- package/dist/core/config/defaults.js.map +2 -2
- package/dist/core/config/schema.js +14 -2
- package/dist/core/config/schema.js.map +2 -2
- package/dist/core/costTracker.js +0 -16
- package/dist/core/costTracker.js.map +2 -2
- package/dist/core/tokenStatsManager.js +5 -0
- package/dist/core/tokenStatsManager.js.map +2 -2
- package/dist/cost-tracker.js +0 -16
- package/dist/cost-tracker.js.map +2 -2
- package/dist/entrypoints/bootstrap.js +56 -0
- package/dist/entrypoints/bootstrap.js.map +7 -0
- package/dist/entrypoints/cli.js +164 -23
- package/dist/entrypoints/cli.js.map +3 -3
- package/dist/history.js +75 -15
- package/dist/history.js.map +2 -2
- package/dist/i18n/index.js +2 -2
- package/dist/i18n/index.js.map +2 -2
- package/dist/i18n/locales/en.js +582 -1
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.js +582 -1
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/i18n/types.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/messages.js +11 -0
- package/dist/messages.js.map +2 -2
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +9 -0
- package/dist/query.js.map +2 -2
- package/dist/screens/REPL.js +45 -7
- package/dist/screens/REPL.js.map +2 -2
- package/dist/services/customCommands.js +44 -16
- package/dist/services/customCommands.js.map +2 -2
- package/dist/services/plugins/lspServers.js +1 -1
- package/dist/services/plugins/lspServers.js.map +2 -2
- package/dist/services/plugins/pluginRuntime.js +2 -1
- package/dist/services/plugins/pluginRuntime.js.map +2 -2
- package/dist/services/plugins/pluginValidation.js +10 -3
- package/dist/services/plugins/pluginValidation.js.map +2 -2
- package/dist/services/plugins/skillMarketplace.js +16 -8
- package/dist/services/plugins/skillMarketplace.js.map +2 -2
- package/dist/services/systemReminder.js +17 -6
- package/dist/services/systemReminder.js.map +2 -2
- package/dist/tools/FileEditTool/FileEditTool.js +7 -0
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileWriteTool/FileWriteTool.js +7 -0
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js +7 -0
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -0
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
- package/dist/tools/TaskTool/TaskTool.js +179 -1
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/tools/TodoWriteTool/prompt.js +21 -0
- package/dist/tools/TodoWriteTool/prompt.js.map +2 -2
- package/dist/tools/URLFetcherTool/prompt.js +14 -9
- package/dist/tools/URLFetcherTool/prompt.js.map +2 -2
- package/dist/tools/WebSearchTool/prompt.js +12 -6
- package/dist/tools/WebSearchTool/prompt.js.map +2 -2
- package/dist/types/PermissionMode.js +30 -1
- package/dist/types/PermissionMode.js.map +2 -2
- package/dist/types/plugin.js +2 -4
- package/dist/types/plugin.js.map +2 -2
- package/dist/utils/agentHookExecutor.js +103 -0
- package/dist/utils/agentHookExecutor.js.map +7 -0
- package/dist/utils/agentLoader.js +272 -32
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/agentMemory.js +134 -0
- package/dist/utils/agentMemory.js.map +7 -0
- package/dist/utils/claudeCodeSync.js +439 -0
- package/dist/utils/claudeCodeSync.js.map +7 -0
- package/dist/utils/config.js +52 -24
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/configPaths.js +199 -0
- package/dist/utils/configPaths.js.map +7 -0
- package/dist/utils/execFileNoThrow.js +2 -1
- package/dist/utils/execFileNoThrow.js.map +2 -2
- package/dist/utils/historyManager.js +234 -0
- package/dist/utils/historyManager.js.map +7 -0
- package/dist/utils/marketplaceManager.js +80 -43
- package/dist/utils/marketplaceManager.js.map +2 -2
- package/dist/utils/messages.js +13 -8
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/migration/index.js +37 -0
- package/dist/utils/migration/index.js.map +7 -0
- package/dist/utils/migration/migrateHistory.js +273 -0
- package/dist/utils/migration/migrateHistory.js.map +7 -0
- package/dist/utils/migration/migrateTodos.js +323 -0
- package/dist/utils/migration/migrateTodos.js.map +7 -0
- package/dist/utils/pasteCache.js +309 -0
- package/dist/utils/pasteCache.js.map +7 -0
- package/dist/utils/pluginInstaller.js +34 -24
- package/dist/utils/pluginInstaller.js.map +2 -2
- package/dist/utils/pluginLoader.js +54 -28
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/repoFetcher.js +110 -0
- package/dist/utils/repoFetcher.js.map +7 -0
- package/dist/utils/sessionIndex.js +192 -0
- package/dist/utils/sessionIndex.js.map +7 -0
- package/dist/utils/sessionTracker.js +170 -0
- package/dist/utils/sessionTracker.js.map +7 -0
- package/dist/utils/skillLoader.js +103 -5
- package/dist/utils/skillLoader.js.map +2 -2
- package/dist/utils/stats.js +417 -0
- package/dist/utils/stats.js.map +7 -0
- package/dist/utils/stringSubstitution.js +106 -0
- package/dist/utils/stringSubstitution.js.map +7 -0
- package/dist/utils/teamConfig.js +156 -14
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/terminal.js +1 -1
- package/dist/utils/terminal.js.map +2 -2
- package/dist/utils/todoStorage.js +51 -19
- package/dist/utils/todoStorage.js.map +2 -2
- 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 +71 -28
- package/scripts/{postinstall.js → postinstall.cjs} +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/components/Help.tsx"],
|
|
4
|
-
"sourcesContent": ["
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["/**\n * Help Component\n *\n * Displays comprehensive help using InfoPanel for consistent UI.\n * Shows all information immediately (no progressive disclosure timer).\n */\n\nimport React from 'react'\nimport type { Command } from '@commands'\nimport type { CustomCommandWithScope } from '@services/customCommands'\nimport { hasCustomCommands } from '@services/customCommands'\nimport { PRODUCT_COMMAND, PRODUCT_NAME } from '@constants/product'\nimport { MACRO } from '@constants/macros'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport { InfoPanel } from '@components/InfoPanel'\nimport type { InfoSection, InfoItem } from '@components/InfoPanel'\nimport { t } from '@i18n'\n\nfunction buildUsageSection(): InfoSection {\n return {\n title: t('help.usageModes'),\n items: [\n { label: 'REPL', value: `${PRODUCT_COMMAND} (interactive session)` },\n {\n label: t('help.nonInteractive'),\n value: `${PRODUCT_COMMAND} -p \"question\"`,\n },\n {\n label: t('help.options'),\n value: t('help.runForOptions', { command: PRODUCT_COMMAND }),\n valueColor: SEMANTIC_COLORS.dim,\n },\n ],\n }\n}\n\nfunction buildCommonTasksSection(): InfoSection {\n return {\n title: t('help.commonTasks'),\n items: [\n {\n label: '\\u2022 Ask questions',\n value: 'How does foo.py work?',\n valueColor: SEMANTIC_COLORS.dim,\n },\n {\n label: '\\u2022 Edit files',\n value: 'Update bar.ts to...',\n valueColor: SEMANTIC_COLORS.dim,\n },\n {\n label: '\\u2022 Fix errors',\n value: 'cargo build',\n valueColor: SEMANTIC_COLORS.dim,\n },\n {\n label: '\\u2022 Run commands',\n value: '/help',\n valueColor: SEMANTIC_COLORS.dim,\n },\n {\n label: '\\u2022 Run bash',\n value: '!ls',\n valueColor: SEMANTIC_COLORS.dim,\n },\n ],\n }\n}\n\nfunction buildModeSystemsSection(): InfoSection {\n return {\n title: t('help.modeSystems'),\n items: [\n {\n label: '',\n value: t('help.safetyModes'),\n valueColor: SEMANTIC_COLORS.secondary,\n },\n { label: ' --yolo', value: 'Skip all confirmations' },\n { label: ' --smart', value: 'Dangerous tools require confirmation' },\n { label: ' --strict', value: 'All tools require confirmation' },\n { label: ' --free', value: 'Free mode (no restrictions)' },\n {\n label: '',\n value: t('help.permissionModes'),\n valueColor: SEMANTIC_COLORS.secondary,\n },\n { label: ' default', value: 'Standard confirmation flow' },\n { label: ' acceptEdits', value: 'Auto-approve file edits' },\n { label: ' plan', value: 'Plan mode (no modifications)' },\n { label: ' bypass', value: 'Skip all permission checks' },\n ],\n }\n}\n\nfunction buildBuiltInSection(commands: Command[]): InfoSection {\n const builtInCommands = commands\n .filter(\n cmd =>\n !cmd.isHidden &&\n !cmd.name.startsWith('project:') &&\n !cmd.name.startsWith('user:') &&\n !cmd.name.startsWith('plugin:') &&\n !cmd.name.startsWith('mcp:'),\n )\n .sort((a, b) => a.userFacingName().localeCompare(b.userFacingName()))\n\n const items: InfoItem[] = builtInCommands.map(cmd => ({\n label: `/${cmd.name}`,\n value: cmd.description,\n }))\n\n return { title: t('help.builtInCommands'), items }\n}\n\nfunction buildCustomSection(commands: Command[]): InfoSection | null {\n const customCommands = commands\n .filter(\n cmd =>\n !cmd.isHidden &&\n (cmd.name.startsWith('project:') || cmd.name.startsWith('user:')),\n )\n .sort((a, b) =>\n a.userFacingName().localeCompare(b.userFacingName()),\n ) as CustomCommandWithScope[]\n\n if (customCommands.length === 0) return null\n\n const items: InfoItem[] = customCommands.map(cmd => ({\n label: `/${cmd.name}`,\n value: `${cmd.description}${cmd.scope ? ` [${cmd.scope}]` : ''}`,\n }))\n\n return { title: t('help.customCommands'), items }\n}\n\nfunction buildPluginSection(commands: Command[]): InfoSection | null {\n const pluginCommands = commands\n .filter(cmd => !cmd.isHidden && cmd.name.startsWith('plugin:'))\n .sort((a, b) => a.userFacingName().localeCompare(b.userFacingName()))\n\n if (pluginCommands.length === 0) return null\n\n const items: InfoItem[] = pluginCommands.map(cmd => ({\n label: `/${cmd.name}`,\n value: cmd.description,\n }))\n\n return { title: t('help.pluginCommands'), items }\n}\n\nfunction buildMcpSection(commands: Command[]): InfoSection | null {\n const mcpCommands = commands\n .filter(cmd => !cmd.isHidden && cmd.name.startsWith('mcp:'))\n .sort((a, b) => a.userFacingName().localeCompare(b.userFacingName()))\n\n if (mcpCommands.length === 0) return null\n\n const items: InfoItem[] = mcpCommands.map(cmd => ({\n label: `/${cmd.name}`,\n value: cmd.description,\n }))\n\n return { title: t('help.mcpCommands'), items }\n}\n\nfunction buildPrioritySection(): InfoSection {\n return {\n title: t('help.commandPriority'),\n items: [\n {\n label: '1.',\n value: 'Built-in commands',\n valueColor: SEMANTIC_COLORS.dim,\n },\n {\n label: '2.',\n value: 'Custom commands (project: / user:)',\n valueColor: SEMANTIC_COLORS.dim,\n },\n {\n label: '3.',\n value: 'Plugin commands',\n valueColor: SEMANTIC_COLORS.dim,\n },\n { label: '4.', value: 'MCP commands', valueColor: SEMANTIC_COLORS.dim },\n ],\n }\n}\n\nexport function Help({\n commands,\n onClose,\n}: {\n commands: Command[]\n onClose: () => void\n}): React.ReactNode {\n const sections: InfoSection[] = []\n\n // Usage modes\n sections.push(buildUsageSection())\n\n // Common tasks\n sections.push(buildCommonTasksSection())\n\n // Mode systems\n sections.push(buildModeSystemsSection())\n\n // Built-in commands\n sections.push(buildBuiltInSection(commands))\n\n // Custom commands (if any)\n const customSection = buildCustomSection(commands)\n if (customSection) sections.push(customSection)\n\n // Plugin commands (if any)\n const pluginSection = buildPluginSection(commands)\n if (pluginSection) sections.push(pluginSection)\n\n // MCP commands (if any)\n const mcpSection = buildMcpSection(commands)\n if (mcpSection) sections.push(mcpSection)\n\n // Priority info (if any non-built-in commands exist)\n const hasExtended =\n hasCustomCommands() || customSection || pluginSection || mcpSection\n if (hasExtended) {\n sections.push(buildPrioritySection())\n }\n\n return (\n <InfoPanel\n title={t('commands.help.title')}\n subtitle={`${PRODUCT_NAME} v${MACRO.VERSION}`}\n sections={sections}\n onClose={onClose}\n />\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -2,43 +2,45 @@ import { Box, Text, useInput } from "ink";
|
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { t } from "../i18n/index.js";
|
|
4
4
|
import { BRAND_GRADIENT, SEMANTIC_COLORS } from "../constants/colors.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
5
|
+
function getHotkeyGroups() {
|
|
6
|
+
return [
|
|
7
|
+
{
|
|
8
|
+
title: t("hotkey.navigation"),
|
|
9
|
+
hotkeys: [
|
|
10
|
+
{ keys: "\u2191/\u2193", description: t("hotkey.browseHistory") },
|
|
11
|
+
{ keys: "Ctrl+R", description: t("hotkey.searchHistory") },
|
|
12
|
+
{ keys: "Tab", description: t("hotkey.autocomplete") },
|
|
13
|
+
{ keys: "Esc Esc", description: t("hotkey.rollbackResponse") }
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
title: t("hotkey.control"),
|
|
18
|
+
hotkeys: [
|
|
19
|
+
{ keys: "Ctrl+C", description: t("hotkey.cancelOperation") },
|
|
20
|
+
{ keys: "Ctrl+D", description: t("hotkey.exitPressTwice") },
|
|
21
|
+
{ keys: "Ctrl+L", description: t("hotkey.clearScreen") },
|
|
22
|
+
{ keys: "Enter", description: t("hotkey.submitPrompt") }
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
title: t("hotkey.features"),
|
|
27
|
+
hotkeys: [
|
|
28
|
+
{ keys: "Ctrl+T", description: t("hotkey.toggleTodoPanel") },
|
|
29
|
+
{ keys: "Ctrl+O", description: t("hotkey.cycleDisplayMode") },
|
|
30
|
+
{ keys: "Ctrl+B", description: t("hotkey.executeAsBash") },
|
|
31
|
+
{ keys: "Ctrl+?", description: t("hotkey.showHideHelp") }
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
title: t("hotkey.inputModes"),
|
|
36
|
+
hotkeys: [
|
|
37
|
+
{ keys: "/", description: t("hotkey.startSlashCommand") },
|
|
38
|
+
{ keys: "!", description: t("hotkey.executeBashCommand") },
|
|
39
|
+
{ keys: "#", description: t("hotkey.addNoteToKoding") }
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
];
|
|
43
|
+
}
|
|
42
44
|
function HotkeyHelpPanel({
|
|
43
45
|
onClose,
|
|
44
46
|
isVisible
|
|
@@ -65,22 +67,22 @@ function HotkeyHelpPanel({
|
|
|
65
67
|
marginBottom: 1
|
|
66
68
|
},
|
|
67
69
|
/* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: BRAND_GRADIENT.START }, "\u2328\uFE0F ", t("ui.hints.shortcuts")), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, " ", "(", t("ui.hints.pressEsc"), ")")),
|
|
68
|
-
/* @__PURE__ */ React.createElement(Box, { flexDirection: "row", gap: 4 },
|
|
70
|
+
/* @__PURE__ */ React.createElement(Box, { flexDirection: "row", gap: 4 }, getHotkeyGroups().map((group, groupIndex) => /* @__PURE__ */ React.createElement(Box, { key: groupIndex, flexDirection: "column", minWidth: 28 }, /* @__PURE__ */ React.createElement(Text, { bold: true, underline: true, color: SEMANTIC_COLORS.secondary }, group.title), group.hotkeys.map((hotkey, hotkeyIndex) => /* @__PURE__ */ React.createElement(Box, { key: hotkeyIndex }, /* @__PURE__ */ React.createElement(Box, { width: 12 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: BRAND_GRADIENT.MIDDLE }, hotkey.keys)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, hotkey.description)))))),
|
|
69
71
|
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, t("ui.hints.tip")))
|
|
70
72
|
);
|
|
71
73
|
}
|
|
72
74
|
function HotkeyHint() {
|
|
73
|
-
return /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "
|
|
75
|
+
return /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, t("hotkey.ctrlQuestionForShortcuts"));
|
|
74
76
|
}
|
|
75
77
|
function getContextHints(context) {
|
|
76
78
|
switch (context) {
|
|
77
79
|
case "idle":
|
|
78
80
|
return [
|
|
79
|
-
{ keys: "!", description: "
|
|
80
|
-
{ keys: "#", description: "
|
|
81
|
-
{ keys: "/", description: "
|
|
82
|
-
{ keys: "ctrl+c", description: "cancel" },
|
|
83
|
-
{ keys: "ctrl+l", description: "clear" }
|
|
81
|
+
{ keys: "!", description: t("ui.hints.forBashMode") },
|
|
82
|
+
{ keys: "#", description: t("ui.hints.forMintoMd") },
|
|
83
|
+
{ keys: "/", description: t("ui.hints.forCommands") },
|
|
84
|
+
{ keys: "ctrl+c", description: t("common.cancel") },
|
|
85
|
+
{ keys: "ctrl+l", description: t("common.clear") }
|
|
84
86
|
];
|
|
85
87
|
case "typing":
|
|
86
88
|
return [
|
|
@@ -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 { 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\
|
|
5
|
-
"mappings": "AAOA,SAAS,KAAK,MAAM,gBAAgB;AACpC,YAAY,WAAW;AACvB,SAAS,SAAS;AAClB,SAAS,gBAAgB,uBAAuB;
|
|
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\n// Build hotkey groups dynamically to support i18n\nfunction getHotkeyGroups(): HotkeyGroup[] {\n return [\n {\n title: t('hotkey.navigation'),\n hotkeys: [\n { keys: '\u2191/\u2193', description: t('hotkey.browseHistory') },\n { keys: 'Ctrl+R', description: t('hotkey.searchHistory') },\n { keys: 'Tab', description: t('hotkey.autocomplete') },\n { keys: 'Esc Esc', description: t('hotkey.rollbackResponse') },\n ],\n },\n {\n title: t('hotkey.control'),\n hotkeys: [\n { keys: 'Ctrl+C', description: t('hotkey.cancelOperation') },\n { keys: 'Ctrl+D', description: t('hotkey.exitPressTwice') },\n { keys: 'Ctrl+L', description: t('hotkey.clearScreen') },\n { keys: 'Enter', description: t('hotkey.submitPrompt') },\n ],\n },\n {\n title: t('hotkey.features'),\n hotkeys: [\n { keys: 'Ctrl+T', description: t('hotkey.toggleTodoPanel') },\n { keys: 'Ctrl+O', description: t('hotkey.cycleDisplayMode') },\n { keys: 'Ctrl+B', description: t('hotkey.executeAsBash') },\n { keys: 'Ctrl+?', description: t('hotkey.showHideHelp') },\n ],\n },\n {\n title: t('hotkey.inputModes'),\n hotkeys: [\n { keys: '/', description: t('hotkey.startSlashCommand') },\n { keys: '!', description: t('hotkey.executeBashCommand') },\n { keys: '#', description: t('hotkey.addNoteToKoding') },\n ],\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 {getHotkeyGroups().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 (\n <Text color={SEMANTIC_COLORS.dim}>\n {t('hotkey.ctrlQuestionForShortcuts')}\n </Text>\n )\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: t('ui.hints.forBashMode') },\n { keys: '#', description: t('ui.hints.forMintoMd') },\n { keys: '/', description: t('ui.hints.forCommands') },\n { keys: 'ctrl+c', description: t('common.cancel') },\n { keys: 'ctrl+l', description: t('common.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
|
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Box, Text, useInput } from "ink";
|
|
3
|
+
import { BRAND_GRADIENT, SEMANTIC_COLORS } from "../../constants/colors.js";
|
|
4
|
+
import { StatusOverlayContent } from "../StatusOverlayContent.js";
|
|
5
|
+
import { t } from "../../i18n/index.js";
|
|
6
|
+
function renderProgressBar(percent, width = 20, color) {
|
|
7
|
+
const clamped = Math.min(100, Math.max(0, percent));
|
|
8
|
+
const filled = Math.round(clamped / 100 * width);
|
|
9
|
+
const empty = width - filled;
|
|
10
|
+
const barColor = color || getProgressColor(clamped);
|
|
11
|
+
return /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: barColor }, "\u2588".repeat(filled)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.muted }, "\u2591".repeat(empty)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", clamped.toFixed(0), "%"));
|
|
12
|
+
}
|
|
13
|
+
function getProgressColor(percent) {
|
|
14
|
+
if (percent < 50) return SEMANTIC_COLORS.success;
|
|
15
|
+
if (percent < 80) return BRAND_GRADIENT.MIDDLE;
|
|
16
|
+
return SEMANTIC_COLORS.error;
|
|
17
|
+
}
|
|
18
|
+
function renderDelta(delta) {
|
|
19
|
+
const prefix = delta.value > 0 ? "+" : "";
|
|
20
|
+
const color = delta.value > 0 ? SEMANTIC_COLORS.success : delta.value < 0 ? SEMANTIC_COLORS.error : SEMANTIC_COLORS.dim;
|
|
21
|
+
return /* @__PURE__ */ React.createElement(Text, { color }, "(", prefix, delta.value, delta.label ? ` ${delta.label}` : "", ")");
|
|
22
|
+
}
|
|
23
|
+
const InfoItemRow = ({ item }) => {
|
|
24
|
+
return /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, item.label.padEnd(18)), /* @__PURE__ */ React.createElement(Text, { color: item.valueColor || SEMANTIC_COLORS.secondary }, item.value), item.progress && /* @__PURE__ */ React.createElement(Text, null, " ", renderProgressBar(
|
|
25
|
+
item.progress.percent,
|
|
26
|
+
item.progress.width,
|
|
27
|
+
item.progress.color
|
|
28
|
+
)), item.delta && /* @__PURE__ */ React.createElement(Text, null, " ", renderDelta(item.delta)));
|
|
29
|
+
};
|
|
30
|
+
const InfoSectionView = ({ section }) => {
|
|
31
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { bold: true, color: SEMANTIC_COLORS.secondary }, section.title)), section.items.map((item, index) => /* @__PURE__ */ React.createElement(InfoItemRow, { key: `${section.title}-${index}`, item })));
|
|
32
|
+
};
|
|
33
|
+
function InfoPanel({
|
|
34
|
+
title,
|
|
35
|
+
subtitle,
|
|
36
|
+
sections,
|
|
37
|
+
actions,
|
|
38
|
+
onClose,
|
|
39
|
+
statusOverlay,
|
|
40
|
+
isActive = true
|
|
41
|
+
}) {
|
|
42
|
+
useInput(
|
|
43
|
+
(input, key) => {
|
|
44
|
+
if (statusOverlay && statusOverlay.type !== "loading") {
|
|
45
|
+
if (key.escape || key.return) {
|
|
46
|
+
onClose();
|
|
47
|
+
}
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (statusOverlay) return;
|
|
51
|
+
if (key.escape) {
|
|
52
|
+
onClose();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (actions) {
|
|
56
|
+
for (const action of actions) {
|
|
57
|
+
const actionKey = action.key.toLowerCase();
|
|
58
|
+
if (input.toLowerCase() === actionKey || (actionKey === "enter" || actionKey === "return") && key.return) {
|
|
59
|
+
action.onPress();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (key.return && (!actions || actions.length === 0)) {
|
|
65
|
+
onClose();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
{ isActive }
|
|
70
|
+
);
|
|
71
|
+
const buildFooterHint = () => {
|
|
72
|
+
if (statusOverlay) {
|
|
73
|
+
return statusOverlay.type === "loading" ? "" : t("ui.infoPanel.dismissHint");
|
|
74
|
+
}
|
|
75
|
+
if (actions && actions.length > 0) {
|
|
76
|
+
const actionHints = actions.map((a) => `${a.keyLabel} ${a.description}`).join(" \xB7 ");
|
|
77
|
+
return `${actionHints} \xB7 Esc ${t("ui.hints.close")}`;
|
|
78
|
+
}
|
|
79
|
+
return t("ui.infoPanel.continueHint");
|
|
80
|
+
};
|
|
81
|
+
const footerHint = buildFooterHint();
|
|
82
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width: "100%" }, /* @__PURE__ */ React.createElement(
|
|
83
|
+
Box,
|
|
84
|
+
{
|
|
85
|
+
borderTop: true,
|
|
86
|
+
borderBottom: false,
|
|
87
|
+
borderLeft: false,
|
|
88
|
+
borderRight: false,
|
|
89
|
+
borderColor: BRAND_GRADIENT.START,
|
|
90
|
+
borderStyle: "single",
|
|
91
|
+
width: "100%",
|
|
92
|
+
paddingX: 1,
|
|
93
|
+
flexDirection: "column"
|
|
94
|
+
},
|
|
95
|
+
/* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START }, "\u25C6"), /* @__PURE__ */ React.createElement(Text, { bold: true, color: SEMANTIC_COLORS.secondary }, " ", title), subtitle && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", subtitle))
|
|
96
|
+
), /* @__PURE__ */ React.createElement(
|
|
97
|
+
Box,
|
|
98
|
+
{
|
|
99
|
+
flexDirection: "column",
|
|
100
|
+
borderTop: false,
|
|
101
|
+
borderBottom: true,
|
|
102
|
+
borderLeft: false,
|
|
103
|
+
borderRight: false,
|
|
104
|
+
borderColor: BRAND_GRADIENT.START,
|
|
105
|
+
borderStyle: "single",
|
|
106
|
+
width: "100%",
|
|
107
|
+
paddingX: 1,
|
|
108
|
+
paddingY: 1
|
|
109
|
+
},
|
|
110
|
+
statusOverlay ? /* @__PURE__ */ React.createElement(
|
|
111
|
+
StatusOverlayContent,
|
|
112
|
+
{
|
|
113
|
+
type: statusOverlay.type,
|
|
114
|
+
message: statusOverlay.message
|
|
115
|
+
}
|
|
116
|
+
) : /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, sections.map((section, index) => /* @__PURE__ */ React.createElement(InfoSectionView, { key: `section-${index}`, section }))),
|
|
117
|
+
footerHint && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.muted }, footerHint))
|
|
118
|
+
));
|
|
119
|
+
}
|
|
120
|
+
export {
|
|
121
|
+
InfoPanel
|
|
122
|
+
};
|
|
123
|
+
//# sourceMappingURL=InfoPanel.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/InfoPanel/InfoPanel.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * InfoPanel Component\n *\n * A read-only info display with brand-consistent borders,\n * sectioned content, optional progress bars, deltas, and actions.\n *\n * Visual pattern:\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 (BRAND_GRADIENT.START border)\n * \u25C6 Title subtitle\n *\n * Section Title\n * label1 value1 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591 45%\n * label2 value2 (+3 vs yesterday)\n * label3 value3\n *\n * Enter Close \u00B7 T Toggle \u00B7 Esc Close\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 (BRAND_GRADIENT.START border)\n */\n\nimport React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\nimport { StatusOverlayContent } from '@components/StatusOverlayContent'\nimport { t } from '@i18n'\nimport type {\n InfoPanelProps,\n InfoItem,\n InfoSection,\n InfoPanelProgress,\n InfoPanelDelta,\n} from './types'\n\n/**\n * Render an ASCII progress bar\n */\nfunction renderProgressBar(\n percent: number,\n width: number = 20,\n color?: string,\n): React.ReactNode {\n const clamped = Math.min(100, Math.max(0, percent))\n const filled = Math.round((clamped / 100) * width)\n const empty = width - filled\n\n const barColor = color || getProgressColor(clamped)\n\n return (\n <Text>\n <Text color={barColor}>{'\u2588'.repeat(filled)}</Text>\n <Text color={SEMANTIC_COLORS.muted}>{'\u2591'.repeat(empty)}</Text>\n <Text color={SEMANTIC_COLORS.dim}> {clamped.toFixed(0)}%</Text>\n </Text>\n )\n}\n\n/**\n * Get color based on percentage\n */\nfunction getProgressColor(percent: number): string {\n if (percent < 50) return SEMANTIC_COLORS.success\n if (percent < 80) return BRAND_GRADIENT.MIDDLE\n return SEMANTIC_COLORS.error\n}\n\n/**\n * Render a delta indicator\n */\nfunction renderDelta(delta: InfoPanelDelta): React.ReactNode {\n const prefix = delta.value > 0 ? '+' : ''\n const color =\n delta.value > 0\n ? SEMANTIC_COLORS.success\n : delta.value < 0\n ? SEMANTIC_COLORS.error\n : SEMANTIC_COLORS.dim\n\n return (\n <Text color={color}>\n ({prefix}\n {delta.value}\n {delta.label ? ` ${delta.label}` : ''})\n </Text>\n )\n}\n\n/**\n * Render a single info item\n */\nconst InfoItemRow: React.FC<{ item: InfoItem }> = ({ item }) => {\n return (\n <Box paddingLeft={2}>\n <Text color={SEMANTIC_COLORS.dim}>{item.label.padEnd(18)}</Text>\n <Text color={item.valueColor || SEMANTIC_COLORS.secondary}>\n {item.value}\n </Text>\n {item.progress && (\n <Text>\n {' '}\n {renderProgressBar(\n item.progress.percent,\n item.progress.width,\n item.progress.color,\n )}\n </Text>\n )}\n {item.delta && <Text> {renderDelta(item.delta)}</Text>}\n </Box>\n )\n}\n\n/**\n * Render a section with title and items\n */\nconst InfoSectionView: React.FC<{ section: InfoSection }> = ({ section }) => {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box>\n <Text bold color={SEMANTIC_COLORS.secondary}>\n {section.title}\n </Text>\n </Box>\n {section.items.map((item, index) => (\n <InfoItemRow key={`${section.title}-${index}`} item={item} />\n ))}\n </Box>\n )\n}\n\nexport function InfoPanel({\n title,\n subtitle,\n sections,\n actions,\n onClose,\n statusOverlay,\n isActive = true,\n}: InfoPanelProps) {\n // Keyboard input handling\n useInput(\n (input, key) => {\n // Status overlay: success/error -> ESC/Enter closes\n if (statusOverlay && statusOverlay.type !== 'loading') {\n if (key.escape || key.return) {\n onClose()\n }\n return\n }\n\n // Status overlay: loading -> ignore all input\n if (statusOverlay) return\n\n // Escape always closes\n if (key.escape) {\n onClose()\n return\n }\n\n // Check action keys\n if (actions) {\n for (const action of actions) {\n const actionKey = action.key.toLowerCase()\n if (\n input.toLowerCase() === actionKey ||\n ((actionKey === 'enter' || actionKey === 'return') && key.return)\n ) {\n action.onPress()\n return\n }\n }\n }\n\n // Enter closes when no actions defined\n if (key.return && (!actions || actions.length === 0)) {\n onClose()\n return\n }\n },\n { isActive },\n )\n\n // Build footer hint\n const buildFooterHint = (): string => {\n if (statusOverlay) {\n return statusOverlay.type === 'loading'\n ? ''\n : t('ui.infoPanel.dismissHint')\n }\n\n if (actions && actions.length > 0) {\n const actionHints = actions\n .map(a => `${a.keyLabel} ${a.description}`)\n .join(' \\u00B7 ')\n return `${actionHints} \\u00B7 Esc ${t('ui.hints.close')}`\n }\n\n return t('ui.infoPanel.continueHint')\n }\n\n const footerHint = buildFooterHint()\n\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n {/* Header bar with top border */}\n <Box\n borderTop={true}\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n borderColor={BRAND_GRADIENT.START}\n borderStyle=\"single\"\n width=\"100%\"\n paddingX={1}\n flexDirection=\"column\"\n >\n {/* Title with brand color */}\n <Box>\n <Text color={BRAND_GRADIENT.START}>{'\\u25C6'}</Text>\n <Text bold color={SEMANTIC_COLORS.secondary}>\n {' '}\n {title}\n </Text>\n {subtitle && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n {subtitle}\n </Text>\n )}\n </Box>\n </Box>\n\n {/* Content container with bottom border */}\n <Box\n flexDirection=\"column\"\n borderTop={false}\n borderBottom={true}\n borderLeft={false}\n borderRight={false}\n borderColor={BRAND_GRADIENT.START}\n borderStyle=\"single\"\n width=\"100%\"\n paddingX={1}\n paddingY={1}\n >\n {statusOverlay ? (\n <StatusOverlayContent\n type={statusOverlay.type}\n message={statusOverlay.message}\n />\n ) : (\n <Box flexDirection=\"column\">\n {sections.map((section, index) => (\n <InfoSectionView key={`section-${index}`} section={section} />\n ))}\n </Box>\n )}\n\n {/* Footer Hint */}\n {footerHint && (\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.muted}>{footerHint}</Text>\n </Box>\n )}\n </Box>\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAmBA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB,uBAAuB;AAChD,SAAS,4BAA4B;AACrC,SAAS,SAAS;AAYlB,SAAS,kBACP,SACA,QAAgB,IAChB,OACiB;AACjB,QAAM,UAAU,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC;AAClD,QAAM,SAAS,KAAK,MAAO,UAAU,MAAO,KAAK;AACjD,QAAM,QAAQ,QAAQ;AAEtB,QAAM,WAAW,SAAS,iBAAiB,OAAO;AAElD,SACE,oCAAC,YACC,oCAAC,QAAK,OAAO,YAAW,SAAI,OAAO,MAAM,CAAE,GAC3C,oCAAC,QAAK,OAAO,gBAAgB,SAAQ,SAAI,OAAO,KAAK,CAAE,GACvD,oCAAC,QAAK,OAAO,gBAAgB,OAAK,KAAE,QAAQ,QAAQ,CAAC,GAAE,GAAC,CAC1D;AAEJ;AAKA,SAAS,iBAAiB,SAAyB;AACjD,MAAI,UAAU,GAAI,QAAO,gBAAgB;AACzC,MAAI,UAAU,GAAI,QAAO,eAAe;AACxC,SAAO,gBAAgB;AACzB;AAKA,SAAS,YAAY,OAAwC;AAC3D,QAAM,SAAS,MAAM,QAAQ,IAAI,MAAM;AACvC,QAAM,QACJ,MAAM,QAAQ,IACV,gBAAgB,UAChB,MAAM,QAAQ,IACZ,gBAAgB,QAChB,gBAAgB;AAExB,SACE,oCAAC,QAAK,SAAc,KAChB,QACD,MAAM,OACN,MAAM,QAAQ,IAAI,MAAM,KAAK,KAAK,IAAG,GACxC;AAEJ;AAKA,MAAM,cAA4C,CAAC,EAAE,KAAK,MAAM;AAC9D,SACE,oCAAC,OAAI,aAAa,KAChB,oCAAC,QAAK,OAAO,gBAAgB,OAAM,KAAK,MAAM,OAAO,EAAE,CAAE,GACzD,oCAAC,QAAK,OAAO,KAAK,cAAc,gBAAgB,aAC7C,KAAK,KACR,GACC,KAAK,YACJ,oCAAC,YACE,MACA;AAAA,IACC,KAAK,SAAS;AAAA,IACd,KAAK,SAAS;AAAA,IACd,KAAK,SAAS;AAAA,EAChB,CACF,GAED,KAAK,SAAS,oCAAC,YAAK,KAAE,YAAY,KAAK,KAAK,CAAE,CACjD;AAEJ;AAKA,MAAM,kBAAsD,CAAC,EAAE,QAAQ,MAAM;AAC3E,SACE,oCAAC,OAAI,eAAc,UAAS,WAAW,KACrC,oCAAC,WACC,oCAAC,QAAK,MAAI,MAAC,OAAO,gBAAgB,aAC/B,QAAQ,KACX,CACF,GACC,QAAQ,MAAM,IAAI,CAAC,MAAM,UACxB,oCAAC,eAAY,KAAK,GAAG,QAAQ,KAAK,IAAI,KAAK,IAAI,MAAY,CAC5D,CACH;AAEJ;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAAmB;AAEjB;AAAA,IACE,CAAC,OAAO,QAAQ;AAEd,UAAI,iBAAiB,cAAc,SAAS,WAAW;AACrD,YAAI,IAAI,UAAU,IAAI,QAAQ;AAC5B,kBAAQ;AAAA,QACV;AACA;AAAA,MACF;AAGA,UAAI,cAAe;AAGnB,UAAI,IAAI,QAAQ;AACd,gBAAQ;AACR;AAAA,MACF;AAGA,UAAI,SAAS;AACX,mBAAW,UAAU,SAAS;AAC5B,gBAAM,YAAY,OAAO,IAAI,YAAY;AACzC,cACE,MAAM,YAAY,MAAM,cACtB,cAAc,WAAW,cAAc,aAAa,IAAI,QAC1D;AACA,mBAAO,QAAQ;AACf;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,UAAI,IAAI,WAAW,CAAC,WAAW,QAAQ,WAAW,IAAI;AACpD,gBAAQ;AACR;AAAA,MACF;AAAA,IACF;AAAA,IACA,EAAE,SAAS;AAAA,EACb;AAGA,QAAM,kBAAkB,MAAc;AACpC,QAAI,eAAe;AACjB,aAAO,cAAc,SAAS,YAC1B,KACA,EAAE,0BAA0B;AAAA,IAClC;AAEA,QAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,YAAM,cAAc,QACjB,IAAI,OAAK,GAAG,EAAE,QAAQ,IAAI,EAAE,WAAW,EAAE,EACzC,KAAK,QAAU;AAClB,aAAO,GAAG,WAAW,aAAe,EAAE,gBAAgB,CAAC;AAAA,IACzD;AAEA,WAAO,EAAE,2BAA2B;AAAA,EACtC;AAEA,QAAM,aAAa,gBAAgB;AAEnC,SACE,oCAAC,OAAI,eAAc,UAAS,OAAM,UAEhC;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,aAAa,eAAe;AAAA,MAC5B,aAAY;AAAA,MACZ,OAAM;AAAA,MACN,UAAU;AAAA,MACV,eAAc;AAAA;AAAA,IAGd,oCAAC,WACC,oCAAC,QAAK,OAAO,eAAe,SAAQ,QAAS,GAC7C,oCAAC,QAAK,MAAI,MAAC,OAAO,gBAAgB,aAC/B,KACA,KACH,GACC,YACC,oCAAC,QAAK,OAAO,gBAAgB,OAC1B,MACA,QACH,CAEJ;AAAA,EACF,GAGA;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,OAAM;AAAA,MACN,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,IAET,gBACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,cAAc;AAAA,QACpB,SAAS,cAAc;AAAA;AAAA,IACzB,IAEA,oCAAC,OAAI,eAAc,YAChB,SAAS,IAAI,CAAC,SAAS,UACtB,oCAAC,mBAAgB,KAAK,WAAW,KAAK,IAAI,SAAkB,CAC7D,CACH;AAAA,IAID,cACC,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAO,gBAAgB,SAAQ,UAAW,CAClD;AAAA,EAEJ,CACF;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/InfoPanel/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * InfoPanel Component Exports\n *\n * A read-only info display component for commands that show status/data.\n */\n\nexport { InfoPanel } from './InfoPanel'\nexport type {\n InfoPanelProps,\n InfoSection,\n InfoItem,\n InfoPanelAction,\n InfoPanelProgress,\n InfoPanelDelta,\n StatusOverlay,\n} from './types'\n"],
|
|
5
|
+
"mappings": "AAMA,SAAS,iBAAiB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.js.map
|
package/dist/components/Logo.js
CHANGED
|
@@ -25,7 +25,10 @@ function Logo({
|
|
|
25
25
|
const projectName = path.basename(cwd);
|
|
26
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
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 },
|
|
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 }, t("ui.update.newVersionAvailable", {
|
|
29
|
+
version: updateBannerVersion,
|
|
30
|
+
current: MACRO.VERSION
|
|
31
|
+
})), /* @__PURE__ */ React.createElement(Text, null, t("ui.update.runCommand")), /* @__PURE__ */ React.createElement(Text, null, " ", updateBannerCommands?.[1] ?? DEFAULT_UPDATE_COMMANDS[1]), process.platform !== "win32" && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, t("ui.update.sudoNote"))) : null, /* @__PURE__ */ React.createElement(
|
|
29
32
|
Box,
|
|
30
33
|
{
|
|
31
34
|
flexDirection: "column",
|
|
@@ -39,7 +42,7 @@ function Logo({
|
|
|
39
42
|
paddingX: 1,
|
|
40
43
|
paddingY: 1
|
|
41
44
|
},
|
|
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 }, "
|
|
45
|
+
/* @__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 }, t("ui.welcome.taglinePart1")), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.END }, t("ui.welcome.taglinePart2")), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " \xB7 v", MACRO.VERSION))),
|
|
43
46
|
/* @__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
47
|
/* @__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
48
|
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "\u{1F4C2} ", projectName))
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/components/Logo.tsx"],
|
|
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
|
|
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,
|
|
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 {t('ui.update.newVersionAvailable', {\n version: updateBannerVersion,\n current: MACRO.VERSION,\n })}\n </Text>\n <Text>{t('ui.update.runCommand')}</Text>\n <Text>\n {' '}\n {updateBannerCommands?.[1] ?? DEFAULT_UPDATE_COMMANDS[1]}\n </Text>\n {process.platform !== 'win32' && (\n <Text color={SEMANTIC_COLORS.dim}>{t('ui.update.sudoNote')}</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}>\n {t('ui.welcome.taglinePart1')}\n </Text>\n <Text color={theme.secondaryText}> \u00B7 </Text>\n <Text color={BRAND_GRADIENT.END}>\n {t('ui.welcome.taglinePart2')}\n </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,WAC1B,EAAE,iCAAiC;AAAA,IAClC,SAAS;AAAA,IACT,SAAS,MAAM;AAAA,EACjB,CAAC,CACH,GACA,oCAAC,YAAM,EAAE,sBAAsB,CAAE,GACjC,oCAAC,YACE,MACA,uBAAuB,CAAC,KAAK,wBAAwB,CAAC,CACzD,GACC,QAAQ,aAAa,WACpB,oCAAC,QAAK,OAAO,gBAAgB,OAAM,EAAE,oBAAoB,CAAE,CAE/D,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,SACzB,EAAE,yBAAyB,CAC9B,GACA,oCAAC,QAAK,OAAO,MAAM,iBAAe,QAAG,GACrC,oCAAC,QAAK,OAAO,eAAe,OACzB,EAAE,yBAAyB,CAC9B,GACA,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
|
}
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
import { MCPServerDialogCopy } from "./MCPServerDialogCopy.js";
|
|
10
10
|
import { useExitOnCtrlCD } from "../hooks/useExitOnCtrlCD.js";
|
|
11
11
|
import { SEMANTIC_COLORS } from "../constants/colors.js";
|
|
12
|
+
import { t } from "../i18n/index.js";
|
|
12
13
|
function MCPServerApprovalDialog({
|
|
13
14
|
serverName,
|
|
14
15
|
onDone
|
|
@@ -57,8 +58,8 @@ function MCPServerApprovalDialog({
|
|
|
57
58
|
borderStyle: "round",
|
|
58
59
|
borderColor: theme.warning
|
|
59
60
|
},
|
|
60
|
-
/* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.warning }, "
|
|
61
|
-
/* @__PURE__ */ React.createElement(Text, null, "
|
|
61
|
+
/* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.warning }, t("dialog.mcpServerDetected")),
|
|
62
|
+
/* @__PURE__ */ React.createElement(Text, null, t("dialog.mcpApprovalRequired")),
|
|
62
63
|
/* @__PURE__ */ React.createElement(Text, { bold: true }, serverName),
|
|
63
64
|
/* @__PURE__ */ React.createElement(MCPServerDialogCopy, null),
|
|
64
65
|
/* @__PURE__ */ React.createElement(Text, null, "Do you want to approve this MCP server?"),
|
|
@@ -66,13 +67,13 @@ function MCPServerApprovalDialog({
|
|
|
66
67
|
Select,
|
|
67
68
|
{
|
|
68
69
|
options: [
|
|
69
|
-
{ label: "
|
|
70
|
-
{ label: "
|
|
70
|
+
{ label: t("dialog.approveServer"), value: "yes" },
|
|
71
|
+
{ label: t("dialog.rejectServer"), value: "no" }
|
|
71
72
|
],
|
|
72
73
|
onChange: (value) => onChange(value)
|
|
73
74
|
}
|
|
74
75
|
)
|
|
75
|
-
), /* @__PURE__ */ React.createElement(Box, { marginLeft: 3 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, exitState.pending ? /* @__PURE__ */ React.createElement(React.Fragment, null, "
|
|
76
|
+
), /* @__PURE__ */ React.createElement(Box, { marginLeft: 3 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, exitState.pending ? /* @__PURE__ */ React.createElement(React.Fragment, null, t("prompts.pressCtrlDAgain")) : /* @__PURE__ */ React.createElement(React.Fragment, null, t("dialog.confirmRejectPrompt")))));
|
|
76
77
|
}
|
|
77
78
|
export {
|
|
78
79
|
MCPServerApprovalDialog
|