@within-7/minto 0.1.6 → 0.2.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 (487) 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 +52 -26
  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 +84 -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 +156 -0
  22. package/dist/commands/export.js.map +7 -0
  23. package/dist/commands/mcp-interactive.js +21 -12
  24. package/dist/commands/mcp-interactive.js.map +2 -2
  25. package/dist/commands/model.js +6 -5
  26. package/dist/commands/model.js.map +2 -2
  27. package/dist/commands/permissions.js +86 -0
  28. package/dist/commands/permissions.js.map +7 -0
  29. package/dist/commands/quit.js +3 -1
  30. package/dist/commands/quit.js.map +2 -2
  31. package/dist/commands/sandbox.js +104 -0
  32. package/dist/commands/sandbox.js.map +7 -0
  33. package/dist/commands/status.js +58 -0
  34. package/dist/commands/status.js.map +7 -0
  35. package/dist/commands/tasks.js +108 -0
  36. package/dist/commands/tasks.js.map +7 -0
  37. package/dist/commands/todos.js +123 -0
  38. package/dist/commands/todos.js.map +7 -0
  39. package/dist/commands.js +20 -2
  40. package/dist/commands.js.map +2 -2
  41. package/dist/components/AgentThinkingBlock.js +10 -18
  42. package/dist/components/AgentThinkingBlock.js.map +2 -2
  43. package/dist/components/BackgroundTasksPanel.js +78 -29
  44. package/dist/components/BackgroundTasksPanel.js.map +2 -2
  45. package/dist/components/BashStreamingProgress.js +24 -0
  46. package/dist/components/BashStreamingProgress.js.map +7 -0
  47. package/dist/components/CollapsibleHint.js +14 -0
  48. package/dist/components/CollapsibleHint.js.map +7 -0
  49. package/dist/components/FileEditToolUpdatedMessage.js +1 -1
  50. package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
  51. package/dist/components/HotkeyHelpPanel.js +137 -0
  52. package/dist/components/HotkeyHelpPanel.js.map +7 -0
  53. package/dist/components/Logo.js +5 -5
  54. package/dist/components/Logo.js.map +2 -2
  55. package/dist/components/Message.js +23 -7
  56. package/dist/components/Message.js.map +3 -3
  57. package/dist/components/ModelConfig.js +16 -3
  58. package/dist/components/ModelConfig.js.map +2 -2
  59. package/dist/components/ModelListManager.js +3 -3
  60. package/dist/components/ModelListManager.js.map +2 -2
  61. package/dist/components/ModelSelector/ModelSelector.js +1 -1
  62. package/dist/components/Onboarding.js +19 -14
  63. package/dist/components/Onboarding.js.map +2 -2
  64. package/dist/components/ProgressBar.js +74 -0
  65. package/dist/components/ProgressBar.js.map +7 -0
  66. package/dist/components/PromptInput.js +156 -46
  67. package/dist/components/PromptInput.js.map +2 -2
  68. package/dist/components/RequestStatusIndicator.js +194 -0
  69. package/dist/components/RequestStatusIndicator.js.map +7 -0
  70. package/dist/components/Spinner.js +92 -27
  71. package/dist/components/Spinner.js.map +2 -2
  72. package/dist/components/SpinnerSymbol.js +21 -27
  73. package/dist/components/SpinnerSymbol.js.map +2 -2
  74. package/dist/components/StreamingBashOutput.js +9 -8
  75. package/dist/components/StreamingBashOutput.js.map +2 -2
  76. package/dist/components/SubagentBlock.js +1 -1
  77. package/dist/components/SubagentBlock.js.map +1 -1
  78. package/dist/components/SubagentProgress.js +10 -11
  79. package/dist/components/SubagentProgress.js.map +2 -2
  80. package/dist/components/TaskCard.js +16 -13
  81. package/dist/components/TaskCard.js.map +2 -2
  82. package/dist/components/TodoChangeBlock.js +1 -1
  83. package/dist/components/TodoChangeBlock.js.map +2 -2
  84. package/dist/components/TodoPanel.js +120 -29
  85. package/dist/components/TodoPanel.js.map +3 -3
  86. package/dist/components/TokenCounter.js +74 -0
  87. package/dist/components/TokenCounter.js.map +7 -0
  88. package/dist/components/TokenWarning.js +2 -1
  89. package/dist/components/TokenWarning.js.map +2 -2
  90. package/dist/components/TreeConnector.js +25 -0
  91. package/dist/components/TreeConnector.js.map +7 -0
  92. package/dist/components/TurnCompletionIndicator.js +18 -0
  93. package/dist/components/TurnCompletionIndicator.js.map +7 -0
  94. package/dist/components/messages/AssistantTextMessage.js +5 -2
  95. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  96. package/dist/components/messages/AssistantThinkingMessage.js +18 -3
  97. package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
  98. package/dist/components/messages/AssistantToolUseMessage.js +11 -8
  99. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  100. package/dist/components/messages/GroupRenderer.js +53 -0
  101. package/dist/components/messages/GroupRenderer.js.map +7 -0
  102. package/dist/components/messages/NestedTasksPreview.js +12 -0
  103. package/dist/components/messages/NestedTasksPreview.js.map +7 -0
  104. package/dist/components/messages/ParallelTasksGroupView.js +92 -0
  105. package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
  106. package/dist/components/messages/TaskInModuleView.js +198 -0
  107. package/dist/components/messages/TaskInModuleView.js.map +7 -0
  108. package/dist/components/messages/TaskOutputContent.js +53 -0
  109. package/dist/components/messages/TaskOutputContent.js.map +7 -0
  110. package/dist/components/messages/UserPromptMessage.js +1 -1
  111. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  112. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
  113. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
  114. package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
  115. package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
  116. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
  117. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
  118. package/dist/constants/colors.js +48 -0
  119. package/dist/constants/colors.js.map +2 -2
  120. package/dist/constants/formatRules.js +102 -0
  121. package/dist/constants/formatRules.js.map +7 -0
  122. package/dist/constants/prompts.js +12 -34
  123. package/dist/constants/prompts.js.map +2 -2
  124. package/dist/constants/symbols.js +64 -6
  125. package/dist/constants/symbols.js.map +2 -2
  126. package/dist/constants/timing.js +5 -0
  127. package/dist/constants/timing.js.map +2 -2
  128. package/dist/core/config/defaults.js +84 -0
  129. package/dist/core/config/defaults.js.map +7 -0
  130. package/dist/core/config/index.js +111 -0
  131. package/dist/core/config/index.js.map +7 -0
  132. package/dist/core/config/loader.js +221 -0
  133. package/dist/core/config/loader.js.map +7 -0
  134. package/dist/core/config/migrations.js +128 -0
  135. package/dist/core/config/migrations.js.map +7 -0
  136. package/dist/core/config/schema.js +178 -0
  137. package/dist/core/config/schema.js.map +7 -0
  138. package/dist/core/costTracker.js +138 -0
  139. package/dist/core/costTracker.js.map +7 -0
  140. package/dist/core/index.js +5 -0
  141. package/dist/core/index.js.map +7 -0
  142. package/dist/core/permissions/auditLog.js +204 -0
  143. package/dist/core/permissions/auditLog.js.map +7 -0
  144. package/dist/core/permissions/engine/index.js +3 -0
  145. package/dist/core/permissions/engine/index.js.map +7 -0
  146. package/dist/core/permissions/engine/permissionEngine.js +106 -0
  147. package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
  148. package/dist/core/permissions/engine/types.js +1 -0
  149. package/dist/core/permissions/engine/types.js.map +7 -0
  150. package/dist/core/permissions/index.js +84 -0
  151. package/dist/core/permissions/index.js.map +7 -0
  152. package/dist/core/permissions/ruleEngine.js +259 -0
  153. package/dist/core/permissions/ruleEngine.js.map +7 -0
  154. package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
  155. package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
  156. package/dist/core/permissions/rules/autoEscalationRule.js +291 -0
  157. package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
  158. package/dist/core/permissions/rules/index.js +46 -0
  159. package/dist/core/permissions/rules/index.js.map +7 -0
  160. package/dist/core/permissions/rules/planModeRule.js +55 -0
  161. package/dist/core/permissions/rules/planModeRule.js.map +7 -0
  162. package/dist/core/permissions/rules/projectBoundaryRule.js +168 -0
  163. package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
  164. package/dist/core/permissions/rules/safeModeRule.js +65 -0
  165. package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
  166. package/dist/core/permissions/rules/sensitivePathsRule.js +340 -0
  167. package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
  168. package/dist/core/permissions/types.js +127 -0
  169. package/dist/core/permissions/types.js.map +7 -0
  170. package/dist/core/tools/executor.js +143 -0
  171. package/dist/core/tools/executor.js.map +7 -0
  172. package/dist/core/tools/index.js +15 -0
  173. package/dist/core/tools/index.js.map +7 -0
  174. package/dist/core/tools/registry.js +183 -0
  175. package/dist/core/tools/registry.js.map +7 -0
  176. package/dist/core/tools/types.js +1 -0
  177. package/dist/core/tools/types.js.map +7 -0
  178. package/dist/cost-tracker.js +23 -15
  179. package/dist/cost-tracker.js.map +2 -2
  180. package/dist/entrypoints/cli.js +43 -43
  181. package/dist/entrypoints/cli.js.map +2 -2
  182. package/dist/entrypoints/mcp.js +12 -4
  183. package/dist/entrypoints/mcp.js.map +2 -2
  184. package/dist/history.js +14 -3
  185. package/dist/history.js.map +2 -2
  186. package/dist/hooks/useAgentTranscripts.js +116 -0
  187. package/dist/hooks/useAgentTranscripts.js.map +7 -0
  188. package/dist/hooks/useAnimationSync.js +53 -0
  189. package/dist/hooks/useAnimationSync.js.map +7 -0
  190. package/dist/hooks/useArrowKeyHistory.js +4 -2
  191. package/dist/hooks/useArrowKeyHistory.js.map +2 -2
  192. package/dist/hooks/useCanUseTool.js +3 -1
  193. package/dist/hooks/useCanUseTool.js.map +2 -2
  194. package/dist/hooks/useCancelRequest.js +4 -1
  195. package/dist/hooks/useCancelRequest.js.map +2 -2
  196. package/dist/hooks/useExitOnCtrlCD.js +9 -5
  197. package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
  198. package/dist/hooks/useHookStatus.js +40 -0
  199. package/dist/hooks/useHookStatus.js.map +7 -0
  200. package/dist/hooks/useLogMessages.js +17 -1
  201. package/dist/hooks/useLogMessages.js.map +2 -2
  202. package/dist/hooks/useMessageGroups.js +43 -0
  203. package/dist/hooks/useMessageGroups.js.map +7 -0
  204. package/dist/hooks/useTerminalSize.js +62 -6
  205. package/dist/hooks/useTerminalSize.js.map +2 -2
  206. package/dist/hooks/useUnifiedCompletion.js +69 -0
  207. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  208. package/dist/i18n/index.js +109 -0
  209. package/dist/i18n/index.js.map +7 -0
  210. package/dist/i18n/locales/en.js +347 -0
  211. package/dist/i18n/locales/en.js.map +7 -0
  212. package/dist/i18n/locales/index.js +7 -0
  213. package/dist/i18n/locales/index.js.map +7 -0
  214. package/dist/i18n/locales/zh-CN.js +347 -0
  215. package/dist/i18n/locales/zh-CN.js.map +7 -0
  216. package/dist/i18n/types.js +8 -0
  217. package/dist/i18n/types.js.map +7 -0
  218. package/dist/query.js +175 -17
  219. package/dist/query.js.map +3 -3
  220. package/dist/screens/REPL.js +501 -192
  221. package/dist/screens/REPL.js.map +3 -3
  222. package/dist/services/adapters/chatCompletions.js +3 -1
  223. package/dist/services/adapters/chatCompletions.js.map +2 -2
  224. package/dist/services/adapters/messageNormalizer.js +354 -0
  225. package/dist/services/adapters/messageNormalizer.js.map +7 -0
  226. package/dist/services/adapters/responsesAPI.js +6 -3
  227. package/dist/services/adapters/responsesAPI.js.map +2 -2
  228. package/dist/services/checkpointManager.js +386 -0
  229. package/dist/services/checkpointManager.js.map +7 -0
  230. package/dist/services/claude.js +138 -11
  231. package/dist/services/claude.js.map +3 -3
  232. package/dist/services/compressionService.js +50 -1
  233. package/dist/services/compressionService.js.map +2 -2
  234. package/dist/services/contextMonitor.js +162 -0
  235. package/dist/services/contextMonitor.js.map +7 -0
  236. package/dist/services/customCommands.js +60 -41
  237. package/dist/services/customCommands.js.map +2 -2
  238. package/dist/services/hookExecutor.js +173 -1
  239. package/dist/services/hookExecutor.js.map +2 -2
  240. package/dist/services/intelligentCompactor.js +281 -0
  241. package/dist/services/intelligentCompactor.js.map +7 -0
  242. package/dist/services/lspConfig.js +109 -0
  243. package/dist/services/lspConfig.js.map +7 -0
  244. package/dist/services/mcpClient.js +273 -34
  245. package/dist/services/mcpClient.js.map +2 -2
  246. package/dist/services/modelOrchestrator.js +310 -0
  247. package/dist/services/modelOrchestrator.js.map +7 -0
  248. package/dist/services/openai.js +8 -1
  249. package/dist/services/openai.js.map +2 -2
  250. package/dist/services/outputStyles.js +138 -0
  251. package/dist/services/outputStyles.js.map +7 -0
  252. package/dist/services/plugins/index.js +5 -0
  253. package/dist/services/plugins/index.js.map +7 -0
  254. package/dist/services/plugins/lspServers.js +188 -0
  255. package/dist/services/plugins/lspServers.js.map +7 -0
  256. package/dist/services/plugins/pluginRuntime.js +229 -0
  257. package/dist/services/plugins/pluginRuntime.js.map +7 -0
  258. package/dist/services/plugins/pluginValidation.js +219 -0
  259. package/dist/services/plugins/pluginValidation.js.map +7 -0
  260. package/dist/services/plugins/skillMarketplace.js +556 -0
  261. package/dist/services/plugins/skillMarketplace.js.map +7 -0
  262. package/dist/services/responseStateManager.js +37 -3
  263. package/dist/services/responseStateManager.js.map +2 -2
  264. package/dist/services/sandbox/filesystemBoundary.js +300 -0
  265. package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
  266. package/dist/services/sandbox/index.js +14 -0
  267. package/dist/services/sandbox/index.js.map +7 -0
  268. package/dist/services/sandbox/networkProxy.js +293 -0
  269. package/dist/services/sandbox/networkProxy.js.map +7 -0
  270. package/dist/services/sandbox/sandboxController.js +574 -0
  271. package/dist/services/sandbox/sandboxController.js.map +7 -0
  272. package/dist/services/sandbox/types.js +50 -0
  273. package/dist/services/sandbox/types.js.map +7 -0
  274. package/dist/services/sessionMemory.js +266 -0
  275. package/dist/services/sessionMemory.js.map +7 -0
  276. package/dist/services/taskRouter.js +324 -0
  277. package/dist/services/taskRouter.js.map +7 -0
  278. package/dist/tools/ArchitectTool/ArchitectTool.js +10 -3
  279. package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
  280. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +3 -0
  281. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  282. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +8 -1
  283. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  284. package/dist/tools/BaseTool.js +72 -0
  285. package/dist/tools/BaseTool.js.map +7 -0
  286. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
  287. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
  288. package/dist/tools/BashTool/BashTool.js +60 -3
  289. package/dist/tools/BashTool/BashTool.js.map +2 -2
  290. package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
  291. package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
  292. package/dist/tools/BashTool/OutputLine.js +54 -0
  293. package/dist/tools/BashTool/OutputLine.js.map +2 -2
  294. package/dist/tools/BashTool/prompt.js +192 -3
  295. package/dist/tools/BashTool/prompt.js.map +2 -2
  296. package/dist/tools/FileEditTool/FileEditTool.js +29 -4
  297. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  298. package/dist/tools/FileReadTool/FileReadTool.js +23 -4
  299. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  300. package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
  301. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  302. package/dist/tools/GlobTool/GlobTool.js +14 -3
  303. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  304. package/dist/tools/GrepTool/GrepTool.js +41 -7
  305. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  306. package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
  307. package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
  308. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
  309. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
  310. package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
  311. package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
  312. package/dist/tools/LspTool/LspTool.js +664 -0
  313. package/dist/tools/LspTool/LspTool.js.map +7 -0
  314. package/dist/tools/LspTool/prompt.js +27 -0
  315. package/dist/tools/LspTool/prompt.js.map +7 -0
  316. package/dist/tools/MCPTool/MCPTool.js +11 -4
  317. package/dist/tools/MCPTool/MCPTool.js.map +2 -2
  318. package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
  319. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  320. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
  321. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  322. package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
  323. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  324. package/dist/tools/NotebookEditTool/NotebookEditTool.js +5 -1
  325. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  326. package/dist/tools/NotebookReadTool/NotebookReadTool.js +8 -4
  327. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
  328. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +74 -0
  329. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
  330. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +108 -0
  331. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
  332. package/dist/tools/PlanModeTool/prompt.js +94 -0
  333. package/dist/tools/PlanModeTool/prompt.js.map +7 -0
  334. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
  335. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
  336. package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
  337. package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
  338. package/dist/tools/SkillTool/SkillTool.js +14 -3
  339. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  340. package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
  341. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
  342. package/dist/tools/SlashCommandTool/prompt.js +35 -0
  343. package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
  344. package/dist/tools/TaskOutputTool/TaskOutputTool.js +189 -0
  345. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
  346. package/dist/tools/TaskOutputTool/prompt.js +15 -0
  347. package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
  348. package/dist/tools/TaskTool/TaskTool.js +321 -146
  349. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  350. package/dist/tools/TaskTool/prompt.js.map +2 -2
  351. package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -73
  352. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
  353. package/dist/tools/URLFetcherTool/URLFetcherTool.js +7 -1
  354. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  355. package/dist/tools/URLFetcherTool/cache.js +55 -8
  356. package/dist/tools/URLFetcherTool/cache.js.map +2 -2
  357. package/dist/tools/WebSearchTool/WebSearchTool.js +6 -1
  358. package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
  359. package/dist/tools.js +31 -2
  360. package/dist/tools.js.map +2 -2
  361. package/dist/types/hooks.js +4 -0
  362. package/dist/types/hooks.js.map +2 -2
  363. package/dist/types/marketplace.js.map +2 -2
  364. package/dist/types/messageGroup.js +36 -0
  365. package/dist/types/messageGroup.js.map +7 -0
  366. package/dist/types/plugin.js.map +2 -2
  367. package/dist/types/thinking.js +1 -0
  368. package/dist/types/thinking.js.map +7 -0
  369. package/dist/utils/BackgroundShellManager.js +136 -39
  370. package/dist/utils/BackgroundShellManager.js.map +2 -2
  371. package/dist/utils/MessageBatchBuffer.js +102 -0
  372. package/dist/utils/MessageBatchBuffer.js.map +7 -0
  373. package/dist/utils/PersistentShell.js +151 -1
  374. package/dist/utils/PersistentShell.js.map +2 -2
  375. package/dist/utils/agentLoader.js +1 -23
  376. package/dist/utils/agentLoader.js.map +2 -2
  377. package/dist/utils/agentTranscripts.js +641 -0
  378. package/dist/utils/agentTranscripts.js.map +7 -0
  379. package/dist/utils/animationManager.js +213 -0
  380. package/dist/utils/animationManager.js.map +7 -0
  381. package/dist/utils/animationSync.js +110 -0
  382. package/dist/utils/animationSync.js.map +7 -0
  383. package/dist/utils/asyncFile.js +215 -0
  384. package/dist/utils/asyncFile.js.map +7 -0
  385. package/dist/utils/backgroundAgentManager.js +231 -0
  386. package/dist/utils/backgroundAgentManager.js.map +7 -0
  387. package/dist/utils/config.js +63 -7
  388. package/dist/utils/config.js.map +2 -2
  389. package/dist/utils/conversationRecovery.js +19 -0
  390. package/dist/utils/conversationRecovery.js.map +2 -2
  391. package/dist/utils/exit.js +73 -0
  392. package/dist/utils/exit.js.map +7 -0
  393. package/dist/utils/format.js +73 -5
  394. package/dist/utils/format.js.map +2 -2
  395. package/dist/utils/generators.js +76 -6
  396. package/dist/utils/generators.js.map +2 -2
  397. package/dist/utils/globalErrorHandler.js +149 -0
  398. package/dist/utils/globalErrorHandler.js.map +7 -0
  399. package/dist/utils/groupHandlers/index.js +8 -0
  400. package/dist/utils/groupHandlers/index.js.map +7 -0
  401. package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
  402. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
  403. package/dist/utils/groupHandlers/taskHandler.js +104 -0
  404. package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
  405. package/dist/utils/groupHandlers/types.js +1 -0
  406. package/dist/utils/groupHandlers/types.js.map +7 -0
  407. package/dist/utils/logRotation.js +224 -0
  408. package/dist/utils/logRotation.js.map +7 -0
  409. package/dist/utils/marketplaceManager.js +3 -5
  410. package/dist/utils/marketplaceManager.js.map +2 -2
  411. package/dist/utils/memSafety.js +264 -0
  412. package/dist/utils/memSafety.js.map +7 -0
  413. package/dist/utils/messageGroupManager.js +274 -0
  414. package/dist/utils/messageGroupManager.js.map +7 -0
  415. package/dist/utils/messages.js +13 -4
  416. package/dist/utils/messages.js.map +2 -2
  417. package/dist/utils/model.js +119 -15
  418. package/dist/utils/model.js.map +3 -3
  419. package/dist/utils/permissions/filesystem.js +157 -5
  420. package/dist/utils/permissions/filesystem.js.map +2 -2
  421. package/dist/utils/plan/planMode.js +143 -0
  422. package/dist/utils/plan/planMode.js.map +7 -0
  423. package/dist/utils/pluginLoader.js +17 -21
  424. package/dist/utils/pluginLoader.js.map +2 -2
  425. package/dist/utils/ripgrep.js +55 -2
  426. package/dist/utils/ripgrep.js.map +2 -2
  427. package/dist/utils/sanitizeInput.js +32 -0
  428. package/dist/utils/sanitizeInput.js.map +7 -0
  429. package/dist/utils/secureKeyStorage.js +312 -0
  430. package/dist/utils/secureKeyStorage.js.map +7 -0
  431. package/dist/utils/session/sessionPlugins.js +67 -0
  432. package/dist/utils/session/sessionPlugins.js.map +7 -0
  433. package/dist/utils/taskDisplayUtils.js +257 -0
  434. package/dist/utils/taskDisplayUtils.js.map +7 -0
  435. package/dist/utils/teamConfig.js +2 -1
  436. package/dist/utils/teamConfig.js.map +2 -2
  437. package/dist/utils/todoStorage.js +92 -2
  438. package/dist/utils/todoStorage.js.map +2 -2
  439. package/dist/utils/toolTimeout.js +136 -0
  440. package/dist/utils/toolTimeout.js.map +7 -0
  441. package/dist/utils/tooling/safeRender.js +115 -0
  442. package/dist/utils/tooling/safeRender.js.map +7 -0
  443. package/dist/utils/userFriendlyError.js +346 -0
  444. package/dist/utils/userFriendlyError.js.map +7 -0
  445. package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
  446. package/dist/version.js +2 -2
  447. package/dist/version.js.map +1 -1
  448. package/package.json +14 -4
  449. package/scripts/postinstall.js +128 -38
  450. package/dist/commands/agents.js +0 -2086
  451. package/dist/commands/agents.js.map +0 -7
  452. package/dist/commands/build.js +0 -74
  453. package/dist/commands/build.js.map +0 -7
  454. package/dist/commands/compression.js +0 -57
  455. package/dist/commands/compression.js.map +0 -7
  456. package/dist/commands/listen.js +0 -37
  457. package/dist/commands/listen.js.map +0 -7
  458. package/dist/commands/login.js +0 -37
  459. package/dist/commands/login.js.map +0 -7
  460. package/dist/commands/logout.js +0 -33
  461. package/dist/commands/logout.js.map +0 -7
  462. package/dist/commands/mcp.js +0 -40
  463. package/dist/commands/mcp.js.map +0 -7
  464. package/dist/commands/mcp_refresh.js +0 -40
  465. package/dist/commands/mcp_refresh.js.map +0 -7
  466. package/dist/commands/modelstatus.js +0 -21
  467. package/dist/commands/modelstatus.js.map +0 -7
  468. package/dist/commands/onboarding.js +0 -36
  469. package/dist/commands/onboarding.js.map +0 -7
  470. package/dist/commands/plugin-interactive.js +0 -446
  471. package/dist/commands/plugin-interactive.js.map +0 -7
  472. package/dist/commands/pr_comments.js +0 -61
  473. package/dist/commands/pr_comments.js.map +0 -7
  474. package/dist/commands/release-notes.js +0 -30
  475. package/dist/commands/release-notes.js.map +0 -7
  476. package/dist/commands/review.js +0 -51
  477. package/dist/commands/review.js.map +0 -7
  478. package/dist/components/Bug.js +0 -147
  479. package/dist/components/Bug.js.map +0 -7
  480. package/dist/components/ModelSelector.js +0 -2062
  481. package/dist/components/ModelSelector.js.map +0 -7
  482. package/dist/components/ModelStatusDisplay.js +0 -87
  483. package/dist/components/ModelStatusDisplay.js.map +0 -7
  484. package/dist/entrypoints/cli-wrapper.js +0 -61
  485. package/dist/entrypoints/cli-wrapper.js.map +0 -7
  486. package/dist/screens/Doctor.js +0 -22
  487. package/dist/screens/Doctor.js.map +0 -7
@@ -1,21 +1,167 @@
1
- import React from "react";
2
- import { Doctor } from "../screens/Doctor.js";
3
- import { PRODUCT_NAME } from "../constants/product.js";
1
+ import { getGlobalConfig, getCurrentProjectConfig } from "../utils/config.js";
2
+ import { getModelManager } from "../utils/model.js";
3
+ import { getClients, listMCPServers } from "../services/mcpClient.js";
4
+ import { MACRO } from "../constants/macros.js";
5
+ async function runDiagnostics() {
6
+ const categories = [];
7
+ const apiResults = [];
8
+ const globalConfig = getGlobalConfig();
9
+ const anthropicKey = process.env.ANTHROPIC_API_KEY || globalConfig.modelProfiles?.some(
10
+ (p) => p.provider === "anthropic" && p.apiKey
11
+ );
12
+ const openaiKey = process.env.OPENAI_API_KEY || globalConfig.modelProfiles?.some((p) => p.provider === "openai" && p.apiKey);
13
+ if (anthropicKey) {
14
+ apiResults.push({ status: "ok", message: "Anthropic API key configured" });
15
+ } else {
16
+ apiResults.push({
17
+ status: "warning",
18
+ message: "Anthropic API key not found (set ANTHROPIC_API_KEY or configure a model profile)"
19
+ });
20
+ }
21
+ if (openaiKey) {
22
+ apiResults.push({ status: "ok", message: "OpenAI API key configured" });
23
+ } else {
24
+ apiResults.push({
25
+ status: "warning",
26
+ message: "OpenAI API key not found (optional, for OpenAI-compatible models)"
27
+ });
28
+ }
29
+ categories.push({ name: "API Configuration", results: apiResults });
30
+ const modelResults = [];
31
+ const modelManager = getModelManager();
32
+ const allModels = modelManager.getAllConfiguredModels();
33
+ const activeModels = modelManager.getAvailableModels();
34
+ if (allModels.length > 0) {
35
+ modelResults.push({
36
+ status: "ok",
37
+ message: `${allModels.length} model profile(s) configured`
38
+ });
39
+ if (activeModels.length > 0) {
40
+ modelResults.push({
41
+ status: "ok",
42
+ message: `${activeModels.length} active model(s)`
43
+ });
44
+ } else {
45
+ modelResults.push({
46
+ status: "warning",
47
+ message: "No active model profiles found"
48
+ });
49
+ }
50
+ } else {
51
+ modelResults.push({
52
+ status: "error",
53
+ message: "No model profiles configured"
54
+ });
55
+ }
56
+ const pointers = globalConfig.modelPointers;
57
+ if (pointers?.main) {
58
+ modelResults.push({ status: "ok", message: `Main model: ${pointers.main}` });
59
+ } else {
60
+ modelResults.push({
61
+ status: "warning",
62
+ message: "Main model pointer not set"
63
+ });
64
+ }
65
+ categories.push({ name: "Model Configuration", results: modelResults });
66
+ const mcpResults = [];
67
+ const mcpServers = listMCPServers();
68
+ const serverCount = Object.keys(mcpServers).length;
69
+ if (serverCount > 0) {
70
+ mcpResults.push({
71
+ status: "ok",
72
+ message: `${serverCount} MCP server(s) configured`
73
+ });
74
+ try {
75
+ const clients = await getClients();
76
+ const connected = clients.filter((c) => c.type === "connected").length;
77
+ const failed = clients.filter((c) => c.type === "failed").length;
78
+ if (connected > 0) {
79
+ mcpResults.push({
80
+ status: "ok",
81
+ message: `${connected} MCP server(s) connected`
82
+ });
83
+ }
84
+ if (failed > 0) {
85
+ mcpResults.push({
86
+ status: "warning",
87
+ message: `${failed} MCP server(s) failed to connect`
88
+ });
89
+ }
90
+ } catch (error) {
91
+ mcpResults.push({
92
+ status: "warning",
93
+ message: `Could not check MCP connections: ${error instanceof Error ? error.message : String(error)}`
94
+ });
95
+ }
96
+ } else {
97
+ mcpResults.push({
98
+ status: "ok",
99
+ message: "No MCP servers configured (optional)"
100
+ });
101
+ }
102
+ categories.push({ name: "MCP Servers", results: mcpResults });
103
+ const projectResults = [];
104
+ const projectConfig = getCurrentProjectConfig();
105
+ if (Object.keys(projectConfig).length > 1) {
106
+ projectResults.push({
107
+ status: "ok",
108
+ message: "Project configuration found"
109
+ });
110
+ } else {
111
+ projectResults.push({
112
+ status: "ok",
113
+ message: "Using global configuration (no project config)"
114
+ });
115
+ }
116
+ categories.push({ name: "Project Configuration", results: projectResults });
117
+ const envResults = [];
118
+ envResults.push({ status: "ok", message: `Minto version: ${MACRO.VERSION}` });
119
+ envResults.push({ status: "ok", message: `Node.js: ${process.version}` });
120
+ envResults.push({
121
+ status: "ok",
122
+ message: `Platform: ${process.platform} ${process.arch}`
123
+ });
124
+ categories.push({ name: "Environment", results: envResults });
125
+ return categories;
126
+ }
127
+ function formatDiagnostics(categories) {
128
+ const lines = [];
129
+ lines.push("=== Minto System Diagnostics ===\n");
130
+ for (const category of categories) {
131
+ lines.push(`## ${category.name}`);
132
+ for (const result of category.results) {
133
+ const icon = result.status === "ok" ? "\u2713" : result.status === "warning" ? "\u26A0" : "\u2717";
134
+ const prefix = result.status === "ok" ? "" : `[${result.status.toUpperCase()}] `;
135
+ lines.push(` ${icon} ${prefix}${result.message}`);
136
+ }
137
+ lines.push("");
138
+ }
139
+ const allResults = categories.flatMap((c) => c.results);
140
+ const errors = allResults.filter((r) => r.status === "error").length;
141
+ const warnings = allResults.filter((r) => r.status === "warning").length;
142
+ if (errors > 0) {
143
+ lines.push(`Summary: ${errors} error(s), ${warnings} warning(s)`);
144
+ lines.push("Fix the errors above to ensure Minto works correctly.");
145
+ } else if (warnings > 0) {
146
+ lines.push(`Summary: ${warnings} warning(s)`);
147
+ lines.push("All critical checks passed. Warnings are informational.");
148
+ } else {
149
+ lines.push("Summary: All checks passed!");
150
+ }
151
+ return lines.join("\n");
152
+ }
4
153
  const doctor = {
154
+ type: "local",
5
155
  name: "doctor",
6
- description: `Checks the health of your ${PRODUCT_NAME} installation`,
156
+ description: "Run system diagnostics and check configuration",
7
157
  isEnabled: true,
8
158
  isHidden: false,
159
+ async call() {
160
+ const categories = await runDiagnostics();
161
+ return formatDiagnostics(categories);
162
+ },
9
163
  userFacingName() {
10
164
  return "doctor";
11
- },
12
- type: "local-jsx",
13
- call(onDone) {
14
- const element = React.createElement(Doctor, {
15
- onDone,
16
- doctorMode: true
17
- });
18
- return Promise.resolve(element);
19
165
  }
20
166
  };
21
167
  var doctor_default = doctor;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/doctor.ts"],
4
- "sourcesContent": ["import React from 'react'\nimport type { Command } from '@commands'\nimport { Doctor } from '@screens/Doctor'\nimport { PRODUCT_NAME } from '@constants/product'\n\nconst doctor: Command = {\n name: 'doctor',\n description: `Checks the health of your ${PRODUCT_NAME} installation`,\n isEnabled: true,\n isHidden: false,\n userFacingName() {\n return 'doctor'\n },\n type: 'local-jsx',\n call(onDone) {\n const element = React.createElement(Doctor, {\n onDone,\n doctorMode: true,\n })\n return Promise.resolve(element)\n },\n}\n\nexport default doctor\n"],
5
- "mappings": "AAAA,OAAO,WAAW;AAElB,SAAS,cAAc;AACvB,SAAS,oBAAoB;AAE7B,MAAM,SAAkB;AAAA,EACtB,MAAM;AAAA,EACN,aAAa,6BAA6B,YAAY;AAAA,EACtD,WAAW;AAAA,EACX,UAAU;AAAA,EACV,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,EACN,KAAK,QAAQ;AACX,UAAM,UAAU,MAAM,cAAc,QAAQ;AAAA,MAC1C;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AACD,WAAO,QAAQ,QAAQ,OAAO;AAAA,EAChC;AACF;AAEA,IAAO,iBAAQ;",
4
+ "sourcesContent": ["import type { Command } from '@commands'\nimport { getGlobalConfig, getCurrentProjectConfig } from '@utils/config'\nimport { getModelManager } from '@utils/model'\nimport { getClients, listMCPServers } from '@services/mcpClient'\nimport { MACRO } from '@constants/macros'\n\n/**\n * System diagnostic command\n * Checks API configuration, model settings, MCP servers, and dependencies\n */\n\ntype DiagnosticResult = {\n status: 'ok' | 'warning' | 'error'\n message: string\n}\n\ntype DiagnosticCategory = {\n name: string\n results: DiagnosticResult[]\n}\n\nasync function runDiagnostics(): Promise<DiagnosticCategory[]> {\n const categories: DiagnosticCategory[] = []\n\n // 1. Check API Configuration\n const apiResults: DiagnosticResult[] = []\n const globalConfig = getGlobalConfig()\n\n // Check for API keys in environment or config\n const anthropicKey =\n process.env.ANTHROPIC_API_KEY ||\n globalConfig.modelProfiles?.some(\n p => p.provider === 'anthropic' && p.apiKey,\n )\n const openaiKey =\n process.env.OPENAI_API_KEY ||\n globalConfig.modelProfiles?.some(p => p.provider === 'openai' && p.apiKey)\n\n if (anthropicKey) {\n apiResults.push({ status: 'ok', message: 'Anthropic API key configured' })\n } else {\n apiResults.push({\n status: 'warning',\n message:\n 'Anthropic API key not found (set ANTHROPIC_API_KEY or configure a model profile)',\n })\n }\n\n if (openaiKey) {\n apiResults.push({ status: 'ok', message: 'OpenAI API key configured' })\n } else {\n apiResults.push({\n status: 'warning',\n message:\n 'OpenAI API key not found (optional, for OpenAI-compatible models)',\n })\n }\n\n categories.push({ name: 'API Configuration', results: apiResults })\n\n // 2. Check Model Configuration\n const modelResults: DiagnosticResult[] = []\n const modelManager = getModelManager()\n const allModels = modelManager.getAllConfiguredModels()\n const activeModels = modelManager.getAvailableModels()\n\n if (allModels.length > 0) {\n modelResults.push({\n status: 'ok',\n message: `${allModels.length} model profile(s) configured`,\n })\n\n if (activeModels.length > 0) {\n modelResults.push({\n status: 'ok',\n message: `${activeModels.length} active model(s)`,\n })\n } else {\n modelResults.push({\n status: 'warning',\n message: 'No active model profiles found',\n })\n }\n } else {\n modelResults.push({\n status: 'error',\n message: 'No model profiles configured',\n })\n }\n\n // Check model pointers\n const pointers = globalConfig.modelPointers\n if (pointers?.main) {\n modelResults.push({ status: 'ok', message: `Main model: ${pointers.main}` })\n } else {\n modelResults.push({\n status: 'warning',\n message: 'Main model pointer not set',\n })\n }\n\n categories.push({ name: 'Model Configuration', results: modelResults })\n\n // 3. Check MCP Server Status\n const mcpResults: DiagnosticResult[] = []\n const mcpServers = listMCPServers()\n const serverCount = Object.keys(mcpServers).length\n\n if (serverCount > 0) {\n mcpResults.push({\n status: 'ok',\n message: `${serverCount} MCP server(s) configured`,\n })\n\n // Try to get connected clients\n try {\n const clients = await getClients()\n const connected = clients.filter(c => c.type === 'connected').length\n const failed = clients.filter(c => c.type === 'failed').length\n\n if (connected > 0) {\n mcpResults.push({\n status: 'ok',\n message: `${connected} MCP server(s) connected`,\n })\n }\n\n if (failed > 0) {\n mcpResults.push({\n status: 'warning',\n message: `${failed} MCP server(s) failed to connect`,\n })\n }\n } catch (error) {\n mcpResults.push({\n status: 'warning',\n message: `Could not check MCP connections: ${error instanceof Error ? error.message : String(error)}`,\n })\n }\n } else {\n mcpResults.push({\n status: 'ok',\n message: 'No MCP servers configured (optional)',\n })\n }\n\n categories.push({ name: 'MCP Servers', results: mcpResults })\n\n // 4. Check Project Configuration\n const projectResults: DiagnosticResult[] = []\n const projectConfig = getCurrentProjectConfig()\n\n if (Object.keys(projectConfig).length > 1) {\n // More than just defaults\n projectResults.push({\n status: 'ok',\n message: 'Project configuration found',\n })\n } else {\n projectResults.push({\n status: 'ok',\n message: 'Using global configuration (no project config)',\n })\n }\n\n categories.push({ name: 'Project Configuration', results: projectResults })\n\n // 5. Environment Info\n const envResults: DiagnosticResult[] = []\n envResults.push({ status: 'ok', message: `Minto version: ${MACRO.VERSION}` })\n envResults.push({ status: 'ok', message: `Node.js: ${process.version}` })\n envResults.push({\n status: 'ok',\n message: `Platform: ${process.platform} ${process.arch}`,\n })\n\n categories.push({ name: 'Environment', results: envResults })\n\n return categories\n}\n\nfunction formatDiagnostics(categories: DiagnosticCategory[]): string {\n const lines: string[] = []\n lines.push('=== Minto System Diagnostics ===\\n')\n\n for (const category of categories) {\n lines.push(`## ${category.name}`)\n\n for (const result of category.results) {\n const icon =\n result.status === 'ok' ? '\u2713' : result.status === 'warning' ? '\u26A0' : '\u2717'\n const prefix =\n result.status === 'ok' ? '' : `[${result.status.toUpperCase()}] `\n lines.push(` ${icon} ${prefix}${result.message}`)\n }\n\n lines.push('')\n }\n\n // Summary\n const allResults = categories.flatMap(c => c.results)\n const errors = allResults.filter(r => r.status === 'error').length\n const warnings = allResults.filter(r => r.status === 'warning').length\n\n if (errors > 0) {\n lines.push(`Summary: ${errors} error(s), ${warnings} warning(s)`)\n lines.push('Fix the errors above to ensure Minto works correctly.')\n } else if (warnings > 0) {\n lines.push(`Summary: ${warnings} warning(s)`)\n lines.push('All critical checks passed. Warnings are informational.')\n } else {\n lines.push('Summary: All checks passed!')\n }\n\n return lines.join('\\n')\n}\n\nconst doctor = {\n type: 'local',\n name: 'doctor',\n description: 'Run system diagnostics and check configuration',\n isEnabled: true,\n isHidden: false,\n async call() {\n const categories = await runDiagnostics()\n return formatDiagnostics(categories)\n },\n userFacingName() {\n return 'doctor'\n },\n} satisfies Command\n\nexport default doctor\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,156 @@
1
+ import React, { useState } from "react";
2
+ import { Box, Text, useInput } from "ink";
3
+ import { writeFile } from "fs/promises";
4
+ import { join } from "path";
5
+ import { getMessagesGetter } from "../messages.js";
6
+ import { getCwd } from "../utils/state.js";
7
+ import { loadGlobalConfig, loadProjectConfig } from "../core/config/index.js";
8
+ const EXPORT_OPTIONS = [
9
+ {
10
+ type: "conversation",
11
+ label: "Conversation",
12
+ description: "Export full conversation history as JSON"
13
+ },
14
+ {
15
+ type: "config",
16
+ label: "Configuration",
17
+ description: "Export current configuration settings"
18
+ },
19
+ {
20
+ type: "summary",
21
+ label: "Summary",
22
+ description: "Export a markdown summary of the session"
23
+ }
24
+ ];
25
+ const ExportMenu = ({ onDone }) => {
26
+ const [selectedIndex, setSelectedIndex] = useState(0);
27
+ const [exporting, setExporting] = useState(false);
28
+ const [result, setResult] = useState(null);
29
+ useInput(async (input, key) => {
30
+ if (exporting) return;
31
+ if (key.upArrow) {
32
+ setSelectedIndex(Math.max(0, selectedIndex - 1));
33
+ } else if (key.downArrow) {
34
+ setSelectedIndex(Math.min(EXPORT_OPTIONS.length - 1, selectedIndex + 1));
35
+ } else if (key.return) {
36
+ await handleExport(EXPORT_OPTIONS[selectedIndex].type);
37
+ } else if (input === "q" || key.escape) {
38
+ onDone();
39
+ }
40
+ });
41
+ const handleExport = async (type) => {
42
+ setExporting(true);
43
+ try {
44
+ const cwd = getCwd();
45
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
46
+ let filename;
47
+ let content;
48
+ switch (type) {
49
+ case "conversation": {
50
+ const messages = getMessagesGetter()();
51
+ filename = `minto-conversation-${timestamp}.json`;
52
+ content = JSON.stringify(messages, null, 2);
53
+ break;
54
+ }
55
+ case "config": {
56
+ const [globalConfig, projectConfig] = await Promise.all([
57
+ Promise.resolve(loadGlobalConfig()),
58
+ Promise.resolve(loadProjectConfig(cwd))
59
+ ]);
60
+ filename = `minto-config-${timestamp}.json`;
61
+ content = JSON.stringify(
62
+ {
63
+ global: globalConfig,
64
+ project: projectConfig
65
+ },
66
+ null,
67
+ 2
68
+ );
69
+ break;
70
+ }
71
+ case "summary": {
72
+ const messages = getMessagesGetter()();
73
+ filename = `minto-summary-${timestamp}.md`;
74
+ content = generateSummary(messages);
75
+ break;
76
+ }
77
+ }
78
+ const filepath = join(cwd, filename);
79
+ await writeFile(filepath, content, "utf-8");
80
+ setResult({
81
+ success: true,
82
+ message: `Exported to ${filename}`
83
+ });
84
+ setTimeout(() => onDone(`Exported to ${filepath}`), 2e3);
85
+ } catch (error) {
86
+ setResult({
87
+ success: false,
88
+ message: `Export failed: ${error instanceof Error ? error.message : String(error)}`
89
+ });
90
+ } finally {
91
+ setExporting(false);
92
+ }
93
+ };
94
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: "cyan" }, "Export Data")), !result ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, EXPORT_OPTIONS.map((option, index) => /* @__PURE__ */ React.createElement(Box, { key: option.type, paddingLeft: 1 }, /* @__PURE__ */ React.createElement(Text, { color: index === selectedIndex ? "cyan" : void 0 }, index === selectedIndex ? "\u25B6 " : " ", /* @__PURE__ */ React.createElement(Text, { bold: true }, option.label), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " - ", option.description))))), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2191/\u2193: Navigate | Enter: Export | q/Esc: Cancel"))) : /* @__PURE__ */ React.createElement(Box, null, result.success ? /* @__PURE__ */ React.createElement(Text, { color: "green" }, "\u2713 ", result.message) : /* @__PURE__ */ React.createElement(Text, { color: "red" }, "\u2717 ", result.message)), exporting && /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: "yellow" }, "Exporting...")));
95
+ };
96
+ function generateSummary(messages) {
97
+ const lines = [
98
+ "# Minto Session Summary",
99
+ "",
100
+ `Generated: ${(/* @__PURE__ */ new Date()).toISOString()}`,
101
+ "",
102
+ "## Conversation Overview",
103
+ "",
104
+ `Total messages: ${messages.length}`,
105
+ "",
106
+ "## Message Summary",
107
+ ""
108
+ ];
109
+ for (const msg of messages) {
110
+ const m = msg;
111
+ if (!m.role) continue;
112
+ const role = m.role === "user" ? "\u{1F464} User" : "\u{1F916} Assistant";
113
+ if (typeof m.content === "string") {
114
+ const preview = m.content.slice(0, 200).replace(/\n/g, " ");
115
+ lines.push(`### ${role}`);
116
+ lines.push("");
117
+ lines.push(`> ${preview}${m.content.length > 200 ? "..." : ""}`);
118
+ lines.push("");
119
+ } else if (Array.isArray(m.content)) {
120
+ lines.push(`### ${role}`);
121
+ lines.push("");
122
+ for (const block of m.content) {
123
+ if (block.type === "text") {
124
+ const preview = String(block.text || "").slice(0, 200).replace(/\n/g, " ");
125
+ lines.push(
126
+ `> ${preview}${String(block.text || "").length > 200 ? "..." : ""}`
127
+ );
128
+ } else if (block.type === "tool_use") {
129
+ lines.push(`- Tool: \`${block.name}\``);
130
+ } else if (block.type === "tool_result") {
131
+ lines.push(`- Tool result received`);
132
+ }
133
+ }
134
+ lines.push("");
135
+ }
136
+ }
137
+ return lines.join("\n");
138
+ }
139
+ const command = {
140
+ name: "export",
141
+ description: "Export session data, configuration, or conversation history",
142
+ isEnabled: true,
143
+ isHidden: false,
144
+ type: "local-jsx",
145
+ userFacingName() {
146
+ return this.name;
147
+ },
148
+ async call(onDone) {
149
+ return /* @__PURE__ */ React.createElement(ExportMenu, { onDone });
150
+ }
151
+ };
152
+ var export_default = command;
153
+ export {
154
+ export_default as default
155
+ };
156
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/export.tsx"],
4
+ "sourcesContent": ["/**\n * Export Command\n *\n * Export session data, configuration, or conversation history.\n */\n\nimport React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { writeFile } from 'fs/promises'\nimport { join } from 'path'\nimport type { Command } from '@commands'\nimport { getMessagesGetter } from '@messages'\nimport { getCwd } from '@utils/state'\nimport { loadGlobalConfig, loadProjectConfig } from '../core/config'\n\ntype ExportType = 'conversation' | 'config' | 'summary'\n\ninterface ExportOption {\n type: ExportType\n label: string\n description: string\n}\n\nconst EXPORT_OPTIONS: ExportOption[] = [\n {\n type: 'conversation',\n label: 'Conversation',\n description: 'Export full conversation history as JSON',\n },\n {\n type: 'config',\n label: 'Configuration',\n description: 'Export current configuration settings',\n },\n {\n type: 'summary',\n label: 'Summary',\n description: 'Export a markdown summary of the session',\n },\n]\n\ninterface ExportMenuProps {\n onDone: (result?: string) => void\n}\n\nconst ExportMenu = ({ onDone }: ExportMenuProps) => {\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [exporting, setExporting] = useState(false)\n const [result, setResult] = useState<{\n success: boolean\n message: string\n } | null>(null)\n\n useInput(async (input, key) => {\n if (exporting) return\n\n if (key.upArrow) {\n setSelectedIndex(Math.max(0, selectedIndex - 1))\n } else if (key.downArrow) {\n setSelectedIndex(Math.min(EXPORT_OPTIONS.length - 1, selectedIndex + 1))\n } else if (key.return) {\n await handleExport(EXPORT_OPTIONS[selectedIndex]!.type)\n } else if (input === 'q' || key.escape) {\n onDone()\n }\n })\n\n const handleExport = async (type: ExportType) => {\n setExporting(true)\n\n try {\n const cwd = getCwd()\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n let filename: string\n let content: string\n\n switch (type) {\n case 'conversation': {\n const messages = getMessagesGetter()()\n filename = `minto-conversation-${timestamp}.json`\n content = JSON.stringify(messages, null, 2)\n break\n }\n case 'config': {\n const [globalConfig, projectConfig] = await Promise.all([\n Promise.resolve(loadGlobalConfig()),\n Promise.resolve(loadProjectConfig(cwd)),\n ])\n filename = `minto-config-${timestamp}.json`\n content = JSON.stringify(\n {\n global: globalConfig,\n project: projectConfig,\n },\n null,\n 2,\n )\n break\n }\n case 'summary': {\n const messages = getMessagesGetter()()\n filename = `minto-summary-${timestamp}.md`\n content = generateSummary(messages)\n break\n }\n }\n\n const filepath = join(cwd, filename)\n await writeFile(filepath, content, 'utf-8')\n\n setResult({\n success: true,\n message: `Exported to ${filename}`,\n })\n\n // Auto-dismiss after 2 seconds\n setTimeout(() => onDone(`Exported to ${filepath}`), 2000)\n } catch (error) {\n setResult({\n success: false,\n message: `Export failed: ${error instanceof Error ? error.message : String(error)}`,\n })\n } finally {\n setExporting(false)\n }\n }\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n Export Data\n </Text>\n </Box>\n\n {!result ? (\n <>\n <Box flexDirection=\"column\" marginBottom={1}>\n {EXPORT_OPTIONS.map((option, index) => (\n <Box key={option.type} paddingLeft={1}>\n <Text color={index === selectedIndex ? 'cyan' : undefined}>\n {index === selectedIndex ? '\u25B6 ' : ' '}\n <Text bold>{option.label}</Text>\n <Text dimColor> - {option.description}</Text>\n </Text>\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\u2191/\u2193: Navigate | Enter: Export | q/Esc: Cancel</Text>\n </Box>\n </>\n ) : (\n <Box>\n {result.success ? (\n <Text color=\"green\">\u2713 {result.message}</Text>\n ) : (\n <Text color=\"red\">\u2717 {result.message}</Text>\n )}\n </Box>\n )}\n\n {exporting && (\n <Box>\n <Text color=\"yellow\">Exporting...</Text>\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * Generate a markdown summary of the conversation\n */\nfunction generateSummary(messages: unknown[]): string {\n const lines: string[] = [\n '# Minto Session Summary',\n '',\n `Generated: ${new Date().toISOString()}`,\n '',\n '## Conversation Overview',\n '',\n `Total messages: ${messages.length}`,\n '',\n '## Message Summary',\n '',\n ]\n\n for (const msg of messages) {\n const m = msg as { role?: string; content?: unknown }\n if (!m.role) continue\n\n const role = m.role === 'user' ? '\uD83D\uDC64 User' : '\uD83E\uDD16 Assistant'\n\n if (typeof m.content === 'string') {\n const preview = m.content.slice(0, 200).replace(/\\n/g, ' ')\n lines.push(`### ${role}`)\n lines.push('')\n lines.push(`> ${preview}${m.content.length > 200 ? '...' : ''}`)\n lines.push('')\n } else if (Array.isArray(m.content)) {\n lines.push(`### ${role}`)\n lines.push('')\n for (const block of m.content) {\n if (block.type === 'text') {\n const preview = String(block.text || '')\n .slice(0, 200)\n .replace(/\\n/g, ' ')\n lines.push(\n `> ${preview}${String(block.text || '').length > 200 ? '...' : ''}`,\n )\n } else if (block.type === 'tool_use') {\n lines.push(`- Tool: \\`${block.name}\\``)\n } else if (block.type === 'tool_result') {\n lines.push(`- Tool result received`)\n }\n }\n lines.push('')\n }\n }\n\n return lines.join('\\n')\n}\n\nconst command: Command = {\n name: 'export',\n description: 'Export session data, configuration, or conversation history',\n isEnabled: true,\n isHidden: false,\n type: 'local-jsx',\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone) {\n return <ExportMenu onDone={onDone} />\n },\n}\n\nexport default command\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -13,15 +13,18 @@ import {
13
13
  getCurrentProjectConfig,
14
14
  saveCurrentProjectConfig
15
15
  } from "../utils/config.js";
16
- const MainMenu = ({ onNavigate, onExit }) => {
16
+ const MainMenu = ({ onNavigate, onExit, isActive = true }) => {
17
17
  const theme = getTheme();
18
18
  const options = [
19
19
  { label: "\u{1F4CB} View all MCP servers", value: "list" },
20
20
  { label: "\u{1F504} Refresh connections", value: "refresh" }
21
21
  ];
22
- useInput((input, key) => {
23
- if (key.escape) onExit();
24
- });
22
+ useInput(
23
+ (input, key) => {
24
+ if (key.escape) onExit();
25
+ },
26
+ { isActive }
27
+ );
25
28
  return /* @__PURE__ */ React.createElement(
26
29
  Box,
27
30
  {
@@ -47,7 +50,7 @@ const MainMenu = ({ onNavigate, onExit }) => {
47
50
  /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "ESC"), " to exit"))
48
51
  );
49
52
  };
50
- const ServerList = ({ onNavigate, onBack }) => {
53
+ const ServerList = ({ onNavigate, onBack, isActive = true }) => {
51
54
  const theme = getTheme();
52
55
  const [loading, setLoading] = useState(true);
53
56
  const [servers, setServers] = useState([]);
@@ -77,9 +80,12 @@ const ServerList = ({ onNavigate, onBack }) => {
77
80
  },
78
81
  [onNavigate]
79
82
  );
80
- useInput((input, key) => {
81
- if (key.escape) onBack();
82
- });
83
+ useInput(
84
+ (input, key) => {
85
+ if (key.escape) onBack();
86
+ },
87
+ { isActive }
88
+ );
83
89
  if (loading) {
84
90
  return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React.createElement(SimpleSpinner, { label: "Loading MCP servers..." }));
85
91
  }
@@ -107,7 +113,7 @@ const ServerList = ({ onNavigate, onBack }) => {
107
113
  /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "ESC"), " to go back"))
108
114
  );
109
115
  };
110
- const ServerDetails = ({ serverName, onBack, onRefresh }) => {
116
+ const ServerDetails = ({ serverName, onBack, onRefresh, isActive = true }) => {
111
117
  const theme = getTheme();
112
118
  const [loading, setLoading] = useState(true);
113
119
  const [server, setServer] = useState(null);
@@ -166,9 +172,12 @@ const ServerDetails = ({ serverName, onBack, onRefresh }) => {
166
172
  refreshMCPConnections();
167
173
  onRefresh();
168
174
  };
169
- useInput((input, key) => {
170
- if (key.escape) onBack();
171
- });
175
+ useInput(
176
+ (input, key) => {
177
+ if (key.escape) onBack();
178
+ },
179
+ { isActive }
180
+ );
172
181
  if (loading) {
173
182
  return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React.createElement(SimpleSpinner, { label: "Loading server details..." }));
174
183
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/mcp-interactive.tsx"],
4
- "sourcesContent": ["/**\n * Interactive MCP Server Management UI\n *\n * Complete interactive interface for MCP server management with navigation\n */\n\nimport React, { useState, useEffect, useCallback } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { Select } from '@components/CustomSelect/select'\nimport { getTheme } from '@utils/theme'\nimport { Command } from '@commands'\nimport {\n listMCPServers,\n getClients,\n refreshMCPConnections,\n getMcpServer,\n addMcpServer,\n removeMcpServer,\n type ScopedMcpServerConfig,\n} from '@services/mcpClient'\nimport { SimpleSpinner } from '@components/Spinner'\nimport {\n getCurrentProjectConfig,\n saveCurrentProjectConfig,\n} from '@utils/config'\n\n// =============================================================================\n// Types\n// =============================================================================\n\ntype Screen = 'main-menu' | 'server-list' | 'server-details'\n\ntype NavigationState = {\n screen: Screen\n serverName?: string\n}\n\ntype ServerStatus = {\n name: string\n status: 'connected' | 'failed'\n config: ScopedMcpServerConfig\n}\n\n// =============================================================================\n// Main Menu\n// =============================================================================\n\nconst MainMenu: React.FC<{\n onNavigate: (state: NavigationState) => void\n onExit: () => void\n}> = ({ onNavigate, onExit }) => {\n const theme = getTheme()\n\n const options = [\n { label: '\uD83D\uDCCB View all MCP servers', value: 'list' },\n { label: '\uD83D\uDD04 Refresh connections', value: 'refresh' },\n ]\n\n useInput((input, key) => {\n if (key.escape) onExit()\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Box marginBottom={1}>\n <Text bold color={theme.primary}>\n MCP Server Manager\n </Text>\n </Box>\n\n <Select\n options={options}\n onChange={value => {\n if (value === 'list') onNavigate({ screen: 'server-list' })\n else if (value === 'refresh') {\n refreshMCPConnections()\n onNavigate({ screen: 'server-list' })\n }\n }}\n />\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text bold>ESC</Text> to exit\n </Text>\n </Box>\n </Box>\n )\n}\n\n// =============================================================================\n// Server List\n// =============================================================================\n\nconst ServerList: React.FC<{\n onNavigate: (state: NavigationState) => void\n onBack: () => void\n}> = ({ onNavigate, onBack }) => {\n const theme = getTheme()\n const [loading, setLoading] = useState(true)\n const [servers, setServers] = useState<ServerStatus[]>([])\n\n useEffect(() => {\n const loadServers = async () => {\n const serverConfigs = listMCPServers()\n const clients = await getClients()\n\n const serverStatuses: ServerStatus[] = Object.entries(serverConfigs).map(\n ([name, _]) => {\n const client = clients.find(c => c.name === name)\n const config = getMcpServer(name)!\n return {\n name,\n status: client?.type === 'connected' ? 'connected' : 'failed',\n config,\n }\n },\n )\n\n setServers(serverStatuses)\n setLoading(false)\n }\n\n loadServers()\n }, [])\n\n // Memoize the onChange handler to prevent infinite re-renders\n const handleServerSelect = useCallback(\n (serverName: string) => {\n onNavigate({ screen: 'server-details', serverName })\n },\n [onNavigate],\n )\n\n useInput((input, key) => {\n if (key.escape) onBack()\n })\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <SimpleSpinner label=\"Loading MCP servers...\" />\n </Box>\n )\n }\n\n if (servers.length === 0) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text>No MCP servers configured.</Text>\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text bold>ESC</Text> to go back\n </Text>\n </Box>\n </Box>\n )\n }\n\n const options = servers.map(server => {\n const statusIcon = server.status === 'connected' ? '\u2713' : '\u2717'\n const statusColor =\n server.status === 'connected' ? theme.success : theme.error\n return {\n label: (\n <Text>\n <Text color={statusColor}>{statusIcon}</Text> {server.name}{' '}\n <Text dimColor>({server.config.scope})</Text>\n </Text>\n ),\n value: server.name,\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Box marginBottom={1}>\n <Text bold color={theme.primary}>\n MCP Servers\n </Text>\n </Box>\n\n <Select options={options} onChange={handleServerSelect} />\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text bold>ESC</Text> to go back\n </Text>\n </Box>\n </Box>\n )\n}\n\n// =============================================================================\n// Server Details\n// =============================================================================\n\nconst ServerDetails: React.FC<{\n serverName: string\n onBack: () => void\n onRefresh: () => void\n}> = ({ serverName, onBack, onRefresh }) => {\n const theme = getTheme()\n const [loading, setLoading] = useState(true)\n const [server, setServer] = useState<ServerStatus | null>(null)\n const [toggling, setToggling] = useState(false)\n\n useEffect(() => {\n const loadServer = async () => {\n const config = getMcpServer(serverName)\n if (!config) {\n onBack()\n return\n }\n\n const clients = await getClients()\n const client = clients.find(c => c.name === serverName)\n\n setServer({\n name: serverName,\n status: client?.type === 'connected' ? 'connected' : 'failed',\n config,\n })\n setLoading(false)\n }\n\n loadServer()\n }, [serverName])\n\n const toggleEnabled = async () => {\n if (!server) return\n\n setToggling(true)\n\n // Get current project config\n const projectConfig = getCurrentProjectConfig()\n const currentServer = projectConfig.mcpServers?.[serverName]\n\n if (currentServer) {\n // Toggle in project config\n const newEnabled = !(currentServer.enabled ?? true)\n await saveCurrentProjectConfig({\n ...projectConfig,\n mcpServers: {\n ...projectConfig.mcpServers,\n [serverName]: {\n ...currentServer,\n enabled: newEnabled,\n },\n },\n })\n } else {\n // Server is from global or mcprc, copy to project and disable\n const serverConfig = getMcpServer(serverName)\n if (serverConfig) {\n await saveCurrentProjectConfig({\n ...projectConfig,\n mcpServers: {\n ...projectConfig.mcpServers,\n [serverName]: {\n ...serverConfig,\n enabled: false,\n },\n },\n })\n }\n }\n\n setToggling(false)\n refreshMCPConnections()\n onRefresh()\n }\n\n useInput((input, key) => {\n if (key.escape) onBack()\n })\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <SimpleSpinner label=\"Loading server details...\" />\n </Box>\n )\n }\n\n if (!server) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color={theme.error}>Server not found</Text>\n </Box>\n )\n }\n\n const isEnabled = 'enabled' in server.config ? server.config.enabled : true\n const statusColor =\n server.status === 'connected' ? theme.success : theme.error\n const enabledColor = isEnabled ? theme.success : theme.error\n\n const options = [\n {\n label: isEnabled ? '\uD83D\uDD34 Disable server' : '\uD83D\uDFE2 Enable server',\n value: 'toggle',\n },\n { label: '\uD83D\uDD04 Refresh connection', value: 'refresh' },\n { label: '\u2190 Back to list', value: 'back' },\n ]\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Box marginBottom={1}>\n <Text bold color={theme.primary}>\n {server.name}\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text>\n Status: <Text color={statusColor}>{server.status}</Text>\n </Text>\n <Text>\n Enabled: <Text color={enabledColor}>{isEnabled ? 'Yes' : 'No'}</Text>\n </Text>\n <Text>\n Scope: <Text dimColor>{server.config.scope}</Text>\n </Text>\n <Text>\n Type: <Text dimColor>{server.config.type}</Text>\n </Text>\n </Box>\n\n {toggling ? (\n <SimpleSpinner label=\"Toggling server...\" />\n ) : (\n <Select\n options={options}\n onChange={value => {\n if (value === 'toggle') toggleEnabled()\n else if (value === 'refresh') {\n refreshMCPConnections()\n onRefresh()\n } else if (value === 'back') onBack()\n }}\n />\n )}\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text bold>ESC</Text> to go back\n </Text>\n </Box>\n </Box>\n )\n}\n\n// =============================================================================\n// Main Interactive Component\n// =============================================================================\n\nconst MCPInteractive: React.FC<{\n onDone: (result?: string) => void\n}> = ({ onDone }) => {\n const [navState, setNavState] = useState<NavigationState>({\n screen: 'main-menu',\n })\n\n const handleNavigate = (state: NavigationState) => {\n setNavState(state)\n }\n\n const handleBack = () => {\n if (navState.screen === 'server-details') {\n setNavState({ screen: 'server-list' })\n } else {\n setNavState({ screen: 'main-menu' })\n }\n }\n\n const handleRefresh = () => {\n // Reload current screen\n setNavState({ ...navState })\n }\n\n switch (navState.screen) {\n case 'main-menu':\n return <MainMenu onNavigate={handleNavigate} onExit={() => onDone()} />\n\n case 'server-list':\n return <ServerList onNavigate={handleNavigate} onBack={handleBack} />\n\n case 'server-details':\n return (\n <ServerDetails\n serverName={navState.serverName!}\n onBack={handleBack}\n onRefresh={handleRefresh}\n />\n )\n\n default:\n return <Text>Unknown screen</Text>\n }\n}\n\n// =============================================================================\n// Command Definition\n// =============================================================================\n\nconst mcpInteractive = {\n type: 'local-jsx',\n name: 'mcp',\n description: 'Interactive MCP server management',\n isEnabled: true,\n isHidden: false,\n async call(onDone: (result?: string) => void) {\n return <MCPInteractive onDone={onDone} />\n },\n userFacingName() {\n return 'mcp'\n },\n} satisfies Command\n\nexport default mcpInteractive\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Interactive MCP Server Management UI\n *\n * Complete interactive interface for MCP server management with navigation\n */\n\nimport React, { useState, useEffect, useCallback } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { Select } from '@components/CustomSelect/select'\nimport { getTheme } from '@utils/theme'\nimport { Command } from '@commands'\nimport {\n listMCPServers,\n getClients,\n refreshMCPConnections,\n getMcpServer,\n addMcpServer,\n removeMcpServer,\n type ScopedMcpServerConfig,\n} from '@services/mcpClient'\nimport { SimpleSpinner } from '@components/Spinner'\nimport {\n getCurrentProjectConfig,\n saveCurrentProjectConfig,\n} from '@utils/config'\n\n// =============================================================================\n// Types\n// =============================================================================\n\ntype Screen = 'main-menu' | 'server-list' | 'server-details'\n\ntype NavigationState = {\n screen: Screen\n serverName?: string\n}\n\ntype ServerStatus = {\n name: string\n status: 'connected' | 'failed'\n config: ScopedMcpServerConfig\n}\n\n// =============================================================================\n// Main Menu\n// =============================================================================\n\nconst MainMenu: React.FC<{\n onNavigate: (state: NavigationState) => void\n onExit: () => void\n isActive?: boolean\n}> = ({ onNavigate, onExit, isActive = true }) => {\n const theme = getTheme()\n\n const options = [\n { label: '\uD83D\uDCCB View all MCP servers', value: 'list' },\n { label: '\uD83D\uDD04 Refresh connections', value: 'refresh' },\n ]\n\n // Only listen when this component is active\n useInput(\n (input, key) => {\n if (key.escape) onExit()\n },\n { isActive },\n )\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Box marginBottom={1}>\n <Text bold color={theme.primary}>\n MCP Server Manager\n </Text>\n </Box>\n\n <Select\n options={options}\n onChange={value => {\n if (value === 'list') onNavigate({ screen: 'server-list' })\n else if (value === 'refresh') {\n refreshMCPConnections()\n onNavigate({ screen: 'server-list' })\n }\n }}\n />\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text bold>ESC</Text> to exit\n </Text>\n </Box>\n </Box>\n )\n}\n\n// =============================================================================\n// Server List\n// =============================================================================\n\nconst ServerList: React.FC<{\n onNavigate: (state: NavigationState) => void\n onBack: () => void\n isActive?: boolean\n}> = ({ onNavigate, onBack, isActive = true }) => {\n const theme = getTheme()\n const [loading, setLoading] = useState(true)\n const [servers, setServers] = useState<ServerStatus[]>([])\n\n useEffect(() => {\n const loadServers = async () => {\n const serverConfigs = listMCPServers()\n const clients = await getClients()\n\n const serverStatuses: ServerStatus[] = Object.entries(serverConfigs).map(\n ([name, _]) => {\n const client = clients.find(c => c.name === name)\n const config = getMcpServer(name)!\n return {\n name,\n status: client?.type === 'connected' ? 'connected' : 'failed',\n config,\n }\n },\n )\n\n setServers(serverStatuses)\n setLoading(false)\n }\n\n loadServers()\n }, [])\n\n // Memoize the onChange handler to prevent infinite re-renders\n const handleServerSelect = useCallback(\n (serverName: string) => {\n onNavigate({ screen: 'server-details', serverName })\n },\n [onNavigate],\n )\n\n // Only listen when this component is active\n useInput(\n (input, key) => {\n if (key.escape) onBack()\n },\n { isActive },\n )\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <SimpleSpinner label=\"Loading MCP servers...\" />\n </Box>\n )\n }\n\n if (servers.length === 0) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text>No MCP servers configured.</Text>\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text bold>ESC</Text> to go back\n </Text>\n </Box>\n </Box>\n )\n }\n\n const options = servers.map(server => {\n const statusIcon = server.status === 'connected' ? '\u2713' : '\u2717'\n const statusColor =\n server.status === 'connected' ? theme.success : theme.error\n return {\n label: (\n <Text>\n <Text color={statusColor}>{statusIcon}</Text> {server.name}{' '}\n <Text dimColor>({server.config.scope})</Text>\n </Text>\n ),\n value: server.name,\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Box marginBottom={1}>\n <Text bold color={theme.primary}>\n MCP Servers\n </Text>\n </Box>\n\n <Select options={options} onChange={handleServerSelect} />\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text bold>ESC</Text> to go back\n </Text>\n </Box>\n </Box>\n )\n}\n\n// =============================================================================\n// Server Details\n// =============================================================================\n\nconst ServerDetails: React.FC<{\n serverName: string\n onBack: () => void\n onRefresh: () => void\n isActive?: boolean\n}> = ({ serverName, onBack, onRefresh, isActive = true }) => {\n const theme = getTheme()\n const [loading, setLoading] = useState(true)\n const [server, setServer] = useState<ServerStatus | null>(null)\n const [toggling, setToggling] = useState(false)\n\n useEffect(() => {\n const loadServer = async () => {\n const config = getMcpServer(serverName)\n if (!config) {\n onBack()\n return\n }\n\n const clients = await getClients()\n const client = clients.find(c => c.name === serverName)\n\n setServer({\n name: serverName,\n status: client?.type === 'connected' ? 'connected' : 'failed',\n config,\n })\n setLoading(false)\n }\n\n loadServer()\n }, [serverName])\n\n const toggleEnabled = async () => {\n if (!server) return\n\n setToggling(true)\n\n // Get current project config\n const projectConfig = getCurrentProjectConfig()\n const currentServer = projectConfig.mcpServers?.[serverName]\n\n if (currentServer) {\n // Toggle in project config\n const newEnabled = !(currentServer.enabled ?? true)\n await saveCurrentProjectConfig({\n ...projectConfig,\n mcpServers: {\n ...projectConfig.mcpServers,\n [serverName]: {\n ...currentServer,\n enabled: newEnabled,\n },\n },\n })\n } else {\n // Server is from global or mcprc, copy to project and disable\n const serverConfig = getMcpServer(serverName)\n if (serverConfig) {\n await saveCurrentProjectConfig({\n ...projectConfig,\n mcpServers: {\n ...projectConfig.mcpServers,\n [serverName]: {\n ...serverConfig,\n enabled: false,\n },\n },\n })\n }\n }\n\n setToggling(false)\n refreshMCPConnections()\n onRefresh()\n }\n\n // Only listen when this component is active\n useInput(\n (input, key) => {\n if (key.escape) onBack()\n },\n { isActive },\n )\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <SimpleSpinner label=\"Loading server details...\" />\n </Box>\n )\n }\n\n if (!server) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color={theme.error}>Server not found</Text>\n </Box>\n )\n }\n\n const isEnabled = 'enabled' in server.config ? server.config.enabled : true\n const statusColor =\n server.status === 'connected' ? theme.success : theme.error\n const enabledColor = isEnabled ? theme.success : theme.error\n\n const options = [\n {\n label: isEnabled ? '\uD83D\uDD34 Disable server' : '\uD83D\uDFE2 Enable server',\n value: 'toggle',\n },\n { label: '\uD83D\uDD04 Refresh connection', value: 'refresh' },\n { label: '\u2190 Back to list', value: 'back' },\n ]\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Box marginBottom={1}>\n <Text bold color={theme.primary}>\n {server.name}\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text>\n Status: <Text color={statusColor}>{server.status}</Text>\n </Text>\n <Text>\n Enabled: <Text color={enabledColor}>{isEnabled ? 'Yes' : 'No'}</Text>\n </Text>\n <Text>\n Scope: <Text dimColor>{server.config.scope}</Text>\n </Text>\n <Text>\n Type: <Text dimColor>{server.config.type}</Text>\n </Text>\n </Box>\n\n {toggling ? (\n <SimpleSpinner label=\"Toggling server...\" />\n ) : (\n <Select\n options={options}\n onChange={value => {\n if (value === 'toggle') toggleEnabled()\n else if (value === 'refresh') {\n refreshMCPConnections()\n onRefresh()\n } else if (value === 'back') onBack()\n }}\n />\n )}\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text bold>ESC</Text> to go back\n </Text>\n </Box>\n </Box>\n )\n}\n\n// =============================================================================\n// Main Interactive Component\n// =============================================================================\n\nconst MCPInteractive: React.FC<{\n onDone: (result?: string) => void\n}> = ({ onDone }) => {\n const [navState, setNavState] = useState<NavigationState>({\n screen: 'main-menu',\n })\n\n const handleNavigate = (state: NavigationState) => {\n setNavState(state)\n }\n\n const handleBack = () => {\n if (navState.screen === 'server-details') {\n setNavState({ screen: 'server-list' })\n } else {\n setNavState({ screen: 'main-menu' })\n }\n }\n\n const handleRefresh = () => {\n // Reload current screen\n setNavState({ ...navState })\n }\n\n switch (navState.screen) {\n case 'main-menu':\n return <MainMenu onNavigate={handleNavigate} onExit={() => onDone()} />\n\n case 'server-list':\n return <ServerList onNavigate={handleNavigate} onBack={handleBack} />\n\n case 'server-details':\n return (\n <ServerDetails\n serverName={navState.serverName!}\n onBack={handleBack}\n onRefresh={handleRefresh}\n />\n )\n\n default:\n return <Text>Unknown screen</Text>\n }\n}\n\n// =============================================================================\n// Command Definition\n// =============================================================================\n\nconst mcpInteractive = {\n type: 'local-jsx',\n name: 'mcp',\n description: 'Interactive MCP server management',\n isEnabled: true,\n isHidden: false,\n async call(onDone: (result?: string) => void) {\n return <MCPInteractive onDone={onDone} />\n },\n userFacingName() {\n return 'mcp'\n },\n} satisfies Command\n\nexport default mcpInteractive\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -10,8 +10,8 @@ function ModelCommand({ onClose, abortController }) {
10
10
  const [mode, setMode] = useState("status");
11
11
  const theme = getTheme();
12
12
  const exitState = useExitOnCtrlCD(onClose);
13
- useInput((input, key) => {
14
- if (mode === "status") {
13
+ useInput(
14
+ (input, key) => {
15
15
  if (key.return || input === "c" || input === "C") {
16
16
  enableConfigs();
17
17
  abortController?.abort?.();
@@ -19,8 +19,9 @@ function ModelCommand({ onClose, abortController }) {
19
19
  } else if (key.escape) {
20
20
  onClose();
21
21
  }
22
- }
23
- });
22
+ },
23
+ { isActive: mode === "status" }
24
+ );
24
25
  if (mode === "config") {
25
26
  return /* @__PURE__ */ React.createElement(
26
27
  ModelConfig,
@@ -37,7 +38,7 @@ function ModelCommand({ onClose, abortController }) {
37
38
  }
38
39
  try {
39
40
  const modelManager = getModelManager();
40
- const pointers = ["main", "task", "reasoning", "quick"];
41
+ const pointers = ["main", "task", "reasoning", "quick", "compact"];
41
42
  return /* @__PURE__ */ React.createElement(
42
43
  Box,
43
44
  {