@within-7/minto 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. package/dist/commands/agents/AgentsCommand.js +22 -24
  2. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  3. package/dist/commands/context.js +2 -1
  4. package/dist/commands/context.js.map +2 -2
  5. package/dist/commands/export.js +2 -1
  6. package/dist/commands/export.js.map +2 -2
  7. package/dist/commands/mcp-interactive.js +7 -6
  8. package/dist/commands/mcp-interactive.js.map +2 -2
  9. package/dist/commands/model.js +3 -2
  10. package/dist/commands/model.js.map +2 -2
  11. package/dist/commands/permissions.js +4 -3
  12. package/dist/commands/permissions.js.map +2 -2
  13. package/dist/commands/plugin/AddMarketplaceForm.js +3 -2
  14. package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
  15. package/dist/commands/plugin/ConfirmDialog.js +2 -1
  16. package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
  17. package/dist/commands/plugin/ErrorView.js +2 -1
  18. package/dist/commands/plugin/ErrorView.js.map +2 -2
  19. package/dist/commands/plugin/InstalledPluginsByMarketplace.js +5 -4
  20. package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
  21. package/dist/commands/plugin/InstalledPluginsManager.js +5 -4
  22. package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
  23. package/dist/commands/plugin/MainMenu.js +2 -1
  24. package/dist/commands/plugin/MainMenu.js.map +2 -2
  25. package/dist/commands/plugin/MarketplaceManager.js +5 -4
  26. package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
  27. package/dist/commands/plugin/MarketplaceSelector.js +4 -3
  28. package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
  29. package/dist/commands/plugin/PlaceholderScreen.js +3 -2
  30. package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
  31. package/dist/commands/plugin/PluginBrowser.js +6 -5
  32. package/dist/commands/plugin/PluginBrowser.js.map +2 -2
  33. package/dist/commands/plugin/PluginDetailsInstall.js +5 -4
  34. package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
  35. package/dist/commands/plugin/PluginDetailsManage.js +4 -3
  36. package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
  37. package/dist/commands/plugin.js +16 -15
  38. package/dist/commands/plugin.js.map +2 -2
  39. package/dist/commands/sandbox.js +4 -3
  40. package/dist/commands/sandbox.js.map +2 -2
  41. package/dist/commands/setup.js +2 -1
  42. package/dist/commands/setup.js.map +2 -2
  43. package/dist/commands/status.js +2 -1
  44. package/dist/commands/status.js.map +2 -2
  45. package/dist/commands/undo.js +245 -0
  46. package/dist/commands/undo.js.map +7 -0
  47. package/dist/commands.js +2 -0
  48. package/dist/commands.js.map +2 -2
  49. package/dist/components/AgentThinkingBlock.js +1 -1
  50. package/dist/components/AgentThinkingBlock.js.map +2 -2
  51. package/dist/components/AsciiLogo.js +7 -8
  52. package/dist/components/AsciiLogo.js.map +2 -2
  53. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
  54. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
  55. package/dist/components/AskUserQuestionDialog/QuestionView.js +2 -1
  56. package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
  57. package/dist/components/CollapsibleHint.js +2 -1
  58. package/dist/components/CollapsibleHint.js.map +2 -2
  59. package/dist/components/Config.js +3 -2
  60. package/dist/components/Config.js.map +2 -2
  61. package/dist/components/ConsoleOAuthFlow.js +2 -1
  62. package/dist/components/ConsoleOAuthFlow.js.map +2 -2
  63. package/dist/components/Cost.js +2 -1
  64. package/dist/components/Cost.js.map +2 -2
  65. package/dist/components/HeaderBar.js +13 -8
  66. package/dist/components/HeaderBar.js.map +2 -2
  67. package/dist/components/HistorySearchOverlay.js +4 -3
  68. package/dist/components/HistorySearchOverlay.js.map +2 -2
  69. package/dist/components/HotkeyHelpPanel.js +8 -11
  70. package/dist/components/HotkeyHelpPanel.js.map +2 -2
  71. package/dist/components/InvalidConfigDialog.js +2 -1
  72. package/dist/components/InvalidConfigDialog.js.map +2 -2
  73. package/dist/components/Logo.js +23 -67
  74. package/dist/components/Logo.js.map +2 -2
  75. package/dist/components/MCPServerApprovalDialog.js +2 -1
  76. package/dist/components/MCPServerApprovalDialog.js.map +2 -2
  77. package/dist/components/MCPServerDialogCopy.js +2 -1
  78. package/dist/components/MCPServerDialogCopy.js.map +2 -2
  79. package/dist/components/MCPServerMultiselectDialog.js +2 -1
  80. package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
  81. package/dist/components/MessageSelector.js +4 -3
  82. package/dist/components/MessageSelector.js.map +2 -2
  83. package/dist/components/ModeIndicator.js +2 -1
  84. package/dist/components/ModeIndicator.js.map +2 -2
  85. package/dist/components/ModelConfig.js +4 -3
  86. package/dist/components/ModelConfig.js.map +2 -2
  87. package/dist/components/ModelListManager.js +4 -3
  88. package/dist/components/ModelListManager.js.map +2 -2
  89. package/dist/components/ModelSelector/ModelSelector.js +26 -13
  90. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  91. package/dist/components/Onboarding.js +3 -2
  92. package/dist/components/Onboarding.js.map +2 -2
  93. package/dist/components/OperationSummary.js +130 -0
  94. package/dist/components/OperationSummary.js.map +7 -0
  95. package/dist/components/PromptInput.js +88 -75
  96. package/dist/components/PromptInput.js.map +2 -2
  97. package/dist/components/SensitiveFileWarning.js +31 -0
  98. package/dist/components/SensitiveFileWarning.js.map +7 -0
  99. package/dist/components/Spinner.js +71 -22
  100. package/dist/components/Spinner.js.map +2 -2
  101. package/dist/components/StructuredDiff.js +6 -8
  102. package/dist/components/StructuredDiff.js.map +2 -2
  103. package/dist/components/SubagentBlock.js +4 -2
  104. package/dist/components/SubagentBlock.js.map +2 -2
  105. package/dist/components/SubagentProgress.js +7 -4
  106. package/dist/components/SubagentProgress.js.map +2 -2
  107. package/dist/components/TaskCard.js +14 -11
  108. package/dist/components/TaskCard.js.map +2 -2
  109. package/dist/components/TextInput.js +9 -1
  110. package/dist/components/TextInput.js.map +2 -2
  111. package/dist/components/TodoPanel.js +44 -26
  112. package/dist/components/TodoPanel.js.map +2 -2
  113. package/dist/components/ToolUseLoader.js +2 -2
  114. package/dist/components/ToolUseLoader.js.map +2 -2
  115. package/dist/components/TreeConnector.js +4 -3
  116. package/dist/components/TreeConnector.js.map +2 -2
  117. package/dist/components/TrustDialog.js +2 -1
  118. package/dist/components/TrustDialog.js.map +2 -2
  119. package/dist/components/binary-feedback/BinaryFeedbackView.js +2 -1
  120. package/dist/components/binary-feedback/BinaryFeedbackView.js.map +2 -2
  121. package/dist/components/messages/AssistantTextMessage.js +17 -9
  122. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  123. package/dist/components/messages/AssistantToolUseMessage.js +8 -4
  124. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  125. package/dist/components/messages/GroupRenderer.js +2 -1
  126. package/dist/components/messages/GroupRenderer.js.map +2 -2
  127. package/dist/components/messages/NestedTasksPreview.js +13 -1
  128. package/dist/components/messages/NestedTasksPreview.js.map +2 -2
  129. package/dist/components/messages/ParallelTasksGroupView.js +4 -3
  130. package/dist/components/messages/ParallelTasksGroupView.js.map +2 -2
  131. package/dist/components/messages/TaskInModuleView.js +35 -15
  132. package/dist/components/messages/TaskInModuleView.js.map +2 -2
  133. package/dist/components/messages/TaskOutputContent.js +9 -6
  134. package/dist/components/messages/TaskOutputContent.js.map +2 -2
  135. package/dist/components/messages/UserPromptMessage.js +2 -2
  136. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  137. package/dist/constants/colors.js +90 -72
  138. package/dist/constants/colors.js.map +2 -2
  139. package/dist/constants/toolInputExamples.js +84 -0
  140. package/dist/constants/toolInputExamples.js.map +7 -0
  141. package/dist/core/backupManager.js +321 -0
  142. package/dist/core/backupManager.js.map +7 -0
  143. package/dist/core/costTracker.js +9 -18
  144. package/dist/core/costTracker.js.map +2 -2
  145. package/dist/core/gitAutoCommit.js +287 -0
  146. package/dist/core/gitAutoCommit.js.map +7 -0
  147. package/dist/core/index.js +3 -0
  148. package/dist/core/index.js.map +2 -2
  149. package/dist/core/operationTracker.js +212 -0
  150. package/dist/core/operationTracker.js.map +7 -0
  151. package/dist/core/permissions/rules/allowedToolsRule.js +1 -1
  152. package/dist/core/permissions/rules/allowedToolsRule.js.map +2 -2
  153. package/dist/core/permissions/rules/autoEscalationRule.js +5 -0
  154. package/dist/core/permissions/rules/autoEscalationRule.js.map +2 -2
  155. package/dist/core/permissions/rules/projectBoundaryRule.js +5 -0
  156. package/dist/core/permissions/rules/projectBoundaryRule.js.map +2 -2
  157. package/dist/core/permissions/rules/sensitivePathsRule.js +5 -0
  158. package/dist/core/permissions/rules/sensitivePathsRule.js.map +2 -2
  159. package/dist/core/tokenStats.js +9 -0
  160. package/dist/core/tokenStats.js.map +7 -0
  161. package/dist/core/tokenStatsManager.js +331 -0
  162. package/dist/core/tokenStatsManager.js.map +7 -0
  163. package/dist/entrypoints/cli.js +115 -87
  164. package/dist/entrypoints/cli.js.map +2 -2
  165. package/dist/hooks/useAgentTokenStats.js +72 -0
  166. package/dist/hooks/useAgentTokenStats.js.map +7 -0
  167. package/dist/hooks/useAgentTranscripts.js +30 -6
  168. package/dist/hooks/useAgentTranscripts.js.map +2 -2
  169. package/dist/hooks/useLogMessages.js +12 -1
  170. package/dist/hooks/useLogMessages.js.map +2 -2
  171. package/dist/i18n/locales/en.js +6 -5
  172. package/dist/i18n/locales/en.js.map +2 -2
  173. package/dist/i18n/locales/zh-CN.js +6 -5
  174. package/dist/i18n/locales/zh-CN.js.map +2 -2
  175. package/dist/i18n/types.js.map +1 -1
  176. package/dist/permissions.js +28 -1
  177. package/dist/permissions.js.map +2 -2
  178. package/dist/query.js +78 -4
  179. package/dist/query.js.map +3 -3
  180. package/dist/screens/REPL.js +23 -3
  181. package/dist/screens/REPL.js.map +2 -2
  182. package/dist/services/claude.js +54 -3
  183. package/dist/services/claude.js.map +2 -2
  184. package/dist/services/intelligentCompactor.js +1 -1
  185. package/dist/services/intelligentCompactor.js.map +2 -2
  186. package/dist/services/mcpClient.js +81 -25
  187. package/dist/services/mcpClient.js.map +2 -2
  188. package/dist/services/sandbox/filesystemBoundary.js +58 -17
  189. package/dist/services/sandbox/filesystemBoundary.js.map +2 -2
  190. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +3 -2
  191. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  192. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +2 -1
  193. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  194. package/dist/tools/BashTool/BashTool.js +22 -3
  195. package/dist/tools/BashTool/BashTool.js.map +2 -2
  196. package/dist/tools/BashTool/prompt.js +178 -34
  197. package/dist/tools/BashTool/prompt.js.map +2 -2
  198. package/dist/tools/FileEditTool/prompt.js +6 -3
  199. package/dist/tools/FileEditTool/prompt.js.map +2 -2
  200. package/dist/tools/FileWriteTool/prompt.js +4 -2
  201. package/dist/tools/FileWriteTool/prompt.js.map +2 -2
  202. package/dist/tools/MultiEditTool/prompt.js +5 -3
  203. package/dist/tools/MultiEditTool/prompt.js.map +2 -2
  204. package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -1
  205. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  206. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +3 -2
  207. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
  208. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +3 -2
  209. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
  210. package/dist/tools/PlanModeTool/prompt.js +1 -1
  211. package/dist/tools/PlanModeTool/prompt.js.map +1 -1
  212. package/dist/tools/SkillTool/SkillTool.js +4 -3
  213. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  214. package/dist/tools/SkillTool/prompt.js +1 -1
  215. package/dist/tools/SkillTool/prompt.js.map +1 -1
  216. package/dist/tools/TaskOutputTool/TaskOutputTool.js +3 -2
  217. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +2 -2
  218. package/dist/tools/TaskTool/TaskTool.js +8 -0
  219. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  220. package/dist/utils/CircuitBreaker.js +242 -0
  221. package/dist/utils/CircuitBreaker.js.map +7 -0
  222. package/dist/utils/ask.js +2 -0
  223. package/dist/utils/ask.js.map +2 -2
  224. package/dist/utils/config.js +47 -5
  225. package/dist/utils/config.js.map +2 -2
  226. package/dist/utils/credentials/CredentialStore.js +1 -0
  227. package/dist/utils/credentials/CredentialStore.js.map +7 -0
  228. package/dist/utils/credentials/EncryptedFileStore.js +157 -0
  229. package/dist/utils/credentials/EncryptedFileStore.js.map +7 -0
  230. package/dist/utils/credentials/index.js +37 -0
  231. package/dist/utils/credentials/index.js.map +7 -0
  232. package/dist/utils/credentials/migration.js +82 -0
  233. package/dist/utils/credentials/migration.js.map +7 -0
  234. package/dist/utils/markdown.js +13 -1
  235. package/dist/utils/markdown.js.map +2 -2
  236. package/dist/utils/permissions/filesystem.js +5 -1
  237. package/dist/utils/permissions/filesystem.js.map +2 -2
  238. package/dist/utils/safePath.js +132 -0
  239. package/dist/utils/safePath.js.map +7 -0
  240. package/dist/utils/sensitiveFiles.js +125 -0
  241. package/dist/utils/sensitiveFiles.js.map +7 -0
  242. package/dist/utils/taskDisplayUtils.js +9 -9
  243. package/dist/utils/taskDisplayUtils.js.map +2 -2
  244. package/dist/utils/theme.js +6 -6
  245. package/dist/utils/theme.js.map +1 -1
  246. package/dist/utils/toolRiskClassification.js +207 -0
  247. package/dist/utils/toolRiskClassification.js.map +7 -0
  248. package/dist/utils/tooling/safeRender.js +5 -4
  249. package/dist/utils/tooling/safeRender.js.map +2 -2
  250. package/dist/version.js +2 -2
  251. package/dist/version.js.map +1 -1
  252. package/package.json +9 -7
  253. package/dist/hooks/useCancelRequest.js +0 -31
  254. package/dist/hooks/useCancelRequest.js.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/plugin/ConfirmDialog.tsx"],
4
- "sourcesContent": ["/**\n * ConfirmDialog Component\n *\n * Reusable confirmation dialog for marketplace operations\n */\n\nimport React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\n\nexport interface ConfirmDialogProps {\n title: string\n message: string\n onConfirm: () => void\n onCancel: () => void\n confirmColor?: string\n confirmText?: string\n cancelText?: string\n}\n\nexport const ConfirmDialog: React.FC<ConfirmDialogProps> = ({\n title,\n message,\n onConfirm,\n onCancel,\n confirmColor,\n confirmText = 'Yes',\n cancelText = 'No',\n}) => {\n const theme = getTheme()\n const [focused, setFocused] = React.useState<'confirm' | 'cancel'>('cancel')\n\n useInput((input, key) => {\n if (key.escape) {\n onCancel()\n } else if (key.return) {\n if (focused === 'confirm') {\n onConfirm()\n } else {\n onCancel()\n }\n } else if (key.leftArrow) {\n setFocused(focused === 'confirm' ? 'cancel' : 'confirm')\n } else if (key.rightArrow) {\n setFocused(focused === 'confirm' ? 'cancel' : 'confirm')\n } else if (input === 'y' || input === 'Y') {\n onConfirm()\n } else if (input === 'n' || input === 'N') {\n onCancel()\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.warning}\n padding={1}\n >\n <Text bold color={theme.warning}>\n {title}\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n {message.split('\\n').map((line, idx) => {\n // Handle React Text component which doesn't accept key prop in its type definition\n // but we need unique keys for list rendering\n return <Text {...({ key: `line-${idx}` } as any)}>{line}</Text>\n })}\n </Box>\n\n <Box marginTop={1} gap={2}>\n <Box\n borderStyle={focused === 'confirm' ? 'round' : 'single'}\n borderColor={\n focused === 'confirm'\n ? confirmColor || theme.success\n : theme.secondaryText\n }\n paddingX={2}\n >\n <Text\n color={\n focused === 'confirm'\n ? confirmColor || theme.success\n : theme.secondaryText\n }\n bold={focused === 'confirm'}\n >\n {confirmText}\n </Text>\n </Box>\n\n <Box\n borderStyle={focused === 'cancel' ? 'round' : 'single'}\n borderColor={\n focused === 'cancel' ? theme.primary : theme.secondaryText\n }\n paddingX={2}\n >\n <Text\n color={focused === 'cancel' ? theme.primary : theme.secondaryText}\n bold={focused === 'cancel'}\n >\n {cancelText}\n </Text>\n </Box>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n \u2190 \u2192 navigate \u00B7 <Text color={theme.success}>Enter</Text> confirm \u00B7{' '}\n <Text color={theme.error}>Esc</Text> cancel\n </Text>\n </Box>\n </Box>\n )\n}\n"],
5
- "mappings": "AAMA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AAYlB,MAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,aAAa;AACf,MAAM;AACJ,QAAM,QAAQ,SAAS;AACvB,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAA+B,QAAQ;AAE3E,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,eAAS;AAAA,IACX,WAAW,IAAI,QAAQ;AACrB,UAAI,YAAY,WAAW;AACzB,kBAAU;AAAA,MACZ,OAAO;AACL,iBAAS;AAAA,MACX;AAAA,IACF,WAAW,IAAI,WAAW;AACxB,iBAAW,YAAY,YAAY,WAAW,SAAS;AAAA,IACzD,WAAW,IAAI,YAAY;AACzB,iBAAW,YAAY,YAAY,WAAW,SAAS;AAAA,IACzD,WAAW,UAAU,OAAO,UAAU,KAAK;AACzC,gBAAU;AAAA,IACZ,WAAW,UAAU,OAAO,UAAU,KAAK;AACzC,eAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,SAAS;AAAA;AAAA,IAET,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WACrB,KACH;AAAA,IAEA,oCAAC,OAAI,WAAW,GAAG,eAAc,YAC9B,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,QAAQ;AAGtC,aAAO,oCAAC,QAAM,GAAI,EAAE,KAAK,QAAQ,GAAG,GAAG,KAAY,IAAK;AAAA,IAC1D,CAAC,CACH;AAAA,IAEA,oCAAC,OAAI,WAAW,GAAG,KAAK,KACtB;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,YAAY,YAAY,UAAU;AAAA,QAC/C,aACE,YAAY,YACR,gBAAgB,MAAM,UACtB,MAAM;AAAA,QAEZ,UAAU;AAAA;AAAA,MAEV;AAAA,QAAC;AAAA;AAAA,UACC,OACE,YAAY,YACR,gBAAgB,MAAM,UACtB,MAAM;AAAA,UAEZ,MAAM,YAAY;AAAA;AAAA,QAEjB;AAAA,MACH;AAAA,IACF,GAEA;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,YAAY,WAAW,UAAU;AAAA,QAC9C,aACE,YAAY,WAAW,MAAM,UAAU,MAAM;AAAA,QAE/C,UAAU;AAAA;AAAA,MAEV;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,YAAY,WAAW,MAAM,UAAU,MAAM;AAAA,UACpD,MAAM,YAAY;AAAA;AAAA,QAEjB;AAAA,MACH;AAAA,IACF,CACF;AAAA,IAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,gCACE,oCAAC,QAAK,OAAO,MAAM,WAAS,OAAK,GAAO,iBAAW,KAClE,oCAAC,QAAK,OAAO,MAAM,SAAO,KAAG,GAAO,SACtC,CACF;AAAA,EACF;AAEJ;",
4
+ "sourcesContent": ["/**\n * ConfirmDialog Component\n *\n * Reusable confirmation dialog for marketplace operations\n */\n\nimport React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\nexport interface ConfirmDialogProps {\n title: string\n message: string\n onConfirm: () => void\n onCancel: () => void\n confirmColor?: string\n confirmText?: string\n cancelText?: string\n}\n\nexport const ConfirmDialog: React.FC<ConfirmDialogProps> = ({\n title,\n message,\n onConfirm,\n onCancel,\n confirmColor,\n confirmText = 'Yes',\n cancelText = 'No',\n}) => {\n const theme = getTheme()\n const [focused, setFocused] = React.useState<'confirm' | 'cancel'>('cancel')\n\n useInput((input, key) => {\n if (key.escape) {\n onCancel()\n } else if (key.return) {\n if (focused === 'confirm') {\n onConfirm()\n } else {\n onCancel()\n }\n } else if (key.leftArrow) {\n setFocused(focused === 'confirm' ? 'cancel' : 'confirm')\n } else if (key.rightArrow) {\n setFocused(focused === 'confirm' ? 'cancel' : 'confirm')\n } else if (input === 'y' || input === 'Y') {\n onConfirm()\n } else if (input === 'n' || input === 'N') {\n onCancel()\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.warning}\n padding={1}\n >\n <Text bold color={theme.warning}>\n {title}\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n {message.split('\\n').map((line, idx) => {\n // Handle React Text component which doesn't accept key prop in its type definition\n // but we need unique keys for list rendering\n return <Text {...({ key: `line-${idx}` } as any)}>{line}</Text>\n })}\n </Box>\n\n <Box marginTop={1} gap={2}>\n <Box\n borderStyle={focused === 'confirm' ? 'round' : 'single'}\n borderColor={\n focused === 'confirm'\n ? confirmColor || theme.success\n : theme.secondaryText\n }\n paddingX={2}\n >\n <Text\n color={\n focused === 'confirm'\n ? confirmColor || theme.success\n : theme.secondaryText\n }\n bold={focused === 'confirm'}\n >\n {confirmText}\n </Text>\n </Box>\n\n <Box\n borderStyle={focused === 'cancel' ? 'round' : 'single'}\n borderColor={\n focused === 'cancel' ? theme.primary : theme.secondaryText\n }\n paddingX={2}\n >\n <Text\n color={focused === 'cancel' ? theme.primary : theme.secondaryText}\n bold={focused === 'cancel'}\n >\n {cancelText}\n </Text>\n </Box>\n </Box>\n\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n \u2190 \u2192 navigate \u00B7 <Text color={theme.success}>Enter</Text> confirm \u00B7{' '}\n <Text color={theme.error}>Esc</Text> cancel\n </Text>\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "AAMA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAYzB,MAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,aAAa;AACf,MAAM;AACJ,QAAM,QAAQ,SAAS;AACvB,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAA+B,QAAQ;AAE3E,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,eAAS;AAAA,IACX,WAAW,IAAI,QAAQ;AACrB,UAAI,YAAY,WAAW;AACzB,kBAAU;AAAA,MACZ,OAAO;AACL,iBAAS;AAAA,MACX;AAAA,IACF,WAAW,IAAI,WAAW;AACxB,iBAAW,YAAY,YAAY,WAAW,SAAS;AAAA,IACzD,WAAW,IAAI,YAAY;AACzB,iBAAW,YAAY,YAAY,WAAW,SAAS;AAAA,IACzD,WAAW,UAAU,OAAO,UAAU,KAAK;AACzC,gBAAU;AAAA,IACZ,WAAW,UAAU,OAAO,UAAU,KAAK;AACzC,eAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,SAAS;AAAA;AAAA,IAET,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WACrB,KACH;AAAA,IAEA,oCAAC,OAAI,WAAW,GAAG,eAAc,YAC9B,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,QAAQ;AAGtC,aAAO,oCAAC,QAAM,GAAI,EAAE,KAAK,QAAQ,GAAG,GAAG,KAAY,IAAK;AAAA,IAC1D,CAAC,CACH;AAAA,IAEA,oCAAC,OAAI,WAAW,GAAG,KAAK,KACtB;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,YAAY,YAAY,UAAU;AAAA,QAC/C,aACE,YAAY,YACR,gBAAgB,MAAM,UACtB,MAAM;AAAA,QAEZ,UAAU;AAAA;AAAA,MAEV;AAAA,QAAC;AAAA;AAAA,UACC,OACE,YAAY,YACR,gBAAgB,MAAM,UACtB,MAAM;AAAA,UAEZ,MAAM,YAAY;AAAA;AAAA,QAEjB;AAAA,MACH;AAAA,IACF,GAEA;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,YAAY,WAAW,UAAU;AAAA,QAC9C,aACE,YAAY,WAAW,MAAM,UAAU,MAAM;AAAA,QAE/C,UAAU;AAAA;AAAA,MAEV;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,YAAY,WAAW,MAAM,UAAU,MAAM;AAAA,UACpD,MAAM,YAAY;AAAA;AAAA,QAEjB;AAAA,MACH;AAAA,IACF,CACF;AAAA,IAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAO,gBAAgB,OAAK,gCACjB,oCAAC,QAAK,OAAO,MAAM,WAAS,OAAK,GAAO,iBAAW,KAClE,oCAAC,QAAK,OAAO,MAAM,SAAO,KAAG,GAAO,SACtC,CACF;AAAA,EACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,7 @@
1
1
  import React from "react";
2
2
  import { Box, Text, useInput } from "ink";
3
3
  import { getTheme } from "../../utils/theme.js";
4
+ import { SEMANTIC_COLORS } from "../../constants/colors.js";
4
5
  const ErrorView = ({
5
6
  error,
6
7
  onRetry,
@@ -24,7 +25,7 @@ const ErrorView = ({
24
25
  },
25
26
  /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.error }, "Error"),
26
27
  /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, null, error)),
27
- /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, onRetry && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "r"), " to retry"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Esc"), " to go back"))
28
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, onRetry && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "r"), " to retry"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Esc"), " to go back"))
28
29
  );
29
30
  };
30
31
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/plugin/ErrorView.tsx"],
4
- "sourcesContent": ["import React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\n\nexport interface ErrorViewProps {\n error: string\n onRetry?: () => void\n onBack: () => void\n}\n\nexport const ErrorView: React.FC<ErrorViewProps> = ({\n error,\n onRetry,\n onBack,\n}) => {\n const theme = getTheme()\n\n useInput((input, key) => {\n if (key.escape) {\n onBack()\n } else if (input === 'r' && onRetry) {\n onRetry()\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n padding={1}\n >\n <Text bold color={theme.error}>\n Error\n </Text>\n <Box marginTop={1}>\n <Text>{error}</Text>\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n {onRetry && (\n <Text dimColor>\n Press <Text bold>r</Text> to retry\n </Text>\n )}\n <Text dimColor>\n Press <Text bold>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n )\n}\n"],
5
- "mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AAQlB,MAAM,YAAsC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,SAAS;AAEvB,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,aAAO;AAAA,IACT,WAAW,UAAU,OAAO,SAAS;AACnC,cAAQ;AAAA,IACV;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,SAAS;AAAA;AAAA,IAET,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,SAAO,OAE/B;AAAA,IACA,oCAAC,OAAI,WAAW,KACd,oCAAC,YAAM,KAAM,CACf;AAAA,IACA,oCAAC,OAAI,WAAW,GAAG,eAAc,YAC9B,WACC,oCAAC,QAAK,UAAQ,QAAC,UACP,oCAAC,QAAK,MAAI,QAAC,GAAC,GAAO,WAC3B,GAEF,oCAAC,QAAK,UAAQ,QAAC,UACP,oCAAC,QAAK,MAAI,QAAC,KAAG,GAAO,aAC7B,CACF;AAAA,EACF;AAEJ;",
4
+ "sourcesContent": ["import React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\nexport interface ErrorViewProps {\n error: string\n onRetry?: () => void\n onBack: () => void\n}\n\nexport const ErrorView: React.FC<ErrorViewProps> = ({\n error,\n onRetry,\n onBack,\n}) => {\n const theme = getTheme()\n\n useInput((input, key) => {\n if (key.escape) {\n onBack()\n } else if (input === 'r' && onRetry) {\n onRetry()\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n padding={1}\n >\n <Text bold color={theme.error}>\n Error\n </Text>\n <Box marginTop={1}>\n <Text>{error}</Text>\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n {onRetry && (\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>r</Text> to retry\n </Text>\n )}\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAQzB,MAAM,YAAsC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,SAAS;AAEvB,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,aAAO;AAAA,IACT,WAAW,UAAU,OAAO,SAAS;AACnC,cAAQ;AAAA,IACV;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,SAAS;AAAA;AAAA,IAET,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,SAAO,OAE/B;AAAA,IACA,oCAAC,OAAI,WAAW,KACd,oCAAC,YAAM,KAAM,CACf;AAAA,IACA,oCAAC,OAAI,WAAW,GAAG,eAAc,YAC9B,WACC,oCAAC,QAAK,OAAO,gBAAgB,OAAK,UAC1B,oCAAC,QAAK,MAAI,QAAC,GAAC,GAAO,WAC3B,GAEF,oCAAC,QAAK,OAAO,gBAAgB,OAAK,UAC1B,oCAAC,QAAK,MAAI,QAAC,KAAG,GAAO,aAC7B,CACF;AAAA,EACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -5,6 +5,7 @@ import {
5
5
  togglePluginEnabled,
6
6
  getPlugin
7
7
  } from "../../utils/pluginLoader.js";
8
+ import { SEMANTIC_COLORS } from "../../constants/colors.js";
8
9
  import { getTheme } from "../../utils/theme.js";
9
10
  const InstalledPluginsByMarketplace = ({ marketplace, onNavigate, onBack }) => {
10
11
  const [plugins, setPlugins] = useState([]);
@@ -120,7 +121,7 @@ const InstalledPluginsByMarketplace = ({ marketplace, onNavigate, onBack }) => {
120
121
  }
121
122
  });
122
123
  if (showConfirm && confirmAction === "uninstall") {
123
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.warning }, "Confirm Uninstall Mark"), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, null, 'Mark plugin "', plugins[selectedIndex]?.manifest.name, '" for uninstallation?'), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "This will mark the plugin for removal. Use batch actions to complete."), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Y"), "es /", " ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "N"), "o"));
124
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.warning }, "Confirm Uninstall Mark"), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, null, 'Mark plugin "', plugins[selectedIndex]?.manifest.name, '" for uninstallation?'), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "This will mark the plugin for removal. Use batch actions to complete."), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Y"), "es /", " ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "N"), "o"));
124
125
  }
125
126
  return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, marketplace.name, " \u203A Manage Plugins (", plugins.length, ")"), /* @__PURE__ */ React.createElement(Text, null, ""), plugins.length === 0 ? /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, "No plugins installed from this marketplace")) : plugins.map((plugin, index) => {
126
127
  const isSelected = index === selectedIndex;
@@ -136,14 +137,14 @@ const InstalledPluginsByMarketplace = ({ marketplace, onNavigate, onBack }) => {
136
137
  marginBottom: 1
137
138
  },
138
139
  /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: isSelected ? theme.success : void 0 }, isSelected ? "\u276F " : " ", statusIcon, " ", plugin.manifest.displayName || plugin.manifest.name), marks.length > 0 && /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, " ", marks.join(" "))),
139
- /* @__PURE__ */ React.createElement(Box, { marginLeft: 4 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, plugin.manifest.description, " \xB7 v", plugin.manifest.version)),
140
- isSelected && /* @__PURE__ */ React.createElement(Box, { marginLeft: 4 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Components:", " ", [
140
+ /* @__PURE__ */ React.createElement(Box, { marginLeft: 4 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, plugin.manifest.description, " \xB7 v", plugin.manifest.version)),
141
+ isSelected && /* @__PURE__ */ React.createElement(Box, { marginLeft: 4 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Components:", " ", [
141
142
  plugin.agents.length > 0 && `${plugin.agents.length} agent(s)`,
142
143
  plugin.commands.length > 0 && `${plugin.commands.length} command(s)`,
143
144
  plugin.skills.length > 0 && `${plugin.skills.length} skill(s)`
144
145
  ].filter(Boolean).join(", ") || "none"))
145
146
  );
146
- }), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Space Toggle \xB7 U Mark Update \xB7 D/Del Mark Uninstall"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Enter Details \xB7 Esc Back")));
147
+ }), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Space Toggle \xB7 U Mark Update \xB7 D/Del Mark Uninstall"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Enter Details \xB7 Esc Back")));
147
148
  };
148
149
  export {
149
150
  InstalledPluginsByMarketplace
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/plugin/InstalledPluginsByMarketplace.tsx"],
4
- "sourcesContent": ["/**\n * Installed Plugins By Marketplace\n *\n * Displays all plugins from a specific marketplace with management actions.\n * Supports enable/disable toggle, marking for update/uninstall, and viewing details.\n */\n\nimport React, { useState, useEffect, useCallback } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport {\n loadAllPlugins,\n togglePluginEnabled,\n getPlugin,\n} from '@utils/pluginLoader'\nimport { LoadedPlugin } from '../../types/plugin'\nimport { RegisteredMarketplace } from '../../types/marketplace'\nimport { getTheme } from '@utils/theme'\nimport { NavigationProps } from './types'\n\ninterface InstalledPluginsByMarketplaceProps extends NavigationProps {\n marketplace: RegisteredMarketplace\n}\n\ninterface PluginWithMarks extends LoadedPlugin {\n markedForUpdate?: boolean\n markedForUninstall?: boolean\n}\n\nexport const InstalledPluginsByMarketplace: React.FC<\n InstalledPluginsByMarketplaceProps\n> = ({ marketplace, onNavigate, onBack }) => {\n const [plugins, setPlugins] = useState<PluginWithMarks[]>([])\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [showConfirm, setShowConfirm] = useState(false)\n const [confirmAction, setConfirmAction] = useState<'uninstall' | null>(null)\n const theme = getTheme()\n\n const loadPlugins = useCallback(() => {\n const allPlugins = loadAllPlugins()\n\n // Filter plugins for this marketplace\n const filtered = allPlugins.filter(p => {\n if (marketplace.name === 'local') {\n // Local includes plugins not from any marketplace\n if (p.source.type === 'marketplace') return false\n if (\n p.source.type === 'local' &&\n p.source.path.includes('/.minto/plugins/')\n ) {\n return true\n }\n return p.source.type === 'local'\n } else {\n // Check if from this marketplace\n if (p.source.type === 'marketplace') {\n return p.source.marketplace === marketplace.name\n }\n // Also check location path\n return p.location.includes(marketplace.name)\n }\n })\n\n // Convert to PluginWithMarks format\n const withMarks: PluginWithMarks[] = filtered.map(p => ({\n ...p,\n markedForUpdate: false,\n markedForUninstall: false,\n }))\n\n setPlugins(withMarks)\n }, [marketplace])\n\n useEffect(() => {\n loadPlugins()\n }, [loadPlugins])\n\n const handleToggleEnabled = useCallback(() => {\n if (plugins[selectedIndex]) {\n try {\n const newState = togglePluginEnabled(\n plugins[selectedIndex].manifest.name,\n )\n // Reload plugins to reflect changes\n loadPlugins()\n } catch (error) {\n console.error('Error toggling plugin:', error)\n }\n }\n }, [plugins, selectedIndex, loadPlugins])\n\n const handleMarkUpdate = useCallback(() => {\n if (plugins[selectedIndex]) {\n setPlugins(prev => {\n const updated = [...prev]\n updated[selectedIndex] = {\n ...updated[selectedIndex],\n markedForUpdate: !updated[selectedIndex].markedForUpdate,\n }\n return updated\n })\n }\n }, [plugins, selectedIndex])\n\n const handleMarkUninstall = useCallback(() => {\n if (plugins[selectedIndex]) {\n setShowConfirm(true)\n setConfirmAction('uninstall')\n }\n }, [plugins, selectedIndex])\n\n const handleConfirmUninstall = useCallback(() => {\n if (plugins[selectedIndex]) {\n setPlugins(prev => {\n const updated = [...prev]\n updated[selectedIndex] = {\n ...updated[selectedIndex],\n markedForUninstall: !updated[selectedIndex].markedForUninstall,\n }\n return updated\n })\n }\n setShowConfirm(false)\n setConfirmAction(null)\n }, [plugins, selectedIndex])\n\n const handleViewDetails = useCallback(() => {\n if (plugins[selectedIndex]) {\n const plugin = getPlugin(plugins[selectedIndex].manifest.name)\n if (plugin) {\n onNavigate({\n screen: 'plugin-details-manage',\n plugin,\n })\n }\n }\n }, [plugins, selectedIndex, onNavigate])\n\n useInput((input, key) => {\n if (showConfirm) {\n if (key.return || input === 'y') {\n handleConfirmUninstall()\n } else if (key.escape || input === 'n') {\n setShowConfirm(false)\n setConfirmAction(null)\n }\n return\n }\n\n if (key.escape) {\n onBack()\n } else if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(plugins.length - 1, prev + 1))\n } else if (input === ' ') {\n handleToggleEnabled()\n } else if (input === 'u') {\n handleMarkUpdate()\n } else if (key.delete || input === 'd') {\n handleMarkUninstall()\n } else if (key.return) {\n handleViewDetails()\n }\n })\n\n if (showConfirm && confirmAction === 'uninstall') {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.warning}>\n Confirm Uninstall Mark\n </Text>\n <Text>{''}</Text>\n <Text>\n Mark plugin \"{plugins[selectedIndex]?.manifest.name}\" for\n uninstallation?\n </Text>\n <Text dimColor>\n This will mark the plugin for removal. Use batch actions to complete.\n </Text>\n <Text>{''}</Text>\n <Text>\n <Text color={theme.success}>Y</Text>es /{' '}\n <Text color={theme.error}>N</Text>o\n </Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.primary}>\n {marketplace.name} \u203A Manage Plugins ({plugins.length})\n </Text>\n <Text>{''}</Text>\n\n {plugins.length === 0 ? (\n <Box marginLeft={2}>\n <Text color={theme.warning}>\n No plugins installed from this marketplace\n </Text>\n </Box>\n ) : (\n plugins.map((plugin, index) => {\n const isSelected = index === selectedIndex\n const statusIcon = plugin.enabled ? '\u25CF' : '\u25CB'\n const marks = []\n\n if (plugin.markedForUpdate) marks.push('\u2B06')\n if (plugin.markedForUninstall) marks.push('\u2717')\n\n return (\n <Box\n key={plugin.manifest.name}\n flexDirection=\"column\"\n marginBottom={1}\n >\n <Box>\n <Text color={isSelected ? theme.success : undefined}>\n {isSelected ? '\u276F ' : ' '}\n {statusIcon}{' '}\n {plugin.manifest.displayName || plugin.manifest.name}\n </Text>\n {marks.length > 0 && (\n <Text color={theme.warning}> {marks.join(' ')}</Text>\n )}\n </Box>\n <Box marginLeft={4}>\n <Text dimColor>\n {plugin.manifest.description} \u00B7 v{plugin.manifest.version}\n </Text>\n </Box>\n {isSelected && (\n <Box marginLeft={4}>\n <Text dimColor>\n Components:{' '}\n {[\n plugin.agents.length > 0 &&\n `${plugin.agents.length} agent(s)`,\n plugin.commands.length > 0 &&\n `${plugin.commands.length} command(s)`,\n plugin.skills.length > 0 &&\n `${plugin.skills.length} skill(s)`,\n ]\n .filter(Boolean)\n .join(', ') || 'none'}\n </Text>\n </Box>\n )}\n </Box>\n )\n })\n )}\n\n <Text>{''}</Text>\n <Box marginLeft={2} flexDirection=\"column\">\n <Text dimColor>\n Space Toggle \u00B7 U Mark Update \u00B7 D/Del Mark Uninstall\n </Text>\n <Text dimColor>Enter Details \u00B7 Esc Back</Text>\n </Box>\n </Box>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Installed Plugins By Marketplace\n *\n * Displays all plugins from a specific marketplace with management actions.\n * Supports enable/disable toggle, marking for update/uninstall, and viewing details.\n */\n\nimport React, { useState, useEffect, useCallback } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport {\n loadAllPlugins,\n togglePluginEnabled,\n getPlugin,\n} from '@utils/pluginLoader'\nimport { LoadedPlugin } from '../../types/plugin'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport { RegisteredMarketplace } from '../../types/marketplace'\nimport { getTheme } from '@utils/theme'\nimport { NavigationProps } from './types'\n\ninterface InstalledPluginsByMarketplaceProps extends NavigationProps {\n marketplace: RegisteredMarketplace\n}\n\ninterface PluginWithMarks extends LoadedPlugin {\n markedForUpdate?: boolean\n markedForUninstall?: boolean\n}\n\nexport const InstalledPluginsByMarketplace: React.FC<\n InstalledPluginsByMarketplaceProps\n> = ({ marketplace, onNavigate, onBack }) => {\n const [plugins, setPlugins] = useState<PluginWithMarks[]>([])\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [showConfirm, setShowConfirm] = useState(false)\n const [confirmAction, setConfirmAction] = useState<'uninstall' | null>(null)\n const theme = getTheme()\n\n const loadPlugins = useCallback(() => {\n const allPlugins = loadAllPlugins()\n\n // Filter plugins for this marketplace\n const filtered = allPlugins.filter(p => {\n if (marketplace.name === 'local') {\n // Local includes plugins not from any marketplace\n if (p.source.type === 'marketplace') return false\n if (\n p.source.type === 'local' &&\n p.source.path.includes('/.minto/plugins/')\n ) {\n return true\n }\n return p.source.type === 'local'\n } else {\n // Check if from this marketplace\n if (p.source.type === 'marketplace') {\n return p.source.marketplace === marketplace.name\n }\n // Also check location path\n return p.location.includes(marketplace.name)\n }\n })\n\n // Convert to PluginWithMarks format\n const withMarks: PluginWithMarks[] = filtered.map(p => ({\n ...p,\n markedForUpdate: false,\n markedForUninstall: false,\n }))\n\n setPlugins(withMarks)\n }, [marketplace])\n\n useEffect(() => {\n loadPlugins()\n }, [loadPlugins])\n\n const handleToggleEnabled = useCallback(() => {\n if (plugins[selectedIndex]) {\n try {\n const newState = togglePluginEnabled(\n plugins[selectedIndex].manifest.name,\n )\n // Reload plugins to reflect changes\n loadPlugins()\n } catch (error) {\n console.error('Error toggling plugin:', error)\n }\n }\n }, [plugins, selectedIndex, loadPlugins])\n\n const handleMarkUpdate = useCallback(() => {\n if (plugins[selectedIndex]) {\n setPlugins(prev => {\n const updated = [...prev]\n updated[selectedIndex] = {\n ...updated[selectedIndex],\n markedForUpdate: !updated[selectedIndex].markedForUpdate,\n }\n return updated\n })\n }\n }, [plugins, selectedIndex])\n\n const handleMarkUninstall = useCallback(() => {\n if (plugins[selectedIndex]) {\n setShowConfirm(true)\n setConfirmAction('uninstall')\n }\n }, [plugins, selectedIndex])\n\n const handleConfirmUninstall = useCallback(() => {\n if (plugins[selectedIndex]) {\n setPlugins(prev => {\n const updated = [...prev]\n updated[selectedIndex] = {\n ...updated[selectedIndex],\n markedForUninstall: !updated[selectedIndex].markedForUninstall,\n }\n return updated\n })\n }\n setShowConfirm(false)\n setConfirmAction(null)\n }, [plugins, selectedIndex])\n\n const handleViewDetails = useCallback(() => {\n if (plugins[selectedIndex]) {\n const plugin = getPlugin(plugins[selectedIndex].manifest.name)\n if (plugin) {\n onNavigate({\n screen: 'plugin-details-manage',\n plugin,\n })\n }\n }\n }, [plugins, selectedIndex, onNavigate])\n\n useInput((input, key) => {\n if (showConfirm) {\n if (key.return || input === 'y') {\n handleConfirmUninstall()\n } else if (key.escape || input === 'n') {\n setShowConfirm(false)\n setConfirmAction(null)\n }\n return\n }\n\n if (key.escape) {\n onBack()\n } else if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(plugins.length - 1, prev + 1))\n } else if (input === ' ') {\n handleToggleEnabled()\n } else if (input === 'u') {\n handleMarkUpdate()\n } else if (key.delete || input === 'd') {\n handleMarkUninstall()\n } else if (key.return) {\n handleViewDetails()\n }\n })\n\n if (showConfirm && confirmAction === 'uninstall') {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.warning}>\n Confirm Uninstall Mark\n </Text>\n <Text>{''}</Text>\n <Text>\n Mark plugin \"{plugins[selectedIndex]?.manifest.name}\" for\n uninstallation?\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n This will mark the plugin for removal. Use batch actions to complete.\n </Text>\n <Text>{''}</Text>\n <Text>\n <Text color={theme.success}>Y</Text>es /{' '}\n <Text color={theme.error}>N</Text>o\n </Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.primary}>\n {marketplace.name} \u203A Manage Plugins ({plugins.length})\n </Text>\n <Text>{''}</Text>\n\n {plugins.length === 0 ? (\n <Box marginLeft={2}>\n <Text color={theme.warning}>\n No plugins installed from this marketplace\n </Text>\n </Box>\n ) : (\n plugins.map((plugin, index) => {\n const isSelected = index === selectedIndex\n const statusIcon = plugin.enabled ? '\u25CF' : '\u25CB'\n const marks = []\n\n if (plugin.markedForUpdate) marks.push('\u2B06')\n if (plugin.markedForUninstall) marks.push('\u2717')\n\n return (\n <Box\n key={plugin.manifest.name}\n flexDirection=\"column\"\n marginBottom={1}\n >\n <Box>\n <Text color={isSelected ? theme.success : undefined}>\n {isSelected ? '\u276F ' : ' '}\n {statusIcon}{' '}\n {plugin.manifest.displayName || plugin.manifest.name}\n </Text>\n {marks.length > 0 && (\n <Text color={theme.warning}> {marks.join(' ')}</Text>\n )}\n </Box>\n <Box marginLeft={4}>\n <Text color={SEMANTIC_COLORS.dim}>\n {plugin.manifest.description} \u00B7 v{plugin.manifest.version}\n </Text>\n </Box>\n {isSelected && (\n <Box marginLeft={4}>\n <Text color={SEMANTIC_COLORS.dim}>\n Components:{' '}\n {[\n plugin.agents.length > 0 &&\n `${plugin.agents.length} agent(s)`,\n plugin.commands.length > 0 &&\n `${plugin.commands.length} command(s)`,\n plugin.skills.length > 0 &&\n `${plugin.skills.length} skill(s)`,\n ]\n .filter(Boolean)\n .join(', ') || 'none'}\n </Text>\n </Box>\n )}\n </Box>\n )\n })\n )}\n\n <Text>{''}</Text>\n <Box marginLeft={2} flexDirection=\"column\">\n <Text color={SEMANTIC_COLORS.dim}>\n Space Toggle \u00B7 U Mark Update \u00B7 D/Del Mark Uninstall\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>Enter Details \u00B7 Esc Back</Text>\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -3,6 +3,7 @@ import { Box, Text, useInput } from "ink";
3
3
  import { loadAllPlugins } from "../../utils/pluginLoader.js";
4
4
  import { listMarketplaces, getMarketplace } from "../../utils/marketplaceManager.js";
5
5
  import { getTheme } from "../../utils/theme.js";
6
+ import { SEMANTIC_COLORS } from "../../constants/colors.js";
6
7
  const InstalledPluginsManager = ({
7
8
  onNavigate,
8
9
  onBack
@@ -88,12 +89,12 @@ const InstalledPluginsManager = ({
88
89
  }
89
90
  });
90
91
  if (loading) {
91
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Manage Installed Plugins"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Loading installed plugins..."));
92
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Manage Installed Plugins"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Loading installed plugins..."));
92
93
  }
93
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Manage Installed Plugins"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Select a marketplace to manage plugins:"), /* @__PURE__ */ React.createElement(Text, null, ""), marketplaces.length === 0 ? /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, "No plugins installed")) : marketplaces.map((group, index) => {
94
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Manage Installed Plugins"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Select a marketplace to manage plugins:"), /* @__PURE__ */ React.createElement(Text, null, ""), marketplaces.length === 0 ? /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, "No plugins installed")) : marketplaces.map((group, index) => {
94
95
  const isSelected = index === selectedIndex;
95
- return /* @__PURE__ */ React.createElement(Box, { key: group.name, marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: isSelected ? theme.success : void 0 }, isSelected ? "\u276F " : " ", group.name), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", "(", group.enabledCount, "/", group.installedCount, " enabled)"));
96
- }), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2191\u2193 Navigate \xB7 Enter Select \xB7 Esc Back")));
96
+ return /* @__PURE__ */ React.createElement(Box, { key: group.name, marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: isSelected ? theme.success : void 0 }, isSelected ? "\u276F " : " ", group.name), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "(", group.enabledCount, "/", group.installedCount, " enabled)"));
97
+ }), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "\u2191\u2193 Navigate \xB7 Enter Select \xB7 Esc Back")));
97
98
  };
98
99
  export {
99
100
  InstalledPluginsManager
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/plugin/InstalledPluginsManager.tsx"],
4
- "sourcesContent": ["/**\n * Installed Plugins Manager\n *\n * Displays all installed plugins grouped by marketplace.\n * Allows navigation to marketplace-specific plugin management.\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { loadAllPlugins } from '@utils/pluginLoader'\nimport { listMarketplaces, getMarketplace } from '@utils/marketplaceManager'\nimport { LoadedPlugin } from '../../types/plugin'\nimport { getTheme } from '@utils/theme'\nimport { NavigationProps } from './types'\n\ninterface MarketplaceGroup {\n name: string\n plugins: LoadedPlugin[]\n installedCount: number\n enabledCount: number\n}\n\nexport const InstalledPluginsManager: React.FC<NavigationProps> = ({\n onNavigate,\n onBack,\n}) => {\n const [marketplaces, setMarketplaces] = useState<MarketplaceGroup[]>([])\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [loading, setLoading] = useState(true)\n const theme = getTheme()\n\n // Reload plugins whenever this component is rendered\n useEffect(() => {\n setLoading(true)\n\n // Small delay to ensure UI is ready\n const timer = setTimeout(() => {\n try {\n // Load all installed plugins\n const plugins = loadAllPlugins()\n\n // Get registered marketplaces\n const registeredMarketplaces = listMarketplaces()\n const marketplaceNames = new Set(\n registeredMarketplaces.map(m => m.name),\n )\n\n // Group plugins by marketplace\n const grouped: Record<string, LoadedPlugin[]> = {}\n\n for (const plugin of plugins) {\n let marketplaceName = 'local'\n\n // Try to determine marketplace from source\n if (plugin.source.type === 'marketplace') {\n marketplaceName = plugin.source.marketplace\n } else {\n // Check if plugin location matches any marketplace\n for (const marketplace of registeredMarketplaces) {\n if (plugin.location.includes(marketplace.name)) {\n marketplaceName = marketplace.name\n break\n }\n }\n }\n\n if (!grouped[marketplaceName]) {\n grouped[marketplaceName] = []\n }\n grouped[marketplaceName].push(plugin)\n }\n\n // Convert to display format\n const groups: MarketplaceGroup[] = Object.entries(grouped).map(\n ([name, plugins]) => ({\n name,\n plugins,\n installedCount: plugins.length,\n enabledCount: plugins.filter(p => p.enabled).length,\n }),\n )\n\n // Sort: marketplaces first, then local\n groups.sort((a, b) => {\n if (a.name === 'local') return 1\n if (b.name === 'local') return -1\n return a.name.localeCompare(b.name)\n })\n\n setMarketplaces(groups)\n } finally {\n setLoading(false)\n }\n }, 100)\n\n return () => clearTimeout(timer)\n }, []) // Keep empty deps but reload happens on mount\n\n useInput((input, key) => {\n if (key.escape) {\n onBack()\n } else if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(marketplaces.length - 1, prev + 1))\n } else if (key.return) {\n if (marketplaces[selectedIndex]) {\n const selectedMarketplace = marketplaces[selectedIndex].name\n const registeredMarketplace = getMarketplace(selectedMarketplace)\n\n onNavigate({\n screen: 'installed-plugins-by-marketplace',\n marketplace: registeredMarketplace || {\n name: selectedMarketplace,\n source: { type: 'local', path: selectedMarketplace },\n manifest: {\n name: selectedMarketplace,\n version: '1.0.0',\n plugins: [],\n owner: { name: 'local', email: '' },\n },\n lastUpdated: new Date(),\n enabled: true,\n },\n })\n }\n }\n })\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.primary}>\n Manage Installed Plugins\n </Text>\n <Text dimColor>Loading installed plugins...</Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.primary}>\n Manage Installed Plugins\n </Text>\n <Text dimColor>Select a marketplace to manage plugins:</Text>\n <Text>{''}</Text>\n\n {marketplaces.length === 0 ? (\n <Box marginLeft={2}>\n <Text color={theme.warning}>No plugins installed</Text>\n </Box>\n ) : (\n marketplaces.map((group, index) => {\n const isSelected = index === selectedIndex\n return (\n <Box key={group.name} marginLeft={2}>\n <Text color={isSelected ? theme.success : undefined}>\n {isSelected ? '\u276F ' : ' '}\n {group.name}\n </Text>\n <Text dimColor>\n {' '}\n ({group.enabledCount}/{group.installedCount} enabled)\n </Text>\n </Box>\n )\n })\n )}\n\n <Text>{''}</Text>\n <Box marginLeft={2}>\n <Text dimColor>\u2191\u2193 Navigate \u00B7 Enter Select \u00B7 Esc Back</Text>\n </Box>\n </Box>\n )\n}\n"],
5
- "mappings": "AAOA,OAAO,SAAS,UAAU,iBAAiB;AAC3C,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB,sBAAsB;AAEjD,SAAS,gBAAgB;AAUlB,MAAM,0BAAqD,CAAC;AAAA,EACjE;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,cAAc,eAAe,IAAI,SAA6B,CAAC,CAAC;AACvE,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,CAAC;AACpD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,QAAQ,SAAS;AAGvB,YAAU,MAAM;AACd,eAAW,IAAI;AAGf,UAAM,QAAQ,WAAW,MAAM;AAC7B,UAAI;AAEF,cAAM,UAAU,eAAe;AAG/B,cAAM,yBAAyB,iBAAiB;AAChD,cAAM,mBAAmB,IAAI;AAAA,UAC3B,uBAAuB,IAAI,OAAK,EAAE,IAAI;AAAA,QACxC;AAGA,cAAM,UAA0C,CAAC;AAEjD,mBAAW,UAAU,SAAS;AAC5B,cAAI,kBAAkB;AAGtB,cAAI,OAAO,OAAO,SAAS,eAAe;AACxC,8BAAkB,OAAO,OAAO;AAAA,UAClC,OAAO;AAEL,uBAAW,eAAe,wBAAwB;AAChD,kBAAI,OAAO,SAAS,SAAS,YAAY,IAAI,GAAG;AAC9C,kCAAkB,YAAY;AAC9B;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,cAAI,CAAC,QAAQ,eAAe,GAAG;AAC7B,oBAAQ,eAAe,IAAI,CAAC;AAAA,UAC9B;AACA,kBAAQ,eAAe,EAAE,KAAK,MAAM;AAAA,QACtC;AAGA,cAAM,SAA6B,OAAO,QAAQ,OAAO,EAAE;AAAA,UACzD,CAAC,CAAC,MAAMA,QAAO,OAAO;AAAA,YACpB;AAAA,YACA,SAAAA;AAAA,YACA,gBAAgBA,SAAQ;AAAA,YACxB,cAAcA,SAAQ,OAAO,OAAK,EAAE,OAAO,EAAE;AAAA,UAC/C;AAAA,QACF;AAGA,eAAO,KAAK,CAAC,GAAG,MAAM;AACpB,cAAI,EAAE,SAAS,QAAS,QAAO;AAC/B,cAAI,EAAE,SAAS,QAAS,QAAO;AAC/B,iBAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,QACpC,CAAC;AAED,wBAAgB,MAAM;AAAA,MACxB,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF,GAAG,GAAG;AAEN,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,CAAC;AAEL,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,aAAO;AAAA,IACT,WAAW,IAAI,SAAS;AACtB,uBAAiB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IAChD,WAAW,IAAI,WAAW;AACxB,uBAAiB,UAAQ,KAAK,IAAI,aAAa,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,IACtE,WAAW,IAAI,QAAQ;AACrB,UAAI,aAAa,aAAa,GAAG;AAC/B,cAAM,sBAAsB,aAAa,aAAa,EAAE;AACxD,cAAM,wBAAwB,eAAe,mBAAmB;AAEhE,mBAAW;AAAA,UACT,QAAQ;AAAA,UACR,aAAa,yBAAyB;AAAA,YACpC,MAAM;AAAA,YACN,QAAQ,EAAE,MAAM,SAAS,MAAM,oBAAoB;AAAA,YACnD,UAAU;AAAA,cACR,MAAM;AAAA,cACN,SAAS;AAAA,cACT,SAAS,CAAC;AAAA,cACV,OAAO,EAAE,MAAM,SAAS,OAAO,GAAG;AAAA,YACpC;AAAA,YACA,aAAa,oBAAI,KAAK;AAAA,YACtB,SAAS;AAAA,UACX;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,SAAS;AACX,WACE,oCAAC,OAAI,eAAc,UAAS,aAAY,SAAQ,SAAS,KACvD,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,0BAEjC,GACA,oCAAC,QAAK,UAAQ,QAAC,8BAA4B,CAC7C;AAAA,EAEJ;AAEA,SACE,oCAAC,OAAI,eAAc,UAAS,aAAY,SAAQ,SAAS,KACvD,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,0BAEjC,GACA,oCAAC,QAAK,UAAQ,QAAC,yCAAuC,GACtD,oCAAC,YAAM,EAAG,GAET,aAAa,WAAW,IACvB,oCAAC,OAAI,YAAY,KACf,oCAAC,QAAK,OAAO,MAAM,WAAS,sBAAoB,CAClD,IAEA,aAAa,IAAI,CAAC,OAAO,UAAU;AACjC,UAAM,aAAa,UAAU;AAC7B,WACE,oCAAC,OAAI,KAAK,MAAM,MAAM,YAAY,KAChC,oCAAC,QAAK,OAAO,aAAa,MAAM,UAAU,UACvC,aAAa,YAAO,MACpB,MAAM,IACT,GACA,oCAAC,QAAK,UAAQ,QACX,KAAI,KACH,MAAM,cAAa,KAAE,MAAM,gBAAe,WAC9C,CACF;AAAA,EAEJ,CAAC,GAGH,oCAAC,YAAM,EAAG,GACV,oCAAC,OAAI,YAAY,KACf,oCAAC,QAAK,UAAQ,QAAC,uDAAqC,CACtD,CACF;AAEJ;",
4
+ "sourcesContent": ["/**\n * Installed Plugins Manager\n *\n * Displays all installed plugins grouped by marketplace.\n * Allows navigation to marketplace-specific plugin management.\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { loadAllPlugins } from '@utils/pluginLoader'\nimport { listMarketplaces, getMarketplace } from '@utils/marketplaceManager'\nimport { LoadedPlugin } from '../../types/plugin'\nimport { getTheme } from '@utils/theme'\nimport { NavigationProps } from './types'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ninterface MarketplaceGroup {\n name: string\n plugins: LoadedPlugin[]\n installedCount: number\n enabledCount: number\n}\n\nexport const InstalledPluginsManager: React.FC<NavigationProps> = ({\n onNavigate,\n onBack,\n}) => {\n const [marketplaces, setMarketplaces] = useState<MarketplaceGroup[]>([])\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [loading, setLoading] = useState(true)\n const theme = getTheme()\n\n // Reload plugins whenever this component is rendered\n useEffect(() => {\n setLoading(true)\n\n // Small delay to ensure UI is ready\n const timer = setTimeout(() => {\n try {\n // Load all installed plugins\n const plugins = loadAllPlugins()\n\n // Get registered marketplaces\n const registeredMarketplaces = listMarketplaces()\n const marketplaceNames = new Set(\n registeredMarketplaces.map(m => m.name),\n )\n\n // Group plugins by marketplace\n const grouped: Record<string, LoadedPlugin[]> = {}\n\n for (const plugin of plugins) {\n let marketplaceName = 'local'\n\n // Try to determine marketplace from source\n if (plugin.source.type === 'marketplace') {\n marketplaceName = plugin.source.marketplace\n } else {\n // Check if plugin location matches any marketplace\n for (const marketplace of registeredMarketplaces) {\n if (plugin.location.includes(marketplace.name)) {\n marketplaceName = marketplace.name\n break\n }\n }\n }\n\n if (!grouped[marketplaceName]) {\n grouped[marketplaceName] = []\n }\n grouped[marketplaceName].push(plugin)\n }\n\n // Convert to display format\n const groups: MarketplaceGroup[] = Object.entries(grouped).map(\n ([name, plugins]) => ({\n name,\n plugins,\n installedCount: plugins.length,\n enabledCount: plugins.filter(p => p.enabled).length,\n }),\n )\n\n // Sort: marketplaces first, then local\n groups.sort((a, b) => {\n if (a.name === 'local') return 1\n if (b.name === 'local') return -1\n return a.name.localeCompare(b.name)\n })\n\n setMarketplaces(groups)\n } finally {\n setLoading(false)\n }\n }, 100)\n\n return () => clearTimeout(timer)\n }, []) // Keep empty deps but reload happens on mount\n\n useInput((input, key) => {\n if (key.escape) {\n onBack()\n } else if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(marketplaces.length - 1, prev + 1))\n } else if (key.return) {\n if (marketplaces[selectedIndex]) {\n const selectedMarketplace = marketplaces[selectedIndex].name\n const registeredMarketplace = getMarketplace(selectedMarketplace)\n\n onNavigate({\n screen: 'installed-plugins-by-marketplace',\n marketplace: registeredMarketplace || {\n name: selectedMarketplace,\n source: { type: 'local', path: selectedMarketplace },\n manifest: {\n name: selectedMarketplace,\n version: '1.0.0',\n plugins: [],\n owner: { name: 'local', email: '' },\n },\n lastUpdated: new Date(),\n enabled: true,\n },\n })\n }\n }\n })\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.primary}>\n Manage Installed Plugins\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>Loading installed plugins...</Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.primary}>\n Manage Installed Plugins\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Select a marketplace to manage plugins:\n </Text>\n <Text>{''}</Text>\n\n {marketplaces.length === 0 ? (\n <Box marginLeft={2}>\n <Text color={theme.warning}>No plugins installed</Text>\n </Box>\n ) : (\n marketplaces.map((group, index) => {\n const isSelected = index === selectedIndex\n return (\n <Box key={group.name} marginLeft={2}>\n <Text color={isSelected ? theme.success : undefined}>\n {isSelected ? '\u276F ' : ' '}\n {group.name}\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n ({group.enabledCount}/{group.installedCount} enabled)\n </Text>\n </Box>\n )\n })\n )}\n\n <Text>{''}</Text>\n <Box marginLeft={2}>\n <Text color={SEMANTIC_COLORS.dim}>\n \u2191\u2193 Navigate \u00B7 Enter Select \u00B7 Esc Back\n </Text>\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["plugins"]
7
7
  }
@@ -2,6 +2,7 @@ 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
+ import { SEMANTIC_COLORS } from "../../constants/colors.js";
5
6
  const MainMenu = ({
6
7
  onNavigate,
7
8
  onBack,
@@ -57,7 +58,7 @@ const MainMenu = ({
57
58
  },
58
59
  /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Plugins")),
59
60
  /* @__PURE__ */ React.createElement(Select, { options, onChange: handleSelect }),
60
- /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Esc to exit"))
61
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Esc to exit"))
61
62
  );
62
63
  };
63
64
  export {
@@ -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> = ({\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;",
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'\nimport { SEMANTIC_COLORS } from '@constants/colors'\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 color={SEMANTIC_COLORS.dim}>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;AAEzB,SAAS,uBAAuB;AAEzB,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,OAAO,gBAAgB,OAAK,aAAW,CAC/C;AAAA,EACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -6,6 +6,7 @@ import {
6
6
  updateMarketplace,
7
7
  removeMarketplace
8
8
  } from "../../utils/marketplaceManager.js";
9
+ import { SEMANTIC_COLORS } from "../../constants/colors.js";
9
10
  import {
10
11
  MarketplaceError
11
12
  } from "../../types/marketplace.js";
@@ -154,8 +155,8 @@ Installed plugins from this marketplace will not be affected.`,
154
155
  borderColor: theme.primary,
155
156
  padding: 1
156
157
  },
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(
158
+ /* @__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, { color: SEMANTIC_COLORS.dim }, "(", marketplaces.length, " registered)")),
159
+ 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, { color: SEMANTIC_COLORS.dim }, "Press "), /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "a"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "to add your first marketplace."))) : /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, marketplaces.map((marketplace, index) => /* @__PURE__ */ React.createElement(
159
160
  MarketplaceListItem,
160
161
  {
161
162
  key: marketplace.name,
@@ -175,7 +176,7 @@ Installed plugins from this marketplace will not be affected.`,
175
176
  /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "\u2717 ", error)
176
177
  ),
177
178
  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
+ !loading && /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, 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
180
  );
180
181
  };
181
182
  const MarketplaceListItem = ({
@@ -192,7 +193,7 @@ const MarketplaceListItem = ({
192
193
  },
193
194
  marketplace.enabled ? "\u25CF " : "\u25CB ",
194
195
  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))));
196
+ ), !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, { color: SEMANTIC_COLORS.dim }, marketplace.manifest.metadata.description), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, marketplace.manifest.plugins.length, " available"), installed > 0 && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " \xB7 ", installed, " installed"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "\xB7 Updated ", formatTimeAgo(marketplace.lastUpdated))), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Source: ", formatMarketplacePath(marketplace.source))));
196
197
  };
197
198
  export {
198
199
  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 {\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": "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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 { SEMANTIC_COLORS } from '@constants/colors'\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 color={SEMANTIC_COLORS.dim}>\n ({marketplaces.length} registered)\n </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 color={SEMANTIC_COLORS.dim}>Press </Text>\n <Text color={theme.success}>a</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n to add your first marketplace.\n </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 color={SEMANTIC_COLORS.dim}>\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 color={SEMANTIC_COLORS.dim}>\n {marketplace.manifest.metadata.description}\n </Text>\n )}\n\n <Box>\n <Text color={SEMANTIC_COLORS.dim}>\n {marketplace.manifest.plugins.length} available\n </Text>\n {installed > 0 && (\n <Text color={SEMANTIC_COLORS.dim}> \u00B7 {installed} installed</Text>\n )}\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n \u00B7 Updated {formatTimeAgo(marketplace.lastUpdated)}\n </Text>\n </Box>\n\n <Text color={SEMANTIC_COLORS.dim}>\n Source: {formatMarketplacePath(marketplace.source)}\n </Text>\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -4,6 +4,7 @@ import { Select } from "../../components/CustomSelect/select.js";
4
4
  import { getTheme } from "../../utils/theme.js";
5
5
  import { listMarketplaces } from "../../utils/marketplaceManager.js";
6
6
  import { loadAllPlugins } from "../../utils/pluginLoader.js";
7
+ import { SEMANTIC_COLORS } from "../../constants/colors.js";
7
8
  const MarketplaceSelector = ({
8
9
  onNavigate,
9
10
  onBack
@@ -88,7 +89,7 @@ const MarketplaceSelector = ({
88
89
  },
89
90
  /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Error"),
90
91
  /* @__PURE__ */ React.createElement(Text, null, error),
91
- /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press Esc to go back"))
92
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press Esc to go back"))
92
93
  );
93
94
  }
94
95
  const options = marketplaceStats.map((stat) => ({
@@ -105,7 +106,7 @@ const MarketplaceSelector = ({
105
106
  paddingY: 1
106
107
  },
107
108
  /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Select Plugin Marketplace"),
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))))),
109
+ /* @__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, { color: SEMANTIC_COLORS.dim }, stat.availableCount, " plugins available \xB7 ", stat.installedCount, " ", "already installed \xB7 ", stat.source))))),
109
110
  /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(
110
111
  Select,
111
112
  {
@@ -114,7 +115,7 @@ const MarketplaceSelector = ({
114
115
  visibleOptionCount: Math.min(options.length, 10)
115
116
  }
116
117
  )),
117
- /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2191\u2193: Navigate \xB7 Enter: Select \xB7 Esc: Back"))
118
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "\u2191\u2193: Navigate \xB7 Enter: Select \xB7 Esc: Back"))
118
119
  );
119
120
  };
120
121
  export {
@@ -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 [],\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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",
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'\nimport { SEMANTIC_COLORS } from '@constants/colors'\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 color={SEMANTIC_COLORS.dim}>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 color={SEMANTIC_COLORS.dim}>\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 color={SEMANTIC_COLORS.dim}>\n \u2191\u2193: Navigate \u00B7 Enter: Select \u00B7 Esc: Back\n </Text>\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,7 @@
1
1
  import React from "react";
2
2
  import { Box, Text, useInput } from "ink";
3
3
  import { getTheme } from "../../utils/theme.js";
4
+ import { SEMANTIC_COLORS } from "../../constants/colors.js";
4
5
  const PlaceholderScreen = ({
5
6
  state,
6
7
  onBack
@@ -20,8 +21,8 @@ const PlaceholderScreen = ({
20
21
  padding: 1
21
22
  },
22
23
  /* @__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"))
24
+ /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "This screen is under construction."), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Screen state: ", JSON.stringify(state, null, 2))),
25
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Esc to go back"))
25
26
  );
26
27
  };
27
28
  export {
@@ -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> = ({\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;",
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'\nimport { SEMANTIC_COLORS } from '@constants/colors'\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 color={SEMANTIC_COLORS.dim}>\n This screen is under construction.\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Screen state: {JSON.stringify(state, null, 2)}\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>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;AAEzB,SAAS,uBAAuB;AAMzB,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,OAAO,gBAAgB,OAAK,oCAElC,GACA,oCAAC,QAAK,OAAO,gBAAgB,OAAK,kBACjB,KAAK,UAAU,OAAO,MAAM,CAAC,CAC9C,CACF;AAAA,IAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAO,gBAAgB,OAAK,gBAAc,CAClD;AAAA,EACF;AAEJ;",
6
6
  "names": []
7
7
  }