@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
@@ -6,12 +6,13 @@ import { triggerModelConfigChange } from "../messages.js";
6
6
  import { getModelManager } from "../utils/model.js";
7
7
  import { getTheme } from "../utils/theme.js";
8
8
  import { useExitOnCtrlCD } from "../hooks/useExitOnCtrlCD.js";
9
+ import { SEMANTIC_COLORS } from "../constants/colors.js";
9
10
  function ModelCommand({ onClose, abortController }) {
10
11
  const [mode, setMode] = useState("status");
11
12
  const theme = getTheme();
12
13
  const exitState = useExitOnCtrlCD(onClose);
13
- useInput((input, key) => {
14
- if (mode === "status") {
14
+ useInput(
15
+ (input, key) => {
15
16
  if (key.return || input === "c" || input === "C") {
16
17
  enableConfigs();
17
18
  abortController?.abort?.();
@@ -19,8 +20,9 @@ function ModelCommand({ onClose, abortController }) {
19
20
  } else if (key.escape) {
20
21
  onClose();
21
22
  }
22
- }
23
- });
23
+ },
24
+ { isActive: mode === "status" }
25
+ );
24
26
  if (mode === "config") {
25
27
  return /* @__PURE__ */ React.createElement(
26
28
  ModelConfig,
@@ -37,7 +39,7 @@ function ModelCommand({ onClose, abortController }) {
37
39
  }
38
40
  try {
39
41
  const modelManager = getModelManager();
40
- const pointers = ["main", "task", "reasoning", "quick"];
42
+ const pointers = ["main", "task", "reasoning", "quick", "compact"];
41
43
  return /* @__PURE__ */ React.createElement(
42
44
  Box,
43
45
  {
@@ -62,7 +64,7 @@ function ModelCommand({ onClose, abortController }) {
62
64
  }
63
65
  }),
64
66
  /* @__PURE__ */ React.createElement(Text, null, " "),
65
- /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Enter"), " or ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "C"), " to configure models"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Esc"), " to close"))
67
+ /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Enter"), " or ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "C"), " to configure models"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Esc"), " to close"))
66
68
  );
67
69
  } catch (error) {
68
70
  return /* @__PURE__ */ React.createElement(
@@ -77,7 +79,7 @@ function ModelCommand({ onClose, abortController }) {
77
79
  /* @__PURE__ */ React.createElement(Text, { bold: true }, "\u{1F4CA} Model Status Error"),
78
80
  /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Error reading model status: ", String(error)),
79
81
  /* @__PURE__ */ React.createElement(Text, null, " "),
80
- /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Enter"), " to configure models")
82
+ /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Enter"), " to configure models")
81
83
  );
82
84
  }
83
85
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/model.tsx"],
4
- "sourcesContent": ["import React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { ModelConfig } from '@components/ModelConfig'\nimport { enableConfigs } from '@utils/config'\nimport { triggerModelConfigChange } from '@messages'\nimport { getModelManager } from '@utils/model'\nimport { getTheme } from '@utils/theme'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\nimport type { Command } from '@commands'\n\ntype Props = {\n onClose: () => void\n abortController?: AbortController\n}\n\n/**\n * Combined Model Command - Shows status and provides configuration\n *\n * This merges the functionality of /model and /modelstatus into a single command.\n * First shows current model status, then allows entering configuration mode.\n */\nfunction ModelCommand({ onClose, abortController }: Props): React.ReactNode {\n const [mode, setMode] = useState<'status' | 'config'>('status')\n const theme = getTheme()\n const exitState = useExitOnCtrlCD(onClose)\n\n useInput((input, key) => {\n if (mode === 'status') {\n if (key.return || input === 'c' || input === 'C') {\n enableConfigs()\n abortController?.abort?.()\n setMode('config')\n } else if (key.escape) {\n onClose()\n }\n }\n })\n\n if (mode === 'config') {\n return (\n <ModelConfig\n onClose={() => {\n import('@utils/model').then(({ reloadModelManager }) => {\n reloadModelManager()\n triggerModelConfigChange()\n // Return to status mode instead of exiting completely\n setMode('status')\n })\n }}\n />\n )\n }\n\n // Status mode - show current model configuration\n try {\n const modelManager = getModelManager()\n const pointers = ['main', 'task', 'reasoning', 'quick'] as const\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n \uD83D\uDCCA Model Status{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Text> </Text>\n\n {pointers.map(pointer => {\n try {\n const model = modelManager.getModel(pointer)\n if (model && model.name && model.provider) {\n return (\n <Box key={pointer}>\n <Text>\n <Text bold color={theme.minto}>\n {pointer.toUpperCase().padEnd(10)}\n </Text>{' '}\n \u2192 {model.name}{' '}\n <Text color={theme.secondaryText}>\n ({model.provider}, {model.modelName || 'unknown'})\n </Text>\n </Text>\n </Box>\n )\n } else {\n return (\n <Box key={pointer}>\n <Text>\n <Text bold color={theme.minto}>\n {pointer.toUpperCase().padEnd(10)}\n </Text>{' '}\n \u2192 <Text color={theme.error}>Not configured</Text>\n </Text>\n </Box>\n )\n }\n } catch {\n return (\n <Box key={pointer}>\n <Text>\n <Text bold color={theme.minto}>\n {pointer.toUpperCase().padEnd(10)}\n </Text>{' '}\n \u2192 <Text color={theme.error}>Error</Text>\n </Text>\n </Box>\n )\n }\n })}\n\n <Text> </Text>\n <Box flexDirection=\"column\">\n <Text dimColor>\n Press <Text bold>Enter</Text> or <Text bold>C</Text> to configure\n models\n </Text>\n <Text dimColor>\n Press <Text bold>Esc</Text> to close\n </Text>\n </Box>\n </Box>\n )\n } catch (error) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\uD83D\uDCCA Model Status Error</Text>\n <Text color={theme.error}>\n Error reading model status: {String(error)}\n </Text>\n <Text> </Text>\n <Text dimColor>\n Press <Text bold>Enter</Text> to configure models\n </Text>\n </Box>\n )\n }\n}\n\nconst model: Command = {\n name: 'model',\n description: 'View model status and configure AI provider settings',\n aliases: ['ms', 'modelstatus', 'model-status'],\n isEnabled: true,\n isHidden: false,\n type: 'local-jsx',\n userFacingName() {\n return 'model'\n },\n async call(onDone, context) {\n const { abortController } = context || {}\n return <ModelCommand onClose={onDone} abortController={abortController} />\n },\n}\n\nexport default model\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { ModelConfig } from '@components/ModelConfig'\nimport { enableConfigs } from '@utils/config'\nimport { triggerModelConfigChange } from '@messages'\nimport { getModelManager } from '@utils/model'\nimport { getTheme } from '@utils/theme'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\nimport type { Command } from '@commands'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ntype Props = {\n onClose: () => void\n abortController?: AbortController\n}\n\n/**\n * Combined Model Command - Shows status and provides configuration\n *\n * This merges the functionality of /model and /modelstatus into a single command.\n * First shows current model status, then allows entering configuration mode.\n */\nfunction ModelCommand({ onClose, abortController }: Props): React.ReactNode {\n const [mode, setMode] = useState<'status' | 'config'>('status')\n const theme = getTheme()\n const exitState = useExitOnCtrlCD(onClose)\n\n // Only listen for input when in status mode\n // When in config mode, ModelConfig handles its own input\n useInput(\n (input, key) => {\n if (key.return || input === 'c' || input === 'C') {\n enableConfigs()\n abortController?.abort?.()\n setMode('config')\n } else if (key.escape) {\n onClose()\n }\n },\n { isActive: mode === 'status' },\n )\n\n if (mode === 'config') {\n return (\n <ModelConfig\n onClose={() => {\n import('@utils/model').then(({ reloadModelManager }) => {\n reloadModelManager()\n triggerModelConfigChange()\n // Return to status mode instead of exiting completely\n setMode('status')\n })\n }}\n />\n )\n }\n\n // Status mode - show current model configuration\n try {\n const modelManager = getModelManager()\n const pointers = ['main', 'task', 'reasoning', 'quick', 'compact'] as const\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n \uD83D\uDCCA Model Status{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Text> </Text>\n\n {pointers.map(pointer => {\n try {\n const model = modelManager.getModel(pointer)\n if (model && model.name && model.provider) {\n return (\n <Box key={pointer}>\n <Text>\n <Text bold color={theme.minto}>\n {pointer.toUpperCase().padEnd(10)}\n </Text>{' '}\n \u2192 {model.name}{' '}\n <Text color={theme.secondaryText}>\n ({model.provider}, {model.modelName || 'unknown'})\n </Text>\n </Text>\n </Box>\n )\n } else {\n return (\n <Box key={pointer}>\n <Text>\n <Text bold color={theme.minto}>\n {pointer.toUpperCase().padEnd(10)}\n </Text>{' '}\n \u2192 <Text color={theme.error}>Not configured</Text>\n </Text>\n </Box>\n )\n }\n } catch {\n return (\n <Box key={pointer}>\n <Text>\n <Text bold color={theme.minto}>\n {pointer.toUpperCase().padEnd(10)}\n </Text>{' '}\n \u2192 <Text color={theme.error}>Error</Text>\n </Text>\n </Box>\n )\n }\n })}\n\n <Text> </Text>\n <Box flexDirection=\"column\">\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>Enter</Text> or <Text bold>C</Text> to configure\n models\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>Esc</Text> to close\n </Text>\n </Box>\n </Box>\n )\n } catch (error) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\uD83D\uDCCA Model Status Error</Text>\n <Text color={theme.error}>\n Error reading model status: {String(error)}\n </Text>\n <Text> </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>Enter</Text> to configure models\n </Text>\n </Box>\n )\n }\n}\n\nconst model: Command = {\n name: 'model',\n description: 'View model status and configure AI provider settings',\n aliases: ['ms', 'modelstatus', 'model-status'],\n isEnabled: true,\n isHidden: false,\n type: 'local-jsx',\n userFacingName() {\n return 'model'\n },\n async call(onDone, context) {\n const { abortController } = context || {}\n return <ModelCommand onClose={onDone} abortController={abortController} />\n },\n}\n\nexport default model\n"],
5
+ "mappings": "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",
6
6
  "names": ["model"]
7
7
  }
@@ -0,0 +1,87 @@
1
+ import React, { useState } from "react";
2
+ import { Box, Text, useInput } from "ink";
3
+ import {
4
+ getPermissionRuleEngine
5
+ } from "../core/permissions/index.js";
6
+ import { SEMANTIC_COLORS } from "../constants/colors.js";
7
+ const PermissionList = ({
8
+ rules,
9
+ defaultDecision,
10
+ onDone
11
+ }) => {
12
+ const [selectedIndex, setSelectedIndex] = useState(0);
13
+ useInput((input, key) => {
14
+ if (key.upArrow) {
15
+ setSelectedIndex(Math.max(0, selectedIndex - 1));
16
+ } else if (key.downArrow) {
17
+ setSelectedIndex(Math.min(rules.length - 1, selectedIndex + 1));
18
+ } else if (input === "q" || key.escape) {
19
+ onDone();
20
+ }
21
+ });
22
+ const globalRules = rules.filter((r) => r.scope === "global");
23
+ const projectRules = rules.filter((r) => r.scope === "project");
24
+ const getDecisionColor = (decision) => {
25
+ switch (decision) {
26
+ case "allow":
27
+ return "green";
28
+ case "deny":
29
+ return "red";
30
+ case "ask":
31
+ return "yellow";
32
+ }
33
+ };
34
+ const formatDecision = (decision) => {
35
+ switch (decision) {
36
+ case "allow":
37
+ return "\u2713 ALLOW";
38
+ case "deny":
39
+ return "\u2717 DENY";
40
+ case "ask":
41
+ return "? ASK";
42
+ }
43
+ };
44
+ const renderRule = (rule, index) => {
45
+ const isSelected = index === selectedIndex;
46
+ return /* @__PURE__ */ React.createElement(Box, { key: rule.id, paddingLeft: 1 }, /* @__PURE__ */ React.createElement(Text, { color: isSelected ? "cyan" : void 0 }, isSelected ? "\u25B6 " : " ", /* @__PURE__ */ React.createElement(Text, { color: getDecisionColor(rule.decision) }, formatDecision(rule.decision).padEnd(10)), /* @__PURE__ */ React.createElement(Text, { bold: true }, rule.pattern.padEnd(30)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "P", rule.priority), rule.description && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " - ", rule.description)));
47
+ };
48
+ let displayIndex = 0;
49
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Permission Rules")), /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Default decision: "), /* @__PURE__ */ React.createElement(Text, { color: getDecisionColor(defaultDecision), bold: true }, formatDecision(defaultDecision)))), projectRules.length > 0 && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: "blue" }, "Project Rules (", projectRules.length, ")")), projectRules.map((rule) => {
50
+ const result = renderRule(rule, displayIndex);
51
+ displayIndex++;
52
+ return result;
53
+ })), globalRules.length > 0 && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: "magenta" }, "Global Rules (", globalRules.length, ")")), globalRules.map((rule) => {
54
+ const result = renderRule(rule, displayIndex);
55
+ displayIndex++;
56
+ return result;
57
+ })), rules.length === 0 && /* @__PURE__ */ React.createElement(Box, { paddingLeft: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "No custom rules defined. Using default rules.")), /* @__PURE__ */ React.createElement(Box, { marginTop: 2 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "\u2191/\u2193: Navigate | q/Esc: Exit")), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Legend: ", /* @__PURE__ */ React.createElement(Text, { color: "green" }, "ALLOW"), " = auto-approve,", " ", /* @__PURE__ */ React.createElement(Text, { color: "red" }, "DENY"), " = block, ", /* @__PURE__ */ React.createElement(Text, { color: "yellow" }, "ASK"), " ", "= prompt user")));
58
+ };
59
+ const command = {
60
+ name: "permissions",
61
+ description: "View and manage permission rules for tool access",
62
+ isEnabled: true,
63
+ isHidden: false,
64
+ type: "local-jsx",
65
+ aliases: ["perms"],
66
+ userFacingName() {
67
+ return this.name;
68
+ },
69
+ async call(onDone, _context) {
70
+ const engine = getPermissionRuleEngine();
71
+ const rules = engine.getRules();
72
+ const defaultDecision = engine.getDefaultDecision();
73
+ return /* @__PURE__ */ React.createElement(
74
+ PermissionList,
75
+ {
76
+ rules,
77
+ defaultDecision,
78
+ onDone
79
+ }
80
+ );
81
+ }
82
+ };
83
+ var permissions_default = command;
84
+ export {
85
+ permissions_default as default
86
+ };
87
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/permissions.tsx"],
4
+ "sourcesContent": ["/**\n * Permissions Command\n *\n * View and manage permission rules for tool access.\n */\n\nimport React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport type { Command } from '@commands'\nimport {\n getPermissionRuleEngine,\n type PatternPermissionRule,\n type RulePermissionDecision,\n} from '../core/permissions'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ninterface PermissionListProps {\n rules: PatternPermissionRule[]\n defaultDecision: RulePermissionDecision\n onDone: (result?: string) => void\n}\n\nconst PermissionList = ({\n rules,\n defaultDecision,\n onDone,\n}: PermissionListProps) => {\n const [selectedIndex, setSelectedIndex] = useState(0)\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(Math.max(0, selectedIndex - 1))\n } else if (key.downArrow) {\n setSelectedIndex(Math.min(rules.length - 1, selectedIndex + 1))\n } else if (input === 'q' || key.escape) {\n onDone()\n }\n })\n\n // Group rules by scope\n const globalRules = rules.filter(r => r.scope === 'global')\n const projectRules = rules.filter(r => r.scope === 'project')\n\n const getDecisionColor = (decision: RulePermissionDecision) => {\n switch (decision) {\n case 'allow':\n return 'green'\n case 'deny':\n return 'red'\n case 'ask':\n return 'yellow'\n }\n }\n\n const formatDecision = (decision: RulePermissionDecision) => {\n switch (decision) {\n case 'allow':\n return '\u2713 ALLOW'\n case 'deny':\n return '\u2717 DENY'\n case 'ask':\n return '? ASK'\n }\n }\n\n const renderRule = (rule: PatternPermissionRule, index: number) => {\n const isSelected = index === selectedIndex\n return (\n <Box key={rule.id} paddingLeft={1}>\n <Text color={isSelected ? 'cyan' : undefined}>\n {isSelected ? '\u25B6 ' : ' '}\n <Text color={getDecisionColor(rule.decision)}>\n {formatDecision(rule.decision).padEnd(10)}\n </Text>\n <Text bold>{rule.pattern.padEnd(30)}</Text>\n <Text color={SEMANTIC_COLORS.dim}>P{rule.priority}</Text>\n {rule.description && (\n <Text color={SEMANTIC_COLORS.dim}> - {rule.description}</Text>\n )}\n </Text>\n </Box>\n )\n }\n\n let displayIndex = 0\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n <Box marginBottom={1}>\n <Text bold>Permission Rules</Text>\n </Box>\n\n {/* Default decision */}\n <Box marginBottom={1}>\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>Default decision: </Text>\n <Text color={getDecisionColor(defaultDecision)} bold>\n {formatDecision(defaultDecision)}\n </Text>\n </Text>\n </Box>\n\n {/* Project rules */}\n {projectRules.length > 0 && (\n <>\n <Box marginTop={1}>\n <Text bold color=\"blue\">\n Project Rules ({projectRules.length})\n </Text>\n </Box>\n {projectRules.map(rule => {\n const result = renderRule(rule, displayIndex)\n displayIndex++\n return result\n })}\n </>\n )}\n\n {/* Global rules */}\n {globalRules.length > 0 && (\n <>\n <Box marginTop={1}>\n <Text bold color=\"magenta\">\n Global Rules ({globalRules.length})\n </Text>\n </Box>\n {globalRules.map(rule => {\n const result = renderRule(rule, displayIndex)\n displayIndex++\n return result\n })}\n </>\n )}\n\n {rules.length === 0 && (\n <Box paddingLeft={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n No custom rules defined. Using default rules.\n </Text>\n </Box>\n )}\n\n {/* Help */}\n <Box marginTop={2}>\n <Text color={SEMANTIC_COLORS.dim}>\u2191/\u2193: Navigate | q/Esc: Exit</Text>\n </Box>\n\n {/* Legend */}\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n Legend: <Text color=\"green\">ALLOW</Text> = auto-approve,{' '}\n <Text color=\"red\">DENY</Text> = block, <Text color=\"yellow\">ASK</Text>{' '}\n = prompt user\n </Text>\n </Box>\n </Box>\n )\n}\n\nconst command: Command = {\n name: 'permissions',\n description: 'View and manage permission rules for tool access',\n isEnabled: true,\n isHidden: false,\n type: 'local-jsx',\n aliases: ['perms'],\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone, _context) {\n const engine = getPermissionRuleEngine()\n const rules = engine.getRules()\n const defaultDecision = engine.getDefaultDecision()\n\n return (\n <PermissionList\n rules={rules}\n defaultDecision={defaultDecision}\n onDone={onDone}\n />\n )\n },\n}\n\nexport default command\n"],
5
+ "mappings": "AAMA,OAAO,SAAS,gBAAgB;AAChC,SAAS,KAAK,MAAM,gBAAgB;AAEpC;AAAA,EACE;AAAA,OAGK;AACP,SAAS,uBAAuB;AAQhC,MAAM,iBAAiB,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACF,MAA2B;AACzB,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,CAAC;AAEpD,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,SAAS;AACf,uBAAiB,KAAK,IAAI,GAAG,gBAAgB,CAAC,CAAC;AAAA,IACjD,WAAW,IAAI,WAAW;AACxB,uBAAiB,KAAK,IAAI,MAAM,SAAS,GAAG,gBAAgB,CAAC,CAAC;AAAA,IAChE,WAAW,UAAU,OAAO,IAAI,QAAQ;AACtC,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAGD,QAAM,cAAc,MAAM,OAAO,OAAK,EAAE,UAAU,QAAQ;AAC1D,QAAM,eAAe,MAAM,OAAO,OAAK,EAAE,UAAU,SAAS;AAE5D,QAAM,mBAAmB,CAAC,aAAqC;AAC7D,YAAQ,UAAU;AAAA,MAChB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,IACX;AAAA,EACF;AAEA,QAAM,iBAAiB,CAAC,aAAqC;AAC3D,YAAQ,UAAU;AAAA,MAChB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,IACX;AAAA,EACF;AAEA,QAAM,aAAa,CAAC,MAA6B,UAAkB;AACjE,UAAM,aAAa,UAAU;AAC7B,WACE,oCAAC,OAAI,KAAK,KAAK,IAAI,aAAa,KAC9B,oCAAC,QAAK,OAAO,aAAa,SAAS,UAChC,aAAa,YAAO,MACrB,oCAAC,QAAK,OAAO,iBAAiB,KAAK,QAAQ,KACxC,eAAe,KAAK,QAAQ,EAAE,OAAO,EAAE,CAC1C,GACA,oCAAC,QAAK,MAAI,QAAE,KAAK,QAAQ,OAAO,EAAE,CAAE,GACpC,oCAAC,QAAK,OAAO,gBAAgB,OAAK,KAAE,KAAK,QAAS,GACjD,KAAK,eACJ,oCAAC,QAAK,OAAO,gBAAgB,OAAK,OAAI,KAAK,WAAY,CAE3D,CACF;AAAA,EAEJ;AAEA,MAAI,eAAe;AAEnB,SACE,oCAAC,OAAI,eAAc,UAAS,SAAS,KACnC,oCAAC,OAAI,cAAc,KACjB,oCAAC,QAAK,MAAI,QAAC,kBAAgB,CAC7B,GAGA,oCAAC,OAAI,cAAc,KACjB,oCAAC,YACC,oCAAC,QAAK,OAAO,gBAAgB,OAAK,oBAAkB,GACpD,oCAAC,QAAK,OAAO,iBAAiB,eAAe,GAAG,MAAI,QACjD,eAAe,eAAe,CACjC,CACF,CACF,GAGC,aAAa,SAAS,KACrB,0DACE,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,MAAI,MAAC,OAAM,UAAO,mBACN,aAAa,QAAO,GACtC,CACF,GACC,aAAa,IAAI,UAAQ;AACxB,UAAM,SAAS,WAAW,MAAM,YAAY;AAC5C;AACA,WAAO;AAAA,EACT,CAAC,CACH,GAID,YAAY,SAAS,KACpB,0DACE,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,MAAI,MAAC,OAAM,aAAU,kBACV,YAAY,QAAO,GACpC,CACF,GACC,YAAY,IAAI,UAAQ;AACvB,UAAM,SAAS,WAAW,MAAM,YAAY;AAC5C;AACA,WAAO;AAAA,EACT,CAAC,CACH,GAGD,MAAM,WAAW,KAChB,oCAAC,OAAI,aAAa,KAChB,oCAAC,QAAK,OAAO,gBAAgB,OAAK,+CAElC,CACF,GAIF,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAO,gBAAgB,OAAK,uCAA2B,CAC/D,GAGA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAO,gBAAgB,OAAK,YACxB,oCAAC,QAAK,OAAM,WAAQ,OAAK,GAAO,oBAAiB,KACzD,oCAAC,QAAK,OAAM,SAAM,MAAI,GAAO,cAAU,oCAAC,QAAK,OAAM,YAAS,KAAG,GAAQ,KAAI,eAE7E,CACF,CACF;AAEJ;AAEA,MAAM,UAAmB;AAAA,EACvB,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS,CAAC,OAAO;AAAA,EAEjB,iBAAiB;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,KAAK,QAAQ,UAAU;AAC3B,UAAM,SAAS,wBAAwB;AACvC,UAAM,QAAQ,OAAO,SAAS;AAC9B,UAAM,kBAAkB,OAAO,mBAAmB;AAElD,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,IAAO,sBAAQ;",
6
+ "names": []
7
+ }
@@ -5,6 +5,7 @@ import TextInput from "../../components/TextInput.js";
5
5
  import { addMarketplace } from "../../utils/marketplaceManager.js";
6
6
  import { MarketplaceError } from "../../types/marketplace.js";
7
7
  import { getTheme } from "../../utils/theme.js";
8
+ import { SEMANTIC_COLORS } from "../../constants/colors.js";
8
9
  const AddMarketplaceForm = ({
9
10
  onNavigate,
10
11
  onBack
@@ -55,7 +56,7 @@ const AddMarketplaceForm = ({
55
56
  padding: 1
56
57
  },
57
58
  /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Add Marketplace"),
58
- /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, "Enter marketplace source:"), /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column", marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Examples:"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " \u2022 owner/repo (GitHub shorthand)"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " \u2022 git@github.com:owner/repo.git (SSH URL)"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " \u2022 https://github.com/owner/repo.git (HTTPS URL)"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " \u2022 ./path/to/local/marketplace (Local path)"))),
59
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, "Enter marketplace source:"), /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column", marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Examples:"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "\u2022 owner/repo (GitHub shorthand)"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "\u2022 git@github.com:owner/repo.git (SSH URL)"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "\u2022 https://github.com/owner/repo.git (HTTPS URL)"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "\u2022 ./path/to/local/marketplace (Local path)"))),
59
60
  /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Source: "), /* @__PURE__ */ React.createElement(
60
61
  TextInput,
61
62
  {
@@ -81,7 +82,7 @@ const AddMarketplaceForm = ({
81
82
  /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "\u2717 ", error)
82
83
  ),
83
84
  adding && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(SimpleSpinner, null), /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, " Adding marketplace...")),
84
- !adding && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Enter"), " to add \xB7", " ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Esc"), " to cancel"))
85
+ !adding && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Enter"), " to add \xB7", " ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Esc"), " to cancel"))
85
86
  );
86
87
  };
87
88
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/plugin/AddMarketplaceForm.tsx"],
4
- "sourcesContent": ["/**\n * AddMarketplaceForm Component\n *\n * Interactive form for adding new plugin marketplaces\n */\n\nimport React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { SimpleSpinner } from '@components/Spinner'\nimport TextInput from '@components/TextInput'\nimport { addMarketplace } from '@utils/marketplaceManager'\nimport { MarketplaceError } from '../../types/marketplace'\nimport { getTheme } from '@utils/theme'\n\nexport interface NavigationProps {\n onNavigate: (params: { screen: string; [key: string]: any }) => void\n onBack: () => void\n}\n\nexport const AddMarketplaceForm: React.FC<NavigationProps> = ({\n onNavigate,\n onBack,\n}) => {\n const [source, setSource] = useState('')\n const [adding, setAdding] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [cursorOffset, setCursorOffset] = useState(0)\n const theme = getTheme()\n\n const handleSubmit = async () => {\n if (!source.trim()) {\n setError('Source cannot be empty')\n return\n }\n\n setAdding(true)\n setError(null)\n\n try {\n const marketplace = await addMarketplace(source)\n // Success - navigate back to marketplace manager\n onBack()\n } catch (err) {\n if (err instanceof MarketplaceError) {\n setError(err.message)\n } else {\n setError(\n err instanceof Error ? err.message : 'Failed to add marketplace',\n )\n }\n } finally {\n setAdding(false)\n }\n }\n\n useInput(\n (input, key) => {\n if (key.escape && !adding) {\n onBack()\n } else if (key.return && !adding) {\n handleSubmit()\n }\n },\n { isActive: !adding },\n )\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Text bold color={theme.primary}>\n Add Marketplace\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text>Enter marketplace source:</Text>\n <Box marginTop={1} flexDirection=\"column\" marginLeft={2}>\n <Text dimColor>Examples:</Text>\n <Text dimColor> \u2022 owner/repo (GitHub shorthand)</Text>\n <Text dimColor> \u2022 git@github.com:owner/repo.git (SSH URL)</Text>\n <Text dimColor> \u2022 https://github.com/owner/repo.git (HTTPS URL)</Text>\n <Text dimColor> \u2022 ./path/to/local/marketplace (Local path)</Text>\n </Box>\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Box>\n <Text color={theme.success}>Source: </Text>\n <TextInput\n value={source}\n onChange={setSource}\n placeholder=\"Enter source...\"\n focus={!adding}\n showCursor={!adding}\n isDimmed={adding}\n columns={60}\n cursorOffset={cursorOffset}\n onChangeCursorOffset={setCursorOffset}\n />\n </Box>\n </Box>\n\n {error && (\n <Box\n marginTop={1}\n borderStyle=\"round\"\n borderColor={theme.error}\n padding={1}\n >\n <Text color={theme.error}>\u2717 {error}</Text>\n </Box>\n )}\n\n {adding && (\n <Box marginTop={1}>\n <SimpleSpinner />\n <Text color={theme.primary}> Adding marketplace...</Text>\n </Box>\n )}\n\n {!adding && (\n <Box marginTop={1}>\n <Text dimColor>\n <Text color={theme.success}>Enter</Text> to add \u00B7{' '}\n <Text color={theme.error}>Esc</Text> to cancel\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n"],
5
- "mappings": "AAMA,OAAO,SAAS,gBAAgB;AAChC,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,qBAAqB;AAC9B,OAAO,eAAe;AACtB,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AACjC,SAAS,gBAAgB;AAOlB,MAAM,qBAAgD,CAAC;AAAA,EAC5D;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,EAAE;AACvC,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AACtD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,CAAC;AAClD,QAAM,QAAQ,SAAS;AAEvB,QAAM,eAAe,YAAY;AAC/B,QAAI,CAAC,OAAO,KAAK,GAAG;AAClB,eAAS,wBAAwB;AACjC;AAAA,IACF;AAEA,cAAU,IAAI;AACd,aAAS,IAAI;AAEb,QAAI;AACF,YAAM,cAAc,MAAM,eAAe,MAAM;AAE/C,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,UAAI,eAAe,kBAAkB;AACnC,iBAAS,IAAI,OAAO;AAAA,MACtB,OAAO;AACL;AAAA,UACE,eAAe,QAAQ,IAAI,UAAU;AAAA,QACvC;AAAA,MACF;AAAA,IACF,UAAE;AACA,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF;AAEA;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,IAAI,UAAU,CAAC,QAAQ;AACzB,eAAO;AAAA,MACT,WAAW,IAAI,UAAU,CAAC,QAAQ;AAChC,qBAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,EAAE,UAAU,CAAC,OAAO;AAAA,EACtB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,SAAS;AAAA;AAAA,IAET,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,iBAEjC;AAAA,IAEA,oCAAC,OAAI,WAAW,GAAG,eAAc,YAC/B,oCAAC,YAAK,2BAAyB,GAC/B,oCAAC,OAAI,WAAW,GAAG,eAAc,UAAS,YAAY,KACpD,oCAAC,QAAK,UAAQ,QAAC,WAAS,GACxB,oCAAC,QAAK,UAAQ,QAAC,uCAAgC,GAC/C,oCAAC,QAAK,UAAQ,QAAC,iDAA0C,GACzD,oCAAC,QAAK,UAAQ,QAAC,uDAAgD,GAC/D,oCAAC,QAAK,UAAQ,QAAC,kDAA2C,CAC5D,CACF;AAAA,IAEA,oCAAC,OAAI,WAAW,GAAG,eAAc,YAC/B,oCAAC,WACC,oCAAC,QAAK,OAAO,MAAM,WAAS,UAAQ,GACpC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,UAAU;AAAA,QACV,aAAY;AAAA,QACZ,OAAO,CAAC;AAAA,QACR,YAAY,CAAC;AAAA,QACb,UAAU;AAAA,QACV,SAAS;AAAA,QACT;AAAA,QACA,sBAAsB;AAAA;AAAA,IACxB,CACF,CACF;AAAA,IAEC,SACC;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,QACX,aAAY;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB,SAAS;AAAA;AAAA,MAET,oCAAC,QAAK,OAAO,MAAM,SAAO,WAAG,KAAM;AAAA,IACrC;AAAA,IAGD,UACC,oCAAC,OAAI,WAAW,KACd,oCAAC,mBAAc,GACf,oCAAC,QAAK,OAAO,MAAM,WAAS,wBAAsB,CACpD;AAAA,IAGD,CAAC,UACA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QACZ,oCAAC,QAAK,OAAO,MAAM,WAAS,OAAK,GAAO,gBAAU,KAClD,oCAAC,QAAK,OAAO,MAAM,SAAO,KAAG,GAAO,YACtC,CACF;AAAA,EAEJ;AAEJ;",
4
+ "sourcesContent": ["/**\n * AddMarketplaceForm Component\n *\n * Interactive form for adding new plugin marketplaces\n */\n\nimport React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { SimpleSpinner } from '@components/Spinner'\nimport TextInput from '@components/TextInput'\nimport { addMarketplace } from '@utils/marketplaceManager'\nimport { MarketplaceError } from '../../types/marketplace'\nimport { getTheme } from '@utils/theme'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\nexport interface NavigationProps {\n onNavigate: (params: { screen: string; [key: string]: any }) => void\n onBack: () => void\n}\n\nexport const AddMarketplaceForm: React.FC<NavigationProps> = ({\n onNavigate,\n onBack,\n}) => {\n const [source, setSource] = useState('')\n const [adding, setAdding] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [cursorOffset, setCursorOffset] = useState(0)\n const theme = getTheme()\n\n const handleSubmit = async () => {\n if (!source.trim()) {\n setError('Source cannot be empty')\n return\n }\n\n setAdding(true)\n setError(null)\n\n try {\n const marketplace = await addMarketplace(source)\n // Success - navigate back to marketplace manager\n onBack()\n } catch (err) {\n if (err instanceof MarketplaceError) {\n setError(err.message)\n } else {\n setError(\n err instanceof Error ? err.message : 'Failed to add marketplace',\n )\n }\n } finally {\n setAdding(false)\n }\n }\n\n useInput(\n (input, key) => {\n if (key.escape && !adding) {\n onBack()\n } else if (key.return && !adding) {\n handleSubmit()\n }\n },\n { isActive: !adding },\n )\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Text bold color={theme.primary}>\n Add Marketplace\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text>Enter marketplace source:</Text>\n <Box marginTop={1} flexDirection=\"column\" marginLeft={2}>\n <Text color={SEMANTIC_COLORS.dim}>Examples:</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n \u2022 owner/repo (GitHub shorthand)\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n \u2022 git@github.com:owner/repo.git (SSH URL)\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n \u2022 https://github.com/owner/repo.git (HTTPS URL)\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n \u2022 ./path/to/local/marketplace (Local path)\n </Text>\n </Box>\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Box>\n <Text color={theme.success}>Source: </Text>\n <TextInput\n value={source}\n onChange={setSource}\n placeholder=\"Enter source...\"\n focus={!adding}\n showCursor={!adding}\n isDimmed={adding}\n columns={60}\n cursorOffset={cursorOffset}\n onChangeCursorOffset={setCursorOffset}\n />\n </Box>\n </Box>\n\n {error && (\n <Box\n marginTop={1}\n borderStyle=\"round\"\n borderColor={theme.error}\n padding={1}\n >\n <Text color={theme.error}>\u2717 {error}</Text>\n </Box>\n )}\n\n {adding && (\n <Box marginTop={1}>\n <SimpleSpinner />\n <Text color={theme.primary}> Adding marketplace...</Text>\n </Box>\n )}\n\n {!adding && (\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n <Text color={theme.success}>Enter</Text> to add \u00B7{' '}\n <Text color={theme.error}>Esc</Text> to cancel\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,7 @@
1
1
  import React from "react";
2
2
  import { Box, Text, useInput } from "ink";
3
3
  import { getTheme } from "../../utils/theme.js";
4
+ import { SEMANTIC_COLORS } from "../../constants/colors.js";
4
5
  const ConfirmDialog = ({
5
6
  title,
6
7
  message,
@@ -74,7 +75,7 @@ const ConfirmDialog = ({
74
75
  cancelText
75
76
  )
76
77
  )),
77
- /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2190 \u2192 navigate \xB7 ", /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Enter"), " confirm \xB7", " ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Esc"), " cancel"))
78
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "\u2190 \u2192 navigate \xB7 ", /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Enter"), " confirm \xB7", " ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Esc"), " cancel"))
78
79
  );
79
80
  };
80
81
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/plugin/ConfirmDialog.tsx"],
4
- "sourcesContent": ["/**\n * ConfirmDialog Component\n *\n * Reusable confirmation dialog for marketplace operations\n */\n\nimport React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\n\nexport interface ConfirmDialogProps {\n title: string\n message: string\n onConfirm: () => void\n onCancel: () => void\n confirmColor?: string\n confirmText?: string\n cancelText?: string\n}\n\nexport const ConfirmDialog: React.FC<ConfirmDialogProps> = ({\n title,\n message,\n onConfirm,\n onCancel,\n confirmColor,\n confirmText = 'Yes',\n cancelText = 'No',\n}) => {\n const theme = getTheme()\n const [focused, setFocused] = React.useState<'confirm' | 'cancel'>('cancel')\n\n useInput((input, key) => {\n if (key.escape) {\n onCancel()\n } else if (key.return) {\n if (focused === 'confirm') {\n onConfirm()\n } else {\n onCancel()\n }\n } else if (key.leftArrow) {\n setFocused(focused === 'confirm' ? 'cancel' : 'confirm')\n } else if (key.rightArrow) {\n setFocused(focused === 'confirm' ? 'cancel' : 'confirm')\n } else if (input === 'y' || input === 'Y') {\n onConfirm()\n } else if (input === 'n' || input === 'N') {\n onCancel()\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.warning}\n padding={1}\n >\n <Text bold color={theme.warning}>\n {title}\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n {message.split('\\n').map((line, idx) => {\n // Handle React Text component which doesn't accept key prop in its type definition\n // but we need unique keys for list rendering\n return <Text {...({ key: `line-${idx}` } as any)}>{line}</Text>\n })}\n </Box>\n\n <Box marginTop={1} gap={2}>\n <Box\n borderStyle={focused === 'confirm' ? 'round' : 'single'}\n borderColor={\n focused === 'confirm'\n ? confirmColor || theme.success\n : theme.secondaryText\n }\n paddingX={2}\n >\n <Text\n color={\n focused === 'confirm'\n ? confirmColor || theme.success\n : theme.secondaryText\n }\n bold={focused === 'confirm'}\n >\n {confirmText}\n </Text>\n </Box>\n\n <Box\n borderStyle={focused === 'cancel' ? 'round' : 'single'}\n borderColor={\n focused === 'cancel' ? theme.primary : theme.secondaryText\n }\n paddingX={2}\n >\n <Text\n color={focused === 'cancel' ? theme.primary : theme.secondaryText}\n bold={focused === 'cancel'}\n >\n {cancelText}\n </Text>\n </Box>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n \u2190 \u2192 navigate \u00B7 <Text color={theme.success}>Enter</Text> confirm \u00B7{' '}\n <Text color={theme.error}>Esc</Text> cancel\n </Text>\n </Box>\n </Box>\n )\n}\n"],
5
- "mappings": "AAMA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AAYlB,MAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,aAAa;AACf,MAAM;AACJ,QAAM,QAAQ,SAAS;AACvB,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAA+B,QAAQ;AAE3E,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,eAAS;AAAA,IACX,WAAW,IAAI,QAAQ;AACrB,UAAI,YAAY,WAAW;AACzB,kBAAU;AAAA,MACZ,OAAO;AACL,iBAAS;AAAA,MACX;AAAA,IACF,WAAW,IAAI,WAAW;AACxB,iBAAW,YAAY,YAAY,WAAW,SAAS;AAAA,IACzD,WAAW,IAAI,YAAY;AACzB,iBAAW,YAAY,YAAY,WAAW,SAAS;AAAA,IACzD,WAAW,UAAU,OAAO,UAAU,KAAK;AACzC,gBAAU;AAAA,IACZ,WAAW,UAAU,OAAO,UAAU,KAAK;AACzC,eAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,SAAS;AAAA;AAAA,IAET,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WACrB,KACH;AAAA,IAEA,oCAAC,OAAI,WAAW,GAAG,eAAc,YAC9B,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,QAAQ;AAGtC,aAAO,oCAAC,QAAM,GAAI,EAAE,KAAK,QAAQ,GAAG,GAAG,KAAY,IAAK;AAAA,IAC1D,CAAC,CACH;AAAA,IAEA,oCAAC,OAAI,WAAW,GAAG,KAAK,KACtB;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,YAAY,YAAY,UAAU;AAAA,QAC/C,aACE,YAAY,YACR,gBAAgB,MAAM,UACtB,MAAM;AAAA,QAEZ,UAAU;AAAA;AAAA,MAEV;AAAA,QAAC;AAAA;AAAA,UACC,OACE,YAAY,YACR,gBAAgB,MAAM,UACtB,MAAM;AAAA,UAEZ,MAAM,YAAY;AAAA;AAAA,QAEjB;AAAA,MACH;AAAA,IACF,GAEA;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,YAAY,WAAW,UAAU;AAAA,QAC9C,aACE,YAAY,WAAW,MAAM,UAAU,MAAM;AAAA,QAE/C,UAAU;AAAA;AAAA,MAEV;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,YAAY,WAAW,MAAM,UAAU,MAAM;AAAA,UACpD,MAAM,YAAY;AAAA;AAAA,QAEjB;AAAA,MACH;AAAA,IACF,CACF;AAAA,IAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,gCACE,oCAAC,QAAK,OAAO,MAAM,WAAS,OAAK,GAAO,iBAAW,KAClE,oCAAC,QAAK,OAAO,MAAM,SAAO,KAAG,GAAO,SACtC,CACF;AAAA,EACF;AAEJ;",
4
+ "sourcesContent": ["/**\n * ConfirmDialog Component\n *\n * Reusable confirmation dialog for marketplace operations\n */\n\nimport React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\nexport interface ConfirmDialogProps {\n title: string\n message: string\n onConfirm: () => void\n onCancel: () => void\n confirmColor?: string\n confirmText?: string\n cancelText?: string\n}\n\nexport const ConfirmDialog: React.FC<ConfirmDialogProps> = ({\n title,\n message,\n onConfirm,\n onCancel,\n confirmColor,\n confirmText = 'Yes',\n cancelText = 'No',\n}) => {\n const theme = getTheme()\n const [focused, setFocused] = React.useState<'confirm' | 'cancel'>('cancel')\n\n useInput((input, key) => {\n if (key.escape) {\n onCancel()\n } else if (key.return) {\n if (focused === 'confirm') {\n onConfirm()\n } else {\n onCancel()\n }\n } else if (key.leftArrow) {\n setFocused(focused === 'confirm' ? 'cancel' : 'confirm')\n } else if (key.rightArrow) {\n setFocused(focused === 'confirm' ? 'cancel' : 'confirm')\n } else if (input === 'y' || input === 'Y') {\n onConfirm()\n } else if (input === 'n' || input === 'N') {\n onCancel()\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.warning}\n padding={1}\n >\n <Text bold color={theme.warning}>\n {title}\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n {message.split('\\n').map((line, idx) => {\n // Handle React Text component which doesn't accept key prop in its type definition\n // but we need unique keys for list rendering\n return <Text {...({ key: `line-${idx}` } as any)}>{line}</Text>\n })}\n </Box>\n\n <Box marginTop={1} gap={2}>\n <Box\n borderStyle={focused === 'confirm' ? 'round' : 'single'}\n borderColor={\n focused === 'confirm'\n ? confirmColor || theme.success\n : theme.secondaryText\n }\n paddingX={2}\n >\n <Text\n color={\n focused === 'confirm'\n ? confirmColor || theme.success\n : theme.secondaryText\n }\n bold={focused === 'confirm'}\n >\n {confirmText}\n </Text>\n </Box>\n\n <Box\n borderStyle={focused === 'cancel' ? 'round' : 'single'}\n borderColor={\n focused === 'cancel' ? theme.primary : theme.secondaryText\n }\n paddingX={2}\n >\n <Text\n color={focused === 'cancel' ? theme.primary : theme.secondaryText}\n bold={focused === 'cancel'}\n >\n {cancelText}\n </Text>\n </Box>\n </Box>\n\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n \u2190 \u2192 navigate \u00B7 <Text color={theme.success}>Enter</Text> confirm \u00B7{' '}\n <Text color={theme.error}>Esc</Text> cancel\n </Text>\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "AAMA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAYzB,MAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,aAAa;AACf,MAAM;AACJ,QAAM,QAAQ,SAAS;AACvB,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAA+B,QAAQ;AAE3E,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,eAAS;AAAA,IACX,WAAW,IAAI,QAAQ;AACrB,UAAI,YAAY,WAAW;AACzB,kBAAU;AAAA,MACZ,OAAO;AACL,iBAAS;AAAA,MACX;AAAA,IACF,WAAW,IAAI,WAAW;AACxB,iBAAW,YAAY,YAAY,WAAW,SAAS;AAAA,IACzD,WAAW,IAAI,YAAY;AACzB,iBAAW,YAAY,YAAY,WAAW,SAAS;AAAA,IACzD,WAAW,UAAU,OAAO,UAAU,KAAK;AACzC,gBAAU;AAAA,IACZ,WAAW,UAAU,OAAO,UAAU,KAAK;AACzC,eAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,SAAS;AAAA;AAAA,IAET,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WACrB,KACH;AAAA,IAEA,oCAAC,OAAI,WAAW,GAAG,eAAc,YAC9B,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,QAAQ;AAGtC,aAAO,oCAAC,QAAM,GAAI,EAAE,KAAK,QAAQ,GAAG,GAAG,KAAY,IAAK;AAAA,IAC1D,CAAC,CACH;AAAA,IAEA,oCAAC,OAAI,WAAW,GAAG,KAAK,KACtB;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,YAAY,YAAY,UAAU;AAAA,QAC/C,aACE,YAAY,YACR,gBAAgB,MAAM,UACtB,MAAM;AAAA,QAEZ,UAAU;AAAA;AAAA,MAEV;AAAA,QAAC;AAAA;AAAA,UACC,OACE,YAAY,YACR,gBAAgB,MAAM,UACtB,MAAM;AAAA,UAEZ,MAAM,YAAY;AAAA;AAAA,QAEjB;AAAA,MACH;AAAA,IACF,GAEA;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,YAAY,WAAW,UAAU;AAAA,QAC9C,aACE,YAAY,WAAW,MAAM,UAAU,MAAM;AAAA,QAE/C,UAAU;AAAA;AAAA,MAEV;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,YAAY,WAAW,MAAM,UAAU,MAAM;AAAA,UACpD,MAAM,YAAY;AAAA;AAAA,QAEjB;AAAA,MACH;AAAA,IACF,CACF;AAAA,IAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAO,gBAAgB,OAAK,gCACjB,oCAAC,QAAK,OAAO,MAAM,WAAS,OAAK,GAAO,iBAAW,KAClE,oCAAC,QAAK,OAAO,MAAM,SAAO,KAAG,GAAO,SACtC,CACF;AAAA,EACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,7 @@
1
1
  import React from "react";
2
2
  import { Box, Text, useInput } from "ink";
3
3
  import { getTheme } from "../../utils/theme.js";
4
+ import { SEMANTIC_COLORS } from "../../constants/colors.js";
4
5
  const ErrorView = ({
5
6
  error,
6
7
  onRetry,
@@ -24,7 +25,7 @@ const ErrorView = ({
24
25
  },
25
26
  /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.error }, "Error"),
26
27
  /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, null, error)),
27
- /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, onRetry && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "r"), " to retry"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Esc"), " to go back"))
28
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, onRetry && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "r"), " to retry"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Esc"), " to go back"))
28
29
  );
29
30
  };
30
31
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/plugin/ErrorView.tsx"],
4
- "sourcesContent": ["import React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\n\nexport interface ErrorViewProps {\n error: string\n onRetry?: () => void\n onBack: () => void\n}\n\nexport const ErrorView: React.FC<ErrorViewProps> = ({\n error,\n onRetry,\n onBack,\n}) => {\n const theme = getTheme()\n\n useInput((input, key) => {\n if (key.escape) {\n onBack()\n } else if (input === 'r' && onRetry) {\n onRetry()\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n padding={1}\n >\n <Text bold color={theme.error}>\n Error\n </Text>\n <Box marginTop={1}>\n <Text>{error}</Text>\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n {onRetry && (\n <Text dimColor>\n Press <Text bold>r</Text> to retry\n </Text>\n )}\n <Text dimColor>\n Press <Text bold>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n )\n}\n"],
5
- "mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AAQlB,MAAM,YAAsC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,SAAS;AAEvB,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,aAAO;AAAA,IACT,WAAW,UAAU,OAAO,SAAS;AACnC,cAAQ;AAAA,IACV;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,SAAS;AAAA;AAAA,IAET,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,SAAO,OAE/B;AAAA,IACA,oCAAC,OAAI,WAAW,KACd,oCAAC,YAAM,KAAM,CACf;AAAA,IACA,oCAAC,OAAI,WAAW,GAAG,eAAc,YAC9B,WACC,oCAAC,QAAK,UAAQ,QAAC,UACP,oCAAC,QAAK,MAAI,QAAC,GAAC,GAAO,WAC3B,GAEF,oCAAC,QAAK,UAAQ,QAAC,UACP,oCAAC,QAAK,MAAI,QAAC,KAAG,GAAO,aAC7B,CACF;AAAA,EACF;AAEJ;",
4
+ "sourcesContent": ["import React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\nexport interface ErrorViewProps {\n error: string\n onRetry?: () => void\n onBack: () => void\n}\n\nexport const ErrorView: React.FC<ErrorViewProps> = ({\n error,\n onRetry,\n onBack,\n}) => {\n const theme = getTheme()\n\n useInput((input, key) => {\n if (key.escape) {\n onBack()\n } else if (input === 'r' && onRetry) {\n onRetry()\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n padding={1}\n >\n <Text bold color={theme.error}>\n Error\n </Text>\n <Box marginTop={1}>\n <Text>{error}</Text>\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n {onRetry && (\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>r</Text> to retry\n </Text>\n )}\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAQzB,MAAM,YAAsC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,SAAS;AAEvB,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,aAAO;AAAA,IACT,WAAW,UAAU,OAAO,SAAS;AACnC,cAAQ;AAAA,IACV;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,SAAS;AAAA;AAAA,IAET,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,SAAO,OAE/B;AAAA,IACA,oCAAC,OAAI,WAAW,KACd,oCAAC,YAAM,KAAM,CACf;AAAA,IACA,oCAAC,OAAI,WAAW,GAAG,eAAc,YAC9B,WACC,oCAAC,QAAK,OAAO,gBAAgB,OAAK,UAC1B,oCAAC,QAAK,MAAI,QAAC,GAAC,GAAO,WAC3B,GAEF,oCAAC,QAAK,OAAO,gBAAgB,OAAK,UAC1B,oCAAC,QAAK,MAAI,QAAC,KAAG,GAAO,aAC7B,CACF;AAAA,EACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -5,6 +5,7 @@ import {
5
5
  togglePluginEnabled,
6
6
  getPlugin
7
7
  } from "../../utils/pluginLoader.js";
8
+ import { SEMANTIC_COLORS } from "../../constants/colors.js";
8
9
  import { getTheme } from "../../utils/theme.js";
9
10
  const InstalledPluginsByMarketplace = ({ marketplace, onNavigate, onBack }) => {
10
11
  const [plugins, setPlugins] = useState([]);
@@ -120,7 +121,7 @@ const InstalledPluginsByMarketplace = ({ marketplace, onNavigate, onBack }) => {
120
121
  }
121
122
  });
122
123
  if (showConfirm && confirmAction === "uninstall") {
123
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.warning }, "Confirm Uninstall Mark"), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, null, 'Mark plugin "', plugins[selectedIndex]?.manifest.name, '" for uninstallation?'), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "This will mark the plugin for removal. Use batch actions to complete."), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Y"), "es /", " ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "N"), "o"));
124
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.warning }, "Confirm Uninstall Mark"), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, null, 'Mark plugin "', plugins[selectedIndex]?.manifest.name, '" for uninstallation?'), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "This will mark the plugin for removal. Use batch actions to complete."), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Y"), "es /", " ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "N"), "o"));
124
125
  }
125
126
  return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, marketplace.name, " \u203A Manage Plugins (", plugins.length, ")"), /* @__PURE__ */ React.createElement(Text, null, ""), plugins.length === 0 ? /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, "No plugins installed from this marketplace")) : plugins.map((plugin, index) => {
126
127
  const isSelected = index === selectedIndex;
@@ -136,14 +137,14 @@ const InstalledPluginsByMarketplace = ({ marketplace, onNavigate, onBack }) => {
136
137
  marginBottom: 1
137
138
  },
138
139
  /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: isSelected ? theme.success : void 0 }, isSelected ? "\u276F " : " ", statusIcon, " ", plugin.manifest.displayName || plugin.manifest.name), marks.length > 0 && /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, " ", marks.join(" "))),
139
- /* @__PURE__ */ React.createElement(Box, { marginLeft: 4 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, plugin.manifest.description, " \xB7 v", plugin.manifest.version)),
140
- isSelected && /* @__PURE__ */ React.createElement(Box, { marginLeft: 4 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Components:", " ", [
140
+ /* @__PURE__ */ React.createElement(Box, { marginLeft: 4 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, plugin.manifest.description, " \xB7 v", plugin.manifest.version)),
141
+ isSelected && /* @__PURE__ */ React.createElement(Box, { marginLeft: 4 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Components:", " ", [
141
142
  plugin.agents.length > 0 && `${plugin.agents.length} agent(s)`,
142
143
  plugin.commands.length > 0 && `${plugin.commands.length} command(s)`,
143
144
  plugin.skills.length > 0 && `${plugin.skills.length} skill(s)`
144
145
  ].filter(Boolean).join(", ") || "none"))
145
146
  );
146
- }), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Space Toggle \xB7 U Mark Update \xB7 D/Del Mark Uninstall"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Enter Details \xB7 Esc Back")));
147
+ }), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Space Toggle \xB7 U Mark Update \xB7 D/Del Mark Uninstall"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Enter Details \xB7 Esc Back")));
147
148
  };
148
149
  export {
149
150
  InstalledPluginsByMarketplace
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/plugin/InstalledPluginsByMarketplace.tsx"],
4
- "sourcesContent": ["/**\n * Installed Plugins By Marketplace\n *\n * Displays all plugins from a specific marketplace with management actions.\n * Supports enable/disable toggle, marking for update/uninstall, and viewing details.\n */\n\nimport React, { useState, useEffect, useCallback } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport {\n loadAllPlugins,\n togglePluginEnabled,\n getPlugin,\n} from '@utils/pluginLoader'\nimport { LoadedPlugin } from '../../types/plugin'\nimport { RegisteredMarketplace } from '../../types/marketplace'\nimport { getTheme } from '@utils/theme'\nimport { NavigationProps } from './types'\n\ninterface InstalledPluginsByMarketplaceProps extends NavigationProps {\n marketplace: RegisteredMarketplace\n}\n\ninterface PluginWithMarks extends LoadedPlugin {\n markedForUpdate?: boolean\n markedForUninstall?: boolean\n}\n\nexport const InstalledPluginsByMarketplace: React.FC<\n InstalledPluginsByMarketplaceProps\n> = ({ marketplace, onNavigate, onBack }) => {\n const [plugins, setPlugins] = useState<PluginWithMarks[]>([])\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [showConfirm, setShowConfirm] = useState(false)\n const [confirmAction, setConfirmAction] = useState<'uninstall' | null>(null)\n const theme = getTheme()\n\n const loadPlugins = useCallback(() => {\n const allPlugins = loadAllPlugins()\n\n // Filter plugins for this marketplace\n const filtered = allPlugins.filter(p => {\n if (marketplace.name === 'local') {\n // Local includes plugins not from any marketplace\n if (p.source.type === 'marketplace') return false\n if (\n p.source.type === 'local' &&\n p.source.path.includes('/.minto/plugins/')\n ) {\n return true\n }\n return p.source.type === 'local'\n } else {\n // Check if from this marketplace\n if (p.source.type === 'marketplace') {\n return p.source.marketplace === marketplace.name\n }\n // Also check location path\n return p.location.includes(marketplace.name)\n }\n })\n\n // Convert to PluginWithMarks format\n const withMarks: PluginWithMarks[] = filtered.map(p => ({\n ...p,\n markedForUpdate: false,\n markedForUninstall: false,\n }))\n\n setPlugins(withMarks)\n }, [marketplace])\n\n useEffect(() => {\n loadPlugins()\n }, [loadPlugins])\n\n const handleToggleEnabled = useCallback(() => {\n if (plugins[selectedIndex]) {\n try {\n const newState = togglePluginEnabled(\n plugins[selectedIndex].manifest.name,\n )\n // Reload plugins to reflect changes\n loadPlugins()\n } catch (error) {\n console.error('Error toggling plugin:', error)\n }\n }\n }, [plugins, selectedIndex, loadPlugins])\n\n const handleMarkUpdate = useCallback(() => {\n if (plugins[selectedIndex]) {\n setPlugins(prev => {\n const updated = [...prev]\n updated[selectedIndex] = {\n ...updated[selectedIndex],\n markedForUpdate: !updated[selectedIndex].markedForUpdate,\n }\n return updated\n })\n }\n }, [plugins, selectedIndex])\n\n const handleMarkUninstall = useCallback(() => {\n if (plugins[selectedIndex]) {\n setShowConfirm(true)\n setConfirmAction('uninstall')\n }\n }, [plugins, selectedIndex])\n\n const handleConfirmUninstall = useCallback(() => {\n if (plugins[selectedIndex]) {\n setPlugins(prev => {\n const updated = [...prev]\n updated[selectedIndex] = {\n ...updated[selectedIndex],\n markedForUninstall: !updated[selectedIndex].markedForUninstall,\n }\n return updated\n })\n }\n setShowConfirm(false)\n setConfirmAction(null)\n }, [plugins, selectedIndex])\n\n const handleViewDetails = useCallback(() => {\n if (plugins[selectedIndex]) {\n const plugin = getPlugin(plugins[selectedIndex].manifest.name)\n if (plugin) {\n onNavigate({\n screen: 'plugin-details-manage',\n plugin,\n })\n }\n }\n }, [plugins, selectedIndex, onNavigate])\n\n useInput((input, key) => {\n if (showConfirm) {\n if (key.return || input === 'y') {\n handleConfirmUninstall()\n } else if (key.escape || input === 'n') {\n setShowConfirm(false)\n setConfirmAction(null)\n }\n return\n }\n\n if (key.escape) {\n onBack()\n } else if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(plugins.length - 1, prev + 1))\n } else if (input === ' ') {\n handleToggleEnabled()\n } else if (input === 'u') {\n handleMarkUpdate()\n } else if (key.delete || input === 'd') {\n handleMarkUninstall()\n } else if (key.return) {\n handleViewDetails()\n }\n })\n\n if (showConfirm && confirmAction === 'uninstall') {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.warning}>\n Confirm Uninstall Mark\n </Text>\n <Text>{''}</Text>\n <Text>\n Mark plugin \"{plugins[selectedIndex]?.manifest.name}\" for\n uninstallation?\n </Text>\n <Text dimColor>\n This will mark the plugin for removal. Use batch actions to complete.\n </Text>\n <Text>{''}</Text>\n <Text>\n <Text color={theme.success}>Y</Text>es /{' '}\n <Text color={theme.error}>N</Text>o\n </Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.primary}>\n {marketplace.name} \u203A Manage Plugins ({plugins.length})\n </Text>\n <Text>{''}</Text>\n\n {plugins.length === 0 ? (\n <Box marginLeft={2}>\n <Text color={theme.warning}>\n No plugins installed from this marketplace\n </Text>\n </Box>\n ) : (\n plugins.map((plugin, index) => {\n const isSelected = index === selectedIndex\n const statusIcon = plugin.enabled ? '\u25CF' : '\u25CB'\n const marks = []\n\n if (plugin.markedForUpdate) marks.push('\u2B06')\n if (plugin.markedForUninstall) marks.push('\u2717')\n\n return (\n <Box\n key={plugin.manifest.name}\n flexDirection=\"column\"\n marginBottom={1}\n >\n <Box>\n <Text color={isSelected ? theme.success : undefined}>\n {isSelected ? '\u276F ' : ' '}\n {statusIcon}{' '}\n {plugin.manifest.displayName || plugin.manifest.name}\n </Text>\n {marks.length > 0 && (\n <Text color={theme.warning}> {marks.join(' ')}</Text>\n )}\n </Box>\n <Box marginLeft={4}>\n <Text dimColor>\n {plugin.manifest.description} \u00B7 v{plugin.manifest.version}\n </Text>\n </Box>\n {isSelected && (\n <Box marginLeft={4}>\n <Text dimColor>\n Components:{' '}\n {[\n plugin.agents.length > 0 &&\n `${plugin.agents.length} agent(s)`,\n plugin.commands.length > 0 &&\n `${plugin.commands.length} command(s)`,\n plugin.skills.length > 0 &&\n `${plugin.skills.length} skill(s)`,\n ]\n .filter(Boolean)\n .join(', ') || 'none'}\n </Text>\n </Box>\n )}\n </Box>\n )\n })\n )}\n\n <Text>{''}</Text>\n <Box marginLeft={2} flexDirection=\"column\">\n <Text dimColor>\n Space Toggle \u00B7 U Mark Update \u00B7 D/Del Mark Uninstall\n </Text>\n <Text dimColor>Enter Details \u00B7 Esc Back</Text>\n </Box>\n </Box>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Installed Plugins By Marketplace\n *\n * Displays all plugins from a specific marketplace with management actions.\n * Supports enable/disable toggle, marking for update/uninstall, and viewing details.\n */\n\nimport React, { useState, useEffect, useCallback } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport {\n loadAllPlugins,\n togglePluginEnabled,\n getPlugin,\n} from '@utils/pluginLoader'\nimport { LoadedPlugin } from '../../types/plugin'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport { RegisteredMarketplace } from '../../types/marketplace'\nimport { getTheme } from '@utils/theme'\nimport { NavigationProps } from './types'\n\ninterface InstalledPluginsByMarketplaceProps extends NavigationProps {\n marketplace: RegisteredMarketplace\n}\n\ninterface PluginWithMarks extends LoadedPlugin {\n markedForUpdate?: boolean\n markedForUninstall?: boolean\n}\n\nexport const InstalledPluginsByMarketplace: React.FC<\n InstalledPluginsByMarketplaceProps\n> = ({ marketplace, onNavigate, onBack }) => {\n const [plugins, setPlugins] = useState<PluginWithMarks[]>([])\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [showConfirm, setShowConfirm] = useState(false)\n const [confirmAction, setConfirmAction] = useState<'uninstall' | null>(null)\n const theme = getTheme()\n\n const loadPlugins = useCallback(() => {\n const allPlugins = loadAllPlugins()\n\n // Filter plugins for this marketplace\n const filtered = allPlugins.filter(p => {\n if (marketplace.name === 'local') {\n // Local includes plugins not from any marketplace\n if (p.source.type === 'marketplace') return false\n if (\n p.source.type === 'local' &&\n p.source.path.includes('/.minto/plugins/')\n ) {\n return true\n }\n return p.source.type === 'local'\n } else {\n // Check if from this marketplace\n if (p.source.type === 'marketplace') {\n return p.source.marketplace === marketplace.name\n }\n // Also check location path\n return p.location.includes(marketplace.name)\n }\n })\n\n // Convert to PluginWithMarks format\n const withMarks: PluginWithMarks[] = filtered.map(p => ({\n ...p,\n markedForUpdate: false,\n markedForUninstall: false,\n }))\n\n setPlugins(withMarks)\n }, [marketplace])\n\n useEffect(() => {\n loadPlugins()\n }, [loadPlugins])\n\n const handleToggleEnabled = useCallback(() => {\n if (plugins[selectedIndex]) {\n try {\n const newState = togglePluginEnabled(\n plugins[selectedIndex].manifest.name,\n )\n // Reload plugins to reflect changes\n loadPlugins()\n } catch (error) {\n console.error('Error toggling plugin:', error)\n }\n }\n }, [plugins, selectedIndex, loadPlugins])\n\n const handleMarkUpdate = useCallback(() => {\n if (plugins[selectedIndex]) {\n setPlugins(prev => {\n const updated = [...prev]\n updated[selectedIndex] = {\n ...updated[selectedIndex],\n markedForUpdate: !updated[selectedIndex].markedForUpdate,\n }\n return updated\n })\n }\n }, [plugins, selectedIndex])\n\n const handleMarkUninstall = useCallback(() => {\n if (plugins[selectedIndex]) {\n setShowConfirm(true)\n setConfirmAction('uninstall')\n }\n }, [plugins, selectedIndex])\n\n const handleConfirmUninstall = useCallback(() => {\n if (plugins[selectedIndex]) {\n setPlugins(prev => {\n const updated = [...prev]\n updated[selectedIndex] = {\n ...updated[selectedIndex],\n markedForUninstall: !updated[selectedIndex].markedForUninstall,\n }\n return updated\n })\n }\n setShowConfirm(false)\n setConfirmAction(null)\n }, [plugins, selectedIndex])\n\n const handleViewDetails = useCallback(() => {\n if (plugins[selectedIndex]) {\n const plugin = getPlugin(plugins[selectedIndex].manifest.name)\n if (plugin) {\n onNavigate({\n screen: 'plugin-details-manage',\n plugin,\n })\n }\n }\n }, [plugins, selectedIndex, onNavigate])\n\n useInput((input, key) => {\n if (showConfirm) {\n if (key.return || input === 'y') {\n handleConfirmUninstall()\n } else if (key.escape || input === 'n') {\n setShowConfirm(false)\n setConfirmAction(null)\n }\n return\n }\n\n if (key.escape) {\n onBack()\n } else if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(plugins.length - 1, prev + 1))\n } else if (input === ' ') {\n handleToggleEnabled()\n } else if (input === 'u') {\n handleMarkUpdate()\n } else if (key.delete || input === 'd') {\n handleMarkUninstall()\n } else if (key.return) {\n handleViewDetails()\n }\n })\n\n if (showConfirm && confirmAction === 'uninstall') {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.warning}>\n Confirm Uninstall Mark\n </Text>\n <Text>{''}</Text>\n <Text>\n Mark plugin \"{plugins[selectedIndex]?.manifest.name}\" for\n uninstallation?\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n This will mark the plugin for removal. Use batch actions to complete.\n </Text>\n <Text>{''}</Text>\n <Text>\n <Text color={theme.success}>Y</Text>es /{' '}\n <Text color={theme.error}>N</Text>o\n </Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.primary}>\n {marketplace.name} \u203A Manage Plugins ({plugins.length})\n </Text>\n <Text>{''}</Text>\n\n {plugins.length === 0 ? (\n <Box marginLeft={2}>\n <Text color={theme.warning}>\n No plugins installed from this marketplace\n </Text>\n </Box>\n ) : (\n plugins.map((plugin, index) => {\n const isSelected = index === selectedIndex\n const statusIcon = plugin.enabled ? '\u25CF' : '\u25CB'\n const marks = []\n\n if (plugin.markedForUpdate) marks.push('\u2B06')\n if (plugin.markedForUninstall) marks.push('\u2717')\n\n return (\n <Box\n key={plugin.manifest.name}\n flexDirection=\"column\"\n marginBottom={1}\n >\n <Box>\n <Text color={isSelected ? theme.success : undefined}>\n {isSelected ? '\u276F ' : ' '}\n {statusIcon}{' '}\n {plugin.manifest.displayName || plugin.manifest.name}\n </Text>\n {marks.length > 0 && (\n <Text color={theme.warning}> {marks.join(' ')}</Text>\n )}\n </Box>\n <Box marginLeft={4}>\n <Text color={SEMANTIC_COLORS.dim}>\n {plugin.manifest.description} \u00B7 v{plugin.manifest.version}\n </Text>\n </Box>\n {isSelected && (\n <Box marginLeft={4}>\n <Text color={SEMANTIC_COLORS.dim}>\n Components:{' '}\n {[\n plugin.agents.length > 0 &&\n `${plugin.agents.length} agent(s)`,\n plugin.commands.length > 0 &&\n `${plugin.commands.length} command(s)`,\n plugin.skills.length > 0 &&\n `${plugin.skills.length} skill(s)`,\n ]\n .filter(Boolean)\n .join(', ') || 'none'}\n </Text>\n </Box>\n )}\n </Box>\n )\n })\n )}\n\n <Text>{''}</Text>\n <Box marginLeft={2} flexDirection=\"column\">\n <Text color={SEMANTIC_COLORS.dim}>\n Space Toggle \u00B7 U Mark Update \u00B7 D/Del Mark Uninstall\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>Enter Details \u00B7 Esc Back</Text>\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "AAOA,OAAO,SAAS,UAAU,WAAW,mBAAmB;AACxD,SAAS,KAAK,MAAM,gBAAgB;AACpC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,uBAAuB;AAEhC,SAAS,gBAAgB;AAYlB,MAAM,gCAET,CAAC,EAAE,aAAa,YAAY,OAAO,MAAM;AAC3C,QAAM,CAAC,SAAS,UAAU,IAAI,SAA4B,CAAC,CAAC;AAC5D,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,CAAC;AACpD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAA6B,IAAI;AAC3E,QAAM,QAAQ,SAAS;AAEvB,QAAM,cAAc,YAAY,MAAM;AACpC,UAAM,aAAa,eAAe;AAGlC,UAAM,WAAW,WAAW,OAAO,OAAK;AACtC,UAAI,YAAY,SAAS,SAAS;AAEhC,YAAI,EAAE,OAAO,SAAS,cAAe,QAAO;AAC5C,YACE,EAAE,OAAO,SAAS,WAClB,EAAE,OAAO,KAAK,SAAS,kBAAkB,GACzC;AACA,iBAAO;AAAA,QACT;AACA,eAAO,EAAE,OAAO,SAAS;AAAA,MAC3B,OAAO;AAEL,YAAI,EAAE,OAAO,SAAS,eAAe;AACnC,iBAAO,EAAE,OAAO,gBAAgB,YAAY;AAAA,QAC9C;AAEA,eAAO,EAAE,SAAS,SAAS,YAAY,IAAI;AAAA,MAC7C;AAAA,IACF,CAAC;AAGD,UAAM,YAA+B,SAAS,IAAI,QAAM;AAAA,MACtD,GAAG;AAAA,MACH,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,IACtB,EAAE;AAEF,eAAW,SAAS;AAAA,EACtB,GAAG,CAAC,WAAW,CAAC;AAEhB,YAAU,MAAM;AACd,gBAAY;AAAA,EACd,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,sBAAsB,YAAY,MAAM;AAC5C,QAAI,QAAQ,aAAa,GAAG;AAC1B,UAAI;AACF,cAAM,WAAW;AAAA,UACf,QAAQ,aAAa,EAAE,SAAS;AAAA,QAClC;AAEA,oBAAY;AAAA,MACd,SAAS,OAAO;AACd,gBAAQ,MAAM,0BAA0B,KAAK;AAAA,MAC/C;AAAA,IACF;AAAA,EACF,GAAG,CAAC,SAAS,eAAe,WAAW,CAAC;AAExC,QAAM,mBAAmB,YAAY,MAAM;AACzC,QAAI,QAAQ,aAAa,GAAG;AAC1B,iBAAW,UAAQ;AACjB,cAAM,UAAU,CAAC,GAAG,IAAI;AACxB,gBAAQ,aAAa,IAAI;AAAA,UACvB,GAAG,QAAQ,aAAa;AAAA,UACxB,iBAAiB,CAAC,QAAQ,aAAa,EAAE;AAAA,QAC3C;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,SAAS,aAAa,CAAC;AAE3B,QAAM,sBAAsB,YAAY,MAAM;AAC5C,QAAI,QAAQ,aAAa,GAAG;AAC1B,qBAAe,IAAI;AACnB,uBAAiB,WAAW;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,SAAS,aAAa,CAAC;AAE3B,QAAM,yBAAyB,YAAY,MAAM;AAC/C,QAAI,QAAQ,aAAa,GAAG;AAC1B,iBAAW,UAAQ;AACjB,cAAM,UAAU,CAAC,GAAG,IAAI;AACxB,gBAAQ,aAAa,IAAI;AAAA,UACvB,GAAG,QAAQ,aAAa;AAAA,UACxB,oBAAoB,CAAC,QAAQ,aAAa,EAAE;AAAA,QAC9C;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AACA,mBAAe,KAAK;AACpB,qBAAiB,IAAI;AAAA,EACvB,GAAG,CAAC,SAAS,aAAa,CAAC;AAE3B,QAAM,oBAAoB,YAAY,MAAM;AAC1C,QAAI,QAAQ,aAAa,GAAG;AAC1B,YAAM,SAAS,UAAU,QAAQ,aAAa,EAAE,SAAS,IAAI;AAC7D,UAAI,QAAQ;AACV,mBAAW;AAAA,UACT,QAAQ;AAAA,UACR;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,GAAG,CAAC,SAAS,eAAe,UAAU,CAAC;AAEvC,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,aAAa;AACf,UAAI,IAAI,UAAU,UAAU,KAAK;AAC/B,+BAAuB;AAAA,MACzB,WAAW,IAAI,UAAU,UAAU,KAAK;AACtC,uBAAe,KAAK;AACpB,yBAAiB,IAAI;AAAA,MACvB;AACA;AAAA,IACF;AAEA,QAAI,IAAI,QAAQ;AACd,aAAO;AAAA,IACT,WAAW,IAAI,SAAS;AACtB,uBAAiB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IAChD,WAAW,IAAI,WAAW;AACxB,uBAAiB,UAAQ,KAAK,IAAI,QAAQ,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,IACjE,WAAW,UAAU,KAAK;AACxB,0BAAoB;AAAA,IACtB,WAAW,UAAU,KAAK;AACxB,uBAAiB;AAAA,IACnB,WAAW,IAAI,UAAU,UAAU,KAAK;AACtC,0BAAoB;AAAA,IACtB,WAAW,IAAI,QAAQ;AACrB,wBAAkB;AAAA,IACpB;AAAA,EACF,CAAC;AAED,MAAI,eAAe,kBAAkB,aAAa;AAChD,WACE,oCAAC,OAAI,eAAc,UAAS,aAAY,SAAQ,SAAS,KACvD,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,wBAEjC,GACA,oCAAC,YAAM,EAAG,GACV,oCAAC,YAAK,iBACU,QAAQ,aAAa,GAAG,SAAS,MAAK,uBAEtD,GACA,oCAAC,QAAK,OAAO,gBAAgB,OAAK,uEAElC,GACA,oCAAC,YAAM,EAAG,GACV,oCAAC,YACC,oCAAC,QAAK,OAAO,MAAM,WAAS,GAAC,GAAO,QAAK,KACzC,oCAAC,QAAK,OAAO,MAAM,SAAO,GAAC,GAAO,GACpC,CACF;AAAA,EAEJ;AAEA,SACE,oCAAC,OAAI,eAAc,UAAS,aAAY,SAAQ,SAAS,KACvD,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WACrB,YAAY,MAAK,4BAAoB,QAAQ,QAAO,GACvD,GACA,oCAAC,YAAM,EAAG,GAET,QAAQ,WAAW,IAClB,oCAAC,OAAI,YAAY,KACf,oCAAC,QAAK,OAAO,MAAM,WAAS,4CAE5B,CACF,IAEA,QAAQ,IAAI,CAAC,QAAQ,UAAU;AAC7B,UAAM,aAAa,UAAU;AAC7B,UAAM,aAAa,OAAO,UAAU,WAAM;AAC1C,UAAM,QAAQ,CAAC;AAEf,QAAI,OAAO,gBAAiB,OAAM,KAAK,QAAG;AAC1C,QAAI,OAAO,mBAAoB,OAAM,KAAK,QAAG;AAE7C,WACE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,OAAO,SAAS;AAAA,QACrB,eAAc;AAAA,QACd,cAAc;AAAA;AAAA,MAEd,oCAAC,WACC,oCAAC,QAAK,OAAO,aAAa,MAAM,UAAU,UACvC,aAAa,YAAO,MACpB,YAAY,KACZ,OAAO,SAAS,eAAe,OAAO,SAAS,IAClD,GACC,MAAM,SAAS,KACd,oCAAC,QAAK,OAAO,MAAM,WAAS,KAAE,MAAM,KAAK,GAAG,CAAE,CAElD;AAAA,MACA,oCAAC,OAAI,YAAY,KACf,oCAAC,QAAK,OAAO,gBAAgB,OAC1B,OAAO,SAAS,aAAY,WAAK,OAAO,SAAS,OACpD,CACF;AAAA,MACC,cACC,oCAAC,OAAI,YAAY,KACf,oCAAC,QAAK,OAAO,gBAAgB,OAAK,eACpB,KACX;AAAA,QACC,OAAO,OAAO,SAAS,KACrB,GAAG,OAAO,OAAO,MAAM;AAAA,QACzB,OAAO,SAAS,SAAS,KACvB,GAAG,OAAO,SAAS,MAAM;AAAA,QAC3B,OAAO,OAAO,SAAS,KACrB,GAAG,OAAO,OAAO,MAAM;AAAA,MAC3B,EACG,OAAO,OAAO,EACd,KAAK,IAAI,KAAK,MACnB,CACF;AAAA,IAEJ;AAAA,EAEJ,CAAC,GAGH,oCAAC,YAAM,EAAG,GACV,oCAAC,OAAI,YAAY,GAAG,eAAc,YAChC,oCAAC,QAAK,OAAO,gBAAgB,OAAK,2DAElC,GACA,oCAAC,QAAK,OAAO,gBAAgB,OAAK,6BAAwB,CAC5D,CACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -3,6 +3,7 @@ import { Box, Text, useInput } from "ink";
3
3
  import { loadAllPlugins } from "../../utils/pluginLoader.js";
4
4
  import { listMarketplaces, getMarketplace } from "../../utils/marketplaceManager.js";
5
5
  import { getTheme } from "../../utils/theme.js";
6
+ import { SEMANTIC_COLORS } from "../../constants/colors.js";
6
7
  const InstalledPluginsManager = ({
7
8
  onNavigate,
8
9
  onBack
@@ -88,12 +89,12 @@ const InstalledPluginsManager = ({
88
89
  }
89
90
  });
90
91
  if (loading) {
91
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Manage Installed Plugins"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Loading installed plugins..."));
92
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Manage Installed Plugins"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Loading installed plugins..."));
92
93
  }
93
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Manage Installed Plugins"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Select a marketplace to manage plugins:"), /* @__PURE__ */ React.createElement(Text, null, ""), marketplaces.length === 0 ? /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, "No plugins installed")) : marketplaces.map((group, index) => {
94
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Manage Installed Plugins"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Select a marketplace to manage plugins:"), /* @__PURE__ */ React.createElement(Text, null, ""), marketplaces.length === 0 ? /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, "No plugins installed")) : marketplaces.map((group, index) => {
94
95
  const isSelected = index === selectedIndex;
95
- return /* @__PURE__ */ React.createElement(Box, { key: group.name, marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: isSelected ? theme.success : void 0 }, isSelected ? "\u276F " : " ", group.name), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", "(", group.enabledCount, "/", group.installedCount, " enabled)"));
96
- }), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2191\u2193 Navigate \xB7 Enter Select \xB7 Esc Back")));
96
+ return /* @__PURE__ */ React.createElement(Box, { key: group.name, marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: isSelected ? theme.success : void 0 }, isSelected ? "\u276F " : " ", group.name), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "(", group.enabledCount, "/", group.installedCount, " enabled)"));
97
+ }), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "\u2191\u2193 Navigate \xB7 Enter Select \xB7 Esc Back")));
97
98
  };
98
99
  export {
99
100
  InstalledPluginsManager
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/plugin/InstalledPluginsManager.tsx"],
4
- "sourcesContent": ["/**\n * Installed Plugins Manager\n *\n * Displays all installed plugins grouped by marketplace.\n * Allows navigation to marketplace-specific plugin management.\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { loadAllPlugins } from '@utils/pluginLoader'\nimport { listMarketplaces, getMarketplace } from '@utils/marketplaceManager'\nimport { LoadedPlugin } from '../../types/plugin'\nimport { getTheme } from '@utils/theme'\nimport { NavigationProps } from './types'\n\ninterface MarketplaceGroup {\n name: string\n plugins: LoadedPlugin[]\n installedCount: number\n enabledCount: number\n}\n\nexport const InstalledPluginsManager: React.FC<NavigationProps> = ({\n onNavigate,\n onBack,\n}) => {\n const [marketplaces, setMarketplaces] = useState<MarketplaceGroup[]>([])\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [loading, setLoading] = useState(true)\n const theme = getTheme()\n\n // Reload plugins whenever this component is rendered\n useEffect(() => {\n setLoading(true)\n\n // Small delay to ensure UI is ready\n const timer = setTimeout(() => {\n try {\n // Load all installed plugins\n const plugins = loadAllPlugins()\n\n // Get registered marketplaces\n const registeredMarketplaces = listMarketplaces()\n const marketplaceNames = new Set(\n registeredMarketplaces.map(m => m.name),\n )\n\n // Group plugins by marketplace\n const grouped: Record<string, LoadedPlugin[]> = {}\n\n for (const plugin of plugins) {\n let marketplaceName = 'local'\n\n // Try to determine marketplace from source\n if (plugin.source.type === 'marketplace') {\n marketplaceName = plugin.source.marketplace\n } else {\n // Check if plugin location matches any marketplace\n for (const marketplace of registeredMarketplaces) {\n if (plugin.location.includes(marketplace.name)) {\n marketplaceName = marketplace.name\n break\n }\n }\n }\n\n if (!grouped[marketplaceName]) {\n grouped[marketplaceName] = []\n }\n grouped[marketplaceName].push(plugin)\n }\n\n // Convert to display format\n const groups: MarketplaceGroup[] = Object.entries(grouped).map(\n ([name, plugins]) => ({\n name,\n plugins,\n installedCount: plugins.length,\n enabledCount: plugins.filter(p => p.enabled).length,\n }),\n )\n\n // Sort: marketplaces first, then local\n groups.sort((a, b) => {\n if (a.name === 'local') return 1\n if (b.name === 'local') return -1\n return a.name.localeCompare(b.name)\n })\n\n setMarketplaces(groups)\n } finally {\n setLoading(false)\n }\n }, 100)\n\n return () => clearTimeout(timer)\n }, []) // Keep empty deps but reload happens on mount\n\n useInput((input, key) => {\n if (key.escape) {\n onBack()\n } else if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(marketplaces.length - 1, prev + 1))\n } else if (key.return) {\n if (marketplaces[selectedIndex]) {\n const selectedMarketplace = marketplaces[selectedIndex].name\n const registeredMarketplace = getMarketplace(selectedMarketplace)\n\n onNavigate({\n screen: 'installed-plugins-by-marketplace',\n marketplace: registeredMarketplace || {\n name: selectedMarketplace,\n source: { type: 'local', path: selectedMarketplace },\n manifest: {\n name: selectedMarketplace,\n version: '1.0.0',\n plugins: [],\n owner: { name: 'local', email: '' },\n },\n lastUpdated: new Date(),\n enabled: true,\n },\n })\n }\n }\n })\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.primary}>\n Manage Installed Plugins\n </Text>\n <Text dimColor>Loading installed plugins...</Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.primary}>\n Manage Installed Plugins\n </Text>\n <Text dimColor>Select a marketplace to manage plugins:</Text>\n <Text>{''}</Text>\n\n {marketplaces.length === 0 ? (\n <Box marginLeft={2}>\n <Text color={theme.warning}>No plugins installed</Text>\n </Box>\n ) : (\n marketplaces.map((group, index) => {\n const isSelected = index === selectedIndex\n return (\n <Box key={group.name} marginLeft={2}>\n <Text color={isSelected ? theme.success : undefined}>\n {isSelected ? '\u276F ' : ' '}\n {group.name}\n </Text>\n <Text dimColor>\n {' '}\n ({group.enabledCount}/{group.installedCount} enabled)\n </Text>\n </Box>\n )\n })\n )}\n\n <Text>{''}</Text>\n <Box marginLeft={2}>\n <Text dimColor>\u2191\u2193 Navigate \u00B7 Enter Select \u00B7 Esc Back</Text>\n </Box>\n </Box>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Installed Plugins Manager\n *\n * Displays all installed plugins grouped by marketplace.\n * Allows navigation to marketplace-specific plugin management.\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { loadAllPlugins } from '@utils/pluginLoader'\nimport { listMarketplaces, getMarketplace } from '@utils/marketplaceManager'\nimport { LoadedPlugin } from '../../types/plugin'\nimport { getTheme } from '@utils/theme'\nimport { NavigationProps } from './types'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ninterface MarketplaceGroup {\n name: string\n plugins: LoadedPlugin[]\n installedCount: number\n enabledCount: number\n}\n\nexport const InstalledPluginsManager: React.FC<NavigationProps> = ({\n onNavigate,\n onBack,\n}) => {\n const [marketplaces, setMarketplaces] = useState<MarketplaceGroup[]>([])\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [loading, setLoading] = useState(true)\n const theme = getTheme()\n\n // Reload plugins whenever this component is rendered\n useEffect(() => {\n setLoading(true)\n\n // Small delay to ensure UI is ready\n const timer = setTimeout(() => {\n try {\n // Load all installed plugins\n const plugins = loadAllPlugins()\n\n // Get registered marketplaces\n const registeredMarketplaces = listMarketplaces()\n const marketplaceNames = new Set(\n registeredMarketplaces.map(m => m.name),\n )\n\n // Group plugins by marketplace\n const grouped: Record<string, LoadedPlugin[]> = {}\n\n for (const plugin of plugins) {\n let marketplaceName = 'local'\n\n // Try to determine marketplace from source\n if (plugin.source.type === 'marketplace') {\n marketplaceName = plugin.source.marketplace\n } else {\n // Check if plugin location matches any marketplace\n for (const marketplace of registeredMarketplaces) {\n if (plugin.location.includes(marketplace.name)) {\n marketplaceName = marketplace.name\n break\n }\n }\n }\n\n if (!grouped[marketplaceName]) {\n grouped[marketplaceName] = []\n }\n grouped[marketplaceName].push(plugin)\n }\n\n // Convert to display format\n const groups: MarketplaceGroup[] = Object.entries(grouped).map(\n ([name, plugins]) => ({\n name,\n plugins,\n installedCount: plugins.length,\n enabledCount: plugins.filter(p => p.enabled).length,\n }),\n )\n\n // Sort: marketplaces first, then local\n groups.sort((a, b) => {\n if (a.name === 'local') return 1\n if (b.name === 'local') return -1\n return a.name.localeCompare(b.name)\n })\n\n setMarketplaces(groups)\n } finally {\n setLoading(false)\n }\n }, 100)\n\n return () => clearTimeout(timer)\n }, []) // Keep empty deps but reload happens on mount\n\n useInput((input, key) => {\n if (key.escape) {\n onBack()\n } else if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(marketplaces.length - 1, prev + 1))\n } else if (key.return) {\n if (marketplaces[selectedIndex]) {\n const selectedMarketplace = marketplaces[selectedIndex].name\n const registeredMarketplace = getMarketplace(selectedMarketplace)\n\n onNavigate({\n screen: 'installed-plugins-by-marketplace',\n marketplace: registeredMarketplace || {\n name: selectedMarketplace,\n source: { type: 'local', path: selectedMarketplace },\n manifest: {\n name: selectedMarketplace,\n version: '1.0.0',\n plugins: [],\n owner: { name: 'local', email: '' },\n },\n lastUpdated: new Date(),\n enabled: true,\n },\n })\n }\n }\n })\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.primary}>\n Manage Installed Plugins\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>Loading installed plugins...</Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.primary}>\n Manage Installed Plugins\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Select a marketplace to manage plugins:\n </Text>\n <Text>{''}</Text>\n\n {marketplaces.length === 0 ? (\n <Box marginLeft={2}>\n <Text color={theme.warning}>No plugins installed</Text>\n </Box>\n ) : (\n marketplaces.map((group, index) => {\n const isSelected = index === selectedIndex\n return (\n <Box key={group.name} marginLeft={2}>\n <Text color={isSelected ? theme.success : undefined}>\n {isSelected ? '\u276F ' : ' '}\n {group.name}\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n ({group.enabledCount}/{group.installedCount} enabled)\n </Text>\n </Box>\n )\n })\n )}\n\n <Text>{''}</Text>\n <Box marginLeft={2}>\n <Text color={SEMANTIC_COLORS.dim}>\n \u2191\u2193 Navigate \u00B7 Enter Select \u00B7 Esc Back\n </Text>\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["plugins"]
7
7
  }