@within-7/minto 0.1.7 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (601) hide show
  1. package/cli.js +155 -37
  2. package/dist/Tool.js +38 -0
  3. package/dist/Tool.js.map +3 -3
  4. package/dist/commands/agents/AgentsCommand.js +73 -49
  5. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  6. package/dist/commands/agents/constants.js +1 -1
  7. package/dist/commands/agents/constants.js.map +1 -1
  8. package/dist/commands/agents/index.js +1 -1
  9. package/dist/commands/bug.js +74 -7
  10. package/dist/commands/bug.js.map +3 -3
  11. package/dist/commands/clear.js +3 -0
  12. package/dist/commands/clear.js.map +2 -2
  13. package/dist/commands/compact.js +37 -0
  14. package/dist/commands/compact.js.map +2 -2
  15. package/dist/commands/context.js +85 -0
  16. package/dist/commands/context.js.map +7 -0
  17. package/dist/commands/ctx_viz.js +18 -10
  18. package/dist/commands/ctx_viz.js.map +2 -2
  19. package/dist/commands/doctor.js +158 -12
  20. package/dist/commands/doctor.js.map +2 -2
  21. package/dist/commands/export.js +157 -0
  22. package/dist/commands/export.js.map +7 -0
  23. package/dist/commands/mcp-interactive.js +28 -18
  24. package/dist/commands/mcp-interactive.js.map +2 -2
  25. package/dist/commands/model.js +9 -7
  26. package/dist/commands/model.js.map +2 -2
  27. package/dist/commands/permissions.js +87 -0
  28. package/dist/commands/permissions.js.map +7 -0
  29. package/dist/commands/plugin/AddMarketplaceForm.js +3 -2
  30. package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
  31. package/dist/commands/plugin/ConfirmDialog.js +2 -1
  32. package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
  33. package/dist/commands/plugin/ErrorView.js +2 -1
  34. package/dist/commands/plugin/ErrorView.js.map +2 -2
  35. package/dist/commands/plugin/InstalledPluginsByMarketplace.js +5 -4
  36. package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
  37. package/dist/commands/plugin/InstalledPluginsManager.js +5 -4
  38. package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
  39. package/dist/commands/plugin/MainMenu.js +2 -1
  40. package/dist/commands/plugin/MainMenu.js.map +2 -2
  41. package/dist/commands/plugin/MarketplaceManager.js +5 -4
  42. package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
  43. package/dist/commands/plugin/MarketplaceSelector.js +4 -3
  44. package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
  45. package/dist/commands/plugin/PlaceholderScreen.js +3 -2
  46. package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
  47. package/dist/commands/plugin/PluginBrowser.js +6 -5
  48. package/dist/commands/plugin/PluginBrowser.js.map +2 -2
  49. package/dist/commands/plugin/PluginDetailsInstall.js +5 -4
  50. package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
  51. package/dist/commands/plugin/PluginDetailsManage.js +4 -3
  52. package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
  53. package/dist/commands/plugin.js +16 -15
  54. package/dist/commands/plugin.js.map +2 -2
  55. package/dist/commands/quit.js +3 -1
  56. package/dist/commands/quit.js.map +2 -2
  57. package/dist/commands/sandbox.js +105 -0
  58. package/dist/commands/sandbox.js.map +7 -0
  59. package/dist/commands/setup.js +2 -1
  60. package/dist/commands/setup.js.map +2 -2
  61. package/dist/commands/status.js +59 -0
  62. package/dist/commands/status.js.map +7 -0
  63. package/dist/commands/tasks.js +108 -0
  64. package/dist/commands/tasks.js.map +7 -0
  65. package/dist/commands/todos.js +123 -0
  66. package/dist/commands/todos.js.map +7 -0
  67. package/dist/commands/undo.js +245 -0
  68. package/dist/commands/undo.js.map +7 -0
  69. package/dist/commands.js +22 -2
  70. package/dist/commands.js.map +2 -2
  71. package/dist/components/AgentThinkingBlock.js +10 -18
  72. package/dist/components/AgentThinkingBlock.js.map +2 -2
  73. package/dist/components/AsciiLogo.js +7 -8
  74. package/dist/components/AsciiLogo.js.map +2 -2
  75. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
  76. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
  77. package/dist/components/AskUserQuestionDialog/QuestionView.js +2 -1
  78. package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
  79. package/dist/components/BackgroundTasksPanel.js +78 -29
  80. package/dist/components/BackgroundTasksPanel.js.map +2 -2
  81. package/dist/components/BashStreamingProgress.js +24 -0
  82. package/dist/components/BashStreamingProgress.js.map +7 -0
  83. package/dist/components/CollapsibleHint.js +15 -0
  84. package/dist/components/CollapsibleHint.js.map +7 -0
  85. package/dist/components/Config.js +3 -2
  86. package/dist/components/Config.js.map +2 -2
  87. package/dist/components/ConsoleOAuthFlow.js +2 -1
  88. package/dist/components/ConsoleOAuthFlow.js.map +2 -2
  89. package/dist/components/Cost.js +2 -1
  90. package/dist/components/Cost.js.map +2 -2
  91. package/dist/components/FileEditToolUpdatedMessage.js +1 -1
  92. package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
  93. package/dist/components/HeaderBar.js +13 -8
  94. package/dist/components/HeaderBar.js.map +2 -2
  95. package/dist/components/HistorySearchOverlay.js +4 -3
  96. package/dist/components/HistorySearchOverlay.js.map +2 -2
  97. package/dist/components/HotkeyHelpPanel.js +134 -0
  98. package/dist/components/HotkeyHelpPanel.js.map +7 -0
  99. package/dist/components/InvalidConfigDialog.js +2 -1
  100. package/dist/components/InvalidConfigDialog.js.map +2 -2
  101. package/dist/components/Logo.js +24 -68
  102. package/dist/components/Logo.js.map +2 -2
  103. package/dist/components/MCPServerApprovalDialog.js +2 -1
  104. package/dist/components/MCPServerApprovalDialog.js.map +2 -2
  105. package/dist/components/MCPServerDialogCopy.js +2 -1
  106. package/dist/components/MCPServerDialogCopy.js.map +2 -2
  107. package/dist/components/MCPServerMultiselectDialog.js +2 -1
  108. package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
  109. package/dist/components/Message.js +23 -7
  110. package/dist/components/Message.js.map +3 -3
  111. package/dist/components/MessageSelector.js +4 -3
  112. package/dist/components/MessageSelector.js.map +2 -2
  113. package/dist/components/ModeIndicator.js +2 -1
  114. package/dist/components/ModeIndicator.js.map +2 -2
  115. package/dist/components/ModelConfig.js +20 -6
  116. package/dist/components/ModelConfig.js.map +2 -2
  117. package/dist/components/ModelListManager.js +7 -6
  118. package/dist/components/ModelListManager.js.map +2 -2
  119. package/dist/components/ModelSelector/ModelSelector.js +27 -14
  120. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  121. package/dist/components/Onboarding.js +22 -16
  122. package/dist/components/Onboarding.js.map +2 -2
  123. package/dist/components/OperationSummary.js +130 -0
  124. package/dist/components/OperationSummary.js.map +7 -0
  125. package/dist/components/ProgressBar.js +74 -0
  126. package/dist/components/ProgressBar.js.map +7 -0
  127. package/dist/components/PromptInput.js +210 -87
  128. package/dist/components/PromptInput.js.map +2 -2
  129. package/dist/components/RequestStatusIndicator.js +194 -0
  130. package/dist/components/RequestStatusIndicator.js.map +7 -0
  131. package/dist/components/SensitiveFileWarning.js +31 -0
  132. package/dist/components/SensitiveFileWarning.js.map +7 -0
  133. package/dist/components/Spinner.js +141 -27
  134. package/dist/components/Spinner.js.map +2 -2
  135. package/dist/components/SpinnerSymbol.js +21 -27
  136. package/dist/components/SpinnerSymbol.js.map +2 -2
  137. package/dist/components/StreamingBashOutput.js +9 -8
  138. package/dist/components/StreamingBashOutput.js.map +2 -2
  139. package/dist/components/StructuredDiff.js +6 -8
  140. package/dist/components/StructuredDiff.js.map +2 -2
  141. package/dist/components/SubagentBlock.js +5 -3
  142. package/dist/components/SubagentBlock.js.map +2 -2
  143. package/dist/components/SubagentProgress.js +17 -15
  144. package/dist/components/SubagentProgress.js.map +2 -2
  145. package/dist/components/TaskCard.js +30 -24
  146. package/dist/components/TaskCard.js.map +2 -2
  147. package/dist/components/TextInput.js +9 -1
  148. package/dist/components/TextInput.js.map +2 -2
  149. package/dist/components/TodoChangeBlock.js +1 -1
  150. package/dist/components/TodoChangeBlock.js.map +2 -2
  151. package/dist/components/TodoPanel.js +140 -31
  152. package/dist/components/TodoPanel.js.map +3 -3
  153. package/dist/components/TokenCounter.js +74 -0
  154. package/dist/components/TokenCounter.js.map +7 -0
  155. package/dist/components/TokenWarning.js +2 -1
  156. package/dist/components/TokenWarning.js.map +2 -2
  157. package/dist/components/ToolUseLoader.js +2 -2
  158. package/dist/components/ToolUseLoader.js.map +2 -2
  159. package/dist/components/TreeConnector.js +26 -0
  160. package/dist/components/TreeConnector.js.map +7 -0
  161. package/dist/components/TrustDialog.js +2 -1
  162. package/dist/components/TrustDialog.js.map +2 -2
  163. package/dist/components/TurnCompletionIndicator.js +18 -0
  164. package/dist/components/TurnCompletionIndicator.js.map +7 -0
  165. package/dist/components/binary-feedback/BinaryFeedbackView.js +2 -1
  166. package/dist/components/binary-feedback/BinaryFeedbackView.js.map +2 -2
  167. package/dist/components/messages/AssistantTextMessage.js +20 -9
  168. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  169. package/dist/components/messages/AssistantThinkingMessage.js +18 -3
  170. package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
  171. package/dist/components/messages/AssistantToolUseMessage.js +17 -10
  172. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  173. package/dist/components/messages/GroupRenderer.js +54 -0
  174. package/dist/components/messages/GroupRenderer.js.map +7 -0
  175. package/dist/components/messages/NestedTasksPreview.js +24 -0
  176. package/dist/components/messages/NestedTasksPreview.js.map +7 -0
  177. package/dist/components/messages/ParallelTasksGroupView.js +93 -0
  178. package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
  179. package/dist/components/messages/TaskInModuleView.js +218 -0
  180. package/dist/components/messages/TaskInModuleView.js.map +7 -0
  181. package/dist/components/messages/TaskOutputContent.js +56 -0
  182. package/dist/components/messages/TaskOutputContent.js.map +7 -0
  183. package/dist/components/messages/UserPromptMessage.js +2 -2
  184. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  185. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
  186. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
  187. package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
  188. package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
  189. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
  190. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
  191. package/dist/constants/colors.js +120 -54
  192. package/dist/constants/colors.js.map +2 -2
  193. package/dist/constants/formatRules.js +102 -0
  194. package/dist/constants/formatRules.js.map +7 -0
  195. package/dist/constants/prompts.js +12 -34
  196. package/dist/constants/prompts.js.map +2 -2
  197. package/dist/constants/symbols.js +64 -6
  198. package/dist/constants/symbols.js.map +2 -2
  199. package/dist/constants/timing.js +5 -0
  200. package/dist/constants/timing.js.map +2 -2
  201. package/dist/constants/toolInputExamples.js +84 -0
  202. package/dist/constants/toolInputExamples.js.map +7 -0
  203. package/dist/core/backupManager.js +321 -0
  204. package/dist/core/backupManager.js.map +7 -0
  205. package/dist/core/config/defaults.js +84 -0
  206. package/dist/core/config/defaults.js.map +7 -0
  207. package/dist/core/config/index.js +111 -0
  208. package/dist/core/config/index.js.map +7 -0
  209. package/dist/core/config/loader.js +221 -0
  210. package/dist/core/config/loader.js.map +7 -0
  211. package/dist/core/config/migrations.js +128 -0
  212. package/dist/core/config/migrations.js.map +7 -0
  213. package/dist/core/config/schema.js +178 -0
  214. package/dist/core/config/schema.js.map +7 -0
  215. package/dist/core/costTracker.js +129 -0
  216. package/dist/core/costTracker.js.map +7 -0
  217. package/dist/core/gitAutoCommit.js +287 -0
  218. package/dist/core/gitAutoCommit.js.map +7 -0
  219. package/dist/core/index.js +8 -0
  220. package/dist/core/index.js.map +7 -0
  221. package/dist/core/operationTracker.js +212 -0
  222. package/dist/core/operationTracker.js.map +7 -0
  223. package/dist/core/permissions/auditLog.js +204 -0
  224. package/dist/core/permissions/auditLog.js.map +7 -0
  225. package/dist/core/permissions/engine/index.js +3 -0
  226. package/dist/core/permissions/engine/index.js.map +7 -0
  227. package/dist/core/permissions/engine/permissionEngine.js +106 -0
  228. package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
  229. package/dist/core/permissions/engine/types.js +1 -0
  230. package/dist/core/permissions/engine/types.js.map +7 -0
  231. package/dist/core/permissions/index.js +84 -0
  232. package/dist/core/permissions/index.js.map +7 -0
  233. package/dist/core/permissions/ruleEngine.js +259 -0
  234. package/dist/core/permissions/ruleEngine.js.map +7 -0
  235. package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
  236. package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
  237. package/dist/core/permissions/rules/autoEscalationRule.js +296 -0
  238. package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
  239. package/dist/core/permissions/rules/index.js +46 -0
  240. package/dist/core/permissions/rules/index.js.map +7 -0
  241. package/dist/core/permissions/rules/planModeRule.js +55 -0
  242. package/dist/core/permissions/rules/planModeRule.js.map +7 -0
  243. package/dist/core/permissions/rules/projectBoundaryRule.js +173 -0
  244. package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
  245. package/dist/core/permissions/rules/safeModeRule.js +65 -0
  246. package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
  247. package/dist/core/permissions/rules/sensitivePathsRule.js +345 -0
  248. package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
  249. package/dist/core/permissions/types.js +127 -0
  250. package/dist/core/permissions/types.js.map +7 -0
  251. package/dist/core/tokenStats.js +9 -0
  252. package/dist/core/tokenStats.js.map +7 -0
  253. package/dist/core/tokenStatsManager.js +331 -0
  254. package/dist/core/tokenStatsManager.js.map +7 -0
  255. package/dist/core/tools/executor.js +143 -0
  256. package/dist/core/tools/executor.js.map +7 -0
  257. package/dist/core/tools/index.js +15 -0
  258. package/dist/core/tools/index.js.map +7 -0
  259. package/dist/core/tools/registry.js +183 -0
  260. package/dist/core/tools/registry.js.map +7 -0
  261. package/dist/core/tools/types.js +1 -0
  262. package/dist/core/tools/types.js.map +7 -0
  263. package/dist/cost-tracker.js +23 -15
  264. package/dist/cost-tracker.js.map +2 -2
  265. package/dist/entrypoints/cli.js +158 -130
  266. package/dist/entrypoints/cli.js.map +2 -2
  267. package/dist/entrypoints/mcp.js +12 -4
  268. package/dist/entrypoints/mcp.js.map +2 -2
  269. package/dist/history.js +14 -3
  270. package/dist/history.js.map +2 -2
  271. package/dist/hooks/useAgentTokenStats.js +72 -0
  272. package/dist/hooks/useAgentTokenStats.js.map +7 -0
  273. package/dist/hooks/useAgentTranscripts.js +140 -0
  274. package/dist/hooks/useAgentTranscripts.js.map +7 -0
  275. package/dist/hooks/useAnimationSync.js +53 -0
  276. package/dist/hooks/useAnimationSync.js.map +7 -0
  277. package/dist/hooks/useArrowKeyHistory.js +4 -2
  278. package/dist/hooks/useArrowKeyHistory.js.map +2 -2
  279. package/dist/hooks/useCanUseTool.js +3 -1
  280. package/dist/hooks/useCanUseTool.js.map +2 -2
  281. package/dist/hooks/useExitOnCtrlCD.js +9 -5
  282. package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
  283. package/dist/hooks/useHookStatus.js +40 -0
  284. package/dist/hooks/useHookStatus.js.map +7 -0
  285. package/dist/hooks/useLogMessages.js +29 -2
  286. package/dist/hooks/useLogMessages.js.map +2 -2
  287. package/dist/hooks/useMessageGroups.js +43 -0
  288. package/dist/hooks/useMessageGroups.js.map +7 -0
  289. package/dist/hooks/useTerminalSize.js +62 -6
  290. package/dist/hooks/useTerminalSize.js.map +2 -2
  291. package/dist/hooks/useUnifiedCompletion.js +69 -0
  292. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  293. package/dist/i18n/index.js +109 -0
  294. package/dist/i18n/index.js.map +7 -0
  295. package/dist/i18n/locales/en.js +348 -0
  296. package/dist/i18n/locales/en.js.map +7 -0
  297. package/dist/i18n/locales/index.js +7 -0
  298. package/dist/i18n/locales/index.js.map +7 -0
  299. package/dist/i18n/locales/zh-CN.js +348 -0
  300. package/dist/i18n/locales/zh-CN.js.map +7 -0
  301. package/dist/i18n/types.js +8 -0
  302. package/dist/i18n/types.js.map +7 -0
  303. package/dist/permissions.js +28 -1
  304. package/dist/permissions.js.map +2 -2
  305. package/dist/query.js +253 -21
  306. package/dist/query.js.map +3 -3
  307. package/dist/screens/REPL.js +523 -194
  308. package/dist/screens/REPL.js.map +3 -3
  309. package/dist/services/adapters/chatCompletions.js +3 -1
  310. package/dist/services/adapters/chatCompletions.js.map +2 -2
  311. package/dist/services/adapters/messageNormalizer.js +354 -0
  312. package/dist/services/adapters/messageNormalizer.js.map +7 -0
  313. package/dist/services/adapters/responsesAPI.js +6 -3
  314. package/dist/services/adapters/responsesAPI.js.map +2 -2
  315. package/dist/services/checkpointManager.js +386 -0
  316. package/dist/services/checkpointManager.js.map +7 -0
  317. package/dist/services/claude.js +192 -14
  318. package/dist/services/claude.js.map +3 -3
  319. package/dist/services/compressionService.js +50 -1
  320. package/dist/services/compressionService.js.map +2 -2
  321. package/dist/services/contextMonitor.js +162 -0
  322. package/dist/services/contextMonitor.js.map +7 -0
  323. package/dist/services/customCommands.js +60 -41
  324. package/dist/services/customCommands.js.map +2 -2
  325. package/dist/services/hookExecutor.js +173 -1
  326. package/dist/services/hookExecutor.js.map +2 -2
  327. package/dist/services/intelligentCompactor.js +281 -0
  328. package/dist/services/intelligentCompactor.js.map +7 -0
  329. package/dist/services/lspConfig.js +109 -0
  330. package/dist/services/lspConfig.js.map +7 -0
  331. package/dist/services/mcpClient.js +338 -43
  332. package/dist/services/mcpClient.js.map +2 -2
  333. package/dist/services/modelOrchestrator.js +310 -0
  334. package/dist/services/modelOrchestrator.js.map +7 -0
  335. package/dist/services/openai.js +8 -1
  336. package/dist/services/openai.js.map +2 -2
  337. package/dist/services/outputStyles.js +138 -0
  338. package/dist/services/outputStyles.js.map +7 -0
  339. package/dist/services/plugins/index.js +5 -0
  340. package/dist/services/plugins/index.js.map +7 -0
  341. package/dist/services/plugins/lspServers.js +188 -0
  342. package/dist/services/plugins/lspServers.js.map +7 -0
  343. package/dist/services/plugins/pluginRuntime.js +229 -0
  344. package/dist/services/plugins/pluginRuntime.js.map +7 -0
  345. package/dist/services/plugins/pluginValidation.js +219 -0
  346. package/dist/services/plugins/pluginValidation.js.map +7 -0
  347. package/dist/services/plugins/skillMarketplace.js +556 -0
  348. package/dist/services/plugins/skillMarketplace.js.map +7 -0
  349. package/dist/services/responseStateManager.js +37 -3
  350. package/dist/services/responseStateManager.js.map +2 -2
  351. package/dist/services/sandbox/filesystemBoundary.js +341 -0
  352. package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
  353. package/dist/services/sandbox/index.js +14 -0
  354. package/dist/services/sandbox/index.js.map +7 -0
  355. package/dist/services/sandbox/networkProxy.js +293 -0
  356. package/dist/services/sandbox/networkProxy.js.map +7 -0
  357. package/dist/services/sandbox/sandboxController.js +574 -0
  358. package/dist/services/sandbox/sandboxController.js.map +7 -0
  359. package/dist/services/sandbox/types.js +50 -0
  360. package/dist/services/sandbox/types.js.map +7 -0
  361. package/dist/services/sessionMemory.js +266 -0
  362. package/dist/services/sessionMemory.js.map +7 -0
  363. package/dist/services/taskRouter.js +324 -0
  364. package/dist/services/taskRouter.js.map +7 -0
  365. package/dist/tools/ArchitectTool/ArchitectTool.js +7 -1
  366. package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
  367. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +6 -2
  368. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  369. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +2 -1
  370. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  371. package/dist/tools/BaseTool.js +72 -0
  372. package/dist/tools/BaseTool.js.map +7 -0
  373. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
  374. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
  375. package/dist/tools/BashTool/BashTool.js +79 -3
  376. package/dist/tools/BashTool/BashTool.js.map +2 -2
  377. package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
  378. package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
  379. package/dist/tools/BashTool/OutputLine.js +54 -0
  380. package/dist/tools/BashTool/OutputLine.js.map +2 -2
  381. package/dist/tools/BashTool/prompt.js +336 -3
  382. package/dist/tools/BashTool/prompt.js.map +2 -2
  383. package/dist/tools/FileEditTool/FileEditTool.js +29 -4
  384. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  385. package/dist/tools/FileEditTool/prompt.js +6 -3
  386. package/dist/tools/FileEditTool/prompt.js.map +2 -2
  387. package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
  388. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  389. package/dist/tools/FileWriteTool/prompt.js +4 -2
  390. package/dist/tools/FileWriteTool/prompt.js.map +2 -2
  391. package/dist/tools/GlobTool/GlobTool.js +4 -2
  392. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  393. package/dist/tools/GrepTool/GrepTool.js +36 -7
  394. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  395. package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
  396. package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
  397. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
  398. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
  399. package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
  400. package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
  401. package/dist/tools/LspTool/LspTool.js +664 -0
  402. package/dist/tools/LspTool/LspTool.js.map +7 -0
  403. package/dist/tools/LspTool/prompt.js +27 -0
  404. package/dist/tools/LspTool/prompt.js.map +7 -0
  405. package/dist/tools/MCPTool/MCPTool.js +9 -1
  406. package/dist/tools/MCPTool/MCPTool.js.map +2 -2
  407. package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
  408. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  409. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
  410. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  411. package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
  412. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  413. package/dist/tools/MultiEditTool/prompt.js +5 -3
  414. package/dist/tools/MultiEditTool/prompt.js.map +2 -2
  415. package/dist/tools/NotebookEditTool/NotebookEditTool.js +7 -2
  416. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  417. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
  418. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +75 -0
  419. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
  420. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +109 -0
  421. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
  422. package/dist/tools/PlanModeTool/prompt.js +94 -0
  423. package/dist/tools/PlanModeTool/prompt.js.map +7 -0
  424. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
  425. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
  426. package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
  427. package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
  428. package/dist/tools/SkillTool/SkillTool.js +10 -4
  429. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  430. package/dist/tools/SkillTool/prompt.js +1 -1
  431. package/dist/tools/SkillTool/prompt.js.map +1 -1
  432. package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
  433. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
  434. package/dist/tools/SlashCommandTool/prompt.js +35 -0
  435. package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
  436. package/dist/tools/TaskOutputTool/TaskOutputTool.js +190 -0
  437. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
  438. package/dist/tools/TaskOutputTool/prompt.js +15 -0
  439. package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
  440. package/dist/tools/TaskTool/TaskTool.js +310 -104
  441. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  442. package/dist/tools/TaskTool/prompt.js.map +2 -2
  443. package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -77
  444. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
  445. package/dist/tools/URLFetcherTool/URLFetcherTool.js +4 -1
  446. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  447. package/dist/tools/URLFetcherTool/cache.js +55 -8
  448. package/dist/tools/URLFetcherTool/cache.js.map +2 -2
  449. package/dist/tools.js +31 -2
  450. package/dist/tools.js.map +2 -2
  451. package/dist/types/hooks.js +4 -0
  452. package/dist/types/hooks.js.map +2 -2
  453. package/dist/types/marketplace.js.map +2 -2
  454. package/dist/types/messageGroup.js +36 -0
  455. package/dist/types/messageGroup.js.map +7 -0
  456. package/dist/types/plugin.js.map +2 -2
  457. package/dist/types/thinking.js +1 -0
  458. package/dist/types/thinking.js.map +7 -0
  459. package/dist/utils/BackgroundShellManager.js +136 -39
  460. package/dist/utils/BackgroundShellManager.js.map +2 -2
  461. package/dist/utils/CircuitBreaker.js +242 -0
  462. package/dist/utils/CircuitBreaker.js.map +7 -0
  463. package/dist/utils/MessageBatchBuffer.js +102 -0
  464. package/dist/utils/MessageBatchBuffer.js.map +7 -0
  465. package/dist/utils/PersistentShell.js +151 -1
  466. package/dist/utils/PersistentShell.js.map +2 -2
  467. package/dist/utils/agentLoader.js +1 -23
  468. package/dist/utils/agentLoader.js.map +2 -2
  469. package/dist/utils/agentTranscripts.js +641 -0
  470. package/dist/utils/agentTranscripts.js.map +7 -0
  471. package/dist/utils/animationManager.js +213 -0
  472. package/dist/utils/animationManager.js.map +7 -0
  473. package/dist/utils/animationSync.js +110 -0
  474. package/dist/utils/animationSync.js.map +7 -0
  475. package/dist/utils/ask.js +2 -0
  476. package/dist/utils/ask.js.map +2 -2
  477. package/dist/utils/asyncFile.js +215 -0
  478. package/dist/utils/asyncFile.js.map +7 -0
  479. package/dist/utils/backgroundAgentManager.js +231 -0
  480. package/dist/utils/backgroundAgentManager.js.map +7 -0
  481. package/dist/utils/config.js +108 -10
  482. package/dist/utils/config.js.map +2 -2
  483. package/dist/utils/conversationRecovery.js +19 -0
  484. package/dist/utils/conversationRecovery.js.map +2 -2
  485. package/dist/utils/credentials/CredentialStore.js +1 -0
  486. package/dist/utils/credentials/CredentialStore.js.map +7 -0
  487. package/dist/utils/credentials/EncryptedFileStore.js +157 -0
  488. package/dist/utils/credentials/EncryptedFileStore.js.map +7 -0
  489. package/dist/utils/credentials/index.js +37 -0
  490. package/dist/utils/credentials/index.js.map +7 -0
  491. package/dist/utils/credentials/migration.js +82 -0
  492. package/dist/utils/credentials/migration.js.map +7 -0
  493. package/dist/utils/exit.js +73 -0
  494. package/dist/utils/exit.js.map +7 -0
  495. package/dist/utils/format.js +73 -5
  496. package/dist/utils/format.js.map +2 -2
  497. package/dist/utils/generators.js +76 -6
  498. package/dist/utils/generators.js.map +2 -2
  499. package/dist/utils/globalErrorHandler.js +149 -0
  500. package/dist/utils/globalErrorHandler.js.map +7 -0
  501. package/dist/utils/groupHandlers/index.js +8 -0
  502. package/dist/utils/groupHandlers/index.js.map +7 -0
  503. package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
  504. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
  505. package/dist/utils/groupHandlers/taskHandler.js +104 -0
  506. package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
  507. package/dist/utils/groupHandlers/types.js +1 -0
  508. package/dist/utils/groupHandlers/types.js.map +7 -0
  509. package/dist/utils/logRotation.js +224 -0
  510. package/dist/utils/logRotation.js.map +7 -0
  511. package/dist/utils/markdown.js +13 -1
  512. package/dist/utils/markdown.js.map +2 -2
  513. package/dist/utils/marketplaceManager.js +3 -5
  514. package/dist/utils/marketplaceManager.js.map +2 -2
  515. package/dist/utils/memSafety.js +264 -0
  516. package/dist/utils/memSafety.js.map +7 -0
  517. package/dist/utils/messageGroupManager.js +274 -0
  518. package/dist/utils/messageGroupManager.js.map +7 -0
  519. package/dist/utils/messages.js +13 -4
  520. package/dist/utils/messages.js.map +2 -2
  521. package/dist/utils/model.js +119 -15
  522. package/dist/utils/model.js.map +3 -3
  523. package/dist/utils/permissions/filesystem.js +162 -6
  524. package/dist/utils/permissions/filesystem.js.map +2 -2
  525. package/dist/utils/plan/planMode.js +143 -0
  526. package/dist/utils/plan/planMode.js.map +7 -0
  527. package/dist/utils/pluginLoader.js +17 -21
  528. package/dist/utils/pluginLoader.js.map +2 -2
  529. package/dist/utils/ripgrep.js +55 -2
  530. package/dist/utils/ripgrep.js.map +2 -2
  531. package/dist/utils/safePath.js +132 -0
  532. package/dist/utils/safePath.js.map +7 -0
  533. package/dist/utils/sanitizeInput.js +32 -0
  534. package/dist/utils/sanitizeInput.js.map +7 -0
  535. package/dist/utils/secureKeyStorage.js +312 -0
  536. package/dist/utils/secureKeyStorage.js.map +7 -0
  537. package/dist/utils/sensitiveFiles.js +125 -0
  538. package/dist/utils/sensitiveFiles.js.map +7 -0
  539. package/dist/utils/session/sessionPlugins.js +67 -0
  540. package/dist/utils/session/sessionPlugins.js.map +7 -0
  541. package/dist/utils/taskDisplayUtils.js +257 -0
  542. package/dist/utils/taskDisplayUtils.js.map +7 -0
  543. package/dist/utils/teamConfig.js +2 -1
  544. package/dist/utils/teamConfig.js.map +2 -2
  545. package/dist/utils/theme.js +6 -6
  546. package/dist/utils/theme.js.map +1 -1
  547. package/dist/utils/todoStorage.js +92 -2
  548. package/dist/utils/todoStorage.js.map +2 -2
  549. package/dist/utils/toolRiskClassification.js +207 -0
  550. package/dist/utils/toolRiskClassification.js.map +7 -0
  551. package/dist/utils/toolTimeout.js +136 -0
  552. package/dist/utils/toolTimeout.js.map +7 -0
  553. package/dist/utils/tooling/safeRender.js +116 -0
  554. package/dist/utils/tooling/safeRender.js.map +7 -0
  555. package/dist/utils/userFriendlyError.js +346 -0
  556. package/dist/utils/userFriendlyError.js.map +7 -0
  557. package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
  558. package/dist/version.js +2 -2
  559. package/dist/version.js.map +1 -1
  560. package/package.json +17 -5
  561. package/scripts/postinstall.js +128 -38
  562. package/dist/commands/agents.js +0 -2086
  563. package/dist/commands/agents.js.map +0 -7
  564. package/dist/commands/build.js +0 -74
  565. package/dist/commands/build.js.map +0 -7
  566. package/dist/commands/compression.js +0 -57
  567. package/dist/commands/compression.js.map +0 -7
  568. package/dist/commands/listen.js +0 -37
  569. package/dist/commands/listen.js.map +0 -7
  570. package/dist/commands/login.js +0 -37
  571. package/dist/commands/login.js.map +0 -7
  572. package/dist/commands/logout.js +0 -33
  573. package/dist/commands/logout.js.map +0 -7
  574. package/dist/commands/mcp.js +0 -40
  575. package/dist/commands/mcp.js.map +0 -7
  576. package/dist/commands/mcp_refresh.js +0 -40
  577. package/dist/commands/mcp_refresh.js.map +0 -7
  578. package/dist/commands/modelstatus.js +0 -21
  579. package/dist/commands/modelstatus.js.map +0 -7
  580. package/dist/commands/onboarding.js +0 -36
  581. package/dist/commands/onboarding.js.map +0 -7
  582. package/dist/commands/plugin-interactive.js +0 -446
  583. package/dist/commands/plugin-interactive.js.map +0 -7
  584. package/dist/commands/pr_comments.js +0 -61
  585. package/dist/commands/pr_comments.js.map +0 -7
  586. package/dist/commands/release-notes.js +0 -30
  587. package/dist/commands/release-notes.js.map +0 -7
  588. package/dist/commands/review.js +0 -51
  589. package/dist/commands/review.js.map +0 -7
  590. package/dist/components/Bug.js +0 -147
  591. package/dist/components/Bug.js.map +0 -7
  592. package/dist/components/ModelSelector.js +0 -2062
  593. package/dist/components/ModelSelector.js.map +0 -7
  594. package/dist/components/ModelStatusDisplay.js +0 -87
  595. package/dist/components/ModelStatusDisplay.js.map +0 -7
  596. package/dist/entrypoints/cli-wrapper.js +0 -61
  597. package/dist/entrypoints/cli-wrapper.js.map +0 -7
  598. package/dist/hooks/useCancelRequest.js +0 -28
  599. package/dist/hooks/useCancelRequest.js.map +0 -7
  600. package/dist/screens/Doctor.js +0 -22
  601. package/dist/screens/Doctor.js.map +0 -7
@@ -21,7 +21,7 @@ function FileEditToolUpdatedMessage({
21
21
  (count, hunk) => count + hunk.lines.filter((_) => _.startsWith("-")).length,
22
22
  0
23
23
  );
24
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, " ", "\u23BF Updated", " ", /* @__PURE__ */ React.createElement(Text, { bold: true }, verbose ? filePath : relative(getCwd(), filePath)), numAdditions > 0 || numRemovals > 0 ? " with " : "", numAdditions > 0 ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, { bold: true }, numAdditions), " ", numAdditions > 1 ? "additions" : "addition") : null, numAdditions > 0 && numRemovals > 0 ? " and " : null, numRemovals > 0 ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, { bold: true }, numRemovals), " ", numRemovals > 1 ? "removals" : "removal") : null), patches.length > 0 && intersperse(
24
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, " ", "\u23BF Updated", " ", /* @__PURE__ */ React.createElement(Text, { bold: true }, verbose ? filePath : relative(getCwd(), filePath)), numAdditions > 0 || numRemovals > 0 ? " with " : "", numAdditions > 0 ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, { bold: true }, numAdditions), " ", numAdditions > 1 ? "additions" : "addition") : null, numAdditions > 0 && numRemovals > 0 ? " and " : null, numRemovals > 0 ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, { bold: true }, numRemovals), " ", numRemovals > 1 ? "removals" : "removal") : null), verbose && patches.length > 0 && intersperse(
25
25
  patches.map((_) => /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingLeft: 5, key: _.newStart }, /* @__PURE__ */ React.createElement(StructuredDiff, { patch: _, dim: false, width: columns - 12 }))),
26
26
  (i) => /* @__PURE__ */ React.createElement(Box, { paddingLeft: 5, key: `ellipsis-${i}` }, /* @__PURE__ */ React.createElement(Text, { color: getTheme().secondaryText }, "..."))
27
27
  ));
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/FileEditToolUpdatedMessage.tsx"],
4
- "sourcesContent": ["import { Hunk } from 'diff'\nimport { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { intersperse } from '@utils/array'\nimport { StructuredDiff } from './StructuredDiff'\nimport { getTheme } from '@utils/theme'\nimport { getCwd } from '@utils/state'\nimport { relative } from 'path'\nimport { useTerminalSize } from '@hooks/useTerminalSize'\n\ntype Props = {\n filePath: string\n structuredPatch?: Hunk[]\n verbose: boolean\n}\n\nexport function FileEditToolUpdatedMessage({\n filePath,\n structuredPatch,\n verbose,\n}: Props): React.ReactNode {\n const { columns } = useTerminalSize()\n const patches = Array.isArray(structuredPatch) ? structuredPatch : []\n const numAdditions = patches.reduce(\n (count, hunk) => count + hunk.lines.filter(_ => _.startsWith('+')).length,\n 0,\n )\n const numRemovals = patches.reduce(\n (count, hunk) => count + hunk.lines.filter(_ => _.startsWith('-')).length,\n 0,\n )\n\n return (\n <Box flexDirection=\"column\">\n <Text>\n {' '}\u23BF Updated{' '}\n <Text bold>{verbose ? filePath : relative(getCwd(), filePath)}</Text>\n {numAdditions > 0 || numRemovals > 0 ? ' with ' : ''}\n {numAdditions > 0 ? (\n <>\n <Text bold>{numAdditions}</Text>{' '}\n {numAdditions > 1 ? 'additions' : 'addition'}\n </>\n ) : null}\n {numAdditions > 0 && numRemovals > 0 ? ' and ' : null}\n {numRemovals > 0 ? (\n <>\n <Text bold>{numRemovals}</Text>{' '}\n {numRemovals > 1 ? 'removals' : 'removal'}\n </>\n ) : null}\n </Text>\n {patches.length > 0 &&\n intersperse(\n patches.map(_ => (\n <Box flexDirection=\"column\" paddingLeft={5} key={_.newStart}>\n <StructuredDiff patch={_} dim={false} width={columns - 12} />\n </Box>\n )),\n i => (\n <Box paddingLeft={5} key={`ellipsis-${i}`}>\n <Text color={getTheme().secondaryText}>...</Text>\n </Box>\n ),\n )}\n </Box>\n )\n}\n"],
5
- "mappings": "AACA,SAAS,KAAK,YAAY;AAC1B,YAAY,WAAW;AACvB,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AAC/B,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAQzB,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,EAAE,QAAQ,IAAI,gBAAgB;AACpC,QAAM,UAAU,MAAM,QAAQ,eAAe,IAAI,kBAAkB,CAAC;AACpE,QAAM,eAAe,QAAQ;AAAA,IAC3B,CAAC,OAAO,SAAS,QAAQ,KAAK,MAAM,OAAO,OAAK,EAAE,WAAW,GAAG,CAAC,EAAE;AAAA,IACnE;AAAA,EACF;AACA,QAAM,cAAc,QAAQ;AAAA,IAC1B,CAAC,OAAO,SAAS,QAAQ,KAAK,MAAM,OAAO,OAAK,EAAE,WAAW,GAAG,CAAC,EAAE;AAAA,IACnE;AAAA,EACF;AAEA,SACE,oCAAC,OAAI,eAAc,YACjB,oCAAC,YACE,MAAK,kBAAU,KAChB,oCAAC,QAAK,MAAI,QAAE,UAAU,WAAW,SAAS,OAAO,GAAG,QAAQ,CAAE,GAC7D,eAAe,KAAK,cAAc,IAAI,WAAW,IACjD,eAAe,IACd,0DACE,oCAAC,QAAK,MAAI,QAAE,YAAa,GAAQ,KAChC,eAAe,IAAI,cAAc,UACpC,IACE,MACH,eAAe,KAAK,cAAc,IAAI,UAAU,MAChD,cAAc,IACb,0DACE,oCAAC,QAAK,MAAI,QAAE,WAAY,GAAQ,KAC/B,cAAc,IAAI,aAAa,SAClC,IACE,IACN,GACC,QAAQ,SAAS,KAChB;AAAA,IACE,QAAQ,IAAI,OACV,oCAAC,OAAI,eAAc,UAAS,aAAa,GAAG,KAAK,EAAE,YACjD,oCAAC,kBAAe,OAAO,GAAG,KAAK,OAAO,OAAO,UAAU,IAAI,CAC7D,CACD;AAAA,IACD,OACE,oCAAC,OAAI,aAAa,GAAG,KAAK,YAAY,CAAC,MACrC,oCAAC,QAAK,OAAO,SAAS,EAAE,iBAAe,KAAG,CAC5C;AAAA,EAEJ,CACJ;AAEJ;",
4
+ "sourcesContent": ["import { Hunk } from 'diff'\nimport { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { intersperse } from '@utils/array'\nimport { StructuredDiff } from './StructuredDiff'\nimport { getTheme } from '@utils/theme'\nimport { getCwd } from '@utils/state'\nimport { relative } from 'path'\nimport { useTerminalSize } from '@hooks/useTerminalSize'\n\ntype Props = {\n filePath: string\n structuredPatch?: Hunk[]\n verbose: boolean\n}\n\nexport function FileEditToolUpdatedMessage({\n filePath,\n structuredPatch,\n verbose,\n}: Props): React.ReactNode {\n const { columns } = useTerminalSize()\n const patches = Array.isArray(structuredPatch) ? structuredPatch : []\n const numAdditions = patches.reduce(\n (count, hunk) => count + hunk.lines.filter(_ => _.startsWith('+')).length,\n 0,\n )\n const numRemovals = patches.reduce(\n (count, hunk) => count + hunk.lines.filter(_ => _.startsWith('-')).length,\n 0,\n )\n\n return (\n <Box flexDirection=\"column\">\n <Text>\n {' '}\u23BF Updated{' '}\n <Text bold>{verbose ? filePath : relative(getCwd(), filePath)}</Text>\n {numAdditions > 0 || numRemovals > 0 ? ' with ' : ''}\n {numAdditions > 0 ? (\n <>\n <Text bold>{numAdditions}</Text>{' '}\n {numAdditions > 1 ? 'additions' : 'addition'}\n </>\n ) : null}\n {numAdditions > 0 && numRemovals > 0 ? ' and ' : null}\n {numRemovals > 0 ? (\n <>\n <Text bold>{numRemovals}</Text>{' '}\n {numRemovals > 1 ? 'removals' : 'removal'}\n </>\n ) : null}\n </Text>\n {/* Only show full diff in verbose mode - otherwise just the summary line above is enough */}\n {verbose &&\n patches.length > 0 &&\n intersperse(\n patches.map(_ => (\n <Box flexDirection=\"column\" paddingLeft={5} key={_.newStart}>\n <StructuredDiff patch={_} dim={false} width={columns - 12} />\n </Box>\n )),\n i => (\n <Box paddingLeft={5} key={`ellipsis-${i}`}>\n <Text color={getTheme().secondaryText}>...</Text>\n </Box>\n ),\n )}\n </Box>\n )\n}\n"],
5
+ "mappings": "AACA,SAAS,KAAK,YAAY;AAC1B,YAAY,WAAW;AACvB,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AAC/B,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAQzB,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,EAAE,QAAQ,IAAI,gBAAgB;AACpC,QAAM,UAAU,MAAM,QAAQ,eAAe,IAAI,kBAAkB,CAAC;AACpE,QAAM,eAAe,QAAQ;AAAA,IAC3B,CAAC,OAAO,SAAS,QAAQ,KAAK,MAAM,OAAO,OAAK,EAAE,WAAW,GAAG,CAAC,EAAE;AAAA,IACnE;AAAA,EACF;AACA,QAAM,cAAc,QAAQ;AAAA,IAC1B,CAAC,OAAO,SAAS,QAAQ,KAAK,MAAM,OAAO,OAAK,EAAE,WAAW,GAAG,CAAC,EAAE;AAAA,IACnE;AAAA,EACF;AAEA,SACE,oCAAC,OAAI,eAAc,YACjB,oCAAC,YACE,MAAK,kBAAU,KAChB,oCAAC,QAAK,MAAI,QAAE,UAAU,WAAW,SAAS,OAAO,GAAG,QAAQ,CAAE,GAC7D,eAAe,KAAK,cAAc,IAAI,WAAW,IACjD,eAAe,IACd,0DACE,oCAAC,QAAK,MAAI,QAAE,YAAa,GAAQ,KAChC,eAAe,IAAI,cAAc,UACpC,IACE,MACH,eAAe,KAAK,cAAc,IAAI,UAAU,MAChD,cAAc,IACb,0DACE,oCAAC,QAAK,MAAI,QAAE,WAAY,GAAQ,KAC/B,cAAc,IAAI,aAAa,SAClC,IACE,IACN,GAEC,WACC,QAAQ,SAAS,KACjB;AAAA,IACE,QAAQ,IAAI,OACV,oCAAC,OAAI,eAAc,UAAS,aAAa,GAAG,KAAK,EAAE,YACjD,oCAAC,kBAAe,OAAO,GAAG,KAAK,OAAO,OAAO,UAAU,IAAI,CAC7D,CACD;AAAA,IACD,OACE,oCAAC,OAAI,aAAa,GAAG,KAAK,YAAY,CAAC,MACrC,oCAAC,QAAK,OAAO,SAAS,EAAE,iBAAe,KAAG,CAC5C;AAAA,EAEJ,CACJ;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -3,6 +3,7 @@ import { Box, Text } from "ink";
3
3
  import { getTheme } from "../utils/theme.js";
4
4
  import { getCwd } from "../utils/state.js";
5
5
  import { getModelManager } from "../utils/model.js";
6
+ import { BRAND_GRADIENT, SEMANTIC_COLORS } from "../constants/colors.js";
6
7
  function HeaderBar({
7
8
  tokenUsage = 0,
8
9
  mcpClients = [],
@@ -14,41 +15,45 @@ function HeaderBar({
14
15
  const cwd = getCwd();
15
16
  const contextPercentage = currentModel ? Math.round(tokenUsage / currentModel.contextLength * 100) : 0;
16
17
  const formatTokens = (tokens) => `${Math.round(tokens / 1e3)}k`;
18
+ const getDisplayModelName = (modelName) => {
19
+ if (!modelName) return "AI \u52A9\u624B";
20
+ const simplified = modelName.replace(/^(claude-|gpt-|glm-)/, "").replace(/-\d+.*$/, "").replace(/-latest$/, "");
21
+ return simplified.charAt(0).toUpperCase() + simplified.slice(1);
22
+ };
17
23
  return /* @__PURE__ */ React.createElement(
18
24
  Box,
19
25
  {
20
26
  flexDirection: "column",
21
- borderColor: theme.brand,
27
+ borderColor: BRAND_GRADIENT.START,
22
28
  borderStyle: "round",
23
29
  paddingX: 1,
24
30
  marginBottom: 1
25
31
  },
26
- /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", justifyContent: "space-between" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.brand, bold: true }, "minto"), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryTextNew }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryTextNew }, cwd)), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, currentModel?.modelName || "No model"), currentModel && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, " \xB7 "), /* @__PURE__ */ React.createElement(
32
+ /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", justifyContent: "space-between" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START }, "\u25C6"), /* @__PURE__ */ React.createElement(Text, null, " "), /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START, bold: true }, "Min"), /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.END, bold: true }, "to"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, cwd)), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, getDisplayModelName(currentModel?.modelName)), currentModel && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.muted }, " \xB7 "), /* @__PURE__ */ React.createElement(
27
33
  Text,
28
34
  {
29
- color: contextPercentage > 80 ? theme.warning : contextPercentage > 60 ? theme.dimmedText : theme.mutedText
35
+ color: contextPercentage > 80 ? SEMANTIC_COLORS.error : contextPercentage > 60 ? SEMANTIC_COLORS.running : SEMANTIC_COLORS.muted
30
36
  },
31
37
  formatTokens(tokenUsage),
32
38
  "/",
33
39
  formatTokens(currentModel.contextLength)
34
40
  )))),
35
- mcpClients.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, "MCP: "), mcpClients.map((client, idx) => /* @__PURE__ */ React.createElement(React.Fragment, { key: idx }, /* @__PURE__ */ React.createElement(
41
+ mcpClients.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.muted }, "MCP: "), mcpClients.map((client, idx) => /* @__PURE__ */ React.createElement(React.Fragment, { key: idx }, /* @__PURE__ */ React.createElement(
36
42
  Text,
37
43
  {
38
- color: client.type === "connected" ? theme.success : theme.error
44
+ color: client.type === "connected" ? SEMANTIC_COLORS.success : SEMANTIC_COLORS.error
39
45
  },
40
46
  client.name
41
- ), idx < mcpClients.length - 1 && /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, ", "))))
47
+ ), idx < mcpClients.length - 1 && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.muted }, ", "))))
42
48
  );
43
49
  }
44
50
  function MinimalHeaderBar({
45
51
  tokenUsage = 0
46
52
  }) {
47
- const theme = getTheme();
48
53
  const modelManager = getModelManager();
49
54
  const currentModel = modelManager.getModel("main");
50
55
  const cwd = getCwd();
51
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", justifyContent: "space-between", paddingX: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryTextNew }, /* @__PURE__ */ React.createElement(Text, { color: theme.brand, bold: true }, "minto"), " ", "\xB7 ", cwd), currentModel && /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, currentModel.modelName, " \xB7 ", Math.round(tokenUsage / 1e3), "k/", Math.round(currentModel.contextLength / 1e3), "k"));
56
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", justifyContent: "space-between", paddingX: 2 }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START }, "\u25C6"), /* @__PURE__ */ React.createElement(Text, null, " "), /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START, bold: true }, "Min"), /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.END, bold: true }, "to"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, cwd)), currentModel && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, Math.round(tokenUsage / 1e3), "k/", Math.round(currentModel.contextLength / 1e3), "k"));
52
57
  }
53
58
  export {
54
59
  HeaderBar,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/HeaderBar.tsx"],
4
- "sourcesContent": ["/**\n * HeaderBar - Claude Code CLI \u98CE\u683C\u7684\u9875\u7709\u7EC4\u4EF6\n *\n * \u8BBE\u8BA1\u539F\u5219\uFF1A\n * 1. **\u56FA\u5B9A\u9876\u90E8** - \u59CB\u7EC8\u53EF\u89C1\uFF0C\u4E0D\u968F\u5185\u5BB9\u6EDA\u52A8\n * 2. **\u4FE1\u606F\u5BC6\u96C6** - \u663E\u793A\u5173\u952E\u4E0A\u4E0B\u6587\uFF08\u5DE5\u4F5C\u76EE\u5F55\u3001\u6A21\u578B\u3001\u4E0A\u4E0B\u6587\u4F7F\u7528\uFF09\n * 3. **\u89C6\u89C9\u7CBE\u7B80** - \u4E0D\u5360\u7528\u8FC7\u591A\u5782\u76F4\u7A7A\u95F4\n * 4. **\u72B6\u6001\u6E05\u6670** - \u4E00\u773C\u4E86\u89E3\u5F53\u524D\u73AF\u5883\n *\n * \u8FD9\u66FF\u4EE3\u4E86\u539F\u6709\u7684 Logo \u7EC4\u4EF6\uFF0C\u66F4\u7B26\u5408 Claude Code CLI \u7684\u8BBE\u8BA1\n */\n\nimport React from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { getCwd } from '@utils/state'\nimport { getModelManager } from '@utils/model'\nimport type { WrappedClient } from '@services/mcpClient'\n\ninterface Props {\n /** \u5F53\u524D Token \u4F7F\u7528\u91CF */\n tokenUsage?: number\n\n /** MCP \u5BA2\u6237\u7AEF (\u53EF\u9009) */\n mcpClients?: WrappedClient[]\n\n /** \u662F\u5426\u662F\u9ED8\u8BA4\u6A21\u578B */\n isDefaultModel?: boolean\n}\n\n/**\n * HeaderBar - \u8F7B\u91CF\u7EA7\u9875\u7709\u72B6\u6001\u680F\n *\n * \u5E03\u5C40\uFF1A\n * ```\n * \u250C\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\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\u2500\u2500\u2510\n * \u2502 minto \u00B7 /path/to/project \u00B7 claude-sonnet-4 \u00B7 50k/200k\u2502\n * \u2514\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\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\u2500\u2500\u2518\n * ```\n */\nexport function HeaderBar({\n tokenUsage = 0,\n mcpClients = [],\n isDefaultModel = true,\n}: Props): React.ReactNode {\n const theme = getTheme()\n const modelManager = getModelManager()\n const currentModel = modelManager.getModel('main')\n const cwd = getCwd()\n\n // \u8BA1\u7B97\u4E0A\u4E0B\u6587\u4F7F\u7528\u767E\u5206\u6BD4\n const contextPercentage = currentModel\n ? Math.round((tokenUsage / currentModel.contextLength) * 100)\n : 0\n\n // \u683C\u5F0F\u5316 Token \u6570\u91CF (k \u4E3A\u5355\u4F4D)\n const formatTokens = (tokens: number) => `${Math.round(tokens / 1000)}k`\n\n return (\n <Box\n flexDirection=\"column\"\n borderColor={theme.brand}\n borderStyle=\"round\"\n paddingX={1}\n marginBottom={1}\n >\n {/* \u4E3B\u4FE1\u606F\u884C */}\n <Box flexDirection=\"row\" justifyContent=\"space-between\">\n {/* \u5DE6\u4FA7\uFF1A\u4EA7\u54C1\u540D\u79F0 + \u5DE5\u4F5C\u76EE\u5F55 */}\n <Box flexDirection=\"row\">\n <Text color={theme.brand} bold>\n minto\n </Text>\n <Text color={theme.secondaryTextNew}> \u00B7 </Text>\n <Text color={theme.secondaryTextNew}>{cwd}</Text>\n </Box>\n\n {/* \u53F3\u4FA7\uFF1A\u6A21\u578B\u4FE1\u606F + \u4E0A\u4E0B\u6587\u4F7F\u7528 */}\n <Box flexDirection=\"row\">\n <Text color={theme.dimmedText}>\n {currentModel?.modelName || 'No model'}\n </Text>\n {currentModel && (\n <>\n <Text color={theme.mutedText}> \u00B7 </Text>\n <Text\n color={\n contextPercentage > 80\n ? theme.warning\n : contextPercentage > 60\n ? theme.dimmedText\n : theme.mutedText\n }\n >\n {formatTokens(tokenUsage)}/\n {formatTokens(currentModel.contextLength)}\n </Text>\n </>\n )}\n </Box>\n </Box>\n\n {/* MCP \u670D\u52A1\u5668\u72B6\u6001 (\u5982\u679C\u6709) */}\n {mcpClients.length > 0 && (\n <Box flexDirection=\"row\" marginTop={0}>\n <Text color={theme.mutedText}>MCP: </Text>\n {mcpClients.map((client, idx) => (\n <React.Fragment key={idx}>\n <Text\n color={\n client.type === 'connected' ? theme.success : theme.error\n }\n >\n {client.name}\n </Text>\n {idx < mcpClients.length - 1 && (\n <Text color={theme.mutedText}>, </Text>\n )}\n </React.Fragment>\n ))}\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * \u6781\u7B80\u7248\u9875\u7709 (\u53EA\u663E\u793A\u57FA\u672C\u4FE1\u606F)\n */\nexport function MinimalHeaderBar({\n tokenUsage = 0,\n}: {\n tokenUsage?: number\n}): React.ReactNode {\n const theme = getTheme()\n const modelManager = getModelManager()\n const currentModel = modelManager.getModel('main')\n const cwd = getCwd()\n\n return (\n <Box flexDirection=\"row\" justifyContent=\"space-between\" paddingX={2}>\n {/* \u5DE5\u4F5C\u76EE\u5F55 */}\n <Text color={theme.secondaryTextNew}>\n <Text color={theme.brand} bold>\n minto\n </Text>{' '}\n \u00B7 {cwd}\n </Text>\n\n {/* \u6A21\u578B + Token */}\n {currentModel && (\n <Text color={theme.dimmedText}>\n {currentModel.modelName} \u00B7 {Math.round(tokenUsage / 1000)}k/\n {Math.round(currentModel.contextLength / 1000)}k\n </Text>\n )}\n </Box>\n )\n}\n"],
5
- "mappings": "AAYA,OAAO,WAAW;AAClB,SAAS,KAAK,YAAY;AAC1B,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,uBAAuB;AAwBzB,SAAS,UAAU;AAAA,EACxB,aAAa;AAAA,EACb,aAAa,CAAC;AAAA,EACd,iBAAiB;AACnB,GAA2B;AACzB,QAAM,QAAQ,SAAS;AACvB,QAAM,eAAe,gBAAgB;AACrC,QAAM,eAAe,aAAa,SAAS,MAAM;AACjD,QAAM,MAAM,OAAO;AAGnB,QAAM,oBAAoB,eACtB,KAAK,MAAO,aAAa,aAAa,gBAAiB,GAAG,IAC1D;AAGJ,QAAM,eAAe,CAAC,WAAmB,GAAG,KAAK,MAAM,SAAS,GAAI,CAAC;AAErE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAa,MAAM;AAAA,MACnB,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAGd,oCAAC,OAAI,eAAc,OAAM,gBAAe,mBAEtC,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,MAAM,OAAO,MAAI,QAAC,OAE/B,GACA,oCAAC,QAAK,OAAO,MAAM,oBAAkB,QAAG,GACxC,oCAAC,QAAK,OAAO,MAAM,oBAAmB,GAAI,CAC5C,GAGA,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,MAAM,cAChB,cAAc,aAAa,UAC9B,GACC,gBACC,0DACE,oCAAC,QAAK,OAAO,MAAM,aAAW,QAAG,GACjC;AAAA,MAAC;AAAA;AAAA,QACC,OACE,oBAAoB,KAChB,MAAM,UACN,oBAAoB,KAClB,MAAM,aACN,MAAM;AAAA;AAAA,MAGb,aAAa,UAAU;AAAA,MAAE;AAAA,MACzB,aAAa,aAAa,aAAa;AAAA,IAC1C,CACF,CAEJ,CACF;AAAA,IAGC,WAAW,SAAS,KACnB,oCAAC,OAAI,eAAc,OAAM,WAAW,KAClC,oCAAC,QAAK,OAAO,MAAM,aAAW,OAAK,GAClC,WAAW,IAAI,CAAC,QAAQ,QACvB,oCAAC,MAAM,UAAN,EAAe,KAAK,OACnB;AAAA,MAAC;AAAA;AAAA,QACC,OACE,OAAO,SAAS,cAAc,MAAM,UAAU,MAAM;AAAA;AAAA,MAGrD,OAAO;AAAA,IACV,GACC,MAAM,WAAW,SAAS,KACzB,oCAAC,QAAK,OAAO,MAAM,aAAW,IAAE,CAEpC,CACD,CACH;AAAA,EAEJ;AAEJ;AAKO,SAAS,iBAAiB;AAAA,EAC/B,aAAa;AACf,GAEoB;AAClB,QAAM,QAAQ,SAAS;AACvB,QAAM,eAAe,gBAAgB;AACrC,QAAM,eAAe,aAAa,SAAS,MAAM;AACjD,QAAM,MAAM,OAAO;AAEnB,SACE,oCAAC,OAAI,eAAc,OAAM,gBAAe,iBAAgB,UAAU,KAEhE,oCAAC,QAAK,OAAO,MAAM,oBACjB,oCAAC,QAAK,OAAO,MAAM,OAAO,MAAI,QAAC,OAE/B,GAAQ,KAAI,SACT,GACL,GAGC,gBACC,oCAAC,QAAK,OAAO,MAAM,cAChB,aAAa,WAAU,UAAI,KAAK,MAAM,aAAa,GAAI,GAAE,MACzD,KAAK,MAAM,aAAa,gBAAgB,GAAI,GAAE,GACjD,CAEJ;AAEJ;",
4
+ "sourcesContent": ["/**\n * HeaderBar - Minto \u54C1\u724C\u9875\u7709\u7EC4\u4EF6\n *\n * \u8BBE\u8BA1\u539F\u5219\uFF1A\n * 1. **\u54C1\u724C\u8BC6\u522B** - \u7D2B\u84DD\u2192\u73CA\u745A\u6E10\u53D8\uFF0C\u4F20\u9012\u4E13\u4E1A\u4E0E\u70ED\u60C5\n * 2. **\u4FE1\u606F\u6E05\u6670** - \u663E\u793A\u5173\u952E\u4FE1\u606F\uFF08\u9879\u76EE\u4F4D\u7F6E\u3001AI \u6A21\u578B\u3001\u4F7F\u7528\u91CF\uFF09\n * 3. **\u5546\u52A1\u53CB\u597D** - \u6E29\u6696\u3001\u4E13\u4E1A\u3001\u6613\u4E8E\u7406\u89E3\n * 4. **\u89C6\u89C9\u7CBE\u7B80** - \u4E0D\u5360\u7528\u8FC7\u591A\u5782\u76F4\u7A7A\u95F4\n */\n\nimport React from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { getCwd } from '@utils/state'\nimport { getModelManager } from '@utils/model'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\nimport type { WrappedClient } from '@services/mcpClient'\n\ninterface Props {\n /** \u5F53\u524D Token \u4F7F\u7528\u91CF */\n tokenUsage?: number\n\n /** MCP \u5BA2\u6237\u7AEF (\u53EF\u9009) */\n mcpClients?: WrappedClient[]\n\n /** \u662F\u5426\u662F\u9ED8\u8BA4\u6A21\u578B */\n isDefaultModel?: boolean\n}\n\n/**\n * HeaderBar - \u54C1\u724C\u9875\u7709\u72B6\u6001\u680F\n *\n * \u5E03\u5C40\uFF1A\n * ```\n * \u256D\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\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\u2500\u2500\u256E\n * \u2502 \u25C6 Minto \u00B7 /path/to/project AI Model \u00B7 50k/200k\u2502\n * \u2570\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\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\u2500\u2500\u256F\n * ```\n */\nexport function HeaderBar({\n tokenUsage = 0,\n mcpClients = [],\n isDefaultModel = true,\n}: Props): React.ReactNode {\n const theme = getTheme()\n const modelManager = getModelManager()\n const currentModel = modelManager.getModel('main')\n const cwd = getCwd()\n\n // \u8BA1\u7B97\u4E0A\u4E0B\u6587\u4F7F\u7528\u767E\u5206\u6BD4\n const contextPercentage = currentModel\n ? Math.round((tokenUsage / currentModel.contextLength) * 100)\n : 0\n\n // \u683C\u5F0F\u5316 Token \u6570\u91CF (k \u4E3A\u5355\u4F4D)\n const formatTokens = (tokens: number) => `${Math.round(tokens / 1000)}k`\n\n // \u83B7\u53D6\u7B80\u5316\u7684\u6A21\u578B\u663E\u793A\u540D\u79F0\uFF08\u5BF9\u975E\u6280\u672F\u7528\u6237\u66F4\u53CB\u597D\uFF09\n const getDisplayModelName = (modelName: string | undefined) => {\n if (!modelName) return 'AI \u52A9\u624B'\n // \u63D0\u53D6\u6A21\u578B\u7B80\u79F0\uFF0C\u79FB\u9664\u7248\u672C\u53F7\u7B49\u6280\u672F\u7EC6\u8282\n const simplified = modelName\n .replace(/^(claude-|gpt-|glm-)/, '')\n .replace(/-\\d+.*$/, '')\n .replace(/-latest$/, '')\n return simplified.charAt(0).toUpperCase() + simplified.slice(1)\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderColor={BRAND_GRADIENT.START}\n borderStyle=\"round\"\n paddingX={1}\n marginBottom={1}\n >\n {/* \u4E3B\u4FE1\u606F\u884C */}\n <Box flexDirection=\"row\" justifyContent=\"space-between\">\n {/* \u5DE6\u4FA7\uFF1A\u54C1\u724C\u6807\u8BC6 + \u9879\u76EE\u4F4D\u7F6E */}\n <Box flexDirection=\"row\">\n <Text color={BRAND_GRADIENT.START}>\u25C6</Text>\n <Text> </Text>\n <Text color={BRAND_GRADIENT.START} bold>\n Min\n </Text>\n <Text color={BRAND_GRADIENT.END} bold>\n to\n </Text>\n <Text color={SEMANTIC_COLORS.dim}> \u00B7 </Text>\n <Text color={SEMANTIC_COLORS.secondary}>{cwd}</Text>\n </Box>\n\n {/* \u53F3\u4FA7\uFF1AAI \u6A21\u578B + \u4F7F\u7528\u91CF */}\n <Box flexDirection=\"row\">\n <Text color={SEMANTIC_COLORS.dim}>\n {getDisplayModelName(currentModel?.modelName)}\n </Text>\n {currentModel && (\n <>\n <Text color={SEMANTIC_COLORS.muted}> \u00B7 </Text>\n <Text\n color={\n contextPercentage > 80\n ? SEMANTIC_COLORS.error\n : contextPercentage > 60\n ? SEMANTIC_COLORS.running\n : SEMANTIC_COLORS.muted\n }\n >\n {formatTokens(tokenUsage)}/\n {formatTokens(currentModel.contextLength)}\n </Text>\n </>\n )}\n </Box>\n </Box>\n\n {/* \u6269\u5C55\u670D\u52A1\u72B6\u6001 (\u5982\u679C\u6709) */}\n {mcpClients.length > 0 && (\n <Box flexDirection=\"row\" marginTop={0}>\n <Text color={SEMANTIC_COLORS.muted}>MCP: </Text>\n {mcpClients.map((client, idx) => (\n <React.Fragment key={idx}>\n <Text\n color={\n client.type === 'connected'\n ? SEMANTIC_COLORS.success\n : SEMANTIC_COLORS.error\n }\n >\n {client.name}\n </Text>\n {idx < mcpClients.length - 1 && (\n <Text color={SEMANTIC_COLORS.muted}>, </Text>\n )}\n </React.Fragment>\n ))}\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * \u6781\u7B80\u7248\u9875\u7709 (\u53EA\u663E\u793A\u57FA\u672C\u4FE1\u606F)\n */\nexport function MinimalHeaderBar({\n tokenUsage = 0,\n}: {\n tokenUsage?: number\n}): React.ReactNode {\n const modelManager = getModelManager()\n const currentModel = modelManager.getModel('main')\n const cwd = getCwd()\n\n return (\n <Box flexDirection=\"row\" justifyContent=\"space-between\" paddingX={2}>\n {/* \u54C1\u724C + \u9879\u76EE\u4F4D\u7F6E */}\n <Box flexDirection=\"row\">\n <Text color={BRAND_GRADIENT.START}>\u25C6</Text>\n <Text> </Text>\n <Text color={BRAND_GRADIENT.START} bold>\n Min\n </Text>\n <Text color={BRAND_GRADIENT.END} bold>\n to\n </Text>\n <Text color={SEMANTIC_COLORS.dim}> \u00B7 </Text>\n <Text color={SEMANTIC_COLORS.secondary}>{cwd}</Text>\n </Box>\n\n {/* AI \u6A21\u578B + \u4F7F\u7528\u91CF */}\n {currentModel && (\n <Text color={SEMANTIC_COLORS.dim}>\n {Math.round(tokenUsage / 1000)}k/\n {Math.round(currentModel.contextLength / 1000)}k\n </Text>\n )}\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,7 @@
1
1
  import { Box, Text } from "ink";
2
2
  import * as React from "react";
3
3
  import { getTheme } from "../utils/theme.js";
4
+ import { SEMANTIC_COLORS } from "../constants/colors.js";
4
5
  function HistorySearchOverlay({
5
6
  searchTerm,
6
7
  results,
@@ -24,9 +25,9 @@ function HistorySearchOverlay({
24
25
  paddingX: 1,
25
26
  marginBottom: 1
26
27
  },
27
- /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.minto }, "Ctrl-R History Search"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " (\u2191/\u2193: navigate, Enter: select, Esc: cancel)")),
28
- /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, null, "Search: "), /* @__PURE__ */ React.createElement(Text, { color: theme.success }, searchTerm || /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "(type to search)"))),
29
- results.length === 0 ? /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, searchTerm ? "No matches found" : "No history available")) : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, results.length, " ", results.length === 1 ? "match" : "matches", results.length > maxVisible && ` (showing ${maxVisible})`)), visibleResults.map((result, displayIndex) => {
28
+ /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.minto }, "Ctrl-R History Search"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "(\u2191/\u2193: navigate, Enter: select, Esc: cancel)")),
29
+ /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, null, "Search: "), /* @__PURE__ */ React.createElement(Text, { color: theme.success }, searchTerm || /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "(type to search)"))),
30
+ results.length === 0 ? /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, searchTerm ? "No matches found" : "No history available")) : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, results.length, " ", results.length === 1 ? "match" : "matches", results.length > maxVisible && ` (showing ${maxVisible})`)), visibleResults.map((result, displayIndex) => {
30
31
  const isSelected = displayIndex === adjustedSelectedIndex;
31
32
  const actualIndex = startIndex + displayIndex;
32
33
  return /* @__PURE__ */ React.createElement(Box, { key: actualIndex, paddingLeft: 1 }, /* @__PURE__ */ React.createElement(
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/HistorySearchOverlay.tsx"],
4
- "sourcesContent": ["import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { getTheme } from '@utils/theme'\nimport type { HistorySearchResult } from '@hooks/useHistorySearch'\n\ntype Props = {\n searchTerm: string\n results: HistorySearchResult[]\n selectedIndex: number\n maxVisible?: number\n}\n\nexport function HistorySearchOverlay({\n searchTerm,\n results,\n selectedIndex,\n maxVisible = 10,\n}: Props) {\n const theme = getTheme()\n\n // Calculate visible range (show selected item in the middle when possible)\n const halfVisible = Math.floor(maxVisible / 2)\n const startIndex = Math.max(\n 0,\n Math.min(selectedIndex - halfVisible, results.length - maxVisible),\n )\n const visibleResults = results.slice(startIndex, startIndex + maxVisible)\n const adjustedSelectedIndex = selectedIndex - startIndex\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={1}\n marginBottom={1}\n >\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color={theme.minto}>\n Ctrl-R History Search\n </Text>\n <Text dimColor> (\u2191/\u2193: navigate, Enter: select, Esc: cancel)</Text>\n </Box>\n\n {/* Search input display */}\n <Box marginBottom={1}>\n <Text>Search: </Text>\n <Text color={theme.success}>\n {searchTerm || <Text dimColor>(type to search)</Text>}\n </Text>\n </Box>\n\n {/* Results */}\n {results.length === 0 ? (\n <Box>\n <Text dimColor>\n {searchTerm ? 'No matches found' : 'No history available'}\n </Text>\n </Box>\n ) : (\n <>\n {/* Results count */}\n <Box marginBottom={1}>\n <Text dimColor>\n {results.length} {results.length === 1 ? 'match' : 'matches'}\n {results.length > maxVisible && ` (showing ${maxVisible})`}\n </Text>\n </Box>\n\n {/* Result list */}\n {visibleResults.map((result, displayIndex) => {\n const isSelected = displayIndex === adjustedSelectedIndex\n const actualIndex = startIndex + displayIndex\n\n return (\n <Box key={actualIndex} paddingLeft={1}>\n <Text\n bold={isSelected}\n color={isSelected ? theme.minto : theme.text}\n backgroundColor={isSelected ? theme.suggestion : undefined}\n >\n {isSelected ? '\u25BA ' : ' '}\n {result.item.length > 80\n ? result.item.substring(0, 77) + '...'\n : result.item}\n </Text>\n </Box>\n )\n })}\n </>\n )}\n </Box>\n )\n}\n"],
5
- "mappings": "AAAA,SAAS,KAAK,YAAY;AAC1B,YAAY,WAAW;AACvB,SAAS,gBAAgB;AAUlB,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AACf,GAAU;AACR,QAAM,QAAQ,SAAS;AAGvB,QAAM,cAAc,KAAK,MAAM,aAAa,CAAC;AAC7C,QAAM,aAAa,KAAK;AAAA,IACtB;AAAA,IACA,KAAK,IAAI,gBAAgB,aAAa,QAAQ,SAAS,UAAU;AAAA,EACnE;AACA,QAAM,iBAAiB,QAAQ,MAAM,YAAY,aAAa,UAAU;AACxE,QAAM,wBAAwB,gBAAgB;AAE9C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAGd,oCAAC,OAAI,cAAc,KACjB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,SAAO,uBAE/B,GACA,oCAAC,QAAK,UAAQ,QAAC,wDAA4C,CAC7D;AAAA,IAGA,oCAAC,OAAI,cAAc,KACjB,oCAAC,YAAK,UAAQ,GACd,oCAAC,QAAK,OAAO,MAAM,WAChB,cAAc,oCAAC,QAAK,UAAQ,QAAC,kBAAgB,CAChD,CACF;AAAA,IAGC,QAAQ,WAAW,IAClB,oCAAC,WACC,oCAAC,QAAK,UAAQ,QACX,aAAa,qBAAqB,sBACrC,CACF,IAEA,0DAEE,oCAAC,OAAI,cAAc,KACjB,oCAAC,QAAK,UAAQ,QACX,QAAQ,QAAO,KAAE,QAAQ,WAAW,IAAI,UAAU,WAClD,QAAQ,SAAS,cAAc,aAAa,UAAU,GACzD,CACF,GAGC,eAAe,IAAI,CAAC,QAAQ,iBAAiB;AAC5C,YAAM,aAAa,iBAAiB;AACpC,YAAM,cAAc,aAAa;AAEjC,aACE,oCAAC,OAAI,KAAK,aAAa,aAAa,KAClC;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,OAAO,aAAa,MAAM,QAAQ,MAAM;AAAA,UACxC,iBAAiB,aAAa,MAAM,aAAa;AAAA;AAAA,QAEhD,aAAa,YAAO;AAAA,QACpB,OAAO,KAAK,SAAS,KAClB,OAAO,KAAK,UAAU,GAAG,EAAE,IAAI,QAC/B,OAAO;AAAA,MACb,CACF;AAAA,IAEJ,CAAC,CACH;AAAA,EAEJ;AAEJ;",
4
+ "sourcesContent": ["import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { getTheme } from '@utils/theme'\nimport type { HistorySearchResult } from '@hooks/useHistorySearch'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ntype Props = {\n searchTerm: string\n results: HistorySearchResult[]\n selectedIndex: number\n maxVisible?: number\n}\n\nexport function HistorySearchOverlay({\n searchTerm,\n results,\n selectedIndex,\n maxVisible = 10,\n}: Props) {\n const theme = getTheme()\n\n // Calculate visible range (show selected item in the middle when possible)\n const halfVisible = Math.floor(maxVisible / 2)\n const startIndex = Math.max(\n 0,\n Math.min(selectedIndex - halfVisible, results.length - maxVisible),\n )\n const visibleResults = results.slice(startIndex, startIndex + maxVisible)\n const adjustedSelectedIndex = selectedIndex - startIndex\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={1}\n marginBottom={1}\n >\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color={theme.minto}>\n Ctrl-R History Search\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n (\u2191/\u2193: navigate, Enter: select, Esc: cancel)\n </Text>\n </Box>\n\n {/* Search input display */}\n <Box marginBottom={1}>\n <Text>Search: </Text>\n <Text color={theme.success}>\n {searchTerm || (\n <Text color={SEMANTIC_COLORS.dim}>(type to search)</Text>\n )}\n </Text>\n </Box>\n\n {/* Results */}\n {results.length === 0 ? (\n <Box>\n <Text color={SEMANTIC_COLORS.dim}>\n {searchTerm ? 'No matches found' : 'No history available'}\n </Text>\n </Box>\n ) : (\n <>\n {/* Results count */}\n <Box marginBottom={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n {results.length} {results.length === 1 ? 'match' : 'matches'}\n {results.length > maxVisible && ` (showing ${maxVisible})`}\n </Text>\n </Box>\n\n {/* Result list */}\n {visibleResults.map((result, displayIndex) => {\n const isSelected = displayIndex === adjustedSelectedIndex\n const actualIndex = startIndex + displayIndex\n\n return (\n <Box key={actualIndex} paddingLeft={1}>\n <Text\n bold={isSelected}\n color={isSelected ? theme.minto : theme.text}\n backgroundColor={isSelected ? theme.suggestion : undefined}\n >\n {isSelected ? '\u25BA ' : ' '}\n {result.item.length > 80\n ? result.item.substring(0, 77) + '...'\n : result.item}\n </Text>\n </Box>\n )\n })}\n </>\n )}\n </Box>\n )\n}\n"],
5
+ "mappings": "AAAA,SAAS,KAAK,YAAY;AAC1B,YAAY,WAAW;AACvB,SAAS,gBAAgB;AAEzB,SAAS,uBAAuB;AASzB,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AACf,GAAU;AACR,QAAM,QAAQ,SAAS;AAGvB,QAAM,cAAc,KAAK,MAAM,aAAa,CAAC;AAC7C,QAAM,aAAa,KAAK;AAAA,IACtB;AAAA,IACA,KAAK,IAAI,gBAAgB,aAAa,QAAQ,SAAS,UAAU;AAAA,EACnE;AACA,QAAM,iBAAiB,QAAQ,MAAM,YAAY,aAAa,UAAU;AACxE,QAAM,wBAAwB,gBAAgB;AAE9C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAGd,oCAAC,OAAI,cAAc,KACjB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,SAAO,uBAE/B,GACA,oCAAC,QAAK,OAAO,gBAAgB,OAC1B,KAAI,uDAEP,CACF;AAAA,IAGA,oCAAC,OAAI,cAAc,KACjB,oCAAC,YAAK,UAAQ,GACd,oCAAC,QAAK,OAAO,MAAM,WAChB,cACC,oCAAC,QAAK,OAAO,gBAAgB,OAAK,kBAAgB,CAEtD,CACF;AAAA,IAGC,QAAQ,WAAW,IAClB,oCAAC,WACC,oCAAC,QAAK,OAAO,gBAAgB,OAC1B,aAAa,qBAAqB,sBACrC,CACF,IAEA,0DAEE,oCAAC,OAAI,cAAc,KACjB,oCAAC,QAAK,OAAO,gBAAgB,OAC1B,QAAQ,QAAO,KAAE,QAAQ,WAAW,IAAI,UAAU,WAClD,QAAQ,SAAS,cAAc,aAAa,UAAU,GACzD,CACF,GAGC,eAAe,IAAI,CAAC,QAAQ,iBAAiB;AAC5C,YAAM,aAAa,iBAAiB;AACpC,YAAM,cAAc,aAAa;AAEjC,aACE,oCAAC,OAAI,KAAK,aAAa,aAAa,KAClC;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,OAAO,aAAa,MAAM,QAAQ,MAAM;AAAA,UACxC,iBAAiB,aAAa,MAAM,aAAa;AAAA;AAAA,QAEhD,aAAa,YAAO;AAAA,QACpB,OAAO,KAAK,SAAS,KAClB,OAAO,KAAK,UAAU,GAAG,EAAE,IAAI,QAC/B,OAAO;AAAA,MACb,CACF;AAAA,IAEJ,CAAC,CACH;AAAA,EAEJ;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,134 @@
1
+ import { Box, Text, useInput } from "ink";
2
+ import * as React from "react";
3
+ import { t } from "../i18n/index.js";
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
+ ];
42
+ function HotkeyHelpPanel({
43
+ onClose,
44
+ isVisible
45
+ }) {
46
+ useInput(
47
+ (input, key) => {
48
+ if (key.escape || key.ctrl && (input === "?" || input === "/")) {
49
+ onClose();
50
+ }
51
+ },
52
+ { isActive: isVisible }
53
+ );
54
+ if (!isVisible) {
55
+ return null;
56
+ }
57
+ return /* @__PURE__ */ React.createElement(
58
+ Box,
59
+ {
60
+ flexDirection: "column",
61
+ borderStyle: "round",
62
+ borderColor: BRAND_GRADIENT.START,
63
+ paddingX: 2,
64
+ paddingY: 1,
65
+ marginBottom: 1
66
+ },
67
+ /* @__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)))))),
69
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, t("ui.hints.tip")))
70
+ );
71
+ }
72
+ function HotkeyHint() {
73
+ return /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Ctrl+? for shortcuts");
74
+ }
75
+ function getContextHints(context) {
76
+ switch (context) {
77
+ case "idle":
78
+ 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" }
84
+ ];
85
+ case "typing":
86
+ return [
87
+ { keys: "Enter", description: t("ui.hints.send") },
88
+ { keys: "Tab", description: t("ui.hints.complete") },
89
+ { keys: "Ctrl+B", description: t("ui.hints.bash") },
90
+ { keys: "Esc", description: t("common.clear") }
91
+ ];
92
+ case "loading":
93
+ return [
94
+ { keys: "Ctrl+C", description: t("common.cancel") },
95
+ { keys: "Esc Esc", description: t("ui.hints.rollback") }
96
+ ];
97
+ case "completion":
98
+ return [
99
+ { keys: "\u2191/\u2193", description: t("ui.hints.select") },
100
+ { keys: "Tab", description: t("ui.hints.confirm") },
101
+ { keys: "Esc", description: t("ui.hints.close") }
102
+ ];
103
+ case "history_search":
104
+ return [
105
+ { keys: "\u2191/\u2193", description: t("ui.hints.browse") },
106
+ { keys: "Enter", description: t("ui.hints.select") },
107
+ { keys: "Esc", description: t("common.cancel") }
108
+ ];
109
+ case "slash_command":
110
+ return [
111
+ { keys: "Tab", description: t("ui.hints.completeCommand") },
112
+ { keys: "Enter", description: t("ui.hints.execute") },
113
+ { keys: "Esc", description: t("common.cancel") }
114
+ ];
115
+ default:
116
+ return [{ keys: "Ctrl+?", description: t("common.help") }];
117
+ }
118
+ }
119
+ function ContextAwareHints({
120
+ context,
121
+ compact = true
122
+ }) {
123
+ const hints = getContextHints(context);
124
+ if (compact) {
125
+ return /* @__PURE__ */ React.createElement(Box, null, hints.map((hint, i) => /* @__PURE__ */ React.createElement(React.Fragment, { key: i }, i > 0 && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, hint.keys, " ", hint.description))));
126
+ }
127
+ return /* @__PURE__ */ React.createElement(Box, { gap: 2 }, hints.map((hint, i) => /* @__PURE__ */ React.createElement(Box, { key: i }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: BRAND_GRADIENT.MIDDLE }, hint.keys), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, " ", hint.description))));
128
+ }
129
+ export {
130
+ ContextAwareHints,
131
+ HotkeyHelpPanel,
132
+ HotkeyHint
133
+ };
134
+ //# sourceMappingURL=HotkeyHelpPanel.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 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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",
6
+ "names": []
7
+ }
@@ -5,6 +5,7 @@ import { Select } from "./CustomSelect/select.js";
5
5
  import { render } from "ink";
6
6
  import { writeFileSync } from "fs";
7
7
  import { useExitOnCtrlCD } from "../hooks/useExitOnCtrlCD.js";
8
+ import { SEMANTIC_COLORS } from "../constants/colors.js";
8
9
  function InvalidConfigDialog({
9
10
  filePath,
10
11
  errorDescription,
@@ -47,7 +48,7 @@ function InvalidConfigDialog({
47
48
  onChange: handleSelect
48
49
  }
49
50
  ))
50
- ), exitState.pending ? /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press ", exitState.keyName, " again to exit") : /* @__PURE__ */ React.createElement(Newline, null));
51
+ ), exitState.pending ? /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press ", exitState.keyName, " again to exit") : /* @__PURE__ */ React.createElement(Newline, null));
51
52
  }
52
53
  function showInvalidConfigDialog({
53
54
  error
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/InvalidConfigDialog.tsx"],
4
- "sourcesContent": ["import React from 'react'\nimport { Box, Newline, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { Select } from './CustomSelect/select'\nimport { render } from 'ink'\nimport { writeFileSync } from 'fs'\nimport { ConfigParseError } from '@utils/errors'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\ninterface InvalidConfigHandlerProps {\n error: ConfigParseError\n}\n\ninterface InvalidConfigDialogProps {\n filePath: string\n errorDescription: string\n onExit: () => void\n onReset: () => void\n}\n\n/**\n * Dialog shown when the Minto config file contains invalid JSON\n */\nfunction InvalidConfigDialog({\n filePath,\n errorDescription,\n onExit,\n onReset,\n}: InvalidConfigDialogProps): React.ReactNode {\n const theme = getTheme()\n\n // Handle escape key\n useInput((_, key) => {\n if (key.escape) {\n onExit()\n }\n })\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n // Handler for Select onChange\n const handleSelect = (value: string) => {\n if (value === 'exit') {\n onExit()\n } else {\n onReset()\n }\n }\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n borderColor={theme.error}\n borderStyle=\"round\"\n padding={1}\n width={70}\n gap={1}\n >\n <Text bold>Configuration Error</Text>\n\n <Box flexDirection=\"column\" gap={1}>\n <Text>\n The configuration file at <Text bold>{filePath}</Text> contains\n invalid JSON.\n </Text>\n <Text>{errorDescription}</Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text bold>Choose an option:</Text>\n <Select\n options={[\n { label: 'Exit and fix manually', value: 'exit' },\n { label: 'Reset with default configuration', value: 'reset' },\n ]}\n onChange={handleSelect}\n />\n </Box>\n </Box>\n {exitState.pending ? (\n <Text dimColor>Press {exitState.keyName} again to exit</Text>\n ) : (\n <Newline />\n )}\n </>\n )\n}\n\nexport function showInvalidConfigDialog({\n error,\n}: InvalidConfigHandlerProps): Promise<void> {\n return new Promise(resolve => {\n render(\n <InvalidConfigDialog\n filePath={error.filePath}\n errorDescription={error.message}\n onExit={() => {\n resolve()\n process.exit(1)\n }}\n onReset={() => {\n writeFileSync(\n error.filePath,\n JSON.stringify(error.defaultConfig, null, 2),\n )\n resolve()\n process.exit(0)\n }}\n />,\n { exitOnCtrlC: false },\n )\n })\n}\n"],
5
- "mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,SAAS,MAAM,gBAAgB;AAC7C,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,cAAc;AACvB,SAAS,qBAAqB;AAE9B,SAAS,uBAAuB;AAehC,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8C;AAC5C,QAAM,QAAQ,SAAS;AAGvB,WAAS,CAAC,GAAG,QAAQ;AACnB,QAAI,IAAI,QAAQ;AACd,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,QAAM,YAAY,gBAAgB,MAAM,QAAQ,KAAK,CAAC,CAAC;AAGvD,QAAM,eAAe,CAAC,UAAkB;AACtC,QAAI,UAAU,QAAQ;AACpB,aAAO;AAAA,IACT,OAAO;AACL,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,SACE,0DACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAa,MAAM;AAAA,MACnB,aAAY;AAAA,MACZ,SAAS;AAAA,MACT,OAAO;AAAA,MACP,KAAK;AAAA;AAAA,IAEL,oCAAC,QAAK,MAAI,QAAC,qBAAmB;AAAA,IAE9B,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B,oCAAC,YAAK,8BACsB,oCAAC,QAAK,MAAI,QAAE,QAAS,GAAO,yBAExD,GACA,oCAAC,YAAM,gBAAiB,CAC1B;AAAA,IAEA,oCAAC,OAAI,eAAc,YACjB,oCAAC,QAAK,MAAI,QAAC,mBAAiB,GAC5B;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,UACP,EAAE,OAAO,yBAAyB,OAAO,OAAO;AAAA,UAChD,EAAE,OAAO,oCAAoC,OAAO,QAAQ;AAAA,QAC9D;AAAA,QACA,UAAU;AAAA;AAAA,IACZ,CACF;AAAA,EACF,GACC,UAAU,UACT,oCAAC,QAAK,UAAQ,QAAC,UAAO,UAAU,SAAQ,gBAAc,IAEtD,oCAAC,aAAQ,CAEb;AAEJ;AAEO,SAAS,wBAAwB;AAAA,EACtC;AACF,GAA6C;AAC3C,SAAO,IAAI,QAAQ,aAAW;AAC5B;AAAA,MACE;AAAA,QAAC;AAAA;AAAA,UACC,UAAU,MAAM;AAAA,UAChB,kBAAkB,MAAM;AAAA,UACxB,QAAQ,MAAM;AACZ,oBAAQ;AACR,oBAAQ,KAAK,CAAC;AAAA,UAChB;AAAA,UACA,SAAS,MAAM;AACb;AAAA,cACE,MAAM;AAAA,cACN,KAAK,UAAU,MAAM,eAAe,MAAM,CAAC;AAAA,YAC7C;AACA,oBAAQ;AACR,oBAAQ,KAAK,CAAC;AAAA,UAChB;AAAA;AAAA,MACF;AAAA,MACA,EAAE,aAAa,MAAM;AAAA,IACvB;AAAA,EACF,CAAC;AACH;",
4
+ "sourcesContent": ["import React from 'react'\nimport { Box, Newline, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { Select } from './CustomSelect/select'\nimport { render } from 'ink'\nimport { writeFileSync } from 'fs'\nimport { ConfigParseError } from '@utils/errors'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\nimport { SEMANTIC_COLORS } from '@constants/colors'\ninterface InvalidConfigHandlerProps {\n error: ConfigParseError\n}\n\ninterface InvalidConfigDialogProps {\n filePath: string\n errorDescription: string\n onExit: () => void\n onReset: () => void\n}\n\n/**\n * Dialog shown when the Minto config file contains invalid JSON\n */\nfunction InvalidConfigDialog({\n filePath,\n errorDescription,\n onExit,\n onReset,\n}: InvalidConfigDialogProps): React.ReactNode {\n const theme = getTheme()\n\n // Handle escape key\n useInput((_, key) => {\n if (key.escape) {\n onExit()\n }\n })\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n // Handler for Select onChange\n const handleSelect = (value: string) => {\n if (value === 'exit') {\n onExit()\n } else {\n onReset()\n }\n }\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n borderColor={theme.error}\n borderStyle=\"round\"\n padding={1}\n width={70}\n gap={1}\n >\n <Text bold>Configuration Error</Text>\n\n <Box flexDirection=\"column\" gap={1}>\n <Text>\n The configuration file at <Text bold>{filePath}</Text> contains\n invalid JSON.\n </Text>\n <Text>{errorDescription}</Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text bold>Choose an option:</Text>\n <Select\n options={[\n { label: 'Exit and fix manually', value: 'exit' },\n { label: 'Reset with default configuration', value: 'reset' },\n ]}\n onChange={handleSelect}\n />\n </Box>\n </Box>\n {exitState.pending ? (\n <Text color={SEMANTIC_COLORS.dim}>\n Press {exitState.keyName} again to exit\n </Text>\n ) : (\n <Newline />\n )}\n </>\n )\n}\n\nexport function showInvalidConfigDialog({\n error,\n}: InvalidConfigHandlerProps): Promise<void> {\n return new Promise(resolve => {\n render(\n <InvalidConfigDialog\n filePath={error.filePath}\n errorDescription={error.message}\n onExit={() => {\n resolve()\n process.exit(1)\n }}\n onReset={() => {\n writeFileSync(\n error.filePath,\n JSON.stringify(error.defaultConfig, null, 2),\n )\n resolve()\n process.exit(0)\n }}\n />,\n { exitOnCtrlC: false },\n )\n })\n}\n"],
5
+ "mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,SAAS,MAAM,gBAAgB;AAC7C,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,cAAc;AACvB,SAAS,qBAAqB;AAE9B,SAAS,uBAAuB;AAChC,SAAS,uBAAuB;AAehC,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8C;AAC5C,QAAM,QAAQ,SAAS;AAGvB,WAAS,CAAC,GAAG,QAAQ;AACnB,QAAI,IAAI,QAAQ;AACd,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,QAAM,YAAY,gBAAgB,MAAM,QAAQ,KAAK,CAAC,CAAC;AAGvD,QAAM,eAAe,CAAC,UAAkB;AACtC,QAAI,UAAU,QAAQ;AACpB,aAAO;AAAA,IACT,OAAO;AACL,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,SACE,0DACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAa,MAAM;AAAA,MACnB,aAAY;AAAA,MACZ,SAAS;AAAA,MACT,OAAO;AAAA,MACP,KAAK;AAAA;AAAA,IAEL,oCAAC,QAAK,MAAI,QAAC,qBAAmB;AAAA,IAE9B,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B,oCAAC,YAAK,8BACsB,oCAAC,QAAK,MAAI,QAAE,QAAS,GAAO,yBAExD,GACA,oCAAC,YAAM,gBAAiB,CAC1B;AAAA,IAEA,oCAAC,OAAI,eAAc,YACjB,oCAAC,QAAK,MAAI,QAAC,mBAAiB,GAC5B;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,UACP,EAAE,OAAO,yBAAyB,OAAO,OAAO;AAAA,UAChD,EAAE,OAAO,oCAAoC,OAAO,QAAQ;AAAA,QAC9D;AAAA,QACA,UAAU;AAAA;AAAA,IACZ,CACF;AAAA,EACF,GACC,UAAU,UACT,oCAAC,QAAK,OAAO,gBAAgB,OAAK,UACzB,UAAU,SAAQ,gBAC3B,IAEA,oCAAC,aAAQ,CAEb;AAEJ;AAEO,SAAS,wBAAwB;AAAA,EACtC;AACF,GAA6C;AAC3C,SAAO,IAAI,QAAQ,aAAW;AAC5B;AAAA,MACE;AAAA,QAAC;AAAA;AAAA,UACC,UAAU,MAAM;AAAA,UAChB,kBAAkB,MAAM;AAAA,UACxB,QAAQ,MAAM;AACZ,oBAAQ;AACR,oBAAQ,KAAK,CAAC;AAAA,UAChB;AAAA,UACA,SAAS,MAAM;AACb;AAAA,cACE,MAAM;AAAA,cACN,KAAK,UAAU,MAAM,eAAe,MAAM,CAAC;AAAA,YAC7C;AACA,oBAAQ;AACR,oBAAQ,KAAK,CAAC;AAAA,UAChB;AAAA;AAAA,MACF;AAAA,MACA,EAAE,aAAa,MAAM;AAAA,IACvB;AAAA,EACF,CAAC;AACH;",
6
6
  "names": []
7
7
  }
@@ -1,13 +1,15 @@
1
1
  import { Box, Text } from "ink";
2
2
  import * as React from "react";
3
3
  import { getTheme } from "../utils/theme.js";
4
- import { PRODUCT_NAME } from "../constants/product.js";
5
- import { getAnthropicApiKey, getGlobalConfig } from "../utils/config.js";
6
4
  import { getCwd } from "../utils/state.js";
7
- import { AsciiLogo } from "./AsciiLogo.js";
8
- import { getModelManager } from "../utils/model.js";
9
5
  import { MACRO } from "../constants/macros.js";
6
+ import { t } from "../i18n/index.js";
7
+ import path from "path";
8
+ import { BRAND_GRADIENT, SEMANTIC_COLORS } from "../constants/colors.js";
10
9
  const MIN_LOGO_WIDTH = 50;
10
+ function getTerminalWidth() {
11
+ return process.stdout.columns || 80;
12
+ }
11
13
  const DEFAULT_UPDATE_COMMANDS = [
12
14
  "bun add -g @within-7/minto@latest",
13
15
  "npm install -g @within-7/minto@latest"
@@ -18,75 +20,29 @@ function Logo({
18
20
  updateBannerVersion,
19
21
  updateBannerCommands
20
22
  }) {
21
- const width = Math.max(MIN_LOGO_WIDTH, getCwd().length + 12);
22
23
  const theme = getTheme();
23
- const config = getGlobalConfig();
24
- const modelManager = getModelManager();
25
- const mainModelName = modelManager.getModelName("main");
26
- const currentModel = mainModelName || "No model configured";
27
- const apiKey = getAnthropicApiKey();
28
- const hasOverrides = Boolean(
29
- process.env.ANTHROPIC_API_KEY || process.env.DISABLE_PROMPT_CACHING || process.env.API_TIMEOUT_MS || process.env.MAX_THINKING_TOKENS
30
- );
31
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(
24
+ const cwd = getCwd();
25
+ const projectName = path.basename(cwd);
26
+ const logoLines = ["\u2588\u2580\u2584\u2580\u2588 \u2588 \u2588\u2584 \u2588 \u2580\u2588\u2580 \u2588\u2580\u2588", "\u2588 \u2580 \u2588 \u2588 \u2588 \u2580\u2588 \u2588 \u2588\u2584\u2588"];
27
+ const terminalWidth = getTerminalWidth();
28
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width: terminalWidth }, updateBannerVersion ? /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingX: 1, marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.running }, "New version available: ", updateBannerVersion, " (current:", " ", MACRO.VERSION, ")"), /* @__PURE__ */ React.createElement(Text, null, "Run the following command to update:"), /* @__PURE__ */ React.createElement(Text, null, " ", updateBannerCommands?.[1] ?? DEFAULT_UPDATE_COMMANDS[1]), process.platform !== "win32" && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, 'Note: you may need to prefix with "sudo" on macOS/Linux.')) : null, /* @__PURE__ */ React.createElement(
32
29
  Box,
33
30
  {
34
- borderColor: theme.minto,
35
- borderStyle: "round",
36
31
  flexDirection: "column",
37
- gap: 1,
38
- paddingLeft: 1,
39
- marginRight: 2,
40
- width
32
+ borderTop: true,
33
+ borderBottom: true,
34
+ borderLeft: false,
35
+ borderRight: false,
36
+ borderColor: BRAND_GRADIENT.START,
37
+ borderStyle: "single",
38
+ width: terminalWidth,
39
+ paddingX: 1,
40
+ paddingY: 1
41
41
  },
42
- updateBannerVersion ? /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: "yellow" }, "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, { dimColor: true }, 'Note: you may need to prefix with "sudo" on macOS/Linux.')) : null,
43
- /* @__PURE__ */ React.createElement(AsciiLogo, null),
44
- /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.minto }, "\u273B"), " Welcome to", " ", /* @__PURE__ */ React.createElement(Text, { bold: true }, PRODUCT_NAME), " ", /* @__PURE__ */ React.createElement(Text, null, "research preview!")),
45
- /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { paddingLeft: 0, flexDirection: "column", gap: 0, marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Tips for getting started:"), /* @__PURE__ */ React.createElement(Text, null, "1. Ask questions, edit files, or run commands."), /* @__PURE__ */ React.createElement(Text, null, "2. Be specific for the best results."), /* @__PURE__ */ React.createElement(Text, null, "3. Create MINTO.md to customize your project's AI interactions."), /* @__PURE__ */ React.createElement(Text, null, "4. Use /help for more information.")), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column", gap: 1, marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "cwd: ", getCwd())), hasOverrides && /* @__PURE__ */ React.createElement(
46
- Box,
47
- {
48
- borderColor: theme.secondaryBorder,
49
- borderStyle: "single",
50
- borderBottom: false,
51
- borderLeft: false,
52
- borderRight: false,
53
- borderTop: true,
54
- flexDirection: "column",
55
- marginLeft: 2,
56
- marginRight: 1,
57
- paddingTop: 1
58
- },
59
- /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "Overrides (via env):")),
60
- process.env.ANTHROPIC_API_KEY && apiKey ? /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "\u2022 API Key:", " ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "sk-ant-\u2026", apiKey.slice(-width + 25))) : null,
61
- process.env.DISABLE_PROMPT_CACHING ? /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "\u2022 Prompt caching:", " ", /* @__PURE__ */ React.createElement(Text, { color: theme.error, bold: true }, "off")) : null,
62
- process.env.API_TIMEOUT_MS ? /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "\u2022 API timeout:", " ", /* @__PURE__ */ React.createElement(Text, { bold: true }, process.env.API_TIMEOUT_MS, "ms")) : null,
63
- process.env.MAX_THINKING_TOKENS ? /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "\u2022 Max thinking tokens:", " ", /* @__PURE__ */ React.createElement(Text, { bold: true }, process.env.MAX_THINKING_TOKENS)) : null,
64
- process.env.ANTHROPIC_BASE_URL ? /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "\u2022 API Base URL:", " ", /* @__PURE__ */ React.createElement(Text, { bold: true }, process.env.ANTHROPIC_BASE_URL)) : null
65
- )),
66
- mcpClients.length ? /* @__PURE__ */ React.createElement(
67
- Box,
68
- {
69
- borderColor: theme.secondaryBorder,
70
- borderStyle: "single",
71
- borderBottom: false,
72
- borderLeft: false,
73
- borderRight: false,
74
- borderTop: true,
75
- flexDirection: "column",
76
- marginLeft: 2,
77
- marginRight: 1,
78
- paddingTop: 1
79
- },
80
- /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "MCP Servers:")),
81
- mcpClients.map((client, idx) => /* @__PURE__ */ React.createElement(Box, { key: idx, width: width - 6 }, /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "\u2022 ", client.name), /* @__PURE__ */ React.createElement(Box, { flexGrow: 1 }), /* @__PURE__ */ React.createElement(
82
- Text,
83
- {
84
- bold: true,
85
- color: client.type === "connected" ? theme.success : theme.error
86
- },
87
- client.type === "connected" ? "connected" : "failed"
88
- )))
89
- ) : null
42
+ /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", alignItems: "center" }, /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START }, "\u25C6"), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", alignItems: "center", marginY: 1 }, /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START, bold: true }, logoLines[0]), /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.END, bold: true }, logoLines[1])), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START }, "Strategic AI"), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.END }, "Global Excellence"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " \xB7 v", MACRO.VERSION))),
43
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START }, "\u273B"), " ", t("ui.welcome.title"))),
44
+ /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, t("ui.welcome.quickStart"), ":"), /* @__PURE__ */ React.createElement(Text, null, "\u2022 ", t("ui.welcome.tip1")), /* @__PURE__ */ React.createElement(Text, null, "\u2022 ", t("ui.welcome.tip2")), /* @__PURE__ */ React.createElement(Text, null, "\u2022 ", t("ui.welcome.tip3"))),
45
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "\u{1F4C2} ", projectName))
90
46
  ));
91
47
  }
92
48
  export {