@within-7/minto 0.1.5 → 0.1.7

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 (273) hide show
  1. package/dist/commands/agents/AgentsCommand.js +2342 -0
  2. package/dist/commands/agents/AgentsCommand.js.map +7 -0
  3. package/dist/commands/agents/constants.js +58 -0
  4. package/dist/commands/agents/constants.js.map +7 -0
  5. package/dist/commands/agents/index.js +37 -0
  6. package/dist/commands/agents/index.js.map +7 -0
  7. package/dist/commands/agents/types.js +10 -0
  8. package/dist/commands/agents/types.js.map +7 -0
  9. package/dist/commands/agents/utils/fileOperations.js +185 -0
  10. package/dist/commands/agents/utils/fileOperations.js.map +7 -0
  11. package/dist/commands/agents/utils/index.js +21 -0
  12. package/dist/commands/agents/utils/index.js.map +7 -0
  13. package/dist/commands/bug.js +2 -2
  14. package/dist/commands/bug.js.map +2 -2
  15. package/dist/commands/compact.js +5 -5
  16. package/dist/commands/compact.js.map +2 -2
  17. package/dist/commands/ctx_viz.js +55 -22
  18. package/dist/commands/ctx_viz.js.map +2 -2
  19. package/dist/commands/mcp-interactive.js +11 -11
  20. package/dist/commands/mcp-interactive.js.map +2 -2
  21. package/dist/commands/model.js +94 -32
  22. package/dist/commands/model.js.map +3 -3
  23. package/dist/commands/plugin/AddMarketplaceForm.js +49 -21
  24. package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
  25. package/dist/commands/plugin/ConfirmDialog.js +38 -26
  26. package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
  27. package/dist/commands/plugin/InstalledPluginsByMarketplace.js +24 -8
  28. package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
  29. package/dist/commands/plugin/InstalledPluginsManager.js +3 -1
  30. package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
  31. package/dist/commands/plugin/MainMenu.js +16 -7
  32. package/dist/commands/plugin/MainMenu.js.map +2 -2
  33. package/dist/commands/plugin/MarketplaceManager.js +84 -39
  34. package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
  35. package/dist/commands/plugin/MarketplaceSelector.js +7 -3
  36. package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
  37. package/dist/commands/plugin/PlaceholderScreen.js +16 -2
  38. package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
  39. package/dist/commands/plugin/PluginBrowser.js +4 -2
  40. package/dist/commands/plugin/PluginBrowser.js.map +2 -2
  41. package/dist/commands/plugin/PluginDetailsInstall.js +12 -6
  42. package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
  43. package/dist/commands/plugin/PluginDetailsManage.js +14 -5
  44. package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
  45. package/dist/commands/plugin/example-usage.js.map +2 -2
  46. package/dist/commands/plugin/utils.js.map +2 -2
  47. package/dist/commands/plugin.js +226 -46
  48. package/dist/commands/plugin.js.map +2 -2
  49. package/dist/commands/refreshCommands.js +6 -3
  50. package/dist/commands/refreshCommands.js.map +2 -2
  51. package/dist/commands/resume.js +2 -1
  52. package/dist/commands/resume.js.map +2 -2
  53. package/dist/commands/setup.js +19 -5
  54. package/dist/commands/setup.js.map +2 -2
  55. package/dist/commands/terminalSetup.js +2 -2
  56. package/dist/commands/terminalSetup.js.map +1 -1
  57. package/dist/commands.js +14 -30
  58. package/dist/commands.js.map +2 -2
  59. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
  60. package/dist/components/AskUserQuestionDialog/QuestionView.js +10 -1
  61. package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
  62. package/dist/components/BackgroundTasksPanel.js +5 -1
  63. package/dist/components/BackgroundTasksPanel.js.map +2 -2
  64. package/dist/components/Config.js +17 -4
  65. package/dist/components/Config.js.map +2 -2
  66. package/dist/components/ConsoleOAuthFlow.js.map +2 -2
  67. package/dist/components/CustomSelect/select-option.js +4 -1
  68. package/dist/components/CustomSelect/select-option.js.map +2 -2
  69. package/dist/components/Help.js +6 -8
  70. package/dist/components/Help.js.map +2 -2
  71. package/dist/components/Logo.js +1 -1
  72. package/dist/components/Logo.js.map +2 -2
  73. package/dist/components/ModelListManager.js.map +2 -2
  74. package/dist/components/ModelSelector/ModelSelector.js +2030 -0
  75. package/dist/components/ModelSelector/ModelSelector.js.map +7 -0
  76. package/dist/components/ModelSelector/ScreenContainer.js +27 -0
  77. package/dist/components/ModelSelector/ScreenContainer.js.map +7 -0
  78. package/dist/components/ModelSelector/constants.js +37 -0
  79. package/dist/components/ModelSelector/constants.js.map +7 -0
  80. package/dist/components/ModelSelector/hooks/index.js +5 -0
  81. package/dist/components/ModelSelector/hooks/index.js.map +7 -0
  82. package/dist/components/ModelSelector/hooks/useEscapeNavigation.js +21 -0
  83. package/dist/components/ModelSelector/hooks/useEscapeNavigation.js.map +7 -0
  84. package/dist/components/ModelSelector/index.js +17 -0
  85. package/dist/components/ModelSelector/index.js.map +7 -0
  86. package/dist/components/ModelSelector/types.js +1 -0
  87. package/dist/components/ModelSelector/types.js.map +7 -0
  88. package/dist/components/PressEnterToContinue.js +1 -1
  89. package/dist/components/PressEnterToContinue.js.map +2 -2
  90. package/dist/components/ProjectOnboarding.js +1 -1
  91. package/dist/components/ProjectOnboarding.js.map +2 -2
  92. package/dist/components/PromptInput.js +88 -37
  93. package/dist/components/PromptInput.js.map +2 -2
  94. package/dist/components/QuitSummary.js +17 -10
  95. package/dist/components/QuitSummary.js.map +2 -2
  96. package/dist/components/SentryErrorBoundary.js.map +2 -2
  97. package/dist/components/StreamingBashOutput.js.map +2 -2
  98. package/dist/components/StructuredDiff.js.map +2 -2
  99. package/dist/components/SubagentProgress.js.map +2 -2
  100. package/dist/components/TaskCard.js.map +2 -2
  101. package/dist/components/TextInput.js.map +1 -1
  102. package/dist/components/TodoItem.js.map +1 -1
  103. package/dist/components/binary-feedback/BinaryFeedbackOption.js +1 -3
  104. package/dist/components/binary-feedback/BinaryFeedbackOption.js.map +2 -2
  105. package/dist/components/messages/AssistantLocalCommandOutputMessage.js.map +1 -1
  106. package/dist/components/messages/AssistantToolUseMessage.js +3 -1
  107. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  108. package/dist/components/messages/TaskProgressMessage.js.map +2 -2
  109. package/dist/components/messages/TaskToolMessage.js.map +2 -2
  110. package/dist/components/messages/UserToolResultMessage/utils.js.map +2 -2
  111. package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js.map +2 -2
  112. package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js.map +2 -2
  113. package/dist/components/permissions/hooks.js.map +2 -2
  114. package/dist/constants/modelCapabilities.js +1 -1
  115. package/dist/constants/modelCapabilities.js.map +2 -2
  116. package/dist/constants/prompts.js.map +1 -1
  117. package/dist/constants/timing.js +34 -0
  118. package/dist/constants/timing.js.map +7 -0
  119. package/dist/entrypoints/cli.js +128 -33
  120. package/dist/entrypoints/cli.js.map +3 -3
  121. package/dist/entrypoints/mcp.js +13 -18
  122. package/dist/entrypoints/mcp.js.map +2 -2
  123. package/dist/hooks/useCanUseTool.js.map +2 -2
  124. package/dist/hooks/useCancelRequest.js.map +1 -1
  125. package/dist/hooks/useHistorySearch.js.map +2 -2
  126. package/dist/hooks/useLogStartupTime.js.map +2 -2
  127. package/dist/hooks/usePermissionRequestLogging.js.map +2 -2
  128. package/dist/hooks/useTextInput.js.map +1 -1
  129. package/dist/hooks/useUnifiedCompletion.js +493 -394
  130. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  131. package/dist/index.js.map +2 -2
  132. package/dist/permissions.js +4 -7
  133. package/dist/permissions.js.map +2 -2
  134. package/dist/query.js +6 -1
  135. package/dist/query.js.map +2 -2
  136. package/dist/screens/REPL.js +72 -36
  137. package/dist/screens/REPL.js.map +2 -2
  138. package/dist/screens/ResumeConversation.js +2 -1
  139. package/dist/screens/ResumeConversation.js.map +2 -2
  140. package/dist/services/adapters/base.js.map +2 -2
  141. package/dist/services/adapters/chatCompletions.js.map +2 -2
  142. package/dist/services/adapters/responsesAPI.js +3 -1
  143. package/dist/services/adapters/responsesAPI.js.map +2 -2
  144. package/dist/services/claude.js +327 -328
  145. package/dist/services/claude.js.map +2 -2
  146. package/dist/services/customCommands.js +6 -1
  147. package/dist/services/customCommands.js.map +2 -2
  148. package/dist/services/fileFreshness.js.map +2 -2
  149. package/dist/services/gpt5ConnectionTest.js +20 -7
  150. package/dist/services/gpt5ConnectionTest.js.map +2 -2
  151. package/dist/services/hookExecutor.js +6 -12
  152. package/dist/services/hookExecutor.js.map +2 -2
  153. package/dist/services/mcpClient.js +29 -2
  154. package/dist/services/mcpClient.js.map +2 -2
  155. package/dist/services/mentionProcessor.js +23 -10
  156. package/dist/services/mentionProcessor.js.map +2 -2
  157. package/dist/services/modelAdapterFactory.js.map +2 -2
  158. package/dist/services/oauth.js.map +2 -2
  159. package/dist/services/openai.js +109 -72
  160. package/dist/services/openai.js.map +3 -3
  161. package/dist/services/responseStateManager.js.map +2 -2
  162. package/dist/services/systemReminder.js.map +2 -2
  163. package/dist/tools/ArchitectTool/ArchitectTool.js +10 -9
  164. package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
  165. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +14 -8
  166. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  167. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +8 -1
  168. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  169. package/dist/tools/BashOutputTool/BashOutputTool.js.map +2 -2
  170. package/dist/tools/BashTool/BashTool.js.map +2 -2
  171. package/dist/tools/FileReadTool/FileReadTool.js +23 -4
  172. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  173. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  174. package/dist/tools/GlobTool/GlobTool.js +11 -2
  175. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  176. package/dist/tools/GrepTool/GrepTool.js +7 -5
  177. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  178. package/dist/tools/MCPTool/MCPTool.js +11 -12
  179. package/dist/tools/MCPTool/MCPTool.js.map +2 -2
  180. package/dist/tools/MultiEditTool/MultiEditTool.js +4 -1
  181. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  182. package/dist/tools/NotebookReadTool/NotebookReadTool.js +11 -5
  183. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
  184. package/dist/tools/SkillTool/SkillTool.js +18 -6
  185. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  186. package/dist/tools/TaskTool/TaskTool.js +37 -51
  187. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  188. package/dist/tools/TaskTool/prompt.js.map +2 -2
  189. package/dist/tools/ThinkTool/ThinkTool.js +6 -1
  190. package/dist/tools/ThinkTool/ThinkTool.js.map +2 -2
  191. package/dist/tools/TodoWriteTool/TodoWriteTool.js +29 -5
  192. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
  193. package/dist/tools/URLFetcherTool/URLFetcherTool.js +5 -2
  194. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  195. package/dist/tools/URLFetcherTool/cache.js +6 -3
  196. package/dist/tools/URLFetcherTool/cache.js.map +2 -2
  197. package/dist/tools/URLFetcherTool/htmlToMarkdown.js +3 -1
  198. package/dist/tools/URLFetcherTool/htmlToMarkdown.js.map +2 -2
  199. package/dist/tools/WebSearchTool/WebSearchTool.js +6 -1
  200. package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
  201. package/dist/tools/WebSearchTool/prompt.js.map +2 -2
  202. package/dist/tools/WebSearchTool/searchProviders.js +15 -6
  203. package/dist/tools/WebSearchTool/searchProviders.js.map +2 -2
  204. package/dist/tools.js +4 -1
  205. package/dist/tools.js.map +2 -2
  206. package/dist/types/core.js +1 -0
  207. package/dist/types/core.js.map +7 -0
  208. package/dist/types/hooks.js +1 -4
  209. package/dist/types/hooks.js.map +2 -2
  210. package/dist/types/marketplace.js +8 -2
  211. package/dist/types/marketplace.js.map +2 -2
  212. package/dist/types/plugin.js +9 -6
  213. package/dist/types/plugin.js.map +2 -2
  214. package/dist/utils/BackgroundShellManager.js +76 -10
  215. package/dist/utils/BackgroundShellManager.js.map +2 -2
  216. package/dist/utils/PersistentShell.js +7 -2
  217. package/dist/utils/PersistentShell.js.map +2 -2
  218. package/dist/utils/advancedFuzzyMatcher.js +4 -1
  219. package/dist/utils/advancedFuzzyMatcher.js.map +2 -2
  220. package/dist/utils/agentLoader.js +69 -35
  221. package/dist/utils/agentLoader.js.map +2 -2
  222. package/dist/utils/agentStorage.js.map +2 -2
  223. package/dist/utils/async.js +163 -0
  224. package/dist/utils/async.js.map +7 -0
  225. package/dist/utils/autoUpdater.js +8 -2
  226. package/dist/utils/autoUpdater.js.map +2 -2
  227. package/dist/utils/commands.js +23 -11
  228. package/dist/utils/commands.js.map +2 -2
  229. package/dist/utils/commonUnixCommands.js +3 -1
  230. package/dist/utils/commonUnixCommands.js.map +2 -2
  231. package/dist/utils/compressionMode.js.map +2 -2
  232. package/dist/utils/config.js +30 -14
  233. package/dist/utils/config.js.map +2 -2
  234. package/dist/utils/debugLogger.js.map +2 -2
  235. package/dist/utils/env.js.map +2 -2
  236. package/dist/utils/envConfig.js +82 -0
  237. package/dist/utils/envConfig.js.map +7 -0
  238. package/dist/utils/errorHandling.js +89 -0
  239. package/dist/utils/errorHandling.js.map +7 -0
  240. package/dist/utils/expertChatStorage.js.map +2 -2
  241. package/dist/utils/fuzzyMatcher.js +13 -7
  242. package/dist/utils/fuzzyMatcher.js.map +2 -2
  243. package/dist/utils/hookManager.js +14 -4
  244. package/dist/utils/hookManager.js.map +2 -2
  245. package/dist/utils/log.js.map +2 -2
  246. package/dist/utils/marketplaceManager.js +44 -9
  247. package/dist/utils/marketplaceManager.js.map +2 -2
  248. package/dist/utils/messageContextManager.js.map +1 -1
  249. package/dist/utils/messages.js +6 -3
  250. package/dist/utils/messages.js.map +2 -2
  251. package/dist/utils/model.js +3 -1
  252. package/dist/utils/model.js.map +2 -2
  253. package/dist/utils/pluginInstaller.js +3 -15
  254. package/dist/utils/pluginInstaller.js.map +2 -2
  255. package/dist/utils/pluginLoader.js +41 -13
  256. package/dist/utils/pluginLoader.js.map +2 -2
  257. package/dist/utils/pluginRegistry.js.map +2 -2
  258. package/dist/utils/pluginValidator.js +71 -49
  259. package/dist/utils/pluginValidator.js.map +2 -2
  260. package/dist/utils/ptyCompat.js.map +2 -2
  261. package/dist/utils/roundConverter.js.map +2 -2
  262. package/dist/utils/secureFile.js +43 -14
  263. package/dist/utils/secureFile.js.map +2 -2
  264. package/dist/utils/sessionState.js.map +2 -2
  265. package/dist/utils/skillLoader.js.map +2 -2
  266. package/dist/utils/teamConfig.js +7 -4
  267. package/dist/utils/teamConfig.js.map +2 -2
  268. package/dist/utils/theme.js.map +2 -2
  269. package/dist/utils/thinking.js.map +2 -2
  270. package/dist/utils/unaryLogging.js.map +2 -2
  271. package/dist/version.js +2 -2
  272. package/dist/version.js.map +1 -1
  273. package/package.json +5 -5
@@ -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 { loadAllPlugins, togglePluginEnabled, getPlugin } 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 (p.source.type === 'local' && p.source.path.includes('/.minto/plugins/')) {\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(plugins[selectedIndex].manifest.name)\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 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 / <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}>No plugins installed from this marketplace</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 key={plugin.manifest.name} flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color={isSelected ? theme.success : undefined}>\n {isSelected ? '\u276F ' : ' '}\n {statusIcon} {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 && `${plugin.agents.length} agent(s)`,\n plugin.commands.length > 0 &&\n `${plugin.commands.length} command(s)`,\n plugin.skills.length > 0 && `${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>Space Toggle \u00B7 U Mark Update \u00B7 D/Del Mark Uninstall</Text>\n <Text dimColor>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,SAAS,gBAAgB,qBAAqB,iBAAiB;AAG/D,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,CAAC,MAAM;AACxC,UAAI,YAAY,SAAS,SAAS;AAEhC,YAAI,EAAE,OAAO,SAAS,cAAe,QAAO;AAC5C,YAAI,EAAE,OAAO,SAAS,WAAW,EAAE,OAAO,KAAK,SAAS,kBAAkB,GAAG;AAC3E,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,CAAC,OAAO;AAAA,MACxD,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,oBAAoB,QAAQ,aAAa,EAAE,SAAS,IAAI;AAEzE,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,CAAC,SAAS;AACnB,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,CAAC,SAAS;AACnB,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,CAAC,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IAClD,WAAW,IAAI,WAAW;AACxB,uBAAiB,CAAC,SAAS,KAAK,IAAI,QAAQ,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,IACnE,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,uBACtD,GACA,oCAAC,QAAK,UAAQ,QAAC,uEAEf,GACA,oCAAC,YAAM,EAAG,GACV,oCAAC,YACC,oCAAC,QAAK,OAAO,MAAM,WAAS,GAAC,GAAO,SAAK,oCAAC,QAAK,OAAO,MAAM,SAAO,GAAC,GAAO,GAC7E,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,4CAA0C,CACxE,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,oCAAC,OAAI,KAAK,OAAO,SAAS,MAAM,eAAc,UAAS,cAAc,KACnE,oCAAC,WACC,oCAAC,QAAK,OAAO,aAAa,MAAM,UAAU,UACvC,aAAa,YAAO,MACpB,YAAW,KAAE,OAAO,SAAS,eAAe,OAAO,SAAS,IAC/D,GACC,MAAM,SAAS,KACd,oCAAC,QAAK,OAAO,MAAM,WAAS,KAAE,MAAM,KAAK,GAAG,CAAE,CAElD,GACA,oCAAC,OAAI,YAAY,KACf,oCAAC,QAAK,UAAQ,QACX,OAAO,SAAS,aAAY,WAAK,OAAO,SAAS,OACpD,CACF,GACC,cACC,oCAAC,OAAI,YAAY,KACf,oCAAC,QAAK,UAAQ,QAAC,eACD,KACX;AAAA,MACC,OAAO,OAAO,SAAS,KAAK,GAAG,OAAO,OAAO,MAAM;AAAA,MACnD,OAAO,SAAS,SAAS,KACvB,GAAG,OAAO,SAAS,MAAM;AAAA,MAC3B,OAAO,OAAO,SAAS,KAAK,GAAG,OAAO,OAAO,MAAM;AAAA,IACrD,EACG,OAAO,OAAO,EACd,KAAK,IAAI,KAAK,MACnB,CACF,CAEJ;AAAA,EAEJ,CAAC,GAGH,oCAAC,YAAM,EAAG,GACV,oCAAC,OAAI,YAAY,GAAG,eAAc,YAChC,oCAAC,QAAK,UAAQ,QAAC,2DAAmD,GAClE,oCAAC,QAAK,UAAQ,QAAC,6BAAwB,CACzC,CACF;AAEJ;",
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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",
6
6
  "names": []
7
7
  }
@@ -17,7 +17,9 @@ const InstalledPluginsManager = ({
17
17
  try {
18
18
  const plugins = loadAllPlugins();
19
19
  const registeredMarketplaces = listMarketplaces();
20
- const marketplaceNames = new Set(registeredMarketplaces.map((m) => m.name));
20
+ const marketplaceNames = new Set(
21
+ registeredMarketplaces.map((m) => m.name)
22
+ );
21
23
  const grouped = {};
22
24
  for (const plugin of plugins) {
23
25
  let marketplaceName = "local";
@@ -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(registeredMarketplaces.map((m) => m.name))\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'\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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",
6
6
  "names": ["plugins"]
7
7
  }
@@ -2,7 +2,11 @@ import React from "react";
2
2
  import { Box, Text, useInput } from "ink";
3
3
  import { Select } from "../../components/CustomSelect/select.js";
4
4
  import { getTheme } from "../../utils/theme.js";
5
- const MainMenu = ({ onNavigate, onBack, onDone }) => {
5
+ const MainMenu = ({
6
+ onNavigate,
7
+ onBack,
8
+ onDone
9
+ }) => {
6
10
  const theme = getTheme();
7
11
  const options = [
8
12
  {
@@ -43,13 +47,18 @@ const MainMenu = ({ onNavigate, onBack, onDone }) => {
43
47
  onDone();
44
48
  }
45
49
  });
46
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.primary, padding: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Plugins")), /* @__PURE__ */ React.createElement(
47
- Select,
50
+ return /* @__PURE__ */ React.createElement(
51
+ Box,
48
52
  {
49
- options,
50
- onChange: handleSelect
51
- }
52
- ), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Esc to exit")));
53
+ flexDirection: "column",
54
+ borderStyle: "round",
55
+ borderColor: theme.primary,
56
+ padding: 1
57
+ },
58
+ /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Plugins")),
59
+ /* @__PURE__ */ React.createElement(Select, { options, onChange: handleSelect }),
60
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Esc to exit"))
61
+ );
53
62
  };
54
63
  export {
55
64
  MainMenu
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/plugin/MainMenu.tsx"],
4
- "sourcesContent": ["/**\n * Main Menu Component\n *\n * Entry point for the interactive plugin management interface.\n * Provides navigation to all major plugin management functions.\n */\n\nimport React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { Select } from '@components/CustomSelect/select'\nimport { getTheme } from '@utils/theme'\nimport type { NavigationProps } from './types'\n\nexport const MainMenu: React.FC<NavigationProps> = ({ onNavigate, onBack, onDone }) => {\n const theme = getTheme()\n\n const options = [\n {\n label: '1. Browse and install plugins',\n value: 'browse'\n },\n {\n label: '2. Manage and uninstall plugins',\n value: 'manage'\n },\n {\n label: '3. Add marketplace',\n value: 'add-marketplace'\n },\n {\n label: '4. Manage marketplaces',\n value: 'manage-marketplaces'\n }\n ]\n\n const handleSelect = (value: string) => {\n switch (value) {\n case 'browse':\n onNavigate({ screen: 'marketplace-selector' })\n break\n case 'manage':\n onNavigate({ screen: 'installed-plugins-manager' })\n break\n case 'add-marketplace':\n onNavigate({ screen: 'add-marketplace' })\n break\n case 'manage-marketplaces':\n onNavigate({ screen: 'marketplace-manager' })\n break\n }\n }\n\n // Handle Escape key to exit\n useInput((input, key) => {\n if (key.escape) {\n onDone()\n }\n })\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.primary} padding={1}>\n <Box marginBottom={1}>\n <Text bold color={theme.primary}>Plugins</Text>\n </Box>\n\n <Select\n options={options}\n onChange={handleSelect}\n />\n\n <Box marginTop={1}>\n <Text dimColor>Esc to exit</Text>\n </Box>\n </Box>\n )\n}\n"],
5
- "mappings": "AAOA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,cAAc;AACvB,SAAS,gBAAgB;AAGlB,MAAM,WAAsC,CAAC,EAAE,YAAY,QAAQ,OAAO,MAAM;AACrF,QAAM,QAAQ,SAAS;AAEvB,QAAM,UAAU;AAAA,IACd;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,UAAkB;AACtC,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,mBAAW,EAAE,QAAQ,uBAAuB,CAAC;AAC7C;AAAA,MACF,KAAK;AACH,mBAAW,EAAE,QAAQ,4BAA4B,CAAC;AAClD;AAAA,MACF,KAAK;AACH,mBAAW,EAAE,QAAQ,kBAAkB,CAAC;AACxC;AAAA,MACF,KAAK;AACH,mBAAW,EAAE,QAAQ,sBAAsB,CAAC;AAC5C;AAAA,IACJ;AAAA,EACF;AAGA,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,SACE,oCAAC,OAAI,eAAc,UAAS,aAAY,SAAQ,aAAa,MAAM,SAAS,SAAS,KACnF,oCAAC,OAAI,cAAc,KACjB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,SAAO,CAC1C,GAEA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,UAAU;AAAA;AAAA,EACZ,GAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,aAAW,CAC5B,CACF;AAEJ;",
4
+ "sourcesContent": ["/**\n * Main Menu Component\n *\n * Entry point for the interactive plugin management interface.\n * Provides navigation to all major plugin management functions.\n */\n\nimport React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { Select } from '@components/CustomSelect/select'\nimport { getTheme } from '@utils/theme'\nimport type { NavigationProps } from './types'\n\nexport const MainMenu: React.FC<NavigationProps> = ({\n onNavigate,\n onBack,\n onDone,\n}) => {\n const theme = getTheme()\n\n const options = [\n {\n label: '1. Browse and install plugins',\n value: 'browse',\n },\n {\n label: '2. Manage and uninstall plugins',\n value: 'manage',\n },\n {\n label: '3. Add marketplace',\n value: 'add-marketplace',\n },\n {\n label: '4. Manage marketplaces',\n value: 'manage-marketplaces',\n },\n ]\n\n const handleSelect = (value: string) => {\n switch (value) {\n case 'browse':\n onNavigate({ screen: 'marketplace-selector' })\n break\n case 'manage':\n onNavigate({ screen: 'installed-plugins-manager' })\n break\n case 'add-marketplace':\n onNavigate({ screen: 'add-marketplace' })\n break\n case 'manage-marketplaces':\n onNavigate({ screen: 'marketplace-manager' })\n break\n }\n }\n\n // Handle Escape key to exit\n useInput((input, key) => {\n if (key.escape) {\n onDone()\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Box marginBottom={1}>\n <Text bold color={theme.primary}>\n Plugins\n </Text>\n </Box>\n\n <Select options={options} onChange={handleSelect} />\n\n <Box marginTop={1}>\n <Text dimColor>Esc to exit</Text>\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "AAOA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,cAAc;AACvB,SAAS,gBAAgB;AAGlB,MAAM,WAAsC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,SAAS;AAEvB,QAAM,UAAU;AAAA,IACd;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,UAAkB;AACtC,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,mBAAW,EAAE,QAAQ,uBAAuB,CAAC;AAC7C;AAAA,MACF,KAAK;AACH,mBAAW,EAAE,QAAQ,4BAA4B,CAAC;AAClD;AAAA,MACF,KAAK;AACH,mBAAW,EAAE,QAAQ,kBAAkB,CAAC;AACxC;AAAA,MACF,KAAK;AACH,mBAAW,EAAE,QAAQ,sBAAsB,CAAC;AAC5C;AAAA,IACJ;AAAA,EACF;AAGA,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,aAAO;AAAA,IACT;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,OAAI,cAAc,KACjB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,SAEjC,CACF;AAAA,IAEA,oCAAC,UAAO,SAAkB,UAAU,cAAc;AAAA,IAElD,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,aAAW,CAC5B;AAAA,EACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -6,9 +6,15 @@ import {
6
6
  updateMarketplace,
7
7
  removeMarketplace
8
8
  } from "../../utils/marketplaceManager.js";
9
- import { MarketplaceError } from "../../types/marketplace.js";
9
+ import {
10
+ MarketplaceError
11
+ } from "../../types/marketplace.js";
10
12
  import { getTheme } from "../../utils/theme.js";
11
- import { formatMarketplacePath, formatTimeAgo, countInstalledPlugins } from "./utils.js";
13
+ import {
14
+ formatMarketplacePath,
15
+ formatTimeAgo,
16
+ countInstalledPlugins
17
+ } from "./utils.js";
12
18
  import { ConfirmDialog } from "./ConfirmDialog.js";
13
19
  const MarketplaceManager = ({
14
20
  onNavigate,
@@ -32,7 +38,9 @@ const MarketplaceManager = ({
32
38
  setFocusedIndex(markets.length - 1);
33
39
  }
34
40
  } catch (err) {
35
- setError(err instanceof Error ? err.message : "Failed to load marketplaces");
41
+ setError(
42
+ err instanceof Error ? err.message : "Failed to load marketplaces"
43
+ );
36
44
  }
37
45
  };
38
46
  const handleUpdate = async (marketplace) => {
@@ -45,7 +53,9 @@ const MarketplaceManager = ({
45
53
  if (err instanceof MarketplaceError) {
46
54
  setError(`Update failed: ${err.message}`);
47
55
  } else {
48
- setError(`Update failed: ${err instanceof Error ? err.message : "Unknown error"}`);
56
+ setError(
57
+ `Update failed: ${err instanceof Error ? err.message : "Unknown error"}`
58
+ );
49
59
  }
50
60
  } finally {
51
61
  setLoading(false);
@@ -59,7 +69,9 @@ const MarketplaceManager = ({
59
69
  if (err instanceof MarketplaceError) {
60
70
  setError(`Remove failed: ${err.message}`);
61
71
  } else {
62
- setError(`Remove failed: ${err instanceof Error ? err.message : "Unknown error"}`);
72
+ setError(
73
+ `Remove failed: ${err instanceof Error ? err.message : "Unknown error"}`
74
+ );
63
75
  }
64
76
  }
65
77
  };
@@ -79,31 +91,34 @@ const MarketplaceManager = ({
79
91
  setShowConfirm(false);
80
92
  setConfirmAction(null);
81
93
  };
82
- useInput((input, key) => {
83
- if (showConfirm || loading) return;
84
- if (key.escape) {
85
- onBack();
86
- } else if (key.upArrow && focusedIndex > 0) {
87
- setFocusedIndex(focusedIndex - 1);
88
- setError(null);
89
- } else if (key.downArrow && focusedIndex < marketplaces.length - 1) {
90
- setFocusedIndex(focusedIndex + 1);
91
- setError(null);
92
- } else if (key.return && marketplaces.length > 0) {
93
- onNavigate({
94
- screen: "marketplace-details",
95
- marketplace: marketplaces[focusedIndex].name
96
- });
97
- } else if (input === "u" && marketplaces.length > 0) {
98
- setConfirmAction("update");
99
- setShowConfirm(true);
100
- } else if (input === "r" && marketplaces.length > 0) {
101
- setConfirmAction("remove");
102
- setShowConfirm(true);
103
- } else if (input === "a") {
104
- onNavigate({ screen: "add-marketplace" });
105
- }
106
- }, { isActive: !showConfirm && !loading });
94
+ useInput(
95
+ (input, key) => {
96
+ if (showConfirm || loading) return;
97
+ if (key.escape) {
98
+ onBack();
99
+ } else if (key.upArrow && focusedIndex > 0) {
100
+ setFocusedIndex(focusedIndex - 1);
101
+ setError(null);
102
+ } else if (key.downArrow && focusedIndex < marketplaces.length - 1) {
103
+ setFocusedIndex(focusedIndex + 1);
104
+ setError(null);
105
+ } else if (key.return && marketplaces.length > 0) {
106
+ onNavigate({
107
+ screen: "marketplace-details",
108
+ marketplace: marketplaces[focusedIndex].name
109
+ });
110
+ } else if (input === "u" && marketplaces.length > 0) {
111
+ setConfirmAction("update");
112
+ setShowConfirm(true);
113
+ } else if (input === "r" && marketplaces.length > 0) {
114
+ setConfirmAction("remove");
115
+ setShowConfirm(true);
116
+ } else if (input === "a") {
117
+ onNavigate({ screen: "add-marketplace" });
118
+ }
119
+ },
120
+ { isActive: !showConfirm && !loading }
121
+ );
107
122
  if (showConfirm && confirmAction === "update" && focusedIndex < marketplaces.length) {
108
123
  return /* @__PURE__ */ React.createElement(
109
124
  ConfirmDialog,
@@ -131,15 +146,37 @@ Installed plugins from this marketplace will not be affected.`,
131
146
  }
132
147
  );
133
148
  }
134
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.primary, padding: 1 }, /* @__PURE__ */ React.createElement(Box, { justifyContent: "space-between" }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Manage Marketplaces"), marketplaces.length > 0 && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "(", marketplaces.length, " registered)")), marketplaces.length === 0 ? /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, "No marketplaces registered."), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press "), /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "a"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " to add your first marketplace."))) : /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, marketplaces.map((marketplace, index) => /* @__PURE__ */ React.createElement(
135
- MarketplaceListItem,
149
+ return /* @__PURE__ */ React.createElement(
150
+ Box,
136
151
  {
137
- key: marketplace.name,
138
- marketplace,
139
- isFocused: index === focusedIndex,
140
- theme
141
- }
142
- ))), error && /* @__PURE__ */ React.createElement(Box, { marginTop: 1, borderStyle: "round", borderColor: theme.error, padding: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "\u2717 ", error)), loading && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(SimpleSpinner, null), /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, " Updating marketplace...")), !loading && /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, marketplaces.length > 0 ? "\u2191\u2193 navigate \xB7 " : "", marketplaces.length > 0 ? /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Enter") : "", marketplaces.length > 0 ? " details \xB7 " : "", /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "a"), " add \xB7", marketplaces.length > 0 ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, " u"), " update \xB7 ") : "", marketplaces.length > 0 ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, { color: theme.error }, " r"), " remove \xB7 ") : " ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Esc"), " back")));
152
+ flexDirection: "column",
153
+ borderStyle: "round",
154
+ borderColor: theme.primary,
155
+ padding: 1
156
+ },
157
+ /* @__PURE__ */ React.createElement(Box, { justifyContent: "space-between" }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Manage Marketplaces"), marketplaces.length > 0 && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "(", marketplaces.length, " registered)")),
158
+ marketplaces.length === 0 ? /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, "No marketplaces registered."), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press "), /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "a"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " to add your first marketplace."))) : /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, marketplaces.map((marketplace, index) => /* @__PURE__ */ React.createElement(
159
+ MarketplaceListItem,
160
+ {
161
+ key: marketplace.name,
162
+ marketplace,
163
+ isFocused: index === focusedIndex,
164
+ theme
165
+ }
166
+ ))),
167
+ error && /* @__PURE__ */ React.createElement(
168
+ Box,
169
+ {
170
+ marginTop: 1,
171
+ borderStyle: "round",
172
+ borderColor: theme.error,
173
+ padding: 1
174
+ },
175
+ /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "\u2717 ", error)
176
+ ),
177
+ loading && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(SimpleSpinner, null), /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, " Updating marketplace...")),
178
+ !loading && /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, marketplaces.length > 0 ? "\u2191\u2193 navigate \xB7 " : "", marketplaces.length > 0 ? /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Enter") : "", marketplaces.length > 0 ? " details \xB7 " : "", /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "a"), " add \xB7", marketplaces.length > 0 ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, " u"), " update \xB7", " ") : "", marketplaces.length > 0 ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, { color: theme.error }, " r"), " remove \xB7", " ") : " ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Esc"), " back"))
179
+ );
143
180
  };
144
181
  const MarketplaceListItem = ({
145
182
  marketplace,
@@ -147,7 +184,15 @@ const MarketplaceListItem = ({
147
184
  theme
148
185
  }) => {
149
186
  const installed = countInstalledPlugins(marketplace.name);
150
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: isFocused ? theme.success : theme.text }, isFocused ? "\u276F " : " "), /* @__PURE__ */ React.createElement(Text, { color: marketplace.enabled ? theme.primary : theme.secondaryText, bold: isFocused }, marketplace.enabled ? "\u25CF " : "\u25CB ", marketplace.name), !marketplace.enabled && /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, " (disabled)")), /* @__PURE__ */ React.createElement(Box, { marginLeft: 4, flexDirection: "column" }, marketplace.manifest.metadata?.description && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, marketplace.manifest.metadata.description), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, marketplace.manifest.plugins.length, " available"), installed > 0 && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " \xB7 ", installed, " installed"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " \xB7 Updated ", formatTimeAgo(marketplace.lastUpdated))), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Source: ", formatMarketplacePath(marketplace.source))));
187
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: isFocused ? theme.success : theme.text }, isFocused ? "\u276F " : " "), /* @__PURE__ */ React.createElement(
188
+ Text,
189
+ {
190
+ color: marketplace.enabled ? theme.primary : theme.secondaryText,
191
+ bold: isFocused
192
+ },
193
+ marketplace.enabled ? "\u25CF " : "\u25CB ",
194
+ marketplace.name
195
+ ), !marketplace.enabled && /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, " (disabled)")), /* @__PURE__ */ React.createElement(Box, { marginLeft: 4, flexDirection: "column" }, marketplace.manifest.metadata?.description && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, marketplace.manifest.metadata.description), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, marketplace.manifest.plugins.length, " available"), installed > 0 && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " \xB7 ", installed, " installed"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", "\xB7 Updated ", formatTimeAgo(marketplace.lastUpdated))), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Source: ", formatMarketplacePath(marketplace.source))));
151
196
  };
152
197
  export {
153
198
  MarketplaceManager
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/plugin/MarketplaceManager.tsx"],
4
- "sourcesContent": ["/**\n * MarketplaceManager Component\n *\n * Manage registered plugin marketplaces with list, update, and remove operations\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { SimpleSpinner } from '@components/Spinner'\nimport {\n listMarketplaces,\n updateMarketplace,\n removeMarketplace,\n} from '@utils/marketplaceManager'\nimport { RegisteredMarketplace, MarketplaceError } from '../../types/marketplace'\nimport { getTheme } from '@utils/theme'\nimport { formatMarketplacePath, formatTimeAgo, countInstalledPlugins } from './utils'\nimport { NavigationProps } from './AddMarketplaceForm'\nimport { ConfirmDialog } from './ConfirmDialog'\n\nexport const MarketplaceManager: React.FC<NavigationProps> = ({\n onNavigate,\n onBack\n}) => {\n const [marketplaces, setMarketplaces] = useState<RegisteredMarketplace[]>([])\n const [focusedIndex, setFocusedIndex] = useState(0)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [showConfirm, setShowConfirm] = useState(false)\n const [confirmAction, setConfirmAction] = useState<'update' | 'remove' | null>(null)\n const theme = getTheme()\n\n // Load marketplaces\n useEffect(() => {\n refreshMarketplaces()\n }, [])\n\n const refreshMarketplaces = () => {\n try {\n const markets = listMarketplaces()\n setMarketplaces(markets)\n // Keep focus in bounds\n if (focusedIndex >= markets.length && markets.length > 0) {\n setFocusedIndex(markets.length - 1)\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load marketplaces')\n }\n }\n\n const handleUpdate = async (marketplace: RegisteredMarketplace) => {\n setLoading(true)\n setError(null)\n\n try {\n await updateMarketplace(marketplace.name)\n refreshMarketplaces()\n } catch (err) {\n if (err instanceof MarketplaceError) {\n setError(`Update failed: ${err.message}`)\n } else {\n setError(`Update failed: ${err instanceof Error ? err.message : 'Unknown error'}`)\n }\n } finally {\n setLoading(false)\n }\n }\n\n const handleRemove = (marketplace: RegisteredMarketplace) => {\n try {\n removeMarketplace(marketplace.name)\n refreshMarketplaces()\n } catch (err) {\n if (err instanceof MarketplaceError) {\n setError(`Remove failed: ${err.message}`)\n } else {\n setError(`Remove failed: ${err instanceof Error ? err.message : 'Unknown error'}`)\n }\n }\n }\n\n const handleConfirmUpdate = () => {\n setShowConfirm(false)\n if (focusedIndex < marketplaces.length) {\n handleUpdate(marketplaces[focusedIndex])\n }\n }\n\n const handleConfirmRemove = () => {\n setShowConfirm(false)\n if (focusedIndex < marketplaces.length) {\n handleRemove(marketplaces[focusedIndex])\n }\n }\n\n const handleConfirmCancel = () => {\n setShowConfirm(false)\n setConfirmAction(null)\n }\n\n useInput((input, key) => {\n if (showConfirm || loading) return\n\n if (key.escape) {\n onBack()\n } else if (key.upArrow && focusedIndex > 0) {\n setFocusedIndex(focusedIndex - 1)\n setError(null)\n } else if (key.downArrow && focusedIndex < marketplaces.length - 1) {\n setFocusedIndex(focusedIndex + 1)\n setError(null)\n } else if (key.return && marketplaces.length > 0) {\n // Navigate to marketplace details\n onNavigate({\n screen: 'marketplace-details',\n marketplace: marketplaces[focusedIndex].name\n })\n } else if (input === 'u' && marketplaces.length > 0) {\n setConfirmAction('update')\n setShowConfirm(true)\n } else if (input === 'r' && marketplaces.length > 0) {\n setConfirmAction('remove')\n setShowConfirm(true)\n } else if (input === 'a') {\n onNavigate({ screen: 'add-marketplace' })\n }\n }, { isActive: !showConfirm && !loading })\n\n if (showConfirm && confirmAction === 'update' && focusedIndex < marketplaces.length) {\n return (\n <ConfirmDialog\n title=\"Update Marketplace\"\n message={`Update marketplace \"${marketplaces[focusedIndex].name}\"?\\n\\nThis will fetch the latest plugin list from the source.`}\n onConfirm={handleConfirmUpdate}\n onCancel={handleConfirmCancel}\n />\n )\n }\n\n if (showConfirm && confirmAction === 'remove' && focusedIndex < marketplaces.length) {\n return (\n <ConfirmDialog\n title=\"Remove Marketplace\"\n message={`Remove marketplace \"${marketplaces[focusedIndex].name}\"?\\n\\nInstalled plugins from this marketplace will not be affected.`}\n onConfirm={handleConfirmRemove}\n onCancel={handleConfirmCancel}\n confirmColor={theme.error}\n />\n )\n }\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.primary} padding={1}>\n <Box justifyContent=\"space-between\">\n <Text bold color={theme.primary}>Manage Marketplaces</Text>\n {marketplaces.length > 0 && (\n <Text dimColor>({marketplaces.length} registered)</Text>\n )}\n </Box>\n\n {marketplaces.length === 0 ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={theme.warning}>No marketplaces registered.</Text>\n <Box marginTop={1}>\n <Text dimColor>Press </Text>\n <Text color={theme.success}>a</Text>\n <Text dimColor> to add your first marketplace.</Text>\n </Box>\n </Box>\n ) : (\n <Box marginTop={1} flexDirection=\"column\">\n {marketplaces.map((marketplace, index) => (\n <MarketplaceListItem\n key={marketplace.name}\n marketplace={marketplace}\n isFocused={index === focusedIndex}\n theme={theme}\n />\n ))}\n </Box>\n )}\n\n {error && (\n <Box marginTop={1} borderStyle=\"round\" borderColor={theme.error} padding={1}>\n <Text color={theme.error}>\u2717 {error}</Text>\n </Box>\n )}\n\n {loading && (\n <Box marginTop={1}>\n <SimpleSpinner />\n <Text color={theme.primary}> Updating marketplace...</Text>\n </Box>\n )}\n\n {!loading && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>\n {marketplaces.length > 0 ? '\u2191\u2193 navigate \u00B7 ' : ''}\n {marketplaces.length > 0 ? <Text color={theme.success}>Enter</Text> : ''}\n {marketplaces.length > 0 ? ' details \u00B7 ' : ''}\n <Text color={theme.success}>a</Text> add \u00B7\n {marketplaces.length > 0 ? <><Text color={theme.success}> u</Text> update \u00B7 </> : ''}\n {marketplaces.length > 0 ? <><Text color={theme.error}> r</Text> remove \u00B7 </> : ' '}\n <Text color={theme.error}>Esc</Text> back\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n\n// Marketplace list item component\ninterface MarketplaceListItemProps {\n marketplace: RegisteredMarketplace\n isFocused: boolean\n theme: ReturnType<typeof getTheme>\n}\n\nconst MarketplaceListItem: React.FC<MarketplaceListItemProps> = ({\n marketplace,\n isFocused,\n theme\n}) => {\n const installed = countInstalledPlugins(marketplace.name)\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color={isFocused ? theme.success : theme.text}>\n {isFocused ? '\u276F ' : ' '}\n </Text>\n <Text color={marketplace.enabled ? theme.primary : theme.secondaryText} bold={isFocused}>\n {marketplace.enabled ? '\u25CF ' : '\u25CB '}\n {marketplace.name}\n </Text>\n {!marketplace.enabled && (\n <Text color={theme.warning}> (disabled)</Text>\n )}\n </Box>\n\n <Box marginLeft={4} flexDirection=\"column\">\n {marketplace.manifest.metadata?.description && (\n <Text dimColor>{marketplace.manifest.metadata.description}</Text>\n )}\n\n <Box>\n <Text dimColor>\n {marketplace.manifest.plugins.length} available\n </Text>\n {installed > 0 && (\n <Text dimColor> \u00B7 {installed} installed</Text>\n )}\n <Text dimColor> \u00B7 Updated {formatTimeAgo(marketplace.lastUpdated)}</Text>\n </Box>\n\n <Text dimColor>\n Source: {formatMarketplacePath(marketplace.source)}\n </Text>\n </Box>\n </Box>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * MarketplaceManager Component\n *\n * Manage registered plugin marketplaces with list, update, and remove operations\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { SimpleSpinner } from '@components/Spinner'\nimport {\n listMarketplaces,\n updateMarketplace,\n removeMarketplace,\n} from '@utils/marketplaceManager'\nimport {\n RegisteredMarketplace,\n MarketplaceError,\n} from '../../types/marketplace'\nimport { getTheme } from '@utils/theme'\nimport {\n formatMarketplacePath,\n formatTimeAgo,\n countInstalledPlugins,\n} from './utils'\nimport { NavigationProps } from './AddMarketplaceForm'\nimport { ConfirmDialog } from './ConfirmDialog'\n\nexport const MarketplaceManager: React.FC<NavigationProps> = ({\n onNavigate,\n onBack,\n}) => {\n const [marketplaces, setMarketplaces] = useState<RegisteredMarketplace[]>([])\n const [focusedIndex, setFocusedIndex] = useState(0)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [showConfirm, setShowConfirm] = useState(false)\n const [confirmAction, setConfirmAction] = useState<\n 'update' | 'remove' | null\n >(null)\n const theme = getTheme()\n\n // Load marketplaces\n useEffect(() => {\n refreshMarketplaces()\n }, [])\n\n const refreshMarketplaces = () => {\n try {\n const markets = listMarketplaces()\n setMarketplaces(markets)\n // Keep focus in bounds\n if (focusedIndex >= markets.length && markets.length > 0) {\n setFocusedIndex(markets.length - 1)\n }\n } catch (err) {\n setError(\n err instanceof Error ? err.message : 'Failed to load marketplaces',\n )\n }\n }\n\n const handleUpdate = async (marketplace: RegisteredMarketplace) => {\n setLoading(true)\n setError(null)\n\n try {\n await updateMarketplace(marketplace.name)\n refreshMarketplaces()\n } catch (err) {\n if (err instanceof MarketplaceError) {\n setError(`Update failed: ${err.message}`)\n } else {\n setError(\n `Update failed: ${err instanceof Error ? err.message : 'Unknown error'}`,\n )\n }\n } finally {\n setLoading(false)\n }\n }\n\n const handleRemove = (marketplace: RegisteredMarketplace) => {\n try {\n removeMarketplace(marketplace.name)\n refreshMarketplaces()\n } catch (err) {\n if (err instanceof MarketplaceError) {\n setError(`Remove failed: ${err.message}`)\n } else {\n setError(\n `Remove failed: ${err instanceof Error ? err.message : 'Unknown error'}`,\n )\n }\n }\n }\n\n const handleConfirmUpdate = () => {\n setShowConfirm(false)\n if (focusedIndex < marketplaces.length) {\n handleUpdate(marketplaces[focusedIndex])\n }\n }\n\n const handleConfirmRemove = () => {\n setShowConfirm(false)\n if (focusedIndex < marketplaces.length) {\n handleRemove(marketplaces[focusedIndex])\n }\n }\n\n const handleConfirmCancel = () => {\n setShowConfirm(false)\n setConfirmAction(null)\n }\n\n useInput(\n (input, key) => {\n if (showConfirm || loading) return\n\n if (key.escape) {\n onBack()\n } else if (key.upArrow && focusedIndex > 0) {\n setFocusedIndex(focusedIndex - 1)\n setError(null)\n } else if (key.downArrow && focusedIndex < marketplaces.length - 1) {\n setFocusedIndex(focusedIndex + 1)\n setError(null)\n } else if (key.return && marketplaces.length > 0) {\n // Navigate to marketplace details\n onNavigate({\n screen: 'marketplace-details',\n marketplace: marketplaces[focusedIndex].name,\n })\n } else if (input === 'u' && marketplaces.length > 0) {\n setConfirmAction('update')\n setShowConfirm(true)\n } else if (input === 'r' && marketplaces.length > 0) {\n setConfirmAction('remove')\n setShowConfirm(true)\n } else if (input === 'a') {\n onNavigate({ screen: 'add-marketplace' })\n }\n },\n { isActive: !showConfirm && !loading },\n )\n\n if (\n showConfirm &&\n confirmAction === 'update' &&\n focusedIndex < marketplaces.length\n ) {\n return (\n <ConfirmDialog\n title=\"Update Marketplace\"\n message={`Update marketplace \"${marketplaces[focusedIndex].name}\"?\\n\\nThis will fetch the latest plugin list from the source.`}\n onConfirm={handleConfirmUpdate}\n onCancel={handleConfirmCancel}\n />\n )\n }\n\n if (\n showConfirm &&\n confirmAction === 'remove' &&\n focusedIndex < marketplaces.length\n ) {\n return (\n <ConfirmDialog\n title=\"Remove Marketplace\"\n message={`Remove marketplace \"${marketplaces[focusedIndex].name}\"?\\n\\nInstalled plugins from this marketplace will not be affected.`}\n onConfirm={handleConfirmRemove}\n onCancel={handleConfirmCancel}\n confirmColor={theme.error}\n />\n )\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Box justifyContent=\"space-between\">\n <Text bold color={theme.primary}>\n Manage Marketplaces\n </Text>\n {marketplaces.length > 0 && (\n <Text dimColor>({marketplaces.length} registered)</Text>\n )}\n </Box>\n\n {marketplaces.length === 0 ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={theme.warning}>No marketplaces registered.</Text>\n <Box marginTop={1}>\n <Text dimColor>Press </Text>\n <Text color={theme.success}>a</Text>\n <Text dimColor> to add your first marketplace.</Text>\n </Box>\n </Box>\n ) : (\n <Box marginTop={1} flexDirection=\"column\">\n {marketplaces.map((marketplace, index) => (\n <MarketplaceListItem\n key={marketplace.name}\n marketplace={marketplace}\n isFocused={index === focusedIndex}\n theme={theme}\n />\n ))}\n </Box>\n )}\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 {loading && (\n <Box marginTop={1}>\n <SimpleSpinner />\n <Text color={theme.primary}> Updating marketplace...</Text>\n </Box>\n )}\n\n {!loading && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>\n {marketplaces.length > 0 ? '\u2191\u2193 navigate \u00B7 ' : ''}\n {marketplaces.length > 0 ? (\n <Text color={theme.success}>Enter</Text>\n ) : (\n ''\n )}\n {marketplaces.length > 0 ? ' details \u00B7 ' : ''}\n <Text color={theme.success}>a</Text> add \u00B7\n {marketplaces.length > 0 ? (\n <>\n <Text color={theme.success}> u</Text> update \u00B7{' '}\n </>\n ) : (\n ''\n )}\n {marketplaces.length > 0 ? (\n <>\n <Text color={theme.error}> r</Text> remove \u00B7{' '}\n </>\n ) : (\n ' '\n )}\n <Text color={theme.error}>Esc</Text> back\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n\n// Marketplace list item component\ninterface MarketplaceListItemProps {\n marketplace: RegisteredMarketplace\n isFocused: boolean\n theme: ReturnType<typeof getTheme>\n}\n\nconst MarketplaceListItem: React.FC<MarketplaceListItemProps> = ({\n marketplace,\n isFocused,\n theme,\n}) => {\n const installed = countInstalledPlugins(marketplace.name)\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color={isFocused ? theme.success : theme.text}>\n {isFocused ? '\u276F ' : ' '}\n </Text>\n <Text\n color={marketplace.enabled ? theme.primary : theme.secondaryText}\n bold={isFocused}\n >\n {marketplace.enabled ? '\u25CF ' : '\u25CB '}\n {marketplace.name}\n </Text>\n {!marketplace.enabled && <Text color={theme.warning}> (disabled)</Text>}\n </Box>\n\n <Box marginLeft={4} flexDirection=\"column\">\n {marketplace.manifest.metadata?.description && (\n <Text dimColor>{marketplace.manifest.metadata.description}</Text>\n )}\n\n <Box>\n <Text dimColor>{marketplace.manifest.plugins.length} available</Text>\n {installed > 0 && <Text dimColor> \u00B7 {installed} installed</Text>}\n <Text dimColor>\n {' '}\n \u00B7 Updated {formatTimeAgo(marketplace.lastUpdated)}\n </Text>\n </Box>\n\n <Text dimColor>\n Source: {formatMarketplacePath(marketplace.source)}\n </Text>\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "AAMA,OAAO,SAAS,UAAU,iBAAiB;AAC3C,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,qBAAqB;AAC9B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EAEE;AAAA,OACK;AACP,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,qBAAqB;AAEvB,MAAM,qBAAgD,CAAC;AAAA,EAC5D;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,cAAc,eAAe,IAAI,SAAkC,CAAC,CAAC;AAC5E,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,CAAC;AAClD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AACtD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAExC,IAAI;AACN,QAAM,QAAQ,SAAS;AAGvB,YAAU,MAAM;AACd,wBAAoB;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,sBAAsB,MAAM;AAChC,QAAI;AACF,YAAM,UAAU,iBAAiB;AACjC,sBAAgB,OAAO;AAEvB,UAAI,gBAAgB,QAAQ,UAAU,QAAQ,SAAS,GAAG;AACxD,wBAAgB,QAAQ,SAAS,CAAC;AAAA,MACpC;AAAA,IACF,SAAS,KAAK;AACZ;AAAA,QACE,eAAe,QAAQ,IAAI,UAAU;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,gBAAuC;AACjE,eAAW,IAAI;AACf,aAAS,IAAI;AAEb,QAAI;AACF,YAAM,kBAAkB,YAAY,IAAI;AACxC,0BAAoB;AAAA,IACtB,SAAS,KAAK;AACZ,UAAI,eAAe,kBAAkB;AACnC,iBAAS,kBAAkB,IAAI,OAAO,EAAE;AAAA,MAC1C,OAAO;AACL;AAAA,UACE,kBAAkB,eAAe,QAAQ,IAAI,UAAU,eAAe;AAAA,QACxE;AAAA,MACF;AAAA,IACF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,gBAAuC;AAC3D,QAAI;AACF,wBAAkB,YAAY,IAAI;AAClC,0BAAoB;AAAA,IACtB,SAAS,KAAK;AACZ,UAAI,eAAe,kBAAkB;AACnC,iBAAS,kBAAkB,IAAI,OAAO,EAAE;AAAA,MAC1C,OAAO;AACL;AAAA,UACE,kBAAkB,eAAe,QAAQ,IAAI,UAAU,eAAe;AAAA,QACxE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAM;AAChC,mBAAe,KAAK;AACpB,QAAI,eAAe,aAAa,QAAQ;AACtC,mBAAa,aAAa,YAAY,CAAC;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAM;AAChC,mBAAe,KAAK;AACpB,QAAI,eAAe,aAAa,QAAQ;AACtC,mBAAa,aAAa,YAAY,CAAC;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAM;AAChC,mBAAe,KAAK;AACpB,qBAAiB,IAAI;AAAA,EACvB;AAEA;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,eAAe,QAAS;AAE5B,UAAI,IAAI,QAAQ;AACd,eAAO;AAAA,MACT,WAAW,IAAI,WAAW,eAAe,GAAG;AAC1C,wBAAgB,eAAe,CAAC;AAChC,iBAAS,IAAI;AAAA,MACf,WAAW,IAAI,aAAa,eAAe,aAAa,SAAS,GAAG;AAClE,wBAAgB,eAAe,CAAC;AAChC,iBAAS,IAAI;AAAA,MACf,WAAW,IAAI,UAAU,aAAa,SAAS,GAAG;AAEhD,mBAAW;AAAA,UACT,QAAQ;AAAA,UACR,aAAa,aAAa,YAAY,EAAE;AAAA,QAC1C,CAAC;AAAA,MACH,WAAW,UAAU,OAAO,aAAa,SAAS,GAAG;AACnD,yBAAiB,QAAQ;AACzB,uBAAe,IAAI;AAAA,MACrB,WAAW,UAAU,OAAO,aAAa,SAAS,GAAG;AACnD,yBAAiB,QAAQ;AACzB,uBAAe,IAAI;AAAA,MACrB,WAAW,UAAU,KAAK;AACxB,mBAAW,EAAE,QAAQ,kBAAkB,CAAC;AAAA,MAC1C;AAAA,IACF;AAAA,IACA,EAAE,UAAU,CAAC,eAAe,CAAC,QAAQ;AAAA,EACvC;AAEA,MACE,eACA,kBAAkB,YAClB,eAAe,aAAa,QAC5B;AACA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAS,uBAAuB,aAAa,YAAY,EAAE,IAAI;AAAA;AAAA;AAAA,QAC/D,WAAW;AAAA,QACX,UAAU;AAAA;AAAA,IACZ;AAAA,EAEJ;AAEA,MACE,eACA,kBAAkB,YAClB,eAAe,aAAa,QAC5B;AACA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAS,uBAAuB,aAAa,YAAY,EAAE,IAAI;AAAA;AAAA;AAAA,QAC/D,WAAW;AAAA,QACX,UAAU;AAAA,QACV,cAAc,MAAM;AAAA;AAAA,IACtB;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,SAAS;AAAA;AAAA,IAET,oCAAC,OAAI,gBAAe,mBAClB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,qBAEjC,GACC,aAAa,SAAS,KACrB,oCAAC,QAAK,UAAQ,QAAC,KAAE,aAAa,QAAO,cAAY,CAErD;AAAA,IAEC,aAAa,WAAW,IACvB,oCAAC,OAAI,WAAW,GAAG,eAAc,YAC/B,oCAAC,QAAK,OAAO,MAAM,WAAS,6BAA2B,GACvD,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,QAAM,GACrB,oCAAC,QAAK,OAAO,MAAM,WAAS,GAAC,GAC7B,oCAAC,QAAK,UAAQ,QAAC,iCAA+B,CAChD,CACF,IAEA,oCAAC,OAAI,WAAW,GAAG,eAAc,YAC9B,aAAa,IAAI,CAAC,aAAa,UAC9B;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,YAAY;AAAA,QACjB;AAAA,QACA,WAAW,UAAU;AAAA,QACrB;AAAA;AAAA,IACF,CACD,CACH;AAAA,IAGD,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,WACC,oCAAC,OAAI,WAAW,KACd,oCAAC,mBAAc,GACf,oCAAC,QAAK,OAAO,MAAM,WAAS,0BAAwB,CACtD;AAAA,IAGD,CAAC,WACA,oCAAC,OAAI,WAAW,GAAG,eAAc,YAC/B,oCAAC,QAAK,UAAQ,QACX,aAAa,SAAS,IAAI,gCAAmB,IAC7C,aAAa,SAAS,IACrB,oCAAC,QAAK,OAAO,MAAM,WAAS,OAAK,IAEjC,IAED,aAAa,SAAS,IAAI,mBAAgB,IAC3C,oCAAC,QAAK,OAAO,MAAM,WAAS,GAAC,GAAO,aACnC,aAAa,SAAS,IACrB,0DACE,oCAAC,QAAK,OAAO,MAAM,WAAS,IAAE,GAAO,gBAAU,GACjD,IAEA,IAED,aAAa,SAAS,IACrB,0DACE,oCAAC,QAAK,OAAO,MAAM,SAAO,IAAE,GAAO,gBAAU,GAC/C,IAEA,KAEF,oCAAC,QAAK,OAAO,MAAM,SAAO,KAAG,GAAO,OACtC,CACF;AAAA,EAEJ;AAEJ;AASA,MAAM,sBAA0D,CAAC;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,YAAY,sBAAsB,YAAY,IAAI;AAExD,SACE,oCAAC,OAAI,eAAc,UAAS,cAAc,KACxC,oCAAC,WACC,oCAAC,QAAK,OAAO,YAAY,MAAM,UAAU,MAAM,QAC5C,YAAY,YAAO,IACtB,GACA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,YAAY,UAAU,MAAM,UAAU,MAAM;AAAA,MACnD,MAAM;AAAA;AAAA,IAEL,YAAY,UAAU,YAAO;AAAA,IAC7B,YAAY;AAAA,EACf,GACC,CAAC,YAAY,WAAW,oCAAC,QAAK,OAAO,MAAM,WAAS,aAAW,CAClE,GAEA,oCAAC,OAAI,YAAY,GAAG,eAAc,YAC/B,YAAY,SAAS,UAAU,eAC9B,oCAAC,QAAK,UAAQ,QAAE,YAAY,SAAS,SAAS,WAAY,GAG5D,oCAAC,WACC,oCAAC,QAAK,UAAQ,QAAE,YAAY,SAAS,QAAQ,QAAO,YAAU,GAC7D,YAAY,KAAK,oCAAC,QAAK,UAAQ,QAAC,UAAI,WAAU,YAAU,GACzD,oCAAC,QAAK,UAAQ,QACX,KAAI,iBACM,cAAc,YAAY,WAAW,CAClD,CACF,GAEA,oCAAC,QAAK,UAAQ,QAAC,YACJ,sBAAsB,YAAY,MAAM,CACnD,CACF,CACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -9,7 +9,9 @@ const MarketplaceSelector = ({
9
9
  onBack
10
10
  }) => {
11
11
  const theme = getTheme();
12
- const [marketplaceStats, setMarketplaceStats] = useState([]);
12
+ const [marketplaceStats, setMarketplaceStats] = useState(
13
+ []
14
+ );
13
15
  const [loading, setLoading] = useState(true);
14
16
  const [error, setError] = useState(null);
15
17
  useEffect(() => {
@@ -21,7 +23,9 @@ const MarketplaceSelector = ({
21
23
  setError(null);
22
24
  const marketplaces = listMarketplaces();
23
25
  if (marketplaces.length === 0) {
24
- setError('No marketplaces registered. Use "minto plugin add-marketplace <source>" to add one.');
26
+ setError(
27
+ 'No marketplaces registered. Use "minto plugin add-marketplace <source>" to add one.'
28
+ );
25
29
  setLoading(false);
26
30
  return;
27
31
  }
@@ -101,7 +105,7 @@ const MarketplaceSelector = ({
101
105
  paddingY: 1
102
106
  },
103
107
  /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Select Plugin Marketplace"),
104
- /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, marketplaceStats.map((stat) => /* @__PURE__ */ React.createElement(Box, { key: stat.name, flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.success }, stat.name)), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, stat.availableCount, " plugins available \xB7 ", stat.installedCount, " already installed \xB7 ", stat.source))))),
108
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, marketplaceStats.map((stat) => /* @__PURE__ */ React.createElement(Box, { key: stat.name, flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.success }, stat.name)), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, stat.availableCount, " plugins available \xB7 ", stat.installedCount, " ", "already installed \xB7 ", stat.source))))),
105
109
  /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(
106
110
  Select,
107
111
  {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/plugin/MarketplaceSelector.tsx"],
4
- "sourcesContent": ["/**\n * Marketplace Selector Component\n *\n * Displays registered marketplace list with statistics\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport { Select } from '@components/CustomSelect/select'\nimport { Option } from '@inkjs/ui'\nimport { getTheme } from '@utils/theme'\nimport { listMarketplaces, getMarketplace } from '@utils/marketplaceManager'\nimport { loadAllPlugins } from '@utils/pluginLoader'\nimport { RegisteredMarketplace } from '../../types/marketplace'\nimport { NavigationProps, MarketplaceStats } from './types'\n\nexport const MarketplaceSelector: React.FC<NavigationProps> = ({\n onNavigate,\n onBack,\n}) => {\n const theme = getTheme()\n const [marketplaceStats, setMarketplaceStats] = useState<MarketplaceStats[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n loadMarketplaceData()\n }, [])\n\n const loadMarketplaceData = async () => {\n try {\n setLoading(true)\n setError(null)\n\n // Load marketplace list\n const marketplaces = listMarketplaces()\n\n if (marketplaces.length === 0) {\n setError('No marketplaces registered. Use \"minto plugin add-marketplace <source>\" to add one.')\n setLoading(false)\n return\n }\n\n // Load all installed plugins to calculate stats\n const installedPlugins = loadAllPlugins()\n\n // Calculate stats for each marketplace\n const stats = marketplaces.map((marketplace) => {\n const availableCount = marketplace.manifest.plugins.length\n const installedCount = installedPlugins.filter(\n (plugin) =>\n plugin.source.type === 'marketplace' &&\n 'marketplace' in plugin.source &&\n plugin.source.marketplace === marketplace.name\n ).length\n\n // Get source path display\n let sourcePath = ''\n if (marketplace.source.type === 'github') {\n sourcePath = marketplace.source.repo\n } else if (marketplace.source.type === 'url') {\n sourcePath = marketplace.source.url\n } else if (marketplace.source.type === 'local') {\n sourcePath = marketplace.source.path\n }\n\n return {\n name: marketplace.name,\n source: sourcePath,\n availableCount,\n installedCount,\n }\n })\n\n setMarketplaceStats(stats)\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setLoading(false)\n }\n }\n\n const handleSelectMarketplace = (value: string) => {\n onNavigate({\n screen: 'plugin-browser',\n marketplace: value,\n })\n }\n\n if (loading) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.primary}>Loading marketplaces...</Text>\n </Box>\n )\n }\n\n if (error) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.error}>Error</Text>\n <Text>{error}</Text>\n <Box marginTop={1}>\n <Text dimColor>Press Esc to go back</Text>\n </Box>\n </Box>\n )\n }\n\n // Build options for Select component\n const options: Option[] = marketplaceStats.map((stat) => ({\n label: stat.name,\n value: stat.name,\n }))\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 color={theme.primary}>\n Select Plugin Marketplace\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n {marketplaceStats.map((stat) => (\n <Box key={stat.name} flexDirection=\"column\" marginBottom={1}>\n <Text>\n <Text bold color={theme.success}>\n {stat.name}\n </Text>\n </Text>\n <Box marginLeft={2}>\n <Text dimColor>\n {stat.availableCount} plugins available \u00B7 {stat.installedCount} already installed \u00B7 {stat.source}\n </Text>\n </Box>\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <Select\n options={options}\n onChange={handleSelectMarketplace}\n visibleOptionCount={Math.min(options.length, 10)}\n />\n </Box>\n\n <Box marginTop={1}>\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 * Marketplace Selector Component\n *\n * Displays registered marketplace list with statistics\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport { Select } from '@components/CustomSelect/select'\nimport { Option } from '@inkjs/ui'\nimport { getTheme } from '@utils/theme'\nimport { listMarketplaces, getMarketplace } from '@utils/marketplaceManager'\nimport { loadAllPlugins } from '@utils/pluginLoader'\nimport { RegisteredMarketplace } from '../../types/marketplace'\nimport { NavigationProps, MarketplaceStats } from './types'\n\nexport const MarketplaceSelector: React.FC<NavigationProps> = ({\n onNavigate,\n onBack,\n}) => {\n const theme = getTheme()\n const [marketplaceStats, setMarketplaceStats] = useState<MarketplaceStats[]>(\n [],\n )\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n loadMarketplaceData()\n }, [])\n\n const loadMarketplaceData = async () => {\n try {\n setLoading(true)\n setError(null)\n\n // Load marketplace list\n const marketplaces = listMarketplaces()\n\n if (marketplaces.length === 0) {\n setError(\n 'No marketplaces registered. Use \"minto plugin add-marketplace <source>\" to add one.',\n )\n setLoading(false)\n return\n }\n\n // Load all installed plugins to calculate stats\n const installedPlugins = loadAllPlugins()\n\n // Calculate stats for each marketplace\n const stats = marketplaces.map(marketplace => {\n const availableCount = marketplace.manifest.plugins.length\n const installedCount = installedPlugins.filter(\n plugin =>\n plugin.source.type === 'marketplace' &&\n 'marketplace' in plugin.source &&\n plugin.source.marketplace === marketplace.name,\n ).length\n\n // Get source path display\n let sourcePath = ''\n if (marketplace.source.type === 'github') {\n sourcePath = marketplace.source.repo\n } else if (marketplace.source.type === 'url') {\n sourcePath = marketplace.source.url\n } else if (marketplace.source.type === 'local') {\n sourcePath = marketplace.source.path\n }\n\n return {\n name: marketplace.name,\n source: sourcePath,\n availableCount,\n installedCount,\n }\n })\n\n setMarketplaceStats(stats)\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setLoading(false)\n }\n }\n\n const handleSelectMarketplace = (value: string) => {\n onNavigate({\n screen: 'plugin-browser',\n marketplace: value,\n })\n }\n\n if (loading) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.primary}>Loading marketplaces...</Text>\n </Box>\n )\n }\n\n if (error) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.error}>Error</Text>\n <Text>{error}</Text>\n <Box marginTop={1}>\n <Text dimColor>Press Esc to go back</Text>\n </Box>\n </Box>\n )\n }\n\n // Build options for Select component\n const options: Option[] = marketplaceStats.map(stat => ({\n label: stat.name,\n value: stat.name,\n }))\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 color={theme.primary}>\n Select Plugin Marketplace\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n {marketplaceStats.map(stat => (\n <Box key={stat.name} flexDirection=\"column\" marginBottom={1}>\n <Text>\n <Text bold color={theme.success}>\n {stat.name}\n </Text>\n </Text>\n <Box marginLeft={2}>\n <Text dimColor>\n {stat.availableCount} plugins available \u00B7 {stat.installedCount}{' '}\n already installed \u00B7 {stat.source}\n </Text>\n </Box>\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <Select\n options={options}\n onChange={handleSelectMarketplace}\n visibleOptionCount={Math.min(options.length, 10)}\n />\n </Box>\n\n <Box marginTop={1}>\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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",
6
6
  "names": []
7
7
  }
@@ -1,14 +1,28 @@
1
1
  import React from "react";
2
2
  import { Box, Text, useInput } from "ink";
3
3
  import { getTheme } from "../../utils/theme.js";
4
- const PlaceholderScreen = ({ state, onBack }) => {
4
+ const PlaceholderScreen = ({
5
+ state,
6
+ onBack
7
+ }) => {
5
8
  const theme = getTheme();
6
9
  useInput((input, key) => {
7
10
  if (key.escape) {
8
11
  onBack();
9
12
  }
10
13
  });
11
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.primary, padding: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Placeholder: ", state.screen)), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "This screen is under construction."), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Screen state: ", JSON.stringify(state, null, 2))), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Esc to go back")));
14
+ return /* @__PURE__ */ React.createElement(
15
+ Box,
16
+ {
17
+ flexDirection: "column",
18
+ borderStyle: "round",
19
+ borderColor: theme.primary,
20
+ padding: 1
21
+ },
22
+ /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Placeholder: ", state.screen)),
23
+ /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "This screen is under construction."), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Screen state: ", JSON.stringify(state, null, 2))),
24
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Esc to go back"))
25
+ );
12
26
  };
13
27
  export {
14
28
  PlaceholderScreen
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/plugin/PlaceholderScreen.tsx"],
4
- "sourcesContent": ["/**\n * Placeholder Screen Component\n *\n * Temporary component used for screens not yet implemented.\n * Displays the screen name and provides navigation back.\n */\n\nimport React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport type { NavigationProps, PluginUIState } from './types'\n\ninterface PlaceholderScreenProps extends NavigationProps {\n state: PluginUIState\n}\n\nexport const PlaceholderScreen: React.FC<PlaceholderScreenProps> = ({ state, onBack }) => {\n const theme = getTheme()\n\n useInput((input, key) => {\n if (key.escape) {\n onBack()\n }\n })\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.primary} padding={1}>\n <Box marginBottom={1}>\n <Text bold color={theme.primary}>Placeholder: {state.screen}</Text>\n </Box>\n\n <Box flexDirection=\"column\" marginY={1}>\n <Text dimColor>This screen is under construction.</Text>\n <Text dimColor>Screen state: {JSON.stringify(state, null, 2)}</Text>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>Esc to go back</Text>\n </Box>\n </Box>\n )\n}\n"],
5
- "mappings": "AAOA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AAOlB,MAAM,oBAAsD,CAAC,EAAE,OAAO,OAAO,MAAM;AACxF,QAAM,QAAQ,SAAS;AAEvB,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,SACE,oCAAC,OAAI,eAAc,UAAS,aAAY,SAAQ,aAAa,MAAM,SAAS,SAAS,KACnF,oCAAC,OAAI,cAAc,KACjB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,iBAAc,MAAM,MAAO,CAC9D,GAEA,oCAAC,OAAI,eAAc,UAAS,SAAS,KACnC,oCAAC,QAAK,UAAQ,QAAC,oCAAkC,GACjD,oCAAC,QAAK,UAAQ,QAAC,kBAAe,KAAK,UAAU,OAAO,MAAM,CAAC,CAAE,CAC/D,GAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,gBAAc,CAC/B,CACF;AAEJ;",
4
+ "sourcesContent": ["/**\n * Placeholder Screen Component\n *\n * Temporary component used for screens not yet implemented.\n * Displays the screen name and provides navigation back.\n */\n\nimport React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport type { NavigationProps, PluginUIState } from './types'\n\ninterface PlaceholderScreenProps extends NavigationProps {\n state: PluginUIState\n}\n\nexport const PlaceholderScreen: React.FC<PlaceholderScreenProps> = ({\n state,\n onBack,\n}) => {\n const theme = getTheme()\n\n useInput((input, key) => {\n if (key.escape) {\n onBack()\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Box marginBottom={1}>\n <Text bold color={theme.primary}>\n Placeholder: {state.screen}\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginY={1}>\n <Text dimColor>This screen is under construction.</Text>\n <Text dimColor>Screen state: {JSON.stringify(state, null, 2)}</Text>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>Esc to go back</Text>\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "AAOA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AAOlB,MAAM,oBAAsD,CAAC;AAAA,EAClE;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,SAAS;AAEvB,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,aAAO;AAAA,IACT;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,OAAI,cAAc,KACjB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,iBACjB,MAAM,MACtB,CACF;AAAA,IAEA,oCAAC,OAAI,eAAc,UAAS,SAAS,KACnC,oCAAC,QAAK,UAAQ,QAAC,oCAAkC,GACjD,oCAAC,QAAK,UAAQ,QAAC,kBAAe,KAAK,UAAU,OAAO,MAAM,CAAC,CAAE,CAC/D;AAAA,IAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,gBAAc,CAC/B;AAAA,EACF;AAEJ;",
6
6
  "names": []
7
7
  }