@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.
- package/dist/commands/agents/AgentsCommand.js +22 -24
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/context.js +2 -1
- package/dist/commands/context.js.map +2 -2
- package/dist/commands/export.js +2 -1
- package/dist/commands/export.js.map +2 -2
- package/dist/commands/mcp-interactive.js +7 -6
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/model.js +3 -2
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/permissions.js +4 -3
- package/dist/commands/permissions.js.map +2 -2
- package/dist/commands/plugin/AddMarketplaceForm.js +3 -2
- package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
- package/dist/commands/plugin/ConfirmDialog.js +2 -1
- package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
- package/dist/commands/plugin/ErrorView.js +2 -1
- package/dist/commands/plugin/ErrorView.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js +5 -4
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsManager.js +5 -4
- package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
- package/dist/commands/plugin/MainMenu.js +2 -1
- package/dist/commands/plugin/MainMenu.js.map +2 -2
- package/dist/commands/plugin/MarketplaceManager.js +5 -4
- package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
- package/dist/commands/plugin/MarketplaceSelector.js +4 -3
- package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
- package/dist/commands/plugin/PlaceholderScreen.js +3 -2
- package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
- package/dist/commands/plugin/PluginBrowser.js +6 -5
- package/dist/commands/plugin/PluginBrowser.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsInstall.js +5 -4
- package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsManage.js +4 -3
- package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
- package/dist/commands/plugin.js +16 -15
- package/dist/commands/plugin.js.map +2 -2
- package/dist/commands/sandbox.js +4 -3
- package/dist/commands/sandbox.js.map +2 -2
- package/dist/commands/setup.js +2 -1
- package/dist/commands/setup.js.map +2 -2
- package/dist/commands/status.js +2 -1
- package/dist/commands/status.js.map +2 -2
- package/dist/commands/undo.js +245 -0
- package/dist/commands/undo.js.map +7 -0
- package/dist/commands.js +2 -0
- package/dist/commands.js.map +2 -2
- package/dist/components/AgentThinkingBlock.js +1 -1
- package/dist/components/AgentThinkingBlock.js.map +2 -2
- package/dist/components/AsciiLogo.js +7 -8
- package/dist/components/AsciiLogo.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/QuestionView.js +2 -1
- package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
- package/dist/components/CollapsibleHint.js +2 -1
- package/dist/components/CollapsibleHint.js.map +2 -2
- package/dist/components/Config.js +3 -2
- package/dist/components/Config.js.map +2 -2
- package/dist/components/ConsoleOAuthFlow.js +2 -1
- package/dist/components/ConsoleOAuthFlow.js.map +2 -2
- package/dist/components/Cost.js +2 -1
- package/dist/components/Cost.js.map +2 -2
- package/dist/components/HeaderBar.js +13 -8
- package/dist/components/HeaderBar.js.map +2 -2
- package/dist/components/HistorySearchOverlay.js +4 -3
- package/dist/components/HistorySearchOverlay.js.map +2 -2
- package/dist/components/HotkeyHelpPanel.js +8 -11
- package/dist/components/HotkeyHelpPanel.js.map +2 -2
- package/dist/components/InvalidConfigDialog.js +2 -1
- package/dist/components/InvalidConfigDialog.js.map +2 -2
- package/dist/components/Logo.js +23 -67
- package/dist/components/Logo.js.map +2 -2
- package/dist/components/MCPServerApprovalDialog.js +2 -1
- package/dist/components/MCPServerApprovalDialog.js.map +2 -2
- package/dist/components/MCPServerDialogCopy.js +2 -1
- package/dist/components/MCPServerDialogCopy.js.map +2 -2
- package/dist/components/MCPServerMultiselectDialog.js +2 -1
- package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
- package/dist/components/MessageSelector.js +4 -3
- package/dist/components/MessageSelector.js.map +2 -2
- package/dist/components/ModeIndicator.js +2 -1
- package/dist/components/ModeIndicator.js.map +2 -2
- package/dist/components/ModelConfig.js +4 -3
- package/dist/components/ModelConfig.js.map +2 -2
- package/dist/components/ModelListManager.js +4 -3
- package/dist/components/ModelListManager.js.map +2 -2
- package/dist/components/ModelSelector/ModelSelector.js +26 -13
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/Onboarding.js +3 -2
- package/dist/components/Onboarding.js.map +2 -2
- package/dist/components/OperationSummary.js +130 -0
- package/dist/components/OperationSummary.js.map +7 -0
- package/dist/components/PromptInput.js +88 -75
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/SensitiveFileWarning.js +31 -0
- package/dist/components/SensitiveFileWarning.js.map +7 -0
- package/dist/components/Spinner.js +71 -22
- package/dist/components/Spinner.js.map +2 -2
- package/dist/components/StructuredDiff.js +6 -8
- package/dist/components/StructuredDiff.js.map +2 -2
- package/dist/components/SubagentBlock.js +4 -2
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/SubagentProgress.js +7 -4
- package/dist/components/SubagentProgress.js.map +2 -2
- package/dist/components/TaskCard.js +14 -11
- package/dist/components/TaskCard.js.map +2 -2
- package/dist/components/TextInput.js +9 -1
- package/dist/components/TextInput.js.map +2 -2
- package/dist/components/TodoPanel.js +44 -26
- package/dist/components/TodoPanel.js.map +2 -2
- package/dist/components/ToolUseLoader.js +2 -2
- package/dist/components/ToolUseLoader.js.map +2 -2
- package/dist/components/TreeConnector.js +4 -3
- package/dist/components/TreeConnector.js.map +2 -2
- package/dist/components/TrustDialog.js +2 -1
- package/dist/components/TrustDialog.js.map +2 -2
- package/dist/components/binary-feedback/BinaryFeedbackView.js +2 -1
- package/dist/components/binary-feedback/BinaryFeedbackView.js.map +2 -2
- package/dist/components/messages/AssistantTextMessage.js +17 -9
- package/dist/components/messages/AssistantTextMessage.js.map +2 -2
- package/dist/components/messages/AssistantToolUseMessage.js +8 -4
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/components/messages/GroupRenderer.js +2 -1
- package/dist/components/messages/GroupRenderer.js.map +2 -2
- package/dist/components/messages/NestedTasksPreview.js +13 -1
- package/dist/components/messages/NestedTasksPreview.js.map +2 -2
- package/dist/components/messages/ParallelTasksGroupView.js +4 -3
- package/dist/components/messages/ParallelTasksGroupView.js.map +2 -2
- package/dist/components/messages/TaskInModuleView.js +35 -15
- package/dist/components/messages/TaskInModuleView.js.map +2 -2
- package/dist/components/messages/TaskOutputContent.js +9 -6
- package/dist/components/messages/TaskOutputContent.js.map +2 -2
- package/dist/components/messages/UserPromptMessage.js +2 -2
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/constants/colors.js +90 -72
- package/dist/constants/colors.js.map +2 -2
- package/dist/constants/toolInputExamples.js +84 -0
- package/dist/constants/toolInputExamples.js.map +7 -0
- package/dist/core/backupManager.js +321 -0
- package/dist/core/backupManager.js.map +7 -0
- package/dist/core/costTracker.js +9 -18
- package/dist/core/costTracker.js.map +2 -2
- package/dist/core/gitAutoCommit.js +287 -0
- package/dist/core/gitAutoCommit.js.map +7 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +2 -2
- package/dist/core/operationTracker.js +212 -0
- package/dist/core/operationTracker.js.map +7 -0
- package/dist/core/permissions/rules/allowedToolsRule.js +1 -1
- package/dist/core/permissions/rules/allowedToolsRule.js.map +2 -2
- package/dist/core/permissions/rules/autoEscalationRule.js +5 -0
- package/dist/core/permissions/rules/autoEscalationRule.js.map +2 -2
- package/dist/core/permissions/rules/projectBoundaryRule.js +5 -0
- package/dist/core/permissions/rules/projectBoundaryRule.js.map +2 -2
- package/dist/core/permissions/rules/sensitivePathsRule.js +5 -0
- package/dist/core/permissions/rules/sensitivePathsRule.js.map +2 -2
- package/dist/core/tokenStats.js +9 -0
- package/dist/core/tokenStats.js.map +7 -0
- package/dist/core/tokenStatsManager.js +331 -0
- package/dist/core/tokenStatsManager.js.map +7 -0
- package/dist/entrypoints/cli.js +115 -87
- package/dist/entrypoints/cli.js.map +2 -2
- package/dist/hooks/useAgentTokenStats.js +72 -0
- package/dist/hooks/useAgentTokenStats.js.map +7 -0
- package/dist/hooks/useAgentTranscripts.js +30 -6
- package/dist/hooks/useAgentTranscripts.js.map +2 -2
- package/dist/hooks/useLogMessages.js +12 -1
- package/dist/hooks/useLogMessages.js.map +2 -2
- package/dist/i18n/locales/en.js +6 -5
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.js +6 -5
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/i18n/types.js.map +1 -1
- package/dist/permissions.js +28 -1
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +78 -4
- package/dist/query.js.map +3 -3
- package/dist/screens/REPL.js +23 -3
- package/dist/screens/REPL.js.map +2 -2
- package/dist/services/claude.js +54 -3
- package/dist/services/claude.js.map +2 -2
- package/dist/services/intelligentCompactor.js +1 -1
- package/dist/services/intelligentCompactor.js.map +2 -2
- package/dist/services/mcpClient.js +81 -25
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/sandbox/filesystemBoundary.js +58 -17
- package/dist/services/sandbox/filesystemBoundary.js.map +2 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +3 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +2 -1
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
- package/dist/tools/BashTool/BashTool.js +22 -3
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/BashTool/prompt.js +178 -34
- package/dist/tools/BashTool/prompt.js.map +2 -2
- package/dist/tools/FileEditTool/prompt.js +6 -3
- package/dist/tools/FileEditTool/prompt.js.map +2 -2
- package/dist/tools/FileWriteTool/prompt.js +4 -2
- package/dist/tools/FileWriteTool/prompt.js.map +2 -2
- package/dist/tools/MultiEditTool/prompt.js +5 -3
- package/dist/tools/MultiEditTool/prompt.js.map +2 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -1
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +3 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +3 -2
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/prompt.js +1 -1
- package/dist/tools/PlanModeTool/prompt.js.map +1 -1
- package/dist/tools/SkillTool/SkillTool.js +4 -3
- package/dist/tools/SkillTool/SkillTool.js.map +2 -2
- package/dist/tools/SkillTool/prompt.js +1 -1
- package/dist/tools/SkillTool/prompt.js.map +1 -1
- package/dist/tools/TaskOutputTool/TaskOutputTool.js +3 -2
- package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +2 -2
- package/dist/tools/TaskTool/TaskTool.js +8 -0
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/utils/CircuitBreaker.js +242 -0
- package/dist/utils/CircuitBreaker.js.map +7 -0
- package/dist/utils/ask.js +2 -0
- package/dist/utils/ask.js.map +2 -2
- package/dist/utils/config.js +47 -5
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/credentials/CredentialStore.js +1 -0
- package/dist/utils/credentials/CredentialStore.js.map +7 -0
- package/dist/utils/credentials/EncryptedFileStore.js +157 -0
- package/dist/utils/credentials/EncryptedFileStore.js.map +7 -0
- package/dist/utils/credentials/index.js +37 -0
- package/dist/utils/credentials/index.js.map +7 -0
- package/dist/utils/credentials/migration.js +82 -0
- package/dist/utils/credentials/migration.js.map +7 -0
- package/dist/utils/markdown.js +13 -1
- package/dist/utils/markdown.js.map +2 -2
- package/dist/utils/permissions/filesystem.js +5 -1
- package/dist/utils/permissions/filesystem.js.map +2 -2
- package/dist/utils/safePath.js +132 -0
- package/dist/utils/safePath.js.map +7 -0
- package/dist/utils/sensitiveFiles.js +125 -0
- package/dist/utils/sensitiveFiles.js.map +7 -0
- package/dist/utils/taskDisplayUtils.js +9 -9
- package/dist/utils/taskDisplayUtils.js.map +2 -2
- package/dist/utils/theme.js +6 -6
- package/dist/utils/theme.js.map +1 -1
- package/dist/utils/toolRiskClassification.js +207 -0
- package/dist/utils/toolRiskClassification.js.map +7 -0
- package/dist/utils/tooling/safeRender.js +5 -4
- package/dist/utils/tooling/safeRender.js.map +2 -2
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +9 -7
- package/dist/hooks/useCancelRequest.js +0 -31
- 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
|
|
5
|
-
"mappings": "AAMA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;
|
|
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, {
|
|
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
|
|
5
|
-
"mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;
|
|
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, {
|
|
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, {
|
|
140
|
-
isSelected && /* @__PURE__ */ React.createElement(Box, { marginLeft: 4 }, /* @__PURE__ */ React.createElement(Text, {
|
|
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, {
|
|
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
|
|
5
|
-
"mappings": "AAOA,OAAO,SAAS,UAAU,WAAW,mBAAmB;AACxD,SAAS,KAAK,MAAM,gBAAgB;AACpC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;
|
|
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, {
|
|
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, {
|
|
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, {
|
|
96
|
-
}), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, {
|
|
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
|
|
5
|
-
"mappings": "AAOA,OAAO,SAAS,UAAU,iBAAiB;AAC3C,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB,sBAAsB;AAEjD,SAAS,gBAAgB;
|
|
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, {
|
|
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
|
|
5
|
-
"mappings": "AAOA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,cAAc;AACvB,SAAS,gBAAgB;
|
|
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, {
|
|
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, {
|
|
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, {
|
|
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, {
|
|
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
|
|
5
|
-
"mappings": "AAMA,OAAO,SAAS,UAAU,iBAAiB;AAC3C,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,qBAAqB;AAC9B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EAEE;AAAA,OACK;AACP,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,qBAAqB;AAEvB,MAAM,qBAAgD,CAAC;AAAA,EAC5D;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,cAAc,eAAe,IAAI,SAAkC,CAAC,CAAC;AAC5E,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,CAAC;AAClD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AACtD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAExC,IAAI;AACN,QAAM,QAAQ,SAAS;AAGvB,YAAU,MAAM;AACd,wBAAoB;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,sBAAsB,MAAM;AAChC,QAAI;AACF,YAAM,UAAU,iBAAiB;AACjC,sBAAgB,OAAO;AAEvB,UAAI,gBAAgB,QAAQ,UAAU,QAAQ,SAAS,GAAG;AACxD,wBAAgB,QAAQ,SAAS,CAAC;AAAA,MACpC;AAAA,IACF,SAAS,KAAK;AACZ;AAAA,QACE,eAAe,QAAQ,IAAI,UAAU;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,gBAAuC;AACjE,eAAW,IAAI;AACf,aAAS,IAAI;AAEb,QAAI;AACF,YAAM,kBAAkB,YAAY,IAAI;AACxC,0BAAoB;AAAA,IACtB,SAAS,KAAK;AACZ,UAAI,eAAe,kBAAkB;AACnC,iBAAS,kBAAkB,IAAI,OAAO,EAAE;AAAA,MAC1C,OAAO;AACL;AAAA,UACE,kBAAkB,eAAe,QAAQ,IAAI,UAAU,eAAe;AAAA,QACxE;AAAA,MACF;AAAA,IACF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,gBAAuC;AAC3D,QAAI;AACF,wBAAkB,YAAY,IAAI;AAClC,0BAAoB;AAAA,IACtB,SAAS,KAAK;AACZ,UAAI,eAAe,kBAAkB;AACnC,iBAAS,kBAAkB,IAAI,OAAO,EAAE;AAAA,MAC1C,OAAO;AACL;AAAA,UACE,kBAAkB,eAAe,QAAQ,IAAI,UAAU,eAAe;AAAA,QACxE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAM;AAChC,mBAAe,KAAK;AACpB,QAAI,eAAe,aAAa,QAAQ;AACtC,mBAAa,aAAa,YAAY,CAAC;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAM;AAChC,mBAAe,KAAK;AACpB,QAAI,eAAe,aAAa,QAAQ;AACtC,mBAAa,aAAa,YAAY,CAAC;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAM;AAChC,mBAAe,KAAK;AACpB,qBAAiB,IAAI;AAAA,EACvB;AAEA;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,eAAe,QAAS;AAE5B,UAAI,IAAI,QAAQ;AACd,eAAO;AAAA,MACT,WAAW,IAAI,WAAW,eAAe,GAAG;AAC1C,wBAAgB,eAAe,CAAC;AAChC,iBAAS,IAAI;AAAA,MACf,WAAW,IAAI,aAAa,eAAe,aAAa,SAAS,GAAG;AAClE,wBAAgB,eAAe,CAAC;AAChC,iBAAS,IAAI;AAAA,MACf,WAAW,IAAI,UAAU,aAAa,SAAS,GAAG;AAEhD,mBAAW;AAAA,UACT,QAAQ;AAAA,UACR,aAAa,aAAa,YAAY,EAAE;AAAA,QAC1C,CAAC;AAAA,MACH,WAAW,UAAU,OAAO,aAAa,SAAS,GAAG;AACnD,yBAAiB,QAAQ;AACzB,uBAAe,IAAI;AAAA,MACrB,WAAW,UAAU,OAAO,aAAa,SAAS,GAAG;AACnD,yBAAiB,QAAQ;AACzB,uBAAe,IAAI;AAAA,MACrB,WAAW,UAAU,KAAK;AACxB,mBAAW,EAAE,QAAQ,kBAAkB,CAAC;AAAA,MAC1C;AAAA,IACF;AAAA,IACA,EAAE,UAAU,CAAC,eAAe,CAAC,QAAQ;AAAA,EACvC;AAEA,MACE,eACA,kBAAkB,YAClB,eAAe,aAAa,QAC5B;AACA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAS,uBAAuB,aAAa,YAAY,EAAE,IAAI;AAAA;AAAA;AAAA,QAC/D,WAAW;AAAA,QACX,UAAU;AAAA;AAAA,IACZ;AAAA,EAEJ;AAEA,MACE,eACA,kBAAkB,YAClB,eAAe,aAAa,QAC5B;AACA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAS,uBAAuB,aAAa,YAAY,EAAE,IAAI;AAAA;AAAA;AAAA,QAC/D,WAAW;AAAA,QACX,UAAU;AAAA,QACV,cAAc,MAAM;AAAA;AAAA,IACtB;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,SAAS;AAAA;AAAA,IAET,oCAAC,OAAI,gBAAe,mBAClB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,qBAEjC,GACC,aAAa,SAAS,KACrB,oCAAC,QAAK,
|
|
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, {
|
|
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, {
|
|
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, {
|
|
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
|
|
5
|
-
"mappings": "AAMA,OAAO,SAAS,UAAU,iBAAiB;AAC3C,SAAS,KAAK,YAAY;AAC1B,SAAS,cAAc;AAEvB,SAAS,gBAAgB;AACzB,SAAS,wBAAwC;AACjD,SAAS,sBAAsB;
|
|
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, {
|
|
24
|
-
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, {
|
|
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
|
|
5
|
-
"mappings": "AAOA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;
|
|
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
|
}
|