@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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/Logo.tsx"],
4
- "sourcesContent": ["import { Box, Text, Newline } from 'ink'\nimport * as React from 'react'\nimport { getTheme } from '@utils/theme'\nimport { PRODUCT_NAME } from '@constants/product'\nimport { getAnthropicApiKey, getGlobalConfig } from '@utils/config'\nimport { getCwd } from '@utils/state'\nimport { AsciiLogo } from './AsciiLogo'\nimport type { WrappedClient } from '@services/mcpClient'\nimport { getModelManager } from '@utils/model'\nimport { MACRO } from '@constants/macros'\n\nexport const MIN_LOGO_WIDTH = 50\n\nconst DEFAULT_UPDATE_COMMANDS = [\n 'bun add -g @within-7/minto@latest',\n 'npm install -g @within-7/minto@latest',\n] as const\n\nexport function Logo({\n mcpClients,\n isDefaultModel = false,\n updateBannerVersion,\n updateBannerCommands,\n}: {\n mcpClients: WrappedClient[]\n isDefaultModel?: boolean\n updateBannerVersion?: string | null\n updateBannerCommands?: string[] | null\n}): React.ReactNode {\n const width = Math.max(MIN_LOGO_WIDTH, getCwd().length + 12)\n const theme = getTheme()\n const config = getGlobalConfig()\n\n const modelManager = getModelManager()\n const mainModelName = modelManager.getModelName('main')\n const currentModel = mainModelName || 'No model configured'\n const apiKey = getAnthropicApiKey()\n const hasOverrides = Boolean(\n process.env.ANTHROPIC_API_KEY ||\n process.env.DISABLE_PROMPT_CACHING ||\n process.env.API_TIMEOUT_MS ||\n process.env.MAX_THINKING_TOKENS,\n )\n\n return (\n <Box flexDirection=\"column\">\n <Box\n borderColor={theme.minto}\n borderStyle=\"round\"\n flexDirection=\"column\"\n gap={1}\n paddingLeft={1}\n marginRight={2}\n width={width}\n >\n {updateBannerVersion ? (\n <Box flexDirection=\"column\">\n <Text color=\"yellow\">\n New version available: {updateBannerVersion} (current:{' '}\n {MACRO.VERSION})\n </Text>\n <Text>Run the following command to update:</Text>\n <Text>\n {' '}\n {updateBannerCommands?.[1] ?? DEFAULT_UPDATE_COMMANDS[1]}\n </Text>\n {process.platform !== 'win32' && (\n <Text dimColor>\n Note: you may need to prefix with \"sudo\" on macOS/Linux.\n </Text>\n )}\n </Box>\n ) : null}\n <AsciiLogo />\n <Text>\n <Text color={theme.minto}>\u273B</Text> Welcome to{' '}\n <Text bold>{PRODUCT_NAME}</Text> <Text>research preview!</Text>\n </Text>\n\n <>\n <Box paddingLeft={0} flexDirection=\"column\" gap={0} marginTop={1}>\n <Text bold>Tips for getting started:</Text>\n <Text>1. Ask questions, edit files, or run commands.</Text>\n <Text>2. Be specific for the best results.</Text>\n <Text>\n 3. Create MINTO.md to customize your project's AI interactions.\n </Text>\n <Text>4. Use /help for more information.</Text>\n </Box>\n\n <Box paddingLeft={2} flexDirection=\"column\" gap={1} marginTop={1}>\n <Text color={theme.secondaryText}>cwd: {getCwd()}</Text>\n </Box>\n\n {hasOverrides && (\n <Box\n borderColor={theme.secondaryBorder}\n borderStyle=\"single\"\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n borderTop={true}\n flexDirection=\"column\"\n marginLeft={2}\n marginRight={1}\n paddingTop={1}\n >\n <Box marginBottom={1}>\n <Text color={theme.secondaryText}>Overrides (via env):</Text>\n </Box>\n {process.env.ANTHROPIC_API_KEY && apiKey ? (\n <Text color={theme.secondaryText}>\n \u2022 API Key:{' '}\n <Text bold>sk-ant-\u2026{apiKey!.slice(-width + 25)}</Text>\n </Text>\n ) : null}\n {process.env.DISABLE_PROMPT_CACHING ? (\n <Text color={theme.secondaryText}>\n \u2022 Prompt caching:{' '}\n <Text color={theme.error} bold>\n off\n </Text>\n </Text>\n ) : null}\n {process.env.API_TIMEOUT_MS ? (\n <Text color={theme.secondaryText}>\n \u2022 API timeout:{' '}\n <Text bold>{process.env.API_TIMEOUT_MS}ms</Text>\n </Text>\n ) : null}\n {process.env.MAX_THINKING_TOKENS ? (\n <Text color={theme.secondaryText}>\n \u2022 Max thinking tokens:{' '}\n <Text bold>{process.env.MAX_THINKING_TOKENS}</Text>\n </Text>\n ) : null}\n {process.env.ANTHROPIC_BASE_URL ? (\n <Text color={theme.secondaryText}>\n \u2022 API Base URL:{' '}\n <Text bold>{process.env.ANTHROPIC_BASE_URL}</Text>\n </Text>\n ) : null}\n </Box>\n )}\n </>\n {mcpClients.length ? (\n <Box\n borderColor={theme.secondaryBorder}\n borderStyle=\"single\"\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n borderTop={true}\n flexDirection=\"column\"\n marginLeft={2}\n marginRight={1}\n paddingTop={1}\n >\n <Box marginBottom={1}>\n <Text color={theme.secondaryText}>MCP Servers:</Text>\n </Box>\n {mcpClients.map((client, idx) => (\n <Box key={idx} width={width - 6}>\n <Text color={theme.secondaryText}>\u2022 {client.name}</Text>\n <Box flexGrow={1} />\n <Text\n bold\n color={\n client.type === 'connected' ? theme.success : theme.error\n }\n >\n {client.type === 'connected' ? 'connected' : 'failed'}\n </Text>\n </Box>\n ))}\n </Box>\n ) : null}\n </Box>\n </Box>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { getTheme } from '@utils/theme'\nimport { getCwd } from '@utils/state'\nimport type { WrappedClient } from '@services/mcpClient'\nimport { MACRO } from '@constants/macros'\nimport { t } from '@i18n'\nimport path from 'path'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\n\nexport const MIN_LOGO_WIDTH = 50\n\n/**\n * Get terminal width directly from stdout.\n * This is critical for Static component re-renders after clearTerminal,\n * as Ink's yoga-layout may not correctly infer the terminal width.\n */\nfunction getTerminalWidth(): number {\n return process.stdout.columns || 80\n}\n\nconst DEFAULT_UPDATE_COMMANDS = [\n 'bun add -g @within-7/minto@latest',\n 'npm install -g @within-7/minto@latest',\n] as const\n\nexport function Logo({\n mcpClients,\n isDefaultModel = false,\n updateBannerVersion,\n updateBannerCommands,\n}: {\n mcpClients: WrappedClient[]\n isDefaultModel?: boolean\n updateBannerVersion?: string | null\n updateBannerCommands?: string[] | null\n}): React.ReactNode {\n const theme = getTheme()\n const cwd = getCwd()\n const projectName = path.basename(cwd)\n const logoLines = ['\u2588\u2580\u2584\u2580\u2588 \u2588 \u2588\u2584 \u2588 \u2580\u2588\u2580 \u2588\u2580\u2588', '\u2588 \u2580 \u2588 \u2588 \u2588 \u2580\u2588 \u2588 \u2588\u2584\u2588']\n\n // Use explicit terminal width to ensure full-width rendering\n // This is critical after clearTerminal() when Ink's Static re-renders\n const terminalWidth = getTerminalWidth()\n\n return (\n <Box flexDirection=\"column\" width={terminalWidth}>\n {/* Update banner - outside the bordered area */}\n {updateBannerVersion ? (\n <Box flexDirection=\"column\" paddingX={1} marginBottom={1}>\n <Text color={SEMANTIC_COLORS.running}>\n New version available: {updateBannerVersion} (current:{' '}\n {MACRO.VERSION})\n </Text>\n <Text>Run the following command to update:</Text>\n <Text>\n {' '}\n {updateBannerCommands?.[1] ?? DEFAULT_UPDATE_COMMANDS[1]}\n </Text>\n {process.platform !== 'win32' && (\n <Text color={SEMANTIC_COLORS.dim}>\n Note: you may need to prefix with \"sudo\" on macOS/Linux.\n </Text>\n )}\n </Box>\n ) : null}\n\n {/* Main header with top/bottom borders */}\n <Box\n flexDirection=\"column\"\n borderTop={true}\n borderBottom={true}\n borderLeft={false}\n borderRight={false}\n borderColor={BRAND_GRADIENT.START}\n borderStyle=\"single\"\n width={terminalWidth}\n paddingX={1}\n paddingY={1}\n >\n {/* Logo section - centered */}\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text color={BRAND_GRADIENT.START}>\u25C6</Text>\n <Box flexDirection=\"column\" alignItems=\"center\" marginY={1}>\n <Text color={BRAND_GRADIENT.START} bold>\n {logoLines[0]}\n </Text>\n <Text color={BRAND_GRADIENT.END} bold>\n {logoLines[1]}\n </Text>\n </Box>\n <Text>\n <Text color={BRAND_GRADIENT.START}>Strategic AI</Text>\n <Text color={theme.secondaryText}> \u00B7 </Text>\n <Text color={BRAND_GRADIENT.END}>Global Excellence</Text>\n <Text color={SEMANTIC_COLORS.dim}> \u00B7 v{MACRO.VERSION}</Text>\n </Text>\n </Box>\n\n {/* Welcome message */}\n <Box marginTop={1}>\n <Text>\n <Text color={BRAND_GRADIENT.START}>\u273B</Text> {t('ui.welcome.title')}\n </Text>\n </Box>\n\n {/* Quick start tips */}\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold>{t('ui.welcome.quickStart')}:</Text>\n <Text>\u2022 {t('ui.welcome.tip1')}</Text>\n <Text>\u2022 {t('ui.welcome.tip2')}</Text>\n <Text>\u2022 {t('ui.welcome.tip3')}</Text>\n </Box>\n\n {/* Project folder */}\n <Box marginTop={1}>\n <Text color={theme.secondaryText}>\uD83D\uDCC2 {projectName}</Text>\n </Box>\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "AAAA,SAAS,KAAK,YAAY;AAC1B,YAAY,WAAW;AACvB,SAAS,gBAAgB;AACzB,SAAS,cAAc;AAEvB,SAAS,aAAa;AACtB,SAAS,SAAS;AAClB,OAAO,UAAU;AACjB,SAAS,gBAAgB,uBAAuB;AAEzC,MAAM,iBAAiB;AAO9B,SAAS,mBAA2B;AAClC,SAAO,QAAQ,OAAO,WAAW;AACnC;AAEA,MAAM,0BAA0B;AAAA,EAC9B;AAAA,EACA;AACF;AAEO,SAAS,KAAK;AAAA,EACnB;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AACF,GAKoB;AAClB,QAAM,QAAQ,SAAS;AACvB,QAAM,MAAM,OAAO;AACnB,QAAM,cAAc,KAAK,SAAS,GAAG;AACrC,QAAM,YAAY,CAAC,mGAAwB,6EAAsB;AAIjE,QAAM,gBAAgB,iBAAiB;AAEvC,SACE,oCAAC,OAAI,eAAc,UAAS,OAAO,iBAEhC,sBACC,oCAAC,OAAI,eAAc,UAAS,UAAU,GAAG,cAAc,KACrD,oCAAC,QAAK,OAAO,gBAAgB,WAAS,2BACZ,qBAAoB,cAAW,KACtD,MAAM,SAAQ,GACjB,GACA,oCAAC,YAAK,sCAAoC,GAC1C,oCAAC,YACE,MACA,uBAAuB,CAAC,KAAK,wBAAwB,CAAC,CACzD,GACC,QAAQ,aAAa,WACpB,oCAAC,QAAK,OAAO,gBAAgB,OAAK,0DAElC,CAEJ,IACE,MAGJ;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,WAAW;AAAA,MACX,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,aAAa,eAAe;AAAA,MAC5B,aAAY;AAAA,MACZ,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,IAGV,oCAAC,OAAI,eAAc,UAAS,YAAW,YACrC,oCAAC,QAAK,OAAO,eAAe,SAAO,QAAC,GACpC,oCAAC,OAAI,eAAc,UAAS,YAAW,UAAS,SAAS,KACvD,oCAAC,QAAK,OAAO,eAAe,OAAO,MAAI,QACpC,UAAU,CAAC,CACd,GACA,oCAAC,QAAK,OAAO,eAAe,KAAK,MAAI,QAClC,UAAU,CAAC,CACd,CACF,GACA,oCAAC,YACC,oCAAC,QAAK,OAAO,eAAe,SAAO,cAAY,GAC/C,oCAAC,QAAK,OAAO,MAAM,iBAAe,QAAG,GACrC,oCAAC,QAAK,OAAO,eAAe,OAAK,mBAAiB,GAClD,oCAAC,QAAK,OAAO,gBAAgB,OAAK,WAAK,MAAM,OAAQ,CACvD,CACF;AAAA,IAGA,oCAAC,OAAI,WAAW,KACd,oCAAC,YACC,oCAAC,QAAK,OAAO,eAAe,SAAO,QAAC,GAAO,KAAE,EAAE,kBAAkB,CACnE,CACF;AAAA,IAGA,oCAAC,OAAI,eAAc,UAAS,WAAW,KACrC,oCAAC,QAAK,MAAI,QAAE,EAAE,uBAAuB,GAAE,GAAC,GACxC,oCAAC,YAAK,WAAG,EAAE,iBAAiB,CAAE,GAC9B,oCAAC,YAAK,WAAG,EAAE,iBAAiB,CAAE,GAC9B,oCAAC,YAAK,WAAG,EAAE,iBAAiB,CAAE,CAChC;AAAA,IAGA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAO,MAAM,iBAAe,cAAI,WAAY,CACpD;AAAA,EACF,CACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -8,6 +8,7 @@ import {
8
8
  } from "../utils/config.js";
9
9
  import { MCPServerDialogCopy } from "./MCPServerDialogCopy.js";
10
10
  import { useExitOnCtrlCD } from "../hooks/useExitOnCtrlCD.js";
11
+ import { SEMANTIC_COLORS } from "../constants/colors.js";
11
12
  function MCPServerApprovalDialog({
12
13
  serverName,
13
14
  onDone
@@ -71,7 +72,7 @@ function MCPServerApprovalDialog({
71
72
  onChange: (value) => onChange(value)
72
73
  }
73
74
  )
74
- ), /* @__PURE__ */ React.createElement(Box, { marginLeft: 3 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, exitState.pending ? /* @__PURE__ */ React.createElement(React.Fragment, null, "Press ", exitState.keyName, " again to exit") : /* @__PURE__ */ React.createElement(React.Fragment, null, "Enter to confirm \xB7 Esc to reject"))));
75
+ ), /* @__PURE__ */ React.createElement(Box, { marginLeft: 3 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, exitState.pending ? /* @__PURE__ */ React.createElement(React.Fragment, null, "Press ", exitState.keyName, " again to exit") : /* @__PURE__ */ React.createElement(React.Fragment, null, "Enter to confirm \xB7 Esc to reject"))));
75
76
  }
76
77
  export {
77
78
  MCPServerApprovalDialog
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/MCPServerApprovalDialog.tsx"],
4
- "sourcesContent": ["import React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { Select } from './CustomSelect/select'\nimport {\n saveCurrentProjectConfig,\n getCurrentProjectConfig,\n} from '@utils/config'\nimport { MCPServerDialogCopy } from './MCPServerDialogCopy'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\n\ntype Props = {\n serverName: string\n onDone(): void\n}\n\nexport function MCPServerApprovalDialog({\n serverName,\n onDone,\n}: Props): React.ReactNode {\n const theme = getTheme()\n function onChange(value: 'yes' | 'no') {\n const config = getCurrentProjectConfig()\n switch (value) {\n case 'yes': {\n if (!config.approvedMcprcServers) {\n config.approvedMcprcServers = []\n }\n if (!config.approvedMcprcServers.includes(serverName)) {\n config.approvedMcprcServers.push(serverName)\n }\n saveCurrentProjectConfig(config)\n onDone()\n break\n }\n case 'no': {\n if (!config.rejectedMcprcServers) {\n config.rejectedMcprcServers = []\n }\n if (!config.rejectedMcprcServers.includes(serverName)) {\n config.rejectedMcprcServers.push(serverName)\n }\n saveCurrentProjectConfig(config)\n onDone()\n break\n }\n }\n }\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n useInput((_input, key) => {\n if (key.escape) {\n onDone()\n return\n }\n })\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n gap={1}\n padding={1}\n borderStyle=\"round\"\n borderColor={theme.warning}\n >\n <Text bold color={theme.warning}>\n New MCP Server Detected\n </Text>\n <Text>\n This project contains a .mcprc file with an MCP server that requires\n your approval:\n </Text>\n <Text bold>{serverName}</Text>\n\n <MCPServerDialogCopy />\n\n <Text>Do you want to approve this MCP server?</Text>\n\n <Select\n options={[\n { label: 'Yes, approve this server', value: 'yes' },\n { label: 'No, reject this server', value: 'no' },\n ]}\n onChange={value => onChange(value as 'yes' | 'no')}\n />\n </Box>\n <Box marginLeft={3}>\n <Text dimColor>\n {exitState.pending ? (\n <>Press {exitState.keyName} again to exit</>\n ) : (\n <>Enter to confirm \u00B7 Esc to reject</>\n )}\n </Text>\n </Box>\n </>\n )\n}\n"],
5
- "mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAOzB,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,QAAQ,SAAS;AACvB,WAAS,SAAS,OAAqB;AACrC,UAAM,SAAS,wBAAwB;AACvC,YAAQ,OAAO;AAAA,MACb,KAAK,OAAO;AACV,YAAI,CAAC,OAAO,sBAAsB;AAChC,iBAAO,uBAAuB,CAAC;AAAA,QACjC;AACA,YAAI,CAAC,OAAO,qBAAqB,SAAS,UAAU,GAAG;AACrD,iBAAO,qBAAqB,KAAK,UAAU;AAAA,QAC7C;AACA,iCAAyB,MAAM;AAC/B,eAAO;AACP;AAAA,MACF;AAAA,MACA,KAAK,MAAM;AACT,YAAI,CAAC,OAAO,sBAAsB;AAChC,iBAAO,uBAAuB,CAAC;AAAA,QACjC;AACA,YAAI,CAAC,OAAO,qBAAqB,SAAS,UAAU,GAAG;AACrD,iBAAO,qBAAqB,KAAK,UAAU;AAAA,QAC7C;AACA,iCAAyB,MAAM;AAC/B,eAAO;AACP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,gBAAgB,MAAM,QAAQ,KAAK,CAAC,CAAC;AAEvD,WAAS,CAAC,QAAQ,QAAQ;AACxB,QAAI,IAAI,QAAQ;AACd,aAAO;AACP;AAAA,IACF;AAAA,EACF,CAAC;AAED,SACE,0DACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,KAAK;AAAA,MACL,SAAS;AAAA,MACT,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA;AAAA,IAEnB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,yBAEjC;AAAA,IACA,oCAAC,YAAK,qFAGN;AAAA,IACA,oCAAC,QAAK,MAAI,QAAE,UAAW;AAAA,IAEvB,oCAAC,yBAAoB;AAAA,IAErB,oCAAC,YAAK,yCAAuC;AAAA,IAE7C;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,UACP,EAAE,OAAO,4BAA4B,OAAO,MAAM;AAAA,UAClD,EAAE,OAAO,0BAA0B,OAAO,KAAK;AAAA,QACjD;AAAA,QACA,UAAU,WAAS,SAAS,KAAqB;AAAA;AAAA,IACnD;AAAA,EACF,GACA,oCAAC,OAAI,YAAY,KACf,oCAAC,QAAK,UAAQ,QACX,UAAU,UACT,0DAAE,UAAO,UAAU,SAAQ,gBAAc,IAEzC,0DAAE,qCAAgC,CAEtC,CACF,CACF;AAEJ;",
4
+ "sourcesContent": ["import React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { Select } from './CustomSelect/select'\nimport {\n saveCurrentProjectConfig,\n getCurrentProjectConfig,\n} from '@utils/config'\nimport { MCPServerDialogCopy } from './MCPServerDialogCopy'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ntype Props = {\n serverName: string\n onDone(): void\n}\n\nexport function MCPServerApprovalDialog({\n serverName,\n onDone,\n}: Props): React.ReactNode {\n const theme = getTheme()\n function onChange(value: 'yes' | 'no') {\n const config = getCurrentProjectConfig()\n switch (value) {\n case 'yes': {\n if (!config.approvedMcprcServers) {\n config.approvedMcprcServers = []\n }\n if (!config.approvedMcprcServers.includes(serverName)) {\n config.approvedMcprcServers.push(serverName)\n }\n saveCurrentProjectConfig(config)\n onDone()\n break\n }\n case 'no': {\n if (!config.rejectedMcprcServers) {\n config.rejectedMcprcServers = []\n }\n if (!config.rejectedMcprcServers.includes(serverName)) {\n config.rejectedMcprcServers.push(serverName)\n }\n saveCurrentProjectConfig(config)\n onDone()\n break\n }\n }\n }\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n useInput((_input, key) => {\n if (key.escape) {\n onDone()\n return\n }\n })\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n gap={1}\n padding={1}\n borderStyle=\"round\"\n borderColor={theme.warning}\n >\n <Text bold color={theme.warning}>\n New MCP Server Detected\n </Text>\n <Text>\n This project contains a .mcprc file with an MCP server that requires\n your approval:\n </Text>\n <Text bold>{serverName}</Text>\n\n <MCPServerDialogCopy />\n\n <Text>Do you want to approve this MCP server?</Text>\n\n <Select\n options={[\n { label: 'Yes, approve this server', value: 'yes' },\n { label: 'No, reject this server', value: 'no' },\n ]}\n onChange={value => onChange(value as 'yes' | 'no')}\n />\n </Box>\n <Box marginLeft={3}>\n <Text color={SEMANTIC_COLORS.dim}>\n {exitState.pending ? (\n <>Press {exitState.keyName} again to exit</>\n ) : (\n <>Enter to confirm \u00B7 Esc to reject</>\n )}\n </Text>\n </Box>\n </>\n )\n}\n"],
5
+ "mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAChC,SAAS,uBAAuB;AAOzB,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,QAAQ,SAAS;AACvB,WAAS,SAAS,OAAqB;AACrC,UAAM,SAAS,wBAAwB;AACvC,YAAQ,OAAO;AAAA,MACb,KAAK,OAAO;AACV,YAAI,CAAC,OAAO,sBAAsB;AAChC,iBAAO,uBAAuB,CAAC;AAAA,QACjC;AACA,YAAI,CAAC,OAAO,qBAAqB,SAAS,UAAU,GAAG;AACrD,iBAAO,qBAAqB,KAAK,UAAU;AAAA,QAC7C;AACA,iCAAyB,MAAM;AAC/B,eAAO;AACP;AAAA,MACF;AAAA,MACA,KAAK,MAAM;AACT,YAAI,CAAC,OAAO,sBAAsB;AAChC,iBAAO,uBAAuB,CAAC;AAAA,QACjC;AACA,YAAI,CAAC,OAAO,qBAAqB,SAAS,UAAU,GAAG;AACrD,iBAAO,qBAAqB,KAAK,UAAU;AAAA,QAC7C;AACA,iCAAyB,MAAM;AAC/B,eAAO;AACP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,gBAAgB,MAAM,QAAQ,KAAK,CAAC,CAAC;AAEvD,WAAS,CAAC,QAAQ,QAAQ;AACxB,QAAI,IAAI,QAAQ;AACd,aAAO;AACP;AAAA,IACF;AAAA,EACF,CAAC;AAED,SACE,0DACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,KAAK;AAAA,MACL,SAAS;AAAA,MACT,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA;AAAA,IAEnB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,yBAEjC;AAAA,IACA,oCAAC,YAAK,qFAGN;AAAA,IACA,oCAAC,QAAK,MAAI,QAAE,UAAW;AAAA,IAEvB,oCAAC,yBAAoB;AAAA,IAErB,oCAAC,YAAK,yCAAuC;AAAA,IAE7C;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,UACP,EAAE,OAAO,4BAA4B,OAAO,MAAM;AAAA,UAClD,EAAE,OAAO,0BAA0B,OAAO,KAAK;AAAA,QACjD;AAAA,QACA,UAAU,WAAS,SAAS,KAAqB;AAAA;AAAA,IACnD;AAAA,EACF,GACA,oCAAC,OAAI,YAAY,KACf,oCAAC,QAAK,OAAO,gBAAgB,OAC1B,UAAU,UACT,0DAAE,UAAO,UAAU,SAAQ,gBAAc,IAEzC,0DAAE,qCAAgC,CAEtC,CACF,CACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -2,8 +2,9 @@ import React from "react";
2
2
  import { Text } from "ink";
3
3
  import Link from "ink-link";
4
4
  import { PRODUCT_NAME, PRODUCT_COMMAND } from "../constants/product.js";
5
+ import { SEMANTIC_COLORS } from "../constants/colors.js";
5
6
  function MCPServerDialogCopy() {
6
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, "MCP servers provide additional functionality to ", PRODUCT_NAME, ". They may execute code, make network requests, or access system resources via tool calls. All tool calls will require your explicit approval before execution. For more information, see", " ", /* @__PURE__ */ React.createElement(Link, { url: "https://docs.anthropic.com/s/claude-code-mcp" }, "MCP documentation")), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Remember: You can always change these choices later by running `", PRODUCT_COMMAND, " mcp reset-mcprc-choices`"));
7
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, "MCP servers provide additional functionality to ", PRODUCT_NAME, ". They may execute code, make network requests, or access system resources via tool calls. All tool calls will require your explicit approval before execution. For more information, see", " ", /* @__PURE__ */ React.createElement(Link, { url: "https://docs.anthropic.com/s/claude-code-mcp" }, "MCP documentation")), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Remember: You can always change these choices later by running `", PRODUCT_COMMAND, " mcp reset-mcprc-choices`"));
7
8
  }
8
9
  export {
9
10
  MCPServerDialogCopy
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/MCPServerDialogCopy.tsx"],
4
- "sourcesContent": ["import React from 'react'\nimport { Text } from 'ink'\nimport Link from 'ink-link'\nimport { PRODUCT_NAME, PRODUCT_COMMAND } from '@constants/product'\n\nexport function MCPServerDialogCopy(): React.ReactNode {\n return (\n <>\n <Text>\n MCP servers provide additional functionality to {PRODUCT_NAME}. They may\n execute code, make network requests, or access system resources via tool\n calls. All tool calls will require your explicit approval before\n execution. For more information, see{' '}\n <Link url=\"https://docs.anthropic.com/s/claude-code-mcp\">\n MCP documentation\n </Link>\n </Text>\n\n <Text dimColor>\n Remember: You can always change these choices later by running `\n {PRODUCT_COMMAND} mcp reset-mcprc-choices`\n </Text>\n </>\n )\n}\n"],
5
- "mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,YAAY;AACrB,OAAO,UAAU;AACjB,SAAS,cAAc,uBAAuB;AAEvC,SAAS,sBAAuC;AACrD,SACE,0DACE,oCAAC,YAAK,oDAC6C,cAAa,6LAGzB,KACrC,oCAAC,QAAK,KAAI,kDAA+C,mBAEzD,CACF,GAEA,oCAAC,QAAK,UAAQ,QAAC,oEAEZ,iBAAgB,2BACnB,CACF;AAEJ;",
4
+ "sourcesContent": ["import React from 'react'\nimport { Text } from 'ink'\nimport Link from 'ink-link'\nimport { PRODUCT_NAME, PRODUCT_COMMAND } from '@constants/product'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\nexport function MCPServerDialogCopy(): React.ReactNode {\n return (\n <>\n <Text>\n MCP servers provide additional functionality to {PRODUCT_NAME}. They may\n execute code, make network requests, or access system resources via tool\n calls. All tool calls will require your explicit approval before\n execution. For more information, see{' '}\n <Link url=\"https://docs.anthropic.com/s/claude-code-mcp\">\n MCP documentation\n </Link>\n </Text>\n\n <Text color={SEMANTIC_COLORS.dim}>\n Remember: You can always change these choices later by running `\n {PRODUCT_COMMAND} mcp reset-mcprc-choices`\n </Text>\n </>\n )\n}\n"],
5
+ "mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,YAAY;AACrB,OAAO,UAAU;AACjB,SAAS,cAAc,uBAAuB;AAC9C,SAAS,uBAAuB;AAEzB,SAAS,sBAAuC;AACrD,SACE,0DACE,oCAAC,YAAK,oDAC6C,cAAa,6LAGzB,KACrC,oCAAC,QAAK,KAAI,kDAA+C,mBAEzD,CACF,GAEA,oCAAC,QAAK,OAAO,gBAAgB,OAAK,oEAE/B,iBAAgB,2BACnB,CACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -9,6 +9,7 @@ import {
9
9
  import { partition } from "lodash-es";
10
10
  import { MCPServerDialogCopy } from "./MCPServerDialogCopy.js";
11
11
  import { useExitOnCtrlCD } from "../hooks/useExitOnCtrlCD.js";
12
+ import { SEMANTIC_COLORS } from "../constants/colors.js";
12
13
  function MCPServerMultiselectDialog({
13
14
  serverNames,
14
15
  onDone
@@ -72,7 +73,7 @@ function MCPServerMultiselectDialog({
72
73
  onSubmit
73
74
  }
74
75
  )
75
- ), /* @__PURE__ */ React.createElement(Box, { marginLeft: 3 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, exitState.pending ? /* @__PURE__ */ React.createElement(React.Fragment, null, "Press ", exitState.keyName, " again to exit") : /* @__PURE__ */ React.createElement(React.Fragment, null, "Space to select \xB7 Enter to confirm \xB7 Esc to reject all"))));
76
+ ), /* @__PURE__ */ React.createElement(Box, { marginLeft: 3 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, exitState.pending ? /* @__PURE__ */ React.createElement(React.Fragment, null, "Press ", exitState.keyName, " again to exit") : /* @__PURE__ */ React.createElement(React.Fragment, null, "Space to select \xB7 Enter to confirm \xB7 Esc to reject all"))));
76
77
  }
77
78
  export {
78
79
  MCPServerMultiselectDialog
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/MCPServerMultiselectDialog.tsx"],
4
- "sourcesContent": ["import React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { MultiSelect } from '@inkjs/ui'\nimport {\n saveCurrentProjectConfig,\n getCurrentProjectConfig,\n} from '@utils/config'\nimport { partition } from 'lodash-es'\nimport { MCPServerDialogCopy } from './MCPServerDialogCopy'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\n\ntype Props = {\n serverNames: string[]\n onDone(): void\n}\n\nexport function MCPServerMultiselectDialog({\n serverNames,\n onDone,\n}: Props): React.ReactNode {\n const theme = getTheme()\n function onSubmit(selectedServers: string[]) {\n const config = getCurrentProjectConfig()\n\n // Initialize arrays if they don't exist\n if (!config.approvedMcprcServers) {\n config.approvedMcprcServers = []\n }\n if (!config.rejectedMcprcServers) {\n config.rejectedMcprcServers = []\n }\n\n // Use partition to separate approved and rejected servers\n const [approvedServers, rejectedServers] = partition(serverNames, server =>\n selectedServers.includes(server),\n )\n\n // Add new servers directly to the respective lists\n config.approvedMcprcServers.push(...approvedServers)\n config.rejectedMcprcServers.push(...rejectedServers)\n\n saveCurrentProjectConfig(config)\n onDone()\n }\n\n const exitState = useExitOnCtrlCD(() => process.exit())\n\n useInput((_input, key) => {\n if (key.escape) {\n // On escape, treat all servers as rejected\n const config = getCurrentProjectConfig()\n if (!config.rejectedMcprcServers) {\n config.rejectedMcprcServers = []\n }\n\n for (const server of serverNames) {\n if (!config.rejectedMcprcServers.includes(server)) {\n config.rejectedMcprcServers.push(server)\n }\n }\n\n saveCurrentProjectConfig(config)\n onDone()\n return\n }\n })\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n gap={1}\n padding={1}\n borderStyle=\"round\"\n borderColor={theme.warning}\n >\n <Text bold color={theme.warning}>\n New MCP Servers Detected\n </Text>\n <Text>\n This project contains a .mcprc file with {serverNames.length} MCP\n servers that require your approval.\n </Text>\n <MCPServerDialogCopy />\n\n <Text>Please select the servers you want to enable:</Text>\n\n <MultiSelect\n options={serverNames.map(server => ({\n label: server,\n value: server,\n }))}\n defaultValue={serverNames}\n onSubmit={onSubmit}\n />\n </Box>\n <Box marginLeft={3}>\n <Text dimColor>\n {exitState.pending ? (\n <>Press {exitState.keyName} again to exit</>\n ) : (\n <>Space to select \u00B7 Enter to confirm \u00B7 Esc to reject all</>\n )}\n </Text>\n </Box>\n </>\n )\n}\n"],
5
- "mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB;AAC1B,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAOzB,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,QAAQ,SAAS;AACvB,WAAS,SAAS,iBAA2B;AAC3C,UAAM,SAAS,wBAAwB;AAGvC,QAAI,CAAC,OAAO,sBAAsB;AAChC,aAAO,uBAAuB,CAAC;AAAA,IACjC;AACA,QAAI,CAAC,OAAO,sBAAsB;AAChC,aAAO,uBAAuB,CAAC;AAAA,IACjC;AAGA,UAAM,CAAC,iBAAiB,eAAe,IAAI;AAAA,MAAU;AAAA,MAAa,YAChE,gBAAgB,SAAS,MAAM;AAAA,IACjC;AAGA,WAAO,qBAAqB,KAAK,GAAG,eAAe;AACnD,WAAO,qBAAqB,KAAK,GAAG,eAAe;AAEnD,6BAAyB,MAAM;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,gBAAgB,MAAM,QAAQ,KAAK,CAAC;AAEtD,WAAS,CAAC,QAAQ,QAAQ;AACxB,QAAI,IAAI,QAAQ;AAEd,YAAM,SAAS,wBAAwB;AACvC,UAAI,CAAC,OAAO,sBAAsB;AAChC,eAAO,uBAAuB,CAAC;AAAA,MACjC;AAEA,iBAAW,UAAU,aAAa;AAChC,YAAI,CAAC,OAAO,qBAAqB,SAAS,MAAM,GAAG;AACjD,iBAAO,qBAAqB,KAAK,MAAM;AAAA,QACzC;AAAA,MACF;AAEA,+BAAyB,MAAM;AAC/B,aAAO;AACP;AAAA,IACF;AAAA,EACF,CAAC;AAED,SACE,0DACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,KAAK;AAAA,MACL,SAAS;AAAA,MACT,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA;AAAA,IAEnB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,0BAEjC;AAAA,IACA,oCAAC,YAAK,6CACsC,YAAY,QAAO,0CAE/D;AAAA,IACA,oCAAC,yBAAoB;AAAA,IAErB,oCAAC,YAAK,+CAA6C;AAAA,IAEnD;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,YAAY,IAAI,aAAW;AAAA,UAClC,OAAO;AAAA,UACP,OAAO;AAAA,QACT,EAAE;AAAA,QACF,cAAc;AAAA,QACd;AAAA;AAAA,IACF;AAAA,EACF,GACA,oCAAC,OAAI,YAAY,KACf,oCAAC,QAAK,UAAQ,QACX,UAAU,UACT,0DAAE,UAAO,UAAU,SAAQ,gBAAc,IAEzC,0DAAE,8DAAsD,CAE5D,CACF,CACF;AAEJ;",
4
+ "sourcesContent": ["import React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { MultiSelect } from '@inkjs/ui'\nimport {\n saveCurrentProjectConfig,\n getCurrentProjectConfig,\n} from '@utils/config'\nimport { partition } from 'lodash-es'\nimport { MCPServerDialogCopy } from './MCPServerDialogCopy'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ntype Props = {\n serverNames: string[]\n onDone(): void\n}\n\nexport function MCPServerMultiselectDialog({\n serverNames,\n onDone,\n}: Props): React.ReactNode {\n const theme = getTheme()\n function onSubmit(selectedServers: string[]) {\n const config = getCurrentProjectConfig()\n\n // Initialize arrays if they don't exist\n if (!config.approvedMcprcServers) {\n config.approvedMcprcServers = []\n }\n if (!config.rejectedMcprcServers) {\n config.rejectedMcprcServers = []\n }\n\n // Use partition to separate approved and rejected servers\n const [approvedServers, rejectedServers] = partition(serverNames, server =>\n selectedServers.includes(server),\n )\n\n // Add new servers directly to the respective lists\n config.approvedMcprcServers.push(...approvedServers)\n config.rejectedMcprcServers.push(...rejectedServers)\n\n saveCurrentProjectConfig(config)\n onDone()\n }\n\n const exitState = useExitOnCtrlCD(() => process.exit())\n\n useInput((_input, key) => {\n if (key.escape) {\n // On escape, treat all servers as rejected\n const config = getCurrentProjectConfig()\n if (!config.rejectedMcprcServers) {\n config.rejectedMcprcServers = []\n }\n\n for (const server of serverNames) {\n if (!config.rejectedMcprcServers.includes(server)) {\n config.rejectedMcprcServers.push(server)\n }\n }\n\n saveCurrentProjectConfig(config)\n onDone()\n return\n }\n })\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n gap={1}\n padding={1}\n borderStyle=\"round\"\n borderColor={theme.warning}\n >\n <Text bold color={theme.warning}>\n New MCP Servers Detected\n </Text>\n <Text>\n This project contains a .mcprc file with {serverNames.length} MCP\n servers that require your approval.\n </Text>\n <MCPServerDialogCopy />\n\n <Text>Please select the servers you want to enable:</Text>\n\n <MultiSelect\n options={serverNames.map(server => ({\n label: server,\n value: server,\n }))}\n defaultValue={serverNames}\n onSubmit={onSubmit}\n />\n </Box>\n <Box marginLeft={3}>\n <Text color={SEMANTIC_COLORS.dim}>\n {exitState.pending ? (\n <>Press {exitState.keyName} again to exit</>\n ) : (\n <>Space to select \u00B7 Enter to confirm \u00B7 Esc to reject all</>\n )}\n </Text>\n </Box>\n </>\n )\n}\n"],
5
+ "mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB;AAC1B,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAChC,SAAS,uBAAuB;AAOzB,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,QAAQ,SAAS;AACvB,WAAS,SAAS,iBAA2B;AAC3C,UAAM,SAAS,wBAAwB;AAGvC,QAAI,CAAC,OAAO,sBAAsB;AAChC,aAAO,uBAAuB,CAAC;AAAA,IACjC;AACA,QAAI,CAAC,OAAO,sBAAsB;AAChC,aAAO,uBAAuB,CAAC;AAAA,IACjC;AAGA,UAAM,CAAC,iBAAiB,eAAe,IAAI;AAAA,MAAU;AAAA,MAAa,YAChE,gBAAgB,SAAS,MAAM;AAAA,IACjC;AAGA,WAAO,qBAAqB,KAAK,GAAG,eAAe;AACnD,WAAO,qBAAqB,KAAK,GAAG,eAAe;AAEnD,6BAAyB,MAAM;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,gBAAgB,MAAM,QAAQ,KAAK,CAAC;AAEtD,WAAS,CAAC,QAAQ,QAAQ;AACxB,QAAI,IAAI,QAAQ;AAEd,YAAM,SAAS,wBAAwB;AACvC,UAAI,CAAC,OAAO,sBAAsB;AAChC,eAAO,uBAAuB,CAAC;AAAA,MACjC;AAEA,iBAAW,UAAU,aAAa;AAChC,YAAI,CAAC,OAAO,qBAAqB,SAAS,MAAM,GAAG;AACjD,iBAAO,qBAAqB,KAAK,MAAM;AAAA,QACzC;AAAA,MACF;AAEA,+BAAyB,MAAM;AAC/B,aAAO;AACP;AAAA,IACF;AAAA,EACF,CAAC;AAED,SACE,0DACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,KAAK;AAAA,MACL,SAAS;AAAA,MACT,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA;AAAA,IAEnB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,0BAEjC;AAAA,IACA,oCAAC,YAAK,6CACsC,YAAY,QAAO,0CAE/D;AAAA,IACA,oCAAC,yBAAoB;AAAA,IAErB,oCAAC,YAAK,+CAA6C;AAAA,IAEnD;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,YAAY,IAAI,aAAW;AAAA,UAClC,OAAO;AAAA,UACP,OAAO;AAAA,QACT,EAAE;AAAA,QACF,cAAc;AAAA,QACd;AAAA;AAAA,IACF;AAAA,EACF,GACA,oCAAC,OAAI,YAAY,KACf,oCAAC,QAAK,OAAO,gBAAgB,OAC1B,UAAU,UACT,0DAAE,UAAO,UAAU,SAAQ,gBAAc,IAEzC,0DAAE,8DAAsD,CAE5D,CACF,CACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,6 @@
1
1
  import { Box } from "ink";
2
2
  import * as React from "react";
3
+ import { memo } from "react";
3
4
  import { logError } from "../utils/log.js";
4
5
  import { UserToolResultMessage } from "./messages/UserToolResultMessage/UserToolResultMessage.js";
5
6
  import { AssistantToolUseMessage } from "./messages/AssistantToolUseMessage.js";
@@ -8,7 +9,7 @@ import { UserTextMessage } from "./messages/UserTextMessage.js";
8
9
  import { AssistantThinkingMessage } from "./messages/AssistantThinkingMessage.js";
9
10
  import { AssistantRedactedThinkingMessage } from "./messages/AssistantRedactedThinkingMessage.js";
10
11
  import { useTerminalSize } from "../hooks/useTerminalSize.js";
11
- function Message({
12
+ const Message = memo(function Message2({
12
13
  message,
13
14
  messages,
14
15
  addMargin,
@@ -39,7 +40,9 @@ function Message({
39
40
  unresolvedToolUseIDs,
40
41
  shouldAnimate,
41
42
  shouldShowDot,
42
- width
43
+ width,
44
+ modelId: message.message.model,
45
+ thinkingMetadata: message.thinkingMetadata
43
46
  }
44
47
  )));
45
48
  }
@@ -56,7 +59,7 @@ function Message({
56
59
  options: { verbose }
57
60
  }
58
61
  )));
59
- }
62
+ });
60
63
  function UserMessage({
61
64
  message,
62
65
  messages,
@@ -96,7 +99,9 @@ function AssistantMessage({
96
99
  unresolvedToolUseIDs,
97
100
  shouldAnimate,
98
101
  shouldShowDot,
99
- width
102
+ width,
103
+ modelId,
104
+ thinkingMetadata
100
105
  }) {
101
106
  switch (param.type) {
102
107
  case "tool_use":
@@ -114,7 +119,8 @@ function AssistantMessage({
114
119
  inProgressToolUseIDs,
115
120
  unresolvedToolUseIDs,
116
121
  shouldAnimate,
117
- shouldShowDot
122
+ shouldShowDot,
123
+ modelId
118
124
  }
119
125
  );
120
126
  case "text":
@@ -128,13 +134,23 @@ function AssistantMessage({
128
134
  addMargin,
129
135
  shouldShowDot,
130
136
  verbose,
131
- width
137
+ width,
138
+ timestamp: Date.now(),
139
+ modelId
132
140
  }
133
141
  );
134
142
  case "redacted_thinking":
135
143
  return /* @__PURE__ */ React.createElement(AssistantRedactedThinkingMessage, { addMargin });
136
144
  case "thinking":
137
- return /* @__PURE__ */ React.createElement(AssistantThinkingMessage, { addMargin, param });
145
+ return /* @__PURE__ */ React.createElement(
146
+ AssistantThinkingMessage,
147
+ {
148
+ addMargin,
149
+ param,
150
+ metadata: thinkingMetadata,
151
+ showMetaInfo: verbose
152
+ }
153
+ );
138
154
  default:
139
155
  logError(`Unable to render message type: ${param.type}`);
140
156
  return null;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/Message.tsx"],
4
- "sourcesContent": ["import { Box } from 'ink'\nimport * as React from 'react'\nimport type { AssistantMessage, Message, UserMessage } from '@query'\nimport type {\n ContentBlock,\n DocumentBlockParam,\n ImageBlockParam,\n TextBlockParam,\n ThinkingBlockParam,\n ToolResultBlockParam,\n ToolUseBlockParam,\n} from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Tool } from '@tool'\nimport { logError } from '@utils/log'\nimport { UserToolResultMessage } from './messages/UserToolResultMessage/UserToolResultMessage'\nimport { AssistantToolUseMessage } from './messages/AssistantToolUseMessage'\nimport { AssistantTextMessage } from './messages/AssistantTextMessage'\nimport { UserTextMessage } from './messages/UserTextMessage'\nimport { NormalizedMessage } from '@utils/messages'\nimport { AssistantThinkingMessage } from './messages/AssistantThinkingMessage'\nimport { AssistantRedactedThinkingMessage } from './messages/AssistantRedactedThinkingMessage'\nimport { useTerminalSize } from '@hooks/useTerminalSize'\n\ntype Props = {\n message: UserMessage | AssistantMessage\n messages: NormalizedMessage[]\n // TODO: Find a way to remove this, and leave spacing to the consumer\n addMargin: boolean\n tools: Tool[]\n verbose: boolean\n debug: boolean\n erroredToolUseIDs: Set<string>\n inProgressToolUseIDs: Set<string>\n unresolvedToolUseIDs: Set<string>\n shouldAnimate: boolean\n shouldShowDot: boolean\n width?: number | string\n}\n\nexport function Message({\n message,\n messages,\n addMargin,\n tools,\n verbose,\n debug,\n erroredToolUseIDs,\n inProgressToolUseIDs,\n unresolvedToolUseIDs,\n shouldAnimate,\n shouldShowDot,\n width,\n}: Props): React.ReactNode {\n // Assistant message\n if (message.type === 'assistant') {\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n {message.message.content.map((_, index) => (\n <AssistantMessage\n key={index}\n param={_}\n costUSD={message.costUSD}\n durationMs={message.durationMs}\n addMargin={addMargin}\n tools={tools}\n debug={debug}\n options={{ verbose }}\n erroredToolUseIDs={erroredToolUseIDs}\n inProgressToolUseIDs={inProgressToolUseIDs}\n unresolvedToolUseIDs={unresolvedToolUseIDs}\n shouldAnimate={shouldAnimate}\n shouldShowDot={shouldShowDot}\n width={width}\n />\n ))}\n </Box>\n )\n }\n\n // User message\n // TODO: normalize upstream\n const content =\n typeof message.message.content === 'string'\n ? [{ type: 'text', text: message.message.content } as TextBlockParam]\n : message.message.content\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n {content.map((_, index) => (\n <UserMessage\n key={index}\n message={message}\n messages={messages}\n addMargin={addMargin}\n tools={tools}\n param={_ as TextBlockParam}\n options={{ verbose }}\n />\n ))}\n </Box>\n )\n}\n\nfunction UserMessage({\n message,\n messages,\n addMargin,\n tools,\n param,\n options: { verbose },\n}: {\n message: UserMessage\n messages: Message[]\n addMargin: boolean\n tools: Tool[]\n param:\n | TextBlockParam\n | DocumentBlockParam\n | ImageBlockParam\n | ToolUseBlockParam\n | ToolResultBlockParam\n options: {\n verbose: boolean\n }\n key?: React.Key\n}): React.ReactNode {\n const { columns } = useTerminalSize()\n switch (param.type) {\n case 'text':\n return <UserTextMessage addMargin={addMargin} param={param} />\n case 'tool_result':\n return (\n <UserToolResultMessage\n param={param}\n message={message}\n messages={messages}\n tools={tools}\n verbose={verbose}\n width={columns - 5}\n />\n )\n }\n}\n\nfunction AssistantMessage({\n param,\n costUSD,\n durationMs,\n addMargin,\n tools,\n debug,\n options: { verbose },\n erroredToolUseIDs,\n inProgressToolUseIDs,\n unresolvedToolUseIDs,\n shouldAnimate,\n shouldShowDot,\n width,\n}: {\n param:\n | ContentBlock\n | TextBlockParam\n | ImageBlockParam\n | ThinkingBlockParam\n | ToolUseBlockParam\n | ToolResultBlockParam\n costUSD: number\n durationMs: number\n addMargin: boolean\n tools: Tool[]\n debug: boolean\n options: {\n verbose: boolean\n }\n erroredToolUseIDs: Set<string>\n inProgressToolUseIDs: Set<string>\n unresolvedToolUseIDs: Set<string>\n shouldAnimate: boolean\n shouldShowDot: boolean\n width?: number | string\n key?: React.Key\n}): React.ReactNode {\n switch (param.type) {\n case 'tool_use':\n return (\n <AssistantToolUseMessage\n param={param}\n costUSD={costUSD}\n durationMs={durationMs}\n addMargin={addMargin}\n tools={tools}\n debug={debug}\n verbose={verbose}\n erroredToolUseIDs={erroredToolUseIDs}\n inProgressToolUseIDs={inProgressToolUseIDs}\n unresolvedToolUseIDs={unresolvedToolUseIDs}\n shouldAnimate={shouldAnimate}\n shouldShowDot={shouldShowDot}\n />\n )\n case 'text':\n return (\n <AssistantTextMessage\n param={param}\n costUSD={costUSD}\n durationMs={durationMs}\n debug={debug}\n addMargin={addMargin}\n shouldShowDot={shouldShowDot}\n verbose={verbose}\n width={width}\n />\n )\n case 'redacted_thinking':\n return <AssistantRedactedThinkingMessage addMargin={addMargin} />\n case 'thinking':\n return <AssistantThinkingMessage addMargin={addMargin} param={param} />\n default:\n logError(`Unable to render message type: ${param.type}`)\n return null\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,WAAW;AACpB,YAAY,WAAW;AAYvB,SAAS,gBAAgB;AACzB,SAAS,6BAA6B;AACtC,SAAS,+BAA+B;AACxC,SAAS,4BAA4B;AACrC,SAAS,uBAAuB;AAEhC,SAAS,gCAAgC;AACzC,SAAS,wCAAwC;AACjD,SAAS,uBAAuB;AAkBzB,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AAEzB,MAAI,QAAQ,SAAS,aAAa;AAChC,WACE,oCAAC,OAAI,eAAc,UAAS,OAAM,UAC/B,QAAQ,QAAQ,QAAQ,IAAI,CAAC,GAAG,UAC/B;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO;AAAA,QACP,SAAS,QAAQ;AAAA,QACjB,YAAY,QAAQ;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,EAAE,QAAQ;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF,CACD,CACH;AAAA,EAEJ;AAIA,QAAM,UACJ,OAAO,QAAQ,QAAQ,YAAY,WAC/B,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,QAAQ,CAAmB,IAClE,QAAQ,QAAQ;AACtB,SACE,oCAAC,OAAI,eAAc,UAAS,OAAM,UAC/B,QAAQ,IAAI,CAAC,GAAG,UACf;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,SAAS,EAAE,QAAQ;AAAA;AAAA,EACrB,CACD,CACH;AAEJ;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS,EAAE,QAAQ;AACrB,GAeoB;AAClB,QAAM,EAAE,QAAQ,IAAI,gBAAgB;AACpC,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,oCAAC,mBAAgB,WAAsB,OAAc;AAAA,IAC9D,KAAK;AACH,aACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAO,UAAU;AAAA;AAAA,MACnB;AAAA,EAEN;AACF;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS,EAAE,QAAQ;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAuBoB;AAClB,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,IAEJ,KAAK;AACH,aACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,IAEJ,KAAK;AACH,aAAO,oCAAC,oCAAiC,WAAsB;AAAA,IACjE,KAAK;AACH,aAAO,oCAAC,4BAAyB,WAAsB,OAAc;AAAA,IACvE;AACE,eAAS,kCAAkC,MAAM,IAAI,EAAE;AACvD,aAAO;AAAA,EACX;AACF;",
6
- "names": []
4
+ "sourcesContent": ["import { Box } from 'ink'\nimport * as React from 'react'\nimport { memo } from 'react'\nimport type {\n AssistantMessage,\n Message as QueryMessage,\n UserMessage,\n} from '@query'\nimport type {\n ContentBlock,\n DocumentBlockParam,\n ImageBlockParam,\n TextBlockParam,\n ThinkingBlockParam,\n ToolResultBlockParam,\n ToolUseBlockParam,\n} from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Tool } from '@tool'\nimport type { ThinkingMetadata } from '@minto-types/thinking'\nimport { logError } from '@utils/log'\nimport { UserToolResultMessage } from './messages/UserToolResultMessage/UserToolResultMessage'\nimport { AssistantToolUseMessage } from './messages/AssistantToolUseMessage'\nimport { AssistantTextMessage } from './messages/AssistantTextMessage'\nimport { UserTextMessage } from './messages/UserTextMessage'\nimport { NormalizedMessage } from '@utils/messages'\nimport { AssistantThinkingMessage } from './messages/AssistantThinkingMessage'\nimport { AssistantRedactedThinkingMessage } from './messages/AssistantRedactedThinkingMessage'\nimport { useTerminalSize } from '@hooks/useTerminalSize'\n\ntype Props = {\n message: UserMessage | AssistantMessage\n messages: NormalizedMessage[]\n // TODO: Find a way to remove this, and leave spacing to the consumer\n addMargin: boolean\n tools: Tool[]\n verbose: boolean\n debug: boolean\n erroredToolUseIDs: Set<string>\n inProgressToolUseIDs: Set<string>\n unresolvedToolUseIDs: Set<string>\n shouldAnimate: boolean\n shouldShowDot: boolean\n width?: number | string\n}\n\n/**\n * Message component with React.memo for performance optimization.\n * Only re-renders when props actually change.\n */\nexport const Message = memo(function Message({\n message,\n messages,\n addMargin,\n tools,\n verbose,\n debug,\n erroredToolUseIDs,\n inProgressToolUseIDs,\n unresolvedToolUseIDs,\n shouldAnimate,\n shouldShowDot,\n width,\n}: Props): React.ReactNode {\n // Assistant message\n if (message.type === 'assistant') {\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n {message.message.content.map((_, index) => (\n <AssistantMessage\n key={index}\n param={_}\n costUSD={message.costUSD}\n durationMs={message.durationMs}\n addMargin={addMargin}\n tools={tools}\n debug={debug}\n options={{ verbose }}\n erroredToolUseIDs={erroredToolUseIDs}\n inProgressToolUseIDs={inProgressToolUseIDs}\n unresolvedToolUseIDs={unresolvedToolUseIDs}\n shouldAnimate={shouldAnimate}\n shouldShowDot={shouldShowDot}\n width={width}\n modelId={message.message.model}\n thinkingMetadata={message.thinkingMetadata}\n />\n ))}\n </Box>\n )\n }\n\n // User message\n // TODO: normalize upstream\n const content =\n typeof message.message.content === 'string'\n ? [{ type: 'text', text: message.message.content } as TextBlockParam]\n : message.message.content\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n {content.map((_, index) => (\n <UserMessage\n key={index}\n message={message}\n messages={messages}\n addMargin={addMargin}\n tools={tools}\n param={_ as TextBlockParam}\n options={{ verbose }}\n />\n ))}\n </Box>\n )\n})\n\nfunction UserMessage({\n message,\n messages,\n addMargin,\n tools,\n param,\n options: { verbose },\n}: {\n message: UserMessage\n messages: QueryMessage[]\n addMargin: boolean\n tools: Tool[]\n param:\n | TextBlockParam\n | DocumentBlockParam\n | ImageBlockParam\n | ToolUseBlockParam\n | ToolResultBlockParam\n options: {\n verbose: boolean\n }\n key?: React.Key\n}): React.ReactNode {\n const { columns } = useTerminalSize()\n switch (param.type) {\n case 'text':\n return <UserTextMessage addMargin={addMargin} param={param} />\n case 'tool_result':\n return (\n <UserToolResultMessage\n param={param}\n message={message}\n messages={messages}\n tools={tools}\n verbose={verbose}\n width={columns - 5}\n />\n )\n }\n}\n\nfunction AssistantMessage({\n param,\n costUSD,\n durationMs,\n addMargin,\n tools,\n debug,\n options: { verbose },\n erroredToolUseIDs,\n inProgressToolUseIDs,\n unresolvedToolUseIDs,\n shouldAnimate,\n shouldShowDot,\n width,\n modelId,\n thinkingMetadata,\n}: {\n param:\n | ContentBlock\n | TextBlockParam\n | ImageBlockParam\n | ThinkingBlockParam\n | ToolUseBlockParam\n | ToolResultBlockParam\n costUSD: number\n durationMs: number\n addMargin: boolean\n tools: Tool[]\n debug: boolean\n options: {\n verbose: boolean\n }\n erroredToolUseIDs: Set<string>\n inProgressToolUseIDs: Set<string>\n unresolvedToolUseIDs: Set<string>\n shouldAnimate: boolean\n shouldShowDot: boolean\n width?: number | string\n key?: React.Key\n modelId?: string\n thinkingMetadata?: ThinkingMetadata\n}): React.ReactNode {\n switch (param.type) {\n case 'tool_use':\n return (\n <AssistantToolUseMessage\n param={param}\n costUSD={costUSD}\n durationMs={durationMs}\n addMargin={addMargin}\n tools={tools}\n debug={debug}\n verbose={verbose}\n erroredToolUseIDs={erroredToolUseIDs}\n inProgressToolUseIDs={inProgressToolUseIDs}\n unresolvedToolUseIDs={unresolvedToolUseIDs}\n shouldAnimate={shouldAnimate}\n shouldShowDot={shouldShowDot}\n modelId={modelId}\n />\n )\n case 'text':\n return (\n <AssistantTextMessage\n param={param}\n costUSD={costUSD}\n durationMs={durationMs}\n debug={debug}\n addMargin={addMargin}\n shouldShowDot={shouldShowDot}\n verbose={verbose}\n width={width}\n timestamp={Date.now()}\n modelId={modelId}\n />\n )\n case 'redacted_thinking':\n return <AssistantRedactedThinkingMessage addMargin={addMargin} />\n case 'thinking':\n return (\n <AssistantThinkingMessage\n addMargin={addMargin}\n param={param}\n metadata={thinkingMetadata}\n showMetaInfo={verbose}\n />\n )\n default:\n logError(`Unable to render message type: ${param.type}`)\n return null\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Message"]
7
7
  }
@@ -12,6 +12,7 @@ import {
12
12
  normalizeMessages
13
13
  } from "../utils/messages.js";
14
14
  import { useExitOnCtrlCD } from "../hooks/useExitOnCtrlCD.js";
15
+ import { BRAND_GRADIENT, SEMANTIC_COLORS } from "../constants/colors.js";
15
16
  const MAX_VISIBLE_MESSAGES = 7;
16
17
  function MessageSelector({
17
18
  erroredToolUseIDs,
@@ -95,12 +96,12 @@ function MessageSelector({
95
96
  paddingX: 1,
96
97
  marginTop: 1
97
98
  },
98
- /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", minHeight: 2, marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Jump to a previous message"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "This will fork the conversation")),
99
+ /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", minHeight: 2, marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Jump to a previous message"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "This will fork the conversation")),
99
100
  allItems.slice(firstVisibleIndex, firstVisibleIndex + MAX_VISIBLE_MESSAGES).map((msg, index) => {
100
101
  const actualIndex = firstVisibleIndex + index;
101
102
  const isSelected = actualIndex === selectedIndex;
102
103
  const isCurrent = msg.uuid === currentUUID;
103
- return /* @__PURE__ */ React.createElement(Box, { key: msg.uuid, flexDirection: "row", height: 2, minHeight: 2 }, /* @__PURE__ */ React.createElement(Box, { width: 7 }, isSelected ? /* @__PURE__ */ React.createElement(Text, { color: "blue", bold: true }, figures.pointer, " ", firstVisibleIndex + index + 1, " ") : /* @__PURE__ */ React.createElement(Text, null, " ", firstVisibleIndex + index + 1, " ")), /* @__PURE__ */ React.createElement(Box, { height: 1, overflow: "hidden", width: 100 }, isCurrent ? /* @__PURE__ */ React.createElement(Box, { width: "100%" }, /* @__PURE__ */ React.createElement(Text, { dimColor: true, italic: true }, "(current)")) : Array.isArray(msg.message.content) && msg.message.content[0]?.type === "text" && isEmptyMessageText(msg.message.content[0].text) ? /* @__PURE__ */ React.createElement(Text, { dimColor: true, italic: true }, "(empty message)") : /* @__PURE__ */ React.createElement(
104
+ return /* @__PURE__ */ React.createElement(Box, { key: msg.uuid, flexDirection: "row", height: 2, minHeight: 2 }, /* @__PURE__ */ React.createElement(Box, { width: 7 }, isSelected ? /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START, bold: true }, figures.pointer, " ", firstVisibleIndex + index + 1, " ") : /* @__PURE__ */ React.createElement(Text, null, " ", firstVisibleIndex + index + 1, " ")), /* @__PURE__ */ React.createElement(Box, { height: 1, overflow: "hidden", width: 100 }, isCurrent ? /* @__PURE__ */ React.createElement(Box, { width: "100%" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim, italic: true }, "(current)")) : Array.isArray(msg.message.content) && msg.message.content[0]?.type === "text" && isEmptyMessageText(msg.message.content[0].text) ? /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim, italic: true }, "(empty message)") : /* @__PURE__ */ React.createElement(
104
105
  MessageComponent,
105
106
  {
106
107
  message: msg,
@@ -117,7 +118,7 @@ function MessageSelector({
117
118
  }
118
119
  )));
119
120
  })
120
- ), /* @__PURE__ */ React.createElement(Box, { marginLeft: 3 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, exitState.pending ? /* @__PURE__ */ React.createElement(React.Fragment, null, "Press ", exitState.keyName, " again to exit") : /* @__PURE__ */ React.createElement(React.Fragment, null, "\u2191/\u2193 to select \xB7 Enter to confirm \xB7 Tab/Esc to cancel"))));
121
+ ), /* @__PURE__ */ React.createElement(Box, { marginLeft: 3 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, exitState.pending ? /* @__PURE__ */ React.createElement(React.Fragment, null, "Press ", exitState.keyName, " again to exit") : /* @__PURE__ */ React.createElement(React.Fragment, null, "\u2191/\u2193 to select \xB7 Enter to confirm \xB7 Tab/Esc to cancel"))));
121
122
  }
122
123
  export {
123
124
  MessageSelector
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/MessageSelector.tsx"],
4
- "sourcesContent": ["import { Box, Text, useInput } from 'ink'\nimport * as React from 'react'\nimport { useMemo, useState, useEffect } from 'react'\nimport figures from 'figures'\nimport { getTheme } from '@utils/theme'\nimport { Message as MessageComponent } from './Message'\nimport { randomUUID } from 'crypto'\nimport { type Tool } from '@tool'\nimport {\n createUserMessage,\n isEmptyMessageText,\n isNotEmptyMessage,\n normalizeMessages,\n} from '@utils/messages'\nimport type { AssistantMessage, UserMessage } from '@query'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\n\ntype Props = {\n erroredToolUseIDs: Set<string>\n messages: (UserMessage | AssistantMessage)[]\n onSelect: (message: UserMessage) => void\n onEscape: () => void\n tools: Tool[]\n unresolvedToolUseIDs: Set<string>\n}\n\nconst MAX_VISIBLE_MESSAGES = 7\n\nexport function MessageSelector({\n erroredToolUseIDs,\n messages,\n onSelect,\n onEscape,\n tools,\n unresolvedToolUseIDs,\n}: Props): React.ReactNode {\n const currentUUID = useMemo(randomUUID, [])\n\n useEffect(() => {}, [])\n\n function handleSelect(message: UserMessage) {\n const indexFromEnd = messages.length - 1 - messages.indexOf(message)\n onSelect(message)\n }\n\n function handleEscape() {\n onEscape()\n }\n\n // Add current prompt as a virtual message\n const allItems = useMemo(\n () => [\n // Filter out tool results\n ...messages\n .filter(\n _ =>\n !(\n _.type === 'user' &&\n Array.isArray(_.message.content) &&\n _.message.content[0]?.type === 'tool_result'\n ),\n )\n // Filter out assistant messages, until we have a way to kick off the tool use loop from REPL\n .filter(_ => _.type !== 'assistant'),\n { ...createUserMessage(''), uuid: currentUUID } as UserMessage,\n ],\n [messages, currentUUID],\n )\n const [selectedIndex, setSelectedIndex] = useState(allItems.length - 1)\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n useInput((input, key) => {\n if (key.tab || key.escape) {\n handleEscape()\n return\n }\n if (key.return) {\n handleSelect(allItems[selectedIndex]!)\n return\n }\n if (key.upArrow) {\n if (key.ctrl || key.shift || key.meta) {\n // Jump to top with any modifier key\n setSelectedIndex(0)\n } else {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n }\n }\n if (key.downArrow) {\n if (key.ctrl || key.shift || key.meta) {\n // Jump to bottom with any modifier key\n setSelectedIndex(allItems.length - 1)\n } else {\n setSelectedIndex(prev => Math.min(allItems.length - 1, prev + 1))\n }\n }\n\n // Handle number keys (1-9)\n const num = Number(input)\n if (!isNaN(num) && num >= 1 && num <= Math.min(9, allItems.length)) {\n if (!allItems[num - 1]) {\n return\n }\n handleSelect(allItems[num - 1]!)\n }\n })\n\n const firstVisibleIndex = Math.max(\n 0,\n Math.min(\n selectedIndex - Math.floor(MAX_VISIBLE_MESSAGES / 2),\n allItems.length - MAX_VISIBLE_MESSAGES,\n ),\n )\n\n const normalizedMessages = useMemo(\n () => normalizeMessages(messages).filter(isNotEmptyMessage),\n [messages],\n )\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={getTheme().secondaryBorder}\n height={4 + Math.min(MAX_VISIBLE_MESSAGES, allItems.length) * 2}\n paddingX={1}\n marginTop={1}\n >\n <Box flexDirection=\"column\" minHeight={2} marginBottom={1}>\n <Text bold>Jump to a previous message</Text>\n <Text dimColor>This will fork the conversation</Text>\n </Box>\n {allItems\n .slice(firstVisibleIndex, firstVisibleIndex + MAX_VISIBLE_MESSAGES)\n .map((msg, index) => {\n const actualIndex = firstVisibleIndex + index\n const isSelected = actualIndex === selectedIndex\n const isCurrent = msg.uuid === currentUUID\n\n return (\n <Box key={msg.uuid} flexDirection=\"row\" height={2} minHeight={2}>\n <Box width={7}>\n {isSelected ? (\n <Text color=\"blue\" bold>\n {figures.pointer} {firstVisibleIndex + index + 1}{' '}\n </Text>\n ) : (\n <Text>\n {' '}\n {firstVisibleIndex + index + 1}{' '}\n </Text>\n )}\n </Box>\n <Box height={1} overflow=\"hidden\" width={100}>\n {isCurrent ? (\n <Box width=\"100%\">\n <Text dimColor italic>\n {'(current)'}\n </Text>\n </Box>\n ) : Array.isArray(msg.message.content) &&\n msg.message.content[0]?.type === 'text' &&\n isEmptyMessageText(msg.message.content[0].text) ? (\n <Text dimColor italic>\n (empty message)\n </Text>\n ) : (\n <MessageComponent\n message={msg}\n messages={normalizedMessages}\n addMargin={false}\n tools={tools}\n verbose={false}\n debug={false}\n erroredToolUseIDs={erroredToolUseIDs}\n inProgressToolUseIDs={new Set()}\n unresolvedToolUseIDs={unresolvedToolUseIDs}\n shouldAnimate={false}\n shouldShowDot={false}\n />\n )}\n </Box>\n </Box>\n )\n })}\n </Box>\n <Box marginLeft={3}>\n <Text dimColor>\n {exitState.pending ? (\n <>Press {exitState.keyName} again to exit</>\n ) : (\n <>\u2191/\u2193 to select \u00B7 Enter to confirm \u00B7 Tab/Esc to cancel</>\n )}\n </Text>\n </Box>\n </>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Box, Text, useInput } from 'ink'\nimport * as React from 'react'\nimport { useMemo, useState, useEffect } from 'react'\nimport figures from 'figures'\nimport { getTheme } from '@utils/theme'\nimport { Message as MessageComponent } from './Message'\nimport { randomUUID } from 'crypto'\nimport { type Tool } from '@tool'\nimport {\n createUserMessage,\n isEmptyMessageText,\n isNotEmptyMessage,\n normalizeMessages,\n} from '@utils/messages'\nimport type { AssistantMessage, UserMessage } from '@query'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\n\ntype Props = {\n erroredToolUseIDs: Set<string>\n messages: (UserMessage | AssistantMessage)[]\n onSelect: (message: UserMessage) => void\n onEscape: () => void\n tools: Tool[]\n unresolvedToolUseIDs: Set<string>\n}\n\nconst MAX_VISIBLE_MESSAGES = 7\n\nexport function MessageSelector({\n erroredToolUseIDs,\n messages,\n onSelect,\n onEscape,\n tools,\n unresolvedToolUseIDs,\n}: Props): React.ReactNode {\n const currentUUID = useMemo(randomUUID, [])\n\n useEffect(() => {}, [])\n\n function handleSelect(message: UserMessage) {\n const indexFromEnd = messages.length - 1 - messages.indexOf(message)\n onSelect(message)\n }\n\n function handleEscape() {\n onEscape()\n }\n\n // Add current prompt as a virtual message\n const allItems = useMemo(\n () => [\n // Filter out tool results\n ...messages\n .filter(\n _ =>\n !(\n _.type === 'user' &&\n Array.isArray(_.message.content) &&\n _.message.content[0]?.type === 'tool_result'\n ),\n )\n // Filter out assistant messages, until we have a way to kick off the tool use loop from REPL\n .filter(_ => _.type !== 'assistant'),\n { ...createUserMessage(''), uuid: currentUUID } as UserMessage,\n ],\n [messages, currentUUID],\n )\n const [selectedIndex, setSelectedIndex] = useState(allItems.length - 1)\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n useInput((input, key) => {\n if (key.tab || key.escape) {\n handleEscape()\n return\n }\n if (key.return) {\n handleSelect(allItems[selectedIndex]!)\n return\n }\n if (key.upArrow) {\n if (key.ctrl || key.shift || key.meta) {\n // Jump to top with any modifier key\n setSelectedIndex(0)\n } else {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n }\n }\n if (key.downArrow) {\n if (key.ctrl || key.shift || key.meta) {\n // Jump to bottom with any modifier key\n setSelectedIndex(allItems.length - 1)\n } else {\n setSelectedIndex(prev => Math.min(allItems.length - 1, prev + 1))\n }\n }\n\n // Handle number keys (1-9)\n const num = Number(input)\n if (!isNaN(num) && num >= 1 && num <= Math.min(9, allItems.length)) {\n if (!allItems[num - 1]) {\n return\n }\n handleSelect(allItems[num - 1]!)\n }\n })\n\n const firstVisibleIndex = Math.max(\n 0,\n Math.min(\n selectedIndex - Math.floor(MAX_VISIBLE_MESSAGES / 2),\n allItems.length - MAX_VISIBLE_MESSAGES,\n ),\n )\n\n const normalizedMessages = useMemo(\n () => normalizeMessages(messages).filter(isNotEmptyMessage),\n [messages],\n )\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={getTheme().secondaryBorder}\n height={4 + Math.min(MAX_VISIBLE_MESSAGES, allItems.length) * 2}\n paddingX={1}\n marginTop={1}\n >\n <Box flexDirection=\"column\" minHeight={2} marginBottom={1}>\n <Text bold>Jump to a previous message</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n This will fork the conversation\n </Text>\n </Box>\n {allItems\n .slice(firstVisibleIndex, firstVisibleIndex + MAX_VISIBLE_MESSAGES)\n .map((msg, index) => {\n const actualIndex = firstVisibleIndex + index\n const isSelected = actualIndex === selectedIndex\n const isCurrent = msg.uuid === currentUUID\n\n return (\n <Box key={msg.uuid} flexDirection=\"row\" height={2} minHeight={2}>\n <Box width={7}>\n {isSelected ? (\n <Text color={BRAND_GRADIENT.START} bold>\n {figures.pointer} {firstVisibleIndex + index + 1}{' '}\n </Text>\n ) : (\n <Text>\n {' '}\n {firstVisibleIndex + index + 1}{' '}\n </Text>\n )}\n </Box>\n <Box height={1} overflow=\"hidden\" width={100}>\n {isCurrent ? (\n <Box width=\"100%\">\n <Text color={SEMANTIC_COLORS.dim} italic>\n {'(current)'}\n </Text>\n </Box>\n ) : Array.isArray(msg.message.content) &&\n msg.message.content[0]?.type === 'text' &&\n isEmptyMessageText(msg.message.content[0].text) ? (\n <Text color={SEMANTIC_COLORS.dim} italic>\n (empty message)\n </Text>\n ) : (\n <MessageComponent\n message={msg}\n messages={normalizedMessages}\n addMargin={false}\n tools={tools}\n verbose={false}\n debug={false}\n erroredToolUseIDs={erroredToolUseIDs}\n inProgressToolUseIDs={new Set()}\n unresolvedToolUseIDs={unresolvedToolUseIDs}\n shouldAnimate={false}\n shouldShowDot={false}\n />\n )}\n </Box>\n </Box>\n )\n })}\n </Box>\n <Box marginLeft={3}>\n <Text color={SEMANTIC_COLORS.dim}>\n {exitState.pending ? (\n <>Press {exitState.keyName} again to exit</>\n ) : (\n <>\u2191/\u2193 to select \u00B7 Enter to confirm \u00B7 Tab/Esc to cancel</>\n )}\n </Text>\n </Box>\n </>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2,6 +2,7 @@ import React from "react";
2
2
  import { Box, Text } from "ink";
3
3
  import { usePermissionContext } from "../context/PermissionContext.js";
4
4
  import { getTheme } from "../utils/theme.js";
5
+ import { SEMANTIC_COLORS } from "../constants/colors.js";
5
6
  function ModeIndicator({
6
7
  showTransitionCount = false
7
8
  }) {
@@ -11,7 +12,7 @@ function ModeIndicator({
11
12
  if (currentMode === "default" && !showTransitionCount) {
12
13
  return null;
13
14
  }
14
- return /* @__PURE__ */ React.createElement(Box, { borderStyle: "single", padding: 1, marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", alignItems: "center" }, /* @__PURE__ */ React.createElement(Text, { color: getThemeColor(modeConfig.color, theme), bold: true }, modeConfig.icon, " ", modeConfig.label)), /* @__PURE__ */ React.createElement(Text, { color: "gray", dimColor: true }, modeConfig.description), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", justifyContent: "space-between", marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: "gray", dimColor: true }, "Press Shift+Tab to cycle modes"), showTransitionCount && /* @__PURE__ */ React.createElement(Text, { color: "gray", dimColor: true }, "Switches: ", permissionContext.metadata.transitionCount)), currentMode === "plan" && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: "cyan", dimColor: true }, "Available tools: ", permissionContext.allowedTools.join(", ")), /* @__PURE__ */ React.createElement(Text, { color: "yellow", dimColor: true }, "Use exit_plan_mode tool when ready to execute"))));
15
+ return /* @__PURE__ */ React.createElement(Box, { borderStyle: "single", padding: 1, marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", alignItems: "center" }, /* @__PURE__ */ React.createElement(Text, { color: getThemeColor(modeConfig.color, theme), bold: true }, modeConfig.icon, " ", modeConfig.label)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, modeConfig.description), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", justifyContent: "space-between", marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press Shift+Tab to cycle modes"), showTransitionCount && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Switches: ", permissionContext.metadata.transitionCount)), currentMode === "plan" && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.info }, "Available tools: ", permissionContext.allowedTools.join(", ")), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.running }, "Use exit_plan_mode tool when ready to execute"))));
15
16
  }
16
17
  function getThemeColor(colorName, theme) {
17
18
  const colorMap = {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/ModeIndicator.tsx"],
4
- "sourcesContent": ["import React from 'react'\nimport { Box, Text } from 'ink'\nimport { usePermissionContext } from '@context/PermissionContext'\nimport { getTheme } from '@utils/theme'\n\ninterface ModeIndicatorProps {\n showTransitionCount?: boolean\n}\n\nexport function ModeIndicator({\n showTransitionCount = false,\n}: ModeIndicatorProps) {\n const { currentMode, permissionContext, getModeConfig } =\n usePermissionContext()\n const theme = getTheme()\n const modeConfig = getModeConfig()\n\n // Don't show indicator for default mode unless explicitly requested\n if (currentMode === 'default' && !showTransitionCount) {\n return null\n }\n\n return (\n <Box borderStyle=\"single\" padding={1} marginY={1}>\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Text color={getThemeColor(modeConfig.color, theme)} bold>\n {modeConfig.icon} {modeConfig.label}\n </Text>\n </Box>\n\n <Text color=\"gray\" dimColor>\n {modeConfig.description}\n </Text>\n\n <Box flexDirection=\"row\" justifyContent=\"space-between\" marginTop={1}>\n <Text color=\"gray\" dimColor>\n Press Shift+Tab to cycle modes\n </Text>\n {showTransitionCount && (\n <Text color=\"gray\" dimColor>\n Switches: {permissionContext.metadata.transitionCount}\n </Text>\n )}\n </Box>\n\n {currentMode === 'plan' && (\n <Box marginTop={1}>\n <Text color=\"cyan\" dimColor>\n Available tools: {permissionContext.allowedTools.join(', ')}\n </Text>\n <Text color=\"yellow\" dimColor>\n Use exit_plan_mode tool when ready to execute\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n )\n}\n\nfunction getThemeColor(colorName: string, theme: any): string {\n const colorMap: Record<string, string> = {\n blue: theme.primary || 'blue',\n green: theme.success || 'green',\n yellow: theme.warning || 'yellow',\n red: theme.error || 'red',\n }\n\n return colorMap[colorName] || colorName\n}\n\n// Compact mode indicator for status bar\nexport function CompactModeIndicator() {\n const { currentMode, getModeConfig } = usePermissionContext()\n const modeConfig = getModeConfig()\n const theme = getTheme()\n\n if (currentMode === 'default') {\n return null\n }\n\n return (\n <Text color={getThemeColor(modeConfig.color, theme)}>\n {modeConfig.icon} {modeConfig.name}\n </Text>\n )\n}\n"],
5
- "mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,YAAY;AAC1B,SAAS,4BAA4B;AACrC,SAAS,gBAAgB;AAMlB,SAAS,cAAc;AAAA,EAC5B,sBAAsB;AACxB,GAAuB;AACrB,QAAM,EAAE,aAAa,mBAAmB,cAAc,IACpD,qBAAqB;AACvB,QAAM,QAAQ,SAAS;AACvB,QAAM,aAAa,cAAc;AAGjC,MAAI,gBAAgB,aAAa,CAAC,qBAAqB;AACrD,WAAO;AAAA,EACT;AAEA,SACE,oCAAC,OAAI,aAAY,UAAS,SAAS,GAAG,SAAS,KAC7C,oCAAC,OAAI,eAAc,YACjB,oCAAC,OAAI,eAAc,OAAM,YAAW,YAClC,oCAAC,QAAK,OAAO,cAAc,WAAW,OAAO,KAAK,GAAG,MAAI,QACtD,WAAW,MAAK,KAAE,WAAW,KAChC,CACF,GAEA,oCAAC,QAAK,OAAM,QAAO,UAAQ,QACxB,WAAW,WACd,GAEA,oCAAC,OAAI,eAAc,OAAM,gBAAe,iBAAgB,WAAW,KACjE,oCAAC,QAAK,OAAM,QAAO,UAAQ,QAAC,gCAE5B,GACC,uBACC,oCAAC,QAAK,OAAM,QAAO,UAAQ,QAAC,cACf,kBAAkB,SAAS,eACxC,CAEJ,GAEC,gBAAgB,UACf,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAM,QAAO,UAAQ,QAAC,qBACR,kBAAkB,aAAa,KAAK,IAAI,CAC5D,GACA,oCAAC,QAAK,OAAM,UAAS,UAAQ,QAAC,+CAE9B,CACF,CAEJ,CACF;AAEJ;AAEA,SAAS,cAAc,WAAmB,OAAoB;AAC5D,QAAM,WAAmC;AAAA,IACvC,MAAM,MAAM,WAAW;AAAA,IACvB,OAAO,MAAM,WAAW;AAAA,IACxB,QAAQ,MAAM,WAAW;AAAA,IACzB,KAAK,MAAM,SAAS;AAAA,EACtB;AAEA,SAAO,SAAS,SAAS,KAAK;AAChC;AAGO,SAAS,uBAAuB;AACrC,QAAM,EAAE,aAAa,cAAc,IAAI,qBAAqB;AAC5D,QAAM,aAAa,cAAc;AACjC,QAAM,QAAQ,SAAS;AAEvB,MAAI,gBAAgB,WAAW;AAC7B,WAAO;AAAA,EACT;AAEA,SACE,oCAAC,QAAK,OAAO,cAAc,WAAW,OAAO,KAAK,KAC/C,WAAW,MAAK,KAAE,WAAW,IAChC;AAEJ;",
4
+ "sourcesContent": ["import React from 'react'\nimport { Box, Text } from 'ink'\nimport { usePermissionContext } from '@context/PermissionContext'\nimport { getTheme } from '@utils/theme'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ninterface ModeIndicatorProps {\n showTransitionCount?: boolean\n}\n\nexport function ModeIndicator({\n showTransitionCount = false,\n}: ModeIndicatorProps) {\n const { currentMode, permissionContext, getModeConfig } =\n usePermissionContext()\n const theme = getTheme()\n const modeConfig = getModeConfig()\n\n // Don't show indicator for default mode unless explicitly requested\n if (currentMode === 'default' && !showTransitionCount) {\n return null\n }\n\n return (\n <Box borderStyle=\"single\" padding={1} marginY={1}>\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Text color={getThemeColor(modeConfig.color, theme)} bold>\n {modeConfig.icon} {modeConfig.label}\n </Text>\n </Box>\n\n <Text color={SEMANTIC_COLORS.dim}>{modeConfig.description}</Text>\n\n <Box flexDirection=\"row\" justifyContent=\"space-between\" marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n Press Shift+Tab to cycle modes\n </Text>\n {showTransitionCount && (\n <Text color={SEMANTIC_COLORS.dim}>\n Switches: {permissionContext.metadata.transitionCount}\n </Text>\n )}\n </Box>\n\n {currentMode === 'plan' && (\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.info}>\n Available tools: {permissionContext.allowedTools.join(', ')}\n </Text>\n <Text color={SEMANTIC_COLORS.running}>\n Use exit_plan_mode tool when ready to execute\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n )\n}\n\nfunction getThemeColor(colorName: string, theme: any): string {\n const colorMap: Record<string, string> = {\n blue: theme.primary || 'blue',\n green: theme.success || 'green',\n yellow: theme.warning || 'yellow',\n red: theme.error || 'red',\n }\n\n return colorMap[colorName] || colorName\n}\n\n// Compact mode indicator for status bar\nexport function CompactModeIndicator() {\n const { currentMode, getModeConfig } = usePermissionContext()\n const modeConfig = getModeConfig()\n const theme = getTheme()\n\n if (currentMode === 'default') {\n return null\n }\n\n return (\n <Text color={getThemeColor(modeConfig.color, theme)}>\n {modeConfig.icon} {modeConfig.name}\n </Text>\n )\n}\n"],
5
+ "mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,YAAY;AAC1B,SAAS,4BAA4B;AACrC,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAMzB,SAAS,cAAc;AAAA,EAC5B,sBAAsB;AACxB,GAAuB;AACrB,QAAM,EAAE,aAAa,mBAAmB,cAAc,IACpD,qBAAqB;AACvB,QAAM,QAAQ,SAAS;AACvB,QAAM,aAAa,cAAc;AAGjC,MAAI,gBAAgB,aAAa,CAAC,qBAAqB;AACrD,WAAO;AAAA,EACT;AAEA,SACE,oCAAC,OAAI,aAAY,UAAS,SAAS,GAAG,SAAS,KAC7C,oCAAC,OAAI,eAAc,YACjB,oCAAC,OAAI,eAAc,OAAM,YAAW,YAClC,oCAAC,QAAK,OAAO,cAAc,WAAW,OAAO,KAAK,GAAG,MAAI,QACtD,WAAW,MAAK,KAAE,WAAW,KAChC,CACF,GAEA,oCAAC,QAAK,OAAO,gBAAgB,OAAM,WAAW,WAAY,GAE1D,oCAAC,OAAI,eAAc,OAAM,gBAAe,iBAAgB,WAAW,KACjE,oCAAC,QAAK,OAAO,gBAAgB,OAAK,gCAElC,GACC,uBACC,oCAAC,QAAK,OAAO,gBAAgB,OAAK,cACrB,kBAAkB,SAAS,eACxC,CAEJ,GAEC,gBAAgB,UACf,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAO,gBAAgB,QAAM,qBACf,kBAAkB,aAAa,KAAK,IAAI,CAC5D,GACA,oCAAC,QAAK,OAAO,gBAAgB,WAAS,+CAEtC,CACF,CAEJ,CACF;AAEJ;AAEA,SAAS,cAAc,WAAmB,OAAoB;AAC5D,QAAM,WAAmC;AAAA,IACvC,MAAM,MAAM,WAAW;AAAA,IACvB,OAAO,MAAM,WAAW;AAAA,IACxB,QAAQ,MAAM,WAAW;AAAA,IACzB,KAAK,MAAM,SAAS;AAAA,EACtB;AAEA,SAAO,SAAS,SAAS,KAAK;AAChC;AAGO,SAAS,uBAAuB;AACrC,QAAM,EAAE,aAAa,cAAc,IAAI,qBAAqB;AAC5D,QAAM,aAAa,cAAc;AACjC,QAAM,QAAQ,SAAS;AAEvB,MAAI,gBAAgB,WAAW;AAC7B,WAAO;AAAA,EACT;AAEA,SACE,oCAAC,QAAK,OAAO,cAAc,WAAW,OAAO,KAAK,KAC/C,WAAW,MAAK,KAAE,WAAW,IAChC;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -9,8 +9,9 @@ import {
9
9
  } from "../utils/config.js";
10
10
  import { getModelManager } from "../utils/model.js";
11
11
  import { useExitOnCtrlCD } from "../hooks/useExitOnCtrlCD.js";
12
- import { ModelSelector } from "./ModelSelector.js";
12
+ import { ModelSelector } from "./ModelSelector/index.js";
13
13
  import { ModelListManager } from "./ModelListManager.js";
14
+ import { SEMANTIC_COLORS } from "../constants/colors.js";
14
15
  function ModelConfig({ onClose }) {
15
16
  const config = getGlobalConfig();
16
17
  const theme = getTheme();
@@ -23,7 +24,9 @@ function ModelConfig({ onClose }) {
23
24
  const [refreshKey, setRefreshKey] = useState(0);
24
25
  const [isDeleteMode, setIsDeleteMode] = useState(false);
25
26
  const selectedIndexRef = useRef(selectedIndex);
26
- const exitState = useExitOnCtrlCD(() => process.exit(0));
27
+ const exitState = useExitOnCtrlCD(() => process.exit(0), {
28
+ isActive: !showModelSelector && !showModelListManager
29
+ });
27
30
  const modelManager = getModelManager();
28
31
  useEffect(() => {
29
32
  selectedIndexRef.current = selectedIndex;
@@ -69,6 +72,15 @@ function ModelConfig({ onClose }) {
69
72
  options: availableModels,
70
73
  type: "modelPointer",
71
74
  onChange: (value) => handleModelPointerChange("quick", value)
75
+ },
76
+ {
77
+ id: "compact",
78
+ label: "Compact Model",
79
+ description: "Model for context compression and summarization",
80
+ value: config.modelPointers?.compact || "",
81
+ options: availableModels,
82
+ type: "modelPointer",
83
+ onChange: (value) => handleModelPointerChange("compact", value)
72
84
  }
73
85
  ];
74
86
  return [
@@ -141,7 +153,9 @@ function ModelConfig({ onClose }) {
141
153
  },
142
154
  [selectedIndex, menuItems, onClose, isDeleteMode, modelManager]
143
155
  );
144
- useInput(handleInput);
156
+ useInput(handleInput, {
157
+ isActive: !showModelSelector && !showModelListManager
158
+ });
145
159
  if (showModelListManager) {
146
160
  return /* @__PURE__ */ React.createElement(ModelListManager, { onClose: handleModelConfigurationComplete });
147
161
  }
@@ -167,7 +181,7 @@ function ModelConfig({ onClose }) {
167
181
  paddingX: 1,
168
182
  marginTop: 1
169
183
  },
170
- /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", minHeight: 2, marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Model Configuration", isDeleteMode ? " - CLEAR MODE" : ""), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, isDeleteMode ? "Press Enter/Space to clear selected pointer assignment, Esc to cancel" : availableModels.length === 0 ? 'No models configured. Use "Configure New Model" to add your first model.' : "Configure which models to use for different tasks. Space to cycle, Enter to configure.")),
184
+ /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", minHeight: 2, marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Model Configuration", isDeleteMode ? " - CLEAR MODE" : ""), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, isDeleteMode ? "Press Enter/Space to clear selected pointer assignment, Esc to cancel" : availableModels.length === 0 ? 'No models configured. Use "Configure New Model" to add your first model.' : "Configure which models to use for different tasks. Space to cycle, Enter to configure.")),
171
185
  menuItems.map((setting, i) => {
172
186
  const isSelected = i === selectedIndex;
173
187
  let displayValue = "";
@@ -188,7 +202,7 @@ function ModelConfig({ onClose }) {
188
202
  color: displayValue !== "(not configured)" ? theme.success : theme.warning
189
203
  },
190
204
  displayValue
191
- ), actionText && /* @__PURE__ */ React.createElement(Text, { color: "blue" }, actionText))), isSelected && /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, setting.description)));
205
+ ), actionText && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.info }, actionText))), isSelected && /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, setting.description)));
192
206
  }),
193
207
  /* @__PURE__ */ React.createElement(
194
208
  Box,
@@ -198,7 +212,7 @@ function ModelConfig({ onClose }) {
198
212
  borderTopColor: theme.secondaryBorder,
199
213
  borderTopStyle: "single"
200
214
  },
201
- /* @__PURE__ */ React.createElement(Text, { dimColor: true }, isDeleteMode ? "CLEAR MODE: Press Enter/Space to clear assignment, Esc to cancel" : availableModels.length === 0 ? "Use \u2191/\u2193 to navigate, Enter to configure new model, Esc to exit" : "Use \u2191/\u2193 to navigate, Space to cycle models, Enter to configure, d to clear, Esc to exit")
215
+ /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, isDeleteMode ? "CLEAR MODE: Press Enter/Space to clear assignment, Esc to cancel" : availableModels.length === 0 ? "Use \u2191/\u2193 to navigate, Enter to configure new model, Esc to exit" : "Use \u2191/\u2193 to navigate, Space to cycle models, Enter to configure, d to clear, Esc to exit")
202
216
  )
203
217
  );
204
218
  }