@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.
Files changed (238) hide show
  1. package/{cli.js → cli.cjs} +25 -23
  2. package/dist/commands/agents/AgentsCommand.js +459 -655
  3. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  4. package/dist/commands/agents/types.js +1 -0
  5. package/dist/commands/agents/types.js.map +2 -2
  6. package/dist/commands/agents/utils/fileOperations.js +96 -36
  7. package/dist/commands/agents/utils/fileOperations.js.map +3 -3
  8. package/dist/commands/agents/utils/index.js +3 -1
  9. package/dist/commands/agents/utils/index.js.map +2 -2
  10. package/dist/commands/context.js +54 -23
  11. package/dist/commands/context.js.map +2 -2
  12. package/dist/commands/export.js +673 -93
  13. package/dist/commands/export.js.map +2 -2
  14. package/dist/commands/language.js +110 -0
  15. package/dist/commands/language.js.map +7 -0
  16. package/dist/commands/mcp-interactive.js +419 -217
  17. package/dist/commands/mcp-interactive.js.map +2 -2
  18. package/dist/commands/model.js +415 -66
  19. package/dist/commands/model.js.map +2 -2
  20. package/dist/commands/new.js +56 -0
  21. package/dist/commands/new.js.map +7 -0
  22. package/dist/commands/permissions.js +75 -49
  23. package/dist/commands/permissions.js.map +2 -2
  24. package/dist/commands/plugin.js +882 -185
  25. package/dist/commands/plugin.js.map +3 -3
  26. package/dist/commands/resume.js +251 -16
  27. package/dist/commands/resume.js.map +2 -2
  28. package/dist/commands/sandbox.js +168 -70
  29. package/dist/commands/sandbox.js.map +2 -2
  30. package/dist/commands/sessions.js +224 -0
  31. package/dist/commands/sessions.js.map +7 -0
  32. package/dist/commands/setup.js +596 -109
  33. package/dist/commands/setup.js.map +2 -2
  34. package/dist/commands/stats.js +292 -0
  35. package/dist/commands/stats.js.map +7 -0
  36. package/dist/commands/status.js +75 -7
  37. package/dist/commands/status.js.map +2 -2
  38. package/dist/commands/undo.js +154 -180
  39. package/dist/commands/undo.js.map +2 -2
  40. package/dist/commands.js +6 -0
  41. package/dist/commands.js.map +2 -2
  42. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
  43. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
  44. package/dist/components/Config.js +9 -8
  45. package/dist/components/Config.js.map +2 -2
  46. package/dist/components/HeaderBar.js +2 -1
  47. package/dist/components/HeaderBar.js.map +2 -2
  48. package/dist/components/Help.js +166 -32
  49. package/dist/components/Help.js.map +2 -2
  50. package/dist/components/HotkeyHelpPanel.js +46 -44
  51. package/dist/components/HotkeyHelpPanel.js.map +2 -2
  52. package/dist/components/InfoPanel/InfoPanel.js +123 -0
  53. package/dist/components/InfoPanel/InfoPanel.js.map +7 -0
  54. package/dist/components/InfoPanel/index.js +5 -0
  55. package/dist/components/InfoPanel/index.js.map +7 -0
  56. package/dist/components/InfoPanel/types.js +1 -0
  57. package/dist/components/InfoPanel/types.js.map +7 -0
  58. package/dist/components/Logo.js +5 -2
  59. package/dist/components/Logo.js.map +2 -2
  60. package/dist/components/MCPServerApprovalDialog.js +6 -5
  61. package/dist/components/MCPServerApprovalDialog.js.map +2 -2
  62. package/dist/components/MCPServerMultiselectDialog.js +5 -4
  63. package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
  64. package/dist/components/MessageSelector.js +4 -3
  65. package/dist/components/MessageSelector.js.map +2 -2
  66. package/dist/components/ModelConfig.js +13 -12
  67. package/dist/components/ModelConfig.js.map +2 -2
  68. package/dist/components/ModelListManager.js +4 -3
  69. package/dist/components/ModelListManager.js.map +2 -2
  70. package/dist/components/ModelSelector/BrandTextInput.js +43 -0
  71. package/dist/components/ModelSelector/BrandTextInput.js.map +7 -0
  72. package/dist/components/ModelSelector/ModelSelector.js +419 -501
  73. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  74. package/dist/components/ModelSelector/WizardContainer.js +45 -0
  75. package/dist/components/ModelSelector/WizardContainer.js.map +7 -0
  76. package/dist/components/ModelSelector/index.js +1 -3
  77. package/dist/components/ModelSelector/index.js.map +2 -2
  78. package/dist/components/PromptInput.js +77 -44
  79. package/dist/components/PromptInput.js.map +2 -2
  80. package/dist/components/SensitiveFileWarning.js +12 -8
  81. package/dist/components/SensitiveFileWarning.js.map +2 -2
  82. package/dist/components/SimpleSelector/SimpleSelector.js +154 -0
  83. package/dist/components/SimpleSelector/SimpleSelector.js.map +7 -0
  84. package/dist/components/SimpleSelector/index.js +5 -0
  85. package/dist/components/SimpleSelector/index.js.map +7 -0
  86. package/dist/components/SimpleSelector/types.js +1 -0
  87. package/dist/components/SimpleSelector/types.js.map +7 -0
  88. package/dist/components/StatusOverlayContent.js +21 -0
  89. package/dist/components/StatusOverlayContent.js.map +7 -0
  90. package/dist/components/TabbedListView/ScrollableList.js +117 -0
  91. package/dist/components/TabbedListView/ScrollableList.js.map +7 -0
  92. package/dist/components/TabbedListView/SearchInput.js +23 -0
  93. package/dist/components/TabbedListView/SearchInput.js.map +7 -0
  94. package/dist/components/TabbedListView/TabBar.js +20 -0
  95. package/dist/components/TabbedListView/TabBar.js.map +7 -0
  96. package/dist/components/TabbedListView/TabbedListView.js +246 -0
  97. package/dist/components/TabbedListView/TabbedListView.js.map +7 -0
  98. package/dist/components/TabbedListView/index.js +11 -0
  99. package/dist/components/TabbedListView/index.js.map +7 -0
  100. package/dist/components/TabbedListView/types.js +1 -0
  101. package/dist/components/TabbedListView/types.js.map +7 -0
  102. package/dist/components/TodoChangeBlock.js +6 -5
  103. package/dist/components/TodoChangeBlock.js.map +3 -3
  104. package/dist/components/TodoPanel.js +6 -3
  105. package/dist/components/TodoPanel.js.map +3 -3
  106. package/dist/components/TrustDialog.js +6 -5
  107. package/dist/components/TrustDialog.js.map +2 -2
  108. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js +2 -1
  109. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js.map +2 -2
  110. package/dist/constants/macros.js +1 -1
  111. package/dist/constants/macros.js.map +1 -1
  112. package/dist/constants/product.js +2 -2
  113. package/dist/constants/product.js.map +1 -1
  114. package/dist/constants/prompts.js +17 -0
  115. package/dist/constants/prompts.js.map +2 -2
  116. package/dist/constants/toolInputExamples.js +5 -1
  117. package/dist/constants/toolInputExamples.js.map +2 -2
  118. package/dist/core/backupHook.js +29 -0
  119. package/dist/core/backupHook.js.map +7 -0
  120. package/dist/core/config/defaults.js +8 -2
  121. package/dist/core/config/defaults.js.map +2 -2
  122. package/dist/core/config/schema.js +14 -2
  123. package/dist/core/config/schema.js.map +2 -2
  124. package/dist/core/costTracker.js +0 -16
  125. package/dist/core/costTracker.js.map +2 -2
  126. package/dist/core/tokenStatsManager.js +5 -0
  127. package/dist/core/tokenStatsManager.js.map +2 -2
  128. package/dist/cost-tracker.js +0 -16
  129. package/dist/cost-tracker.js.map +2 -2
  130. package/dist/entrypoints/bootstrap.js +56 -0
  131. package/dist/entrypoints/bootstrap.js.map +7 -0
  132. package/dist/entrypoints/cli.js +164 -23
  133. package/dist/entrypoints/cli.js.map +3 -3
  134. package/dist/history.js +75 -15
  135. package/dist/history.js.map +2 -2
  136. package/dist/i18n/index.js +2 -2
  137. package/dist/i18n/index.js.map +2 -2
  138. package/dist/i18n/locales/en.js +582 -1
  139. package/dist/i18n/locales/en.js.map +2 -2
  140. package/dist/i18n/locales/zh-CN.js +582 -1
  141. package/dist/i18n/locales/zh-CN.js.map +2 -2
  142. package/dist/i18n/types.js.map +1 -1
  143. package/dist/index.js +1 -1
  144. package/dist/index.js.map +2 -2
  145. package/dist/messages.js +11 -0
  146. package/dist/messages.js.map +2 -2
  147. package/dist/permissions.js.map +2 -2
  148. package/dist/query.js +9 -0
  149. package/dist/query.js.map +2 -2
  150. package/dist/screens/REPL.js +45 -7
  151. package/dist/screens/REPL.js.map +2 -2
  152. package/dist/services/customCommands.js +44 -16
  153. package/dist/services/customCommands.js.map +2 -2
  154. package/dist/services/plugins/lspServers.js +1 -1
  155. package/dist/services/plugins/lspServers.js.map +2 -2
  156. package/dist/services/plugins/pluginRuntime.js +2 -1
  157. package/dist/services/plugins/pluginRuntime.js.map +2 -2
  158. package/dist/services/plugins/pluginValidation.js +10 -3
  159. package/dist/services/plugins/pluginValidation.js.map +2 -2
  160. package/dist/services/plugins/skillMarketplace.js +16 -8
  161. package/dist/services/plugins/skillMarketplace.js.map +2 -2
  162. package/dist/services/systemReminder.js +17 -6
  163. package/dist/services/systemReminder.js.map +2 -2
  164. package/dist/tools/FileEditTool/FileEditTool.js +7 -0
  165. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  166. package/dist/tools/FileWriteTool/FileWriteTool.js +7 -0
  167. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  168. package/dist/tools/MultiEditTool/MultiEditTool.js +7 -0
  169. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  170. package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -0
  171. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  172. package/dist/tools/TaskTool/TaskTool.js +179 -1
  173. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  174. package/dist/tools/TodoWriteTool/prompt.js +21 -0
  175. package/dist/tools/TodoWriteTool/prompt.js.map +2 -2
  176. package/dist/tools/URLFetcherTool/prompt.js +14 -9
  177. package/dist/tools/URLFetcherTool/prompt.js.map +2 -2
  178. package/dist/tools/WebSearchTool/prompt.js +12 -6
  179. package/dist/tools/WebSearchTool/prompt.js.map +2 -2
  180. package/dist/types/PermissionMode.js +30 -1
  181. package/dist/types/PermissionMode.js.map +2 -2
  182. package/dist/types/plugin.js +2 -4
  183. package/dist/types/plugin.js.map +2 -2
  184. package/dist/utils/agentHookExecutor.js +103 -0
  185. package/dist/utils/agentHookExecutor.js.map +7 -0
  186. package/dist/utils/agentLoader.js +272 -32
  187. package/dist/utils/agentLoader.js.map +2 -2
  188. package/dist/utils/agentMemory.js +134 -0
  189. package/dist/utils/agentMemory.js.map +7 -0
  190. package/dist/utils/claudeCodeSync.js +439 -0
  191. package/dist/utils/claudeCodeSync.js.map +7 -0
  192. package/dist/utils/config.js +52 -24
  193. package/dist/utils/config.js.map +2 -2
  194. package/dist/utils/configPaths.js +199 -0
  195. package/dist/utils/configPaths.js.map +7 -0
  196. package/dist/utils/execFileNoThrow.js +2 -1
  197. package/dist/utils/execFileNoThrow.js.map +2 -2
  198. package/dist/utils/historyManager.js +234 -0
  199. package/dist/utils/historyManager.js.map +7 -0
  200. package/dist/utils/marketplaceManager.js +80 -43
  201. package/dist/utils/marketplaceManager.js.map +2 -2
  202. package/dist/utils/messages.js +13 -8
  203. package/dist/utils/messages.js.map +2 -2
  204. package/dist/utils/migration/index.js +37 -0
  205. package/dist/utils/migration/index.js.map +7 -0
  206. package/dist/utils/migration/migrateHistory.js +273 -0
  207. package/dist/utils/migration/migrateHistory.js.map +7 -0
  208. package/dist/utils/migration/migrateTodos.js +323 -0
  209. package/dist/utils/migration/migrateTodos.js.map +7 -0
  210. package/dist/utils/pasteCache.js +309 -0
  211. package/dist/utils/pasteCache.js.map +7 -0
  212. package/dist/utils/pluginInstaller.js +34 -24
  213. package/dist/utils/pluginInstaller.js.map +2 -2
  214. package/dist/utils/pluginLoader.js +54 -28
  215. package/dist/utils/pluginLoader.js.map +2 -2
  216. package/dist/utils/repoFetcher.js +110 -0
  217. package/dist/utils/repoFetcher.js.map +7 -0
  218. package/dist/utils/sessionIndex.js +192 -0
  219. package/dist/utils/sessionIndex.js.map +7 -0
  220. package/dist/utils/sessionTracker.js +170 -0
  221. package/dist/utils/sessionTracker.js.map +7 -0
  222. package/dist/utils/skillLoader.js +103 -5
  223. package/dist/utils/skillLoader.js.map +2 -2
  224. package/dist/utils/stats.js +417 -0
  225. package/dist/utils/stats.js.map +7 -0
  226. package/dist/utils/stringSubstitution.js +106 -0
  227. package/dist/utils/stringSubstitution.js.map +7 -0
  228. package/dist/utils/teamConfig.js +156 -14
  229. package/dist/utils/teamConfig.js.map +2 -2
  230. package/dist/utils/terminal.js +1 -1
  231. package/dist/utils/terminal.js.map +2 -2
  232. package/dist/utils/todoStorage.js +51 -19
  233. package/dist/utils/todoStorage.js.map +2 -2
  234. package/dist/utils/tooling/safeRender.js.map +2 -2
  235. package/dist/version.js +2 -2
  236. package/dist/version.js.map +1 -1
  237. package/package.json +71 -28
  238. 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": ["import { Command } from '@commands'\nimport { PRODUCT_COMMAND, PRODUCT_NAME } from '@constants/product'\nimport {\n getCustomCommandDirectories,\n hasCustomCommands,\n type CustomCommandWithScope,\n} from '@services/customCommands'\nimport * as React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { PressEnterToContinue } from './PressEnterToContinue'\nimport { MACRO } from '@constants/macros'\n\n/**\n * Help Component - Interactive help system with progressive disclosure\n *\n * This component provides a comprehensive help interface that progressively\n * reveals information to avoid overwhelming users. It categorizes commands\n * into built-in and custom types, providing clear guidance on usage.\n *\n * The progressive disclosure pattern (count-based) ensures users can absorb\n * information at their own pace while maintaining a responsive interface.\n */\nexport function Help({\n commands,\n onClose,\n}: {\n commands: Command[]\n onClose: () => void\n}): React.ReactNode {\n const theme = getTheme()\n const moreHelp = `Learn more at: ${MACRO.README_URL}`\n\n // Filter out hidden commands from the help display\n const filteredCommands = commands.filter(cmd => !cmd.isHidden)\n\n // Categorize commands by their source/type\n const builtInCommands = filteredCommands\n .filter(\n cmd =>\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 // Custom commands (user: and project: prefixes)\n const customCommands = filteredCommands\n .filter(\n cmd => cmd.name.startsWith('project:') || cmd.name.startsWith('user:'),\n )\n .sort((a, b) =>\n a.userFacingName().localeCompare(b.userFacingName()),\n ) as CustomCommandWithScope[]\n\n // Plugin commands\n const pluginCommands = filteredCommands\n .filter(cmd => cmd.name.startsWith('plugin:'))\n .sort((a, b) => a.userFacingName().localeCompare(b.userFacingName()))\n\n // MCP commands\n const mcpCommands = filteredCommands\n .filter(cmd => cmd.name.startsWith('mcp:'))\n .sort((a, b) => a.userFacingName().localeCompare(b.userFacingName()))\n\n // Progressive disclosure state for managing information flow\n const [count, setCount] = React.useState(0)\n\n // Timer-based progressive disclosure to prevent information overload\n React.useEffect(() => {\n const timer = setTimeout(() => {\n if (count < 3) {\n setCount(count + 1)\n }\n }, 250)\n\n return () => clearTimeout(timer)\n }, [count])\n\n // Handle Enter or Esc key to close help\n useInput((_, key) => {\n if (key.return || key.escape) onClose()\n })\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text bold color={theme.minto}>\n {`${PRODUCT_NAME} v${MACRO.VERSION}`}\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text>\n {PRODUCT_NAME} is a beta research preview. Always review{' '}\n {PRODUCT_NAME}&apos;s responses, especially when running code.{' '}\n {PRODUCT_NAME} has read access to files in the current directory and\n can run commands and edit files with your permission.\n </Text>\n </Box>\n\n {count >= 1 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold>Usage Modes:</Text>\n <Text>\n \u2022 REPL: <Text bold>{PRODUCT_COMMAND}</Text> (interactive session)\n </Text>\n <Text>\n \u2022 Non-interactive:{' '}\n <Text bold>{PRODUCT_COMMAND} -p &quot;question&quot;</Text>\n </Text>\n <Box marginTop={1}>\n <Text>\n Run <Text bold>{PRODUCT_COMMAND} -h</Text> for all command line\n options\n </Text>\n </Box>\n </Box>\n )}\n\n {count >= 2 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Common Tasks:</Text>\n <Text>\n \u2022 Ask questions about your codebase{' '}\n <Text color={getTheme().secondaryText}>\n &gt; How does foo.py work?\n </Text>\n </Text>\n <Text>\n \u2022 Edit files{' '}\n <Text color={getTheme().secondaryText}>\n &gt; Update bar.ts to...\n </Text>\n </Text>\n <Text>\n \u2022 Fix errors{' '}\n <Text color={getTheme().secondaryText}>&gt; cargo build</Text>\n </Text>\n <Text>\n \u2022 Run commands{' '}\n <Text color={getTheme().secondaryText}>&gt; /help</Text>\n </Text>\n <Text>\n \u2022 Run bash commands{' '}\n <Text color={getTheme().secondaryText}>&gt; !ls</Text>\n </Text>\n </Box>\n )}\n\n {count >= 3 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Built-in Commands:</Text>\n\n <Box flexDirection=\"column\">\n {builtInCommands.map((cmd, i) => (\n <Box key={i} marginLeft={1}>\n <Text bold>{`/${cmd.name}`}</Text>\n <Text> - {cmd.description}</Text>\n </Box>\n ))}\n </Box>\n\n {customCommands.length > 0 && (\n <>\n <Box marginTop={1}>\n <Text bold>Custom Commands:</Text>\n </Box>\n\n <Box flexDirection=\"column\">\n {customCommands.map((cmd, i) => (\n <Box key={i} marginLeft={1}>\n <Text bold color={theme.minto}>{`/${cmd.name}`}</Text>\n <Text> - {cmd.description}</Text>\n {cmd.aliases && cmd.aliases.length > 0 && (\n <Text color={theme.secondaryText}>\n {' '}\n (aliases: {cmd.aliases.join(', ')})\n </Text>\n )}\n {/* Show scope indicator for debugging */}\n {cmd.scope && (\n <Text color={theme.secondaryText}> [{cmd.scope}]</Text>\n )}\n </Box>\n ))}\n </Box>\n </>\n )}\n\n {pluginCommands.length > 0 && (\n <>\n <Box marginTop={1}>\n <Text bold>Plugin Commands:</Text>\n </Box>\n\n <Box flexDirection=\"column\">\n {pluginCommands.map((cmd, i) => (\n <Box key={i} marginLeft={1}>\n <Text bold color={theme.minto}>{`/${cmd.name}`}</Text>\n <Text> - {cmd.description}</Text>\n {cmd.aliases && cmd.aliases.length > 0 && (\n <Text color={theme.secondaryText}>\n {' '}\n (aliases: {cmd.aliases.join(', ')})\n </Text>\n )}\n </Box>\n ))}\n </Box>\n </>\n )}\n\n {mcpCommands.length > 0 && (\n <>\n <Box marginTop={1}>\n <Text bold>MCP Commands:</Text>\n </Box>\n\n <Box flexDirection=\"column\">\n {mcpCommands.map((cmd, i) => (\n <Box key={i} marginLeft={1}>\n <Text bold color={theme.minto}>{`/${cmd.name}`}</Text>\n <Text> - {cmd.description}</Text>\n {cmd.aliases && cmd.aliases.length > 0 && (\n <Text color={theme.secondaryText}>\n {' '}\n (aliases: {cmd.aliases.join(', ')})\n </Text>\n )}\n </Box>\n ))}\n </Box>\n </>\n )}\n\n {/* Show command loading information */}\n {(hasCustomCommands() ||\n customCommands.length > 0 ||\n pluginCommands.length > 0 ||\n mcpCommands.length > 0) && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={theme.secondaryText}>\n Commands are loaded in priority order:\n </Text>\n <Text color={theme.secondaryText}>\n 1. Built-in commands (highest priority, alphabetically sorted)\n </Text>\n <Text color={theme.secondaryText}>\n 2. Custom commands (user/project, alphabetically sorted)\n </Text>\n <Text color={theme.secondaryText}>\n 3. Plugin commands (alphabetically sorted)\n </Text>\n <Text color={theme.secondaryText}>\n 4. MCP commands (alphabetically sorted)\n </Text>\n <Box marginTop={1}>\n <Text color={theme.secondaryText}>\n Use /refresh-commands to reload after changes\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={theme.secondaryText}>{moreHelp}</Text>\n </Box>\n\n <Box marginTop={2}>\n <PressEnterToContinue />\n </Box>\n </Box>\n )\n}\n"],
5
- "mappings": "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",
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
- const HOTKEY_GROUPS = [
6
- {
7
- title: "Navigation",
8
- hotkeys: [
9
- { keys: "\u2191/\u2193", description: "Browse command history" },
10
- { keys: "Ctrl+R", description: "Search command history" },
11
- { keys: "Tab", description: "Autocomplete commands/paths" },
12
- { keys: "Esc Esc", description: "Rollback last response" }
13
- ]
14
- },
15
- {
16
- title: "Control",
17
- hotkeys: [
18
- { keys: "Ctrl+C", description: "Cancel current operation" },
19
- { keys: "Ctrl+D", description: "Exit (press twice)" },
20
- { keys: "Ctrl+L", description: "Clear screen" },
21
- { keys: "Enter", description: "Submit prompt" }
22
- ]
23
- },
24
- {
25
- title: "Features",
26
- hotkeys: [
27
- { keys: "Ctrl+T", description: "Toggle todo panel" },
28
- { keys: "Ctrl+O", description: "Cycle display mode" },
29
- { keys: "Ctrl+B", description: "Execute as bash command" },
30
- { keys: "Ctrl+?", description: "Show/hide this help" }
31
- ]
32
- },
33
- {
34
- title: "Input Modes",
35
- hotkeys: [
36
- { keys: "/", description: "Start a slash command" },
37
- { keys: "!", description: "Execute bash command" },
38
- { keys: "#", description: "Add note to KODING.md" }
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 }, HOTKEY_GROUPS.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)))))),
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 }, "Ctrl+? for shortcuts");
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: "for bash mode" },
80
- { keys: "#", description: "for MINTO.md" },
81
- { keys: "/", description: "for commands" },
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\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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",
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": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,5 @@
1
+ import { InfoPanel } from "./InfoPanel.js";
2
+ export {
3
+ InfoPanel
4
+ };
5
+ //# sourceMappingURL=index.js.map
@@ -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
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -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 }, "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(
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 }, "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))),
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 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;",
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 }, "New MCP Server Detected"),
61
- /* @__PURE__ */ React.createElement(Text, null, "This project contains a .mcprc file with an MCP server that requires your approval:"),
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: "Yes, approve this server", value: "yes" },
70
- { label: "No, reject this server", value: "no" }
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, "Press ", exitState.keyName, " again to exit") : /* @__PURE__ */ React.createElement(React.Fragment, null, "Enter to confirm \xB7 Esc to reject"))));
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