@within-7/minto 0.0.5-dev.1
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/LICENSE +201 -0
- package/README.md +1097 -0
- package/README.zh-CN.md +1097 -0
- package/cli.js +59 -0
- package/dist/Tool.js +1 -0
- package/dist/Tool.js.map +7 -0
- package/dist/commands/agents.js +2086 -0
- package/dist/commands/agents.js.map +7 -0
- package/dist/commands/approvedTools.js +36 -0
- package/dist/commands/approvedTools.js.map +7 -0
- package/dist/commands/bug.js +21 -0
- package/dist/commands/bug.js.map +7 -0
- package/dist/commands/build.js +74 -0
- package/dist/commands/build.js.map +7 -0
- package/dist/commands/clear.js +37 -0
- package/dist/commands/clear.js.map +7 -0
- package/dist/commands/compact.js +82 -0
- package/dist/commands/compact.js.map +7 -0
- package/dist/commands/compression.js +57 -0
- package/dist/commands/compression.js.map +7 -0
- package/dist/commands/config.js +20 -0
- package/dist/commands/config.js.map +7 -0
- package/dist/commands/cost.js +19 -0
- package/dist/commands/cost.js.map +7 -0
- package/dist/commands/ctx_viz.js +152 -0
- package/dist/commands/ctx_viz.js.map +7 -0
- package/dist/commands/doctor.js +25 -0
- package/dist/commands/doctor.js.map +7 -0
- package/dist/commands/help.js +20 -0
- package/dist/commands/help.js.map +7 -0
- package/dist/commands/init.js +38 -0
- package/dist/commands/init.js.map +7 -0
- package/dist/commands/listen.js +37 -0
- package/dist/commands/listen.js.map +7 -0
- package/dist/commands/login.js +37 -0
- package/dist/commands/login.js.map +7 -0
- package/dist/commands/logout.js +33 -0
- package/dist/commands/logout.js.map +7 -0
- package/dist/commands/mcp-interactive.js +267 -0
- package/dist/commands/mcp-interactive.js.map +7 -0
- package/dist/commands/mcp.js +40 -0
- package/dist/commands/mcp.js.map +7 -0
- package/dist/commands/mcp_refresh.js +40 -0
- package/dist/commands/mcp_refresh.js.map +7 -0
- package/dist/commands/model.js +41 -0
- package/dist/commands/model.js.map +7 -0
- package/dist/commands/modelstatus.js +21 -0
- package/dist/commands/modelstatus.js.map +7 -0
- package/dist/commands/onboarding.js +36 -0
- package/dist/commands/onboarding.js.map +7 -0
- package/dist/commands/plugin/AddMarketplaceForm.js +62 -0
- package/dist/commands/plugin/AddMarketplaceForm.js.map +7 -0
- package/dist/commands/plugin/ConfirmDialog.js +71 -0
- package/dist/commands/plugin/ConfirmDialog.js.map +7 -0
- package/dist/commands/plugin/ErrorView.js +33 -0
- package/dist/commands/plugin/ErrorView.js.map +7 -0
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js +135 -0
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +7 -0
- package/dist/commands/plugin/InstalledPluginsManager.js +99 -0
- package/dist/commands/plugin/InstalledPluginsManager.js.map +7 -0
- package/dist/commands/plugin/LoadingView.js +14 -0
- package/dist/commands/plugin/LoadingView.js.map +7 -0
- package/dist/commands/plugin/MainMenu.js +57 -0
- package/dist/commands/plugin/MainMenu.js.map +7 -0
- package/dist/commands/plugin/MarketplaceManager.js +155 -0
- package/dist/commands/plugin/MarketplaceManager.js.map +7 -0
- package/dist/commands/plugin/MarketplaceSelector.js +119 -0
- package/dist/commands/plugin/MarketplaceSelector.js.map +7 -0
- package/dist/commands/plugin/PlaceholderScreen.js +16 -0
- package/dist/commands/plugin/PlaceholderScreen.js.map +7 -0
- package/dist/commands/plugin/PluginBrowser.js +180 -0
- package/dist/commands/plugin/PluginBrowser.js.map +7 -0
- package/dist/commands/plugin/PluginDetailsInstall.js +152 -0
- package/dist/commands/plugin/PluginDetailsInstall.js.map +7 -0
- package/dist/commands/plugin/PluginDetailsManage.js +200 -0
- package/dist/commands/plugin/PluginDetailsManage.js.map +7 -0
- package/dist/commands/plugin/components.js +16 -0
- package/dist/commands/plugin/components.js.map +7 -0
- package/dist/commands/plugin/example-usage.js +63 -0
- package/dist/commands/plugin/example-usage.js.map +7 -0
- package/dist/commands/plugin/types.js +1 -0
- package/dist/commands/plugin/types.js.map +7 -0
- package/dist/commands/plugin/utils.js +77 -0
- package/dist/commands/plugin/utils.js.map +7 -0
- package/dist/commands/plugin-interactive.js +446 -0
- package/dist/commands/plugin-interactive.js.map +7 -0
- package/dist/commands/plugin.js +523 -0
- package/dist/commands/plugin.js.map +7 -0
- package/dist/commands/pr_comments.js +61 -0
- package/dist/commands/pr_comments.js.map +7 -0
- package/dist/commands/quit.js +16 -0
- package/dist/commands/quit.js.map +7 -0
- package/dist/commands/refreshCommands.js +43 -0
- package/dist/commands/refreshCommands.js.map +7 -0
- package/dist/commands/release-notes.js +30 -0
- package/dist/commands/release-notes.js.map +7 -0
- package/dist/commands/resume.js +35 -0
- package/dist/commands/resume.js.map +7 -0
- package/dist/commands/review.js +51 -0
- package/dist/commands/review.js.map +7 -0
- package/dist/commands/terminalSetup.js +164 -0
- package/dist/commands/terminalSetup.js.map +7 -0
- package/dist/commands.js +104 -0
- package/dist/commands.js.map +7 -0
- package/dist/components/AgentResponseBlock.js +41 -0
- package/dist/components/AgentResponseBlock.js.map +7 -0
- package/dist/components/AgentThinkingBlock.js +40 -0
- package/dist/components/AgentThinkingBlock.js.map +7 -0
- package/dist/components/AsciiLogo.js +19 -0
- package/dist/components/AsciiLogo.js.map +7 -0
- package/dist/components/BackgroundTasksPanel.js +124 -0
- package/dist/components/BackgroundTasksPanel.js.map +7 -0
- package/dist/components/Bug.js +147 -0
- package/dist/components/Bug.js.map +7 -0
- package/dist/components/Config.js +166 -0
- package/dist/components/Config.js.map +7 -0
- package/dist/components/ConsoleOAuthFlow.js +178 -0
- package/dist/components/ConsoleOAuthFlow.js.map +7 -0
- package/dist/components/Cost.js +13 -0
- package/dist/components/Cost.js.map +7 -0
- package/dist/components/CostThresholdDialog.js +38 -0
- package/dist/components/CostThresholdDialog.js.map +7 -0
- package/dist/components/CustomSelect/option-map.js +32 -0
- package/dist/components/CustomSelect/option-map.js.map +7 -0
- package/dist/components/CustomSelect/select-option.js +34 -0
- package/dist/components/CustomSelect/select-option.js.map +7 -0
- package/dist/components/CustomSelect/select.js +64 -0
- package/dist/components/CustomSelect/select.js.map +7 -0
- package/dist/components/CustomSelect/theme.js +1 -0
- package/dist/components/CustomSelect/theme.js.map +7 -0
- package/dist/components/CustomSelect/use-select-state.js +220 -0
- package/dist/components/CustomSelect/use-select-state.js.map +7 -0
- package/dist/components/CustomSelect/use-select.js +21 -0
- package/dist/components/CustomSelect/use-select.js.map +7 -0
- package/dist/components/FallbackToolUseRejectedMessage.js +11 -0
- package/dist/components/FallbackToolUseRejectedMessage.js.map +7 -0
- package/dist/components/FileEditToolUpdatedMessage.js +32 -0
- package/dist/components/FileEditToolUpdatedMessage.js.map +7 -0
- package/dist/components/HeaderBar.js +57 -0
- package/dist/components/HeaderBar.js.map +7 -0
- package/dist/components/Help.js +46 -0
- package/dist/components/Help.js.map +7 -0
- package/dist/components/HighlightedCode.js +30 -0
- package/dist/components/HighlightedCode.js.map +7 -0
- package/dist/components/HistorySearchOverlay.js +48 -0
- package/dist/components/HistorySearchOverlay.js.map +7 -0
- package/dist/components/InteractionRoundBlock.js +56 -0
- package/dist/components/InteractionRoundBlock.js.map +7 -0
- package/dist/components/InvalidConfigDialog.js +83 -0
- package/dist/components/InvalidConfigDialog.js.map +7 -0
- package/dist/components/Link.js +18 -0
- package/dist/components/Link.js.map +7 -0
- package/dist/components/LogSelector.js +50 -0
- package/dist/components/LogSelector.js.map +7 -0
- package/dist/components/Logo.js +96 -0
- package/dist/components/Logo.js.map +7 -0
- package/dist/components/MCPServerApprovalDialog.js +79 -0
- package/dist/components/MCPServerApprovalDialog.js.map +7 -0
- package/dist/components/MCPServerDialogCopy.js +11 -0
- package/dist/components/MCPServerDialogCopy.js.map +7 -0
- package/dist/components/MCPServerMultiselectDialog.js +80 -0
- package/dist/components/MCPServerMultiselectDialog.js.map +7 -0
- package/dist/components/Message.js +146 -0
- package/dist/components/Message.js.map +7 -0
- package/dist/components/MessageResponse.js +9 -0
- package/dist/components/MessageResponse.js.map +7 -0
- package/dist/components/MessageSelector.js +125 -0
- package/dist/components/MessageSelector.js.map +7 -0
- package/dist/components/ModeIndicator.js +38 -0
- package/dist/components/ModeIndicator.js.map +7 -0
- package/dist/components/ModelConfig.js +208 -0
- package/dist/components/ModelConfig.js.map +7 -0
- package/dist/components/ModelListManager.js +140 -0
- package/dist/components/ModelListManager.js.map +7 -0
- package/dist/components/ModelSelector.js +2062 -0
- package/dist/components/ModelSelector.js.map +7 -0
- package/dist/components/ModelStatusDisplay.js +87 -0
- package/dist/components/ModelStatusDisplay.js.map +7 -0
- package/dist/components/Onboarding.js +153 -0
- package/dist/components/Onboarding.js.map +7 -0
- package/dist/components/PressEnterToContinue.js +10 -0
- package/dist/components/PressEnterToContinue.js.map +7 -0
- package/dist/components/ProjectOnboarding.js +99 -0
- package/dist/components/ProjectOnboarding.js.map +7 -0
- package/dist/components/PromptInput.js +755 -0
- package/dist/components/PromptInput.js.map +7 -0
- package/dist/components/QuitSummary.js +81 -0
- package/dist/components/QuitSummary.js.map +7 -0
- package/dist/components/SentryErrorBoundary.js +27 -0
- package/dist/components/SentryErrorBoundary.js.map +7 -0
- package/dist/components/Spinner.js +101 -0
- package/dist/components/Spinner.js.map +7 -0
- package/dist/components/SpinnerSymbol.js +78 -0
- package/dist/components/SpinnerSymbol.js.map +7 -0
- package/dist/components/StreamingBashOutput.js +70 -0
- package/dist/components/StreamingBashOutput.js.map +7 -0
- package/dist/components/StructuredDiff.js +148 -0
- package/dist/components/StructuredDiff.js.map +7 -0
- package/dist/components/SubagentBlock.js +157 -0
- package/dist/components/SubagentBlock.js.map +7 -0
- package/dist/components/SubagentManager.js +65 -0
- package/dist/components/SubagentManager.js.map +7 -0
- package/dist/components/SubagentProgress.js +109 -0
- package/dist/components/SubagentProgress.js.map +7 -0
- package/dist/components/SubagentStatusMarker.js +37 -0
- package/dist/components/SubagentStatusMarker.js.map +7 -0
- package/dist/components/TaskCard.js +170 -0
- package/dist/components/TaskCard.js.map +7 -0
- package/dist/components/TextInput.js +100 -0
- package/dist/components/TextInput.js.map +7 -0
- package/dist/components/TimelineRenderer.js +31 -0
- package/dist/components/TimelineRenderer.js.map +7 -0
- package/dist/components/TodoChangeBlock.js +29 -0
- package/dist/components/TodoChangeBlock.js.map +7 -0
- package/dist/components/TodoChangeLine.js +22 -0
- package/dist/components/TodoChangeLine.js.map +7 -0
- package/dist/components/TodoItem.js +35 -0
- package/dist/components/TodoItem.js.map +7 -0
- package/dist/components/TodoPanel.js +55 -0
- package/dist/components/TodoPanel.js.map +7 -0
- package/dist/components/TokenWarning.js +19 -0
- package/dist/components/TokenWarning.js.map +7 -0
- package/dist/components/ToolExecutionBlock.js +18 -0
- package/dist/components/ToolExecutionBlock.js.map +7 -0
- package/dist/components/ToolUseLoader.js +24 -0
- package/dist/components/ToolUseLoader.js.map +7 -0
- package/dist/components/TrustDialog.js +71 -0
- package/dist/components/TrustDialog.js.map +7 -0
- package/dist/components/UserQueryBlock.js +12 -0
- package/dist/components/UserQueryBlock.js.map +7 -0
- package/dist/components/binary-feedback/BinaryFeedback.js +50 -0
- package/dist/components/binary-feedback/BinaryFeedback.js.map +7 -0
- package/dist/components/binary-feedback/BinaryFeedbackOption.js +94 -0
- package/dist/components/binary-feedback/BinaryFeedbackOption.js.map +7 -0
- package/dist/components/binary-feedback/BinaryFeedbackView.js +139 -0
- package/dist/components/binary-feedback/BinaryFeedbackView.js.map +7 -0
- package/dist/components/binary-feedback/utils.js +108 -0
- package/dist/components/binary-feedback/utils.js.map +7 -0
- package/dist/components/messages/AssistantBashOutputMessage.js +23 -0
- package/dist/components/messages/AssistantBashOutputMessage.js.map +7 -0
- package/dist/components/messages/AssistantLocalCommandOutputMessage.js +36 -0
- package/dist/components/messages/AssistantLocalCommandOutputMessage.js.map +7 -0
- package/dist/components/messages/AssistantRedactedThinkingMessage.js +12 -0
- package/dist/components/messages/AssistantRedactedThinkingMessage.js.map +7 -0
- package/dist/components/messages/AssistantTextMessage.js +78 -0
- package/dist/components/messages/AssistantTextMessage.js.map +7 -0
- package/dist/components/messages/AssistantThinkingMessage.js +27 -0
- package/dist/components/messages/AssistantThinkingMessage.js.map +7 -0
- package/dist/components/messages/AssistantToolUseMessage.js +91 -0
- package/dist/components/messages/AssistantToolUseMessage.js.map +7 -0
- package/dist/components/messages/TaskProgressMessage.js +11 -0
- package/dist/components/messages/TaskProgressMessage.js.map +7 -0
- package/dist/components/messages/TaskToolMessage.js +39 -0
- package/dist/components/messages/TaskToolMessage.js.map +7 -0
- package/dist/components/messages/UserBashInputMessage.js +18 -0
- package/dist/components/messages/UserBashInputMessage.js.map +7 -0
- package/dist/components/messages/UserCommandMessage.js +20 -0
- package/dist/components/messages/UserCommandMessage.js.map +7 -0
- package/dist/components/messages/UserKodingInputMessage.js +18 -0
- package/dist/components/messages/UserKodingInputMessage.js.map +7 -0
- package/dist/components/messages/UserPromptMessage.js +20 -0
- package/dist/components/messages/UserPromptMessage.js.map +7 -0
- package/dist/components/messages/UserTextMessage.js +25 -0
- package/dist/components/messages/UserTextMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js +10 -0
- package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolErrorMessage.js +15 -0
- package/dist/components/messages/UserToolResultMessage/UserToolErrorMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js +25 -0
- package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js +47 -0
- package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +23 -0
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +7 -0
- package/dist/components/messages/UserToolResultMessage/utils.js +50 -0
- package/dist/components/messages/UserToolResultMessage/utils.js.map +7 -0
- package/dist/components/permissions/BashPermissionRequest/BashPermissionRequest.js +112 -0
- package/dist/components/permissions/BashPermissionRequest/BashPermissionRequest.js.map +7 -0
- package/dist/components/permissions/FallbackPermissionRequest.js +131 -0
- package/dist/components/permissions/FallbackPermissionRequest.js.map +7 -0
- package/dist/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js +159 -0
- package/dist/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js.map +7 -0
- package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js +58 -0
- package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js.map +7 -0
- package/dist/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js +153 -0
- package/dist/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js.map +7 -0
- package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js +70 -0
- package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js.map +7 -0
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +212 -0
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +7 -0
- package/dist/components/permissions/PermissionRequest.js +70 -0
- package/dist/components/permissions/PermissionRequest.js.map +7 -0
- package/dist/components/permissions/PermissionRequestTitle.js +52 -0
- package/dist/components/permissions/PermissionRequestTitle.js.map +7 -0
- package/dist/components/permissions/hooks.js +23 -0
- package/dist/components/permissions/hooks.js.map +7 -0
- package/dist/components/permissions/toolUseOptions.js +46 -0
- package/dist/components/permissions/toolUseOptions.js.map +7 -0
- package/dist/components/permissions/utils.js +21 -0
- package/dist/components/permissions/utils.js.map +7 -0
- package/dist/constants/claude-asterisk-ascii-art.js +242 -0
- package/dist/constants/claude-asterisk-ascii-art.js.map +7 -0
- package/dist/constants/colors.js +126 -0
- package/dist/constants/colors.js.map +7 -0
- package/dist/constants/compressionPrompts.js +73 -0
- package/dist/constants/compressionPrompts.js.map +7 -0
- package/dist/constants/figures.js +6 -0
- package/dist/constants/figures.js.map +7 -0
- package/dist/constants/macros.js +11 -0
- package/dist/constants/macros.js.map +7 -0
- package/dist/constants/modelCapabilities.js +154 -0
- package/dist/constants/modelCapabilities.js.map +7 -0
- package/dist/constants/models.js +1034 -0
- package/dist/constants/models.js.map +7 -0
- package/dist/constants/oauth.js +18 -0
- package/dist/constants/oauth.js.map +7 -0
- package/dist/constants/product.js +26 -0
- package/dist/constants/product.js.map +7 -0
- package/dist/constants/prompts.js +168 -0
- package/dist/constants/prompts.js.map +7 -0
- package/dist/constants/releaseNotes.js +9 -0
- package/dist/constants/releaseNotes.js.map +7 -0
- package/dist/constants/symbols.js +50 -0
- package/dist/constants/symbols.js.map +7 -0
- package/dist/context/PermissionContext.js +111 -0
- package/dist/context/PermissionContext.js.map +7 -0
- package/dist/context.js +278 -0
- package/dist/context.js.map +7 -0
- package/dist/cost-tracker.js +76 -0
- package/dist/cost-tracker.js.map +7 -0
- package/dist/entrypoints/cli-wrapper.js +61 -0
- package/dist/entrypoints/cli-wrapper.js.map +7 -0
- package/dist/entrypoints/cli.js +1115 -0
- package/dist/entrypoints/cli.js.map +7 -0
- package/dist/entrypoints/mcp.js +150 -0
- package/dist/entrypoints/mcp.js.map +7 -0
- package/dist/history.js +25 -0
- package/dist/history.js.map +7 -0
- package/dist/hooks/useApiKeyVerification.js +12 -0
- package/dist/hooks/useApiKeyVerification.js.map +7 -0
- package/dist/hooks/useArrowKeyHistory.js +50 -0
- package/dist/hooks/useArrowKeyHistory.js.map +7 -0
- package/dist/hooks/useCanUseTool.js +87 -0
- package/dist/hooks/useCanUseTool.js.map +7 -0
- package/dist/hooks/useCancelRequest.js +28 -0
- package/dist/hooks/useCancelRequest.js.map +7 -0
- package/dist/hooks/useDoublePress.js +31 -0
- package/dist/hooks/useDoublePress.js.map +7 -0
- package/dist/hooks/useExitOnCtrlCD.js +26 -0
- package/dist/hooks/useExitOnCtrlCD.js.map +7 -0
- package/dist/hooks/useHistorySearch.js +62 -0
- package/dist/hooks/useHistorySearch.js.map +7 -0
- package/dist/hooks/useInterval.js +18 -0
- package/dist/hooks/useInterval.js.map +7 -0
- package/dist/hooks/useLogMessages.js +14 -0
- package/dist/hooks/useLogMessages.js.map +7 -0
- package/dist/hooks/useLogStartupTime.js +10 -0
- package/dist/hooks/useLogStartupTime.js.map +7 -0
- package/dist/hooks/useNotifyAfterTimeout.js +42 -0
- package/dist/hooks/useNotifyAfterTimeout.js.map +7 -0
- package/dist/hooks/usePermissionRequestLogging.js +23 -0
- package/dist/hooks/usePermissionRequestLogging.js.map +7 -0
- package/dist/hooks/useTerminalSize.js +38 -0
- package/dist/hooks/useTerminalSize.js.map +7 -0
- package/dist/hooks/useTextInput.js +252 -0
- package/dist/hooks/useTextInput.js.map +7 -0
- package/dist/hooks/useUnifiedCompletion.js +929 -0
- package/dist/hooks/useUnifiedCompletion.js.map +7 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +7 -0
- package/dist/messages.js +33 -0
- package/dist/messages.js.map +7 -0
- package/dist/package.json +4 -0
- package/dist/permissions.js +194 -0
- package/dist/permissions.js.map +7 -0
- package/dist/query.js +499 -0
- package/dist/query.js.map +7 -0
- package/dist/screens/Doctor.js +22 -0
- package/dist/screens/Doctor.js.map +7 -0
- package/dist/screens/LogList.js +55 -0
- package/dist/screens/LogList.js.map +7 -0
- package/dist/screens/REPL.js +671 -0
- package/dist/screens/REPL.js.map +7 -0
- package/dist/screens/ResumeConversation.js +56 -0
- package/dist/screens/ResumeConversation.js.map +7 -0
- package/dist/services/adapters/base.js +29 -0
- package/dist/services/adapters/base.js.map +7 -0
- package/dist/services/adapters/chatCompletions.js +69 -0
- package/dist/services/adapters/chatCompletions.js.map +7 -0
- package/dist/services/adapters/responsesAPI.js +126 -0
- package/dist/services/adapters/responsesAPI.js.map +7 -0
- package/dist/services/claude.js +1573 -0
- package/dist/services/claude.js.map +7 -0
- package/dist/services/compressionService.js +210 -0
- package/dist/services/compressionService.js.map +7 -0
- package/dist/services/customCommands.js +437 -0
- package/dist/services/customCommands.js.map +7 -0
- package/dist/services/fileFreshness.js +275 -0
- package/dist/services/fileFreshness.js.map +7 -0
- package/dist/services/gpt5ConnectionTest.js +248 -0
- package/dist/services/gpt5ConnectionTest.js.map +7 -0
- package/dist/services/hookExecutor.js +276 -0
- package/dist/services/hookExecutor.js.map +7 -0
- package/dist/services/mainAgentCompressor.js +84 -0
- package/dist/services/mainAgentCompressor.js.map +7 -0
- package/dist/services/mcpClient.js +449 -0
- package/dist/services/mcpClient.js.map +7 -0
- package/dist/services/mcpServerApproval.js +55 -0
- package/dist/services/mcpServerApproval.js.map +7 -0
- package/dist/services/mentionProcessor.js +201 -0
- package/dist/services/mentionProcessor.js.map +7 -0
- package/dist/services/modelAdapterFactory.js +47 -0
- package/dist/services/modelAdapterFactory.js.map +7 -0
- package/dist/services/notifier.js +35 -0
- package/dist/services/notifier.js.map +7 -0
- package/dist/services/oauth.js +247 -0
- package/dist/services/oauth.js.map +7 -0
- package/dist/services/openai.js +995 -0
- package/dist/services/openai.js.map +7 -0
- package/dist/services/responseStateManager.js +68 -0
- package/dist/services/responseStateManager.js.map +7 -0
- package/dist/services/sentry.js +9 -0
- package/dist/services/sentry.js.map +7 -0
- package/dist/services/subagentAbortManager.js +95 -0
- package/dist/services/subagentAbortManager.js.map +7 -0
- package/dist/services/subagentCompressor.js +146 -0
- package/dist/services/subagentCompressor.js.map +7 -0
- package/dist/services/systemReminder.js +335 -0
- package/dist/services/systemReminder.js.map +7 -0
- package/dist/services/vcr.js +133 -0
- package/dist/services/vcr.js.map +7 -0
- package/dist/tools/ArchitectTool/ArchitectTool.js +119 -0
- package/dist/tools/ArchitectTool/ArchitectTool.js.map +7 -0
- package/dist/tools/ArchitectTool/prompt.js +18 -0
- package/dist/tools/ArchitectTool/prompt.js.map +7 -0
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +423 -0
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +7 -0
- package/dist/tools/BashOutputTool/BashOutputTool.js +120 -0
- package/dist/tools/BashOutputTool/BashOutputTool.js.map +7 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +11 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +7 -0
- package/dist/tools/BashOutputTool/prompt.js +13 -0
- package/dist/tools/BashOutputTool/prompt.js.map +7 -0
- package/dist/tools/BashTool/BashTool.js +209 -0
- package/dist/tools/BashTool/BashTool.js.map +7 -0
- package/dist/tools/BashTool/BashToolResultMessage.js +21 -0
- package/dist/tools/BashTool/BashToolResultMessage.js.map +7 -0
- package/dist/tools/BashTool/OutputLine.js +30 -0
- package/dist/tools/BashTool/OutputLine.js.map +7 -0
- package/dist/tools/BashTool/prompt.js +180 -0
- package/dist/tools/BashTool/prompt.js.map +7 -0
- package/dist/tools/BashTool/utils.js +51 -0
- package/dist/tools/BashTool/utils.js.map +7 -0
- package/dist/tools/FileEditTool/FileEditTool.js +226 -0
- package/dist/tools/FileEditTool/FileEditTool.js.map +7 -0
- package/dist/tools/FileEditTool/prompt.js +54 -0
- package/dist/tools/FileEditTool/prompt.js.map +7 -0
- package/dist/tools/FileEditTool/utils.js +42 -0
- package/dist/tools/FileEditTool/utils.js.map +7 -0
- package/dist/tools/FileReadTool/FileReadTool.js +272 -0
- package/dist/tools/FileReadTool/FileReadTool.js.map +7 -0
- package/dist/tools/FileReadTool/prompt.js +10 -0
- package/dist/tools/FileReadTool/prompt.js.map +7 -0
- package/dist/tools/FileWriteTool/FileWriteTool.js +202 -0
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +7 -0
- package/dist/tools/FileWriteTool/prompt.js +14 -0
- package/dist/tools/FileWriteTool/prompt.js.map +7 -0
- package/dist/tools/GlobTool/GlobTool.js +88 -0
- package/dist/tools/GlobTool/GlobTool.js.map +7 -0
- package/dist/tools/GlobTool/prompt.js +12 -0
- package/dist/tools/GlobTool/prompt.js.map +7 -0
- package/dist/tools/GrepTool/GrepTool.js +107 -0
- package/dist/tools/GrepTool/GrepTool.js.map +7 -0
- package/dist/tools/GrepTool/prompt.js +15 -0
- package/dist/tools/GrepTool/prompt.js.map +7 -0
- package/dist/tools/KillShellTool/KillShellTool.js +92 -0
- package/dist/tools/KillShellTool/KillShellTool.js.map +7 -0
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js +11 -0
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +7 -0
- package/dist/tools/KillShellTool/prompt.js +12 -0
- package/dist/tools/KillShellTool/prompt.js.map +7 -0
- package/dist/tools/MCPTool/MCPTool.js +90 -0
- package/dist/tools/MCPTool/MCPTool.js.map +7 -0
- package/dist/tools/MCPTool/prompt.js +7 -0
- package/dist/tools/MCPTool/prompt.js.map +7 -0
- package/dist/tools/MemoryReadTool/MemoryReadTool.js +103 -0
- package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +7 -0
- package/dist/tools/MemoryReadTool/prompt.js +7 -0
- package/dist/tools/MemoryReadTool/prompt.js.map +7 -0
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +77 -0
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +7 -0
- package/dist/tools/MemoryWriteTool/prompt.js +7 -0
- package/dist/tools/MemoryWriteTool/prompt.js.map +7 -0
- package/dist/tools/MultiEditTool/MultiEditTool.js +301 -0
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +7 -0
- package/dist/tools/MultiEditTool/prompt.js +48 -0
- package/dist/tools/MultiEditTool/prompt.js.map +7 -0
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +238 -0
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +7 -0
- package/dist/tools/NotebookEditTool/prompt.js +7 -0
- package/dist/tools/NotebookEditTool/prompt.js.map +7 -0
- package/dist/tools/NotebookReadTool/NotebookReadTool.js +212 -0
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +7 -0
- package/dist/tools/NotebookReadTool/prompt.js +7 -0
- package/dist/tools/NotebookReadTool/prompt.js.map +7 -0
- package/dist/tools/SkillTool/SkillTool.js +209 -0
- package/dist/tools/SkillTool/SkillTool.js.map +7 -0
- package/dist/tools/SkillTool/prompt.js +81 -0
- package/dist/tools/SkillTool/prompt.js.map +7 -0
- package/dist/tools/TaskTool/TaskTool.js +381 -0
- package/dist/tools/TaskTool/TaskTool.js.map +7 -0
- package/dist/tools/TaskTool/constants.js +5 -0
- package/dist/tools/TaskTool/constants.js.map +7 -0
- package/dist/tools/TaskTool/prompt.js +111 -0
- package/dist/tools/TaskTool/prompt.js.map +7 -0
- package/dist/tools/ThinkTool/ThinkTool.js +40 -0
- package/dist/tools/ThinkTool/ThinkTool.js.map +7 -0
- package/dist/tools/ThinkTool/prompt.js +16 -0
- package/dist/tools/ThinkTool/prompt.js.map +7 -0
- package/dist/tools/TodoWriteTool/TodoWriteTool.js +243 -0
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +7 -0
- package/dist/tools/TodoWriteTool/prompt.js +66 -0
- package/dist/tools/TodoWriteTool/prompt.js.map +7 -0
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +137 -0
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +7 -0
- package/dist/tools/URLFetcherTool/cache.js +45 -0
- package/dist/tools/URLFetcherTool/cache.js.map +7 -0
- package/dist/tools/URLFetcherTool/htmlToMarkdown.js +42 -0
- package/dist/tools/URLFetcherTool/htmlToMarkdown.js.map +7 -0
- package/dist/tools/URLFetcherTool/prompt.js +22 -0
- package/dist/tools/URLFetcherTool/prompt.js.map +7 -0
- package/dist/tools/WebSearchTool/WebSearchTool.js +86 -0
- package/dist/tools/WebSearchTool/WebSearchTool.js.map +7 -0
- package/dist/tools/WebSearchTool/prompt.js +17 -0
- package/dist/tools/WebSearchTool/prompt.js.map +7 -0
- package/dist/tools/WebSearchTool/searchProviders.js +48 -0
- package/dist/tools/WebSearchTool/searchProviders.js.map +7 -0
- package/dist/tools/lsTool/lsTool.js +201 -0
- package/dist/tools/lsTool/lsTool.js.map +7 -0
- package/dist/tools/lsTool/prompt.js +5 -0
- package/dist/tools/lsTool/prompt.js.map +7 -0
- package/dist/tools.js +70 -0
- package/dist/tools.js.map +7 -0
- package/dist/types/PermissionMode.js +82 -0
- package/dist/types/PermissionMode.js.map +7 -0
- package/dist/types/RequestContext.js +47 -0
- package/dist/types/RequestContext.js.map +7 -0
- package/dist/types/common.d.js +1 -0
- package/dist/types/common.d.js.map +7 -0
- package/dist/types/conversation.js +1 -0
- package/dist/types/conversation.js.map +7 -0
- package/dist/types/hooks.js +38 -0
- package/dist/types/hooks.js.map +7 -0
- package/dist/types/interactionRound.js +1 -0
- package/dist/types/interactionRound.js.map +7 -0
- package/dist/types/logs.js +1 -0
- package/dist/types/logs.js.map +7 -0
- package/dist/types/marketplace.js +101 -0
- package/dist/types/marketplace.js.map +7 -0
- package/dist/types/modelCapabilities.js +1 -0
- package/dist/types/modelCapabilities.js.map +7 -0
- package/dist/types/notebook.js +1 -0
- package/dist/types/notebook.js.map +7 -0
- package/dist/types/plugin.js +83 -0
- package/dist/types/plugin.js.map +7 -0
- package/dist/types/subagent.js +1 -0
- package/dist/types/subagent.js.map +7 -0
- package/dist/utils/BackgroundShellManager.js +215 -0
- package/dist/utils/BackgroundShellManager.js.map +7 -0
- package/dist/utils/Cursor.js +315 -0
- package/dist/utils/Cursor.js.map +7 -0
- package/dist/utils/PersistentShell.js +371 -0
- package/dist/utils/PersistentShell.js.map +7 -0
- package/dist/utils/advancedFuzzyMatcher.js +206 -0
- package/dist/utils/advancedFuzzyMatcher.js.map +7 -0
- package/dist/utils/agentLoader.js +244 -0
- package/dist/utils/agentLoader.js.map +7 -0
- package/dist/utils/agentStorage.js +59 -0
- package/dist/utils/agentStorage.js.map +7 -0
- package/dist/utils/array.js +7 -0
- package/dist/utils/array.js.map +7 -0
- package/dist/utils/ask.js +77 -0
- package/dist/utils/ask.js.map +7 -0
- package/dist/utils/auth.js +11 -0
- package/dist/utils/auth.js.map +7 -0
- package/dist/utils/autoCompactCore.js +126 -0
- package/dist/utils/autoCompactCore.js.map +7 -0
- package/dist/utils/autoUpdater.js +107 -0
- package/dist/utils/autoUpdater.js.map +7 -0
- package/dist/utils/browser.js +15 -0
- package/dist/utils/browser.js.map +7 -0
- package/dist/utils/cleanup.js +54 -0
- package/dist/utils/cleanup.js.map +7 -0
- package/dist/utils/commands.js +207 -0
- package/dist/utils/commands.js.map +7 -0
- package/dist/utils/commonUnixCommands.js +687 -0
- package/dist/utils/commonUnixCommands.js.map +7 -0
- package/dist/utils/compressionMode.js +47 -0
- package/dist/utils/compressionMode.js.map +7 -0
- package/dist/utils/config.js +651 -0
- package/dist/utils/config.js.map +7 -0
- package/dist/utils/conversationRecovery.js +35 -0
- package/dist/utils/conversationRecovery.js.map +7 -0
- package/dist/utils/debugLogger.js +889 -0
- package/dist/utils/debugLogger.js.map +7 -0
- package/dist/utils/diff.js +32 -0
- package/dist/utils/diff.js.map +7 -0
- package/dist/utils/env.js +44 -0
- package/dist/utils/env.js.map +7 -0
- package/dist/utils/errors.js +23 -0
- package/dist/utils/errors.js.map +7 -0
- package/dist/utils/execFileNoThrow.js +44 -0
- package/dist/utils/execFileNoThrow.js.map +7 -0
- package/dist/utils/expertChatStorage.js +78 -0
- package/dist/utils/expertChatStorage.js.map +7 -0
- package/dist/utils/file.js +282 -0
- package/dist/utils/file.js.map +7 -0
- package/dist/utils/fileRecoveryCore.js +41 -0
- package/dist/utils/fileRecoveryCore.js.map +7 -0
- package/dist/utils/format.js +41 -0
- package/dist/utils/format.js.map +7 -0
- package/dist/utils/fuzzyMatcher.js +252 -0
- package/dist/utils/fuzzyMatcher.js.map +7 -0
- package/dist/utils/generators.js +46 -0
- package/dist/utils/generators.js.map +7 -0
- package/dist/utils/git.js +83 -0
- package/dist/utils/git.js.map +7 -0
- package/dist/utils/hookManager.js +238 -0
- package/dist/utils/hookManager.js.map +7 -0
- package/dist/utils/http.js +7 -0
- package/dist/utils/http.js.map +7 -0
- package/dist/utils/imagePaste.js +29 -0
- package/dist/utils/imagePaste.js.map +7 -0
- package/dist/utils/json.js +16 -0
- package/dist/utils/json.js.map +7 -0
- package/dist/utils/log.js +329 -0
- package/dist/utils/log.js.map +7 -0
- package/dist/utils/markdown.js +187 -0
- package/dist/utils/markdown.js.map +7 -0
- package/dist/utils/marketplaceManager.js +474 -0
- package/dist/utils/marketplaceManager.js.map +7 -0
- package/dist/utils/messageContextManager.js +195 -0
- package/dist/utils/messageContextManager.js.map +7 -0
- package/dist/utils/messages.js +650 -0
- package/dist/utils/messages.js.map +7 -0
- package/dist/utils/model.js +677 -0
- package/dist/utils/model.js.map +7 -0
- package/dist/utils/permissions/filesystem.js +80 -0
- package/dist/utils/permissions/filesystem.js.map +7 -0
- package/dist/utils/pluginInstaller.js +491 -0
- package/dist/utils/pluginInstaller.js.map +7 -0
- package/dist/utils/pluginLoader.js +582 -0
- package/dist/utils/pluginLoader.js.map +7 -0
- package/dist/utils/pluginRegistry.js +111 -0
- package/dist/utils/pluginRegistry.js.map +7 -0
- package/dist/utils/pluginValidator.js +774 -0
- package/dist/utils/pluginValidator.js.map +7 -0
- package/dist/utils/ptyCompat.js +125 -0
- package/dist/utils/ptyCompat.js.map +7 -0
- package/dist/utils/replStateMachine.js +145 -0
- package/dist/utils/replStateMachine.js.map +7 -0
- package/dist/utils/ripgrep.js +131 -0
- package/dist/utils/ripgrep.js.map +7 -0
- package/dist/utils/roundConverter.js +262 -0
- package/dist/utils/roundConverter.js.map +7 -0
- package/dist/utils/secureFile.js +483 -0
- package/dist/utils/secureFile.js.map +7 -0
- package/dist/utils/sessionState.js +22 -0
- package/dist/utils/sessionState.js.map +7 -0
- package/dist/utils/skillLoader.js +79 -0
- package/dist/utils/skillLoader.js.map +7 -0
- package/dist/utils/state.js +24 -0
- package/dist/utils/state.js.map +7 -0
- package/dist/utils/style.js +31 -0
- package/dist/utils/style.js.map +7 -0
- package/dist/utils/terminal.js +47 -0
- package/dist/utils/terminal.js.map +7 -0
- package/dist/utils/theme.js +102 -0
- package/dist/utils/theme.js.map +7 -0
- package/dist/utils/thinking.js +59 -0
- package/dist/utils/thinking.js.map +7 -0
- package/dist/utils/todoChangeCalculator.js +64 -0
- package/dist/utils/todoChangeCalculator.js.map +7 -0
- package/dist/utils/todoStorage.js +291 -0
- package/dist/utils/todoStorage.js.map +7 -0
- package/dist/utils/tokens.js +30 -0
- package/dist/utils/tokens.js.map +7 -0
- package/dist/utils/toolExecutionController.js +109 -0
- package/dist/utils/toolExecutionController.js.map +7 -0
- package/dist/utils/unaryLogging.js +6 -0
- package/dist/utils/unaryLogging.js.map +7 -0
- package/dist/utils/user.js +40 -0
- package/dist/utils/user.js.map +7 -0
- package/dist/utils/validate.js +132 -0
- package/dist/utils/validate.js.map +7 -0
- package/dist/version.js +7 -0
- package/dist/version.js.map +7 -0
- package/dist/yoga.wasm +0 -0
- package/package.json +113 -0
- package/scripts/postinstall.js +18 -0
- package/yoga.wasm +0 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import React, { useState, useEffect } from "react";
|
|
2
|
+
import { Box, Text, useInput } from "ink";
|
|
3
|
+
import { getTheme } from "../../utils/theme.js";
|
|
4
|
+
import { getMarketplace } from "../../utils/marketplaceManager.js";
|
|
5
|
+
import { loadAllPlugins } from "../../utils/pluginLoader.js";
|
|
6
|
+
const PluginBrowser = ({
|
|
7
|
+
marketplace,
|
|
8
|
+
onNavigate,
|
|
9
|
+
onBack
|
|
10
|
+
}) => {
|
|
11
|
+
const theme = getTheme();
|
|
12
|
+
const [plugins, setPlugins] = useState([]);
|
|
13
|
+
const [installedPlugins, setInstalledPlugins] = useState(/* @__PURE__ */ new Set());
|
|
14
|
+
const [selectedPlugins, setSelectedPlugins] = useState(/* @__PURE__ */ new Set());
|
|
15
|
+
const [focusedIndex, setFocusedIndex] = useState(0);
|
|
16
|
+
const [loading, setLoading] = useState(true);
|
|
17
|
+
const [error, setError] = useState(null);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
loadPluginData();
|
|
20
|
+
}, [marketplace]);
|
|
21
|
+
const loadPluginData = () => {
|
|
22
|
+
try {
|
|
23
|
+
setLoading(true);
|
|
24
|
+
setError(null);
|
|
25
|
+
const marketplaceData = getMarketplace(marketplace);
|
|
26
|
+
if (!marketplaceData) {
|
|
27
|
+
setError(`Marketplace "${marketplace}" not found`);
|
|
28
|
+
setLoading(false);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const marketplacePlugins = marketplaceData.manifest.plugins;
|
|
32
|
+
setPlugins(marketplacePlugins);
|
|
33
|
+
const installed = loadAllPlugins();
|
|
34
|
+
const installedNames = new Set(
|
|
35
|
+
installed.filter(
|
|
36
|
+
(p) => p.source.type === "marketplace" && "marketplace" in p.source && p.source.marketplace === marketplace
|
|
37
|
+
).map((p) => p.manifest.name)
|
|
38
|
+
);
|
|
39
|
+
setInstalledPlugins(installedNames);
|
|
40
|
+
if (marketplacePlugins.length > 0) {
|
|
41
|
+
setFocusedIndex(0);
|
|
42
|
+
}
|
|
43
|
+
} catch (err) {
|
|
44
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
45
|
+
} finally {
|
|
46
|
+
setLoading(false);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const focusedPlugin = plugins[focusedIndex];
|
|
50
|
+
useInput(
|
|
51
|
+
(input, key) => {
|
|
52
|
+
if (loading || plugins.length === 0) return;
|
|
53
|
+
if (key.escape) {
|
|
54
|
+
onBack();
|
|
55
|
+
} else if (key.upArrow) {
|
|
56
|
+
setFocusedIndex((prev) => prev > 0 ? prev - 1 : plugins.length - 1);
|
|
57
|
+
} else if (key.downArrow) {
|
|
58
|
+
setFocusedIndex((prev) => prev < plugins.length - 1 ? prev + 1 : 0);
|
|
59
|
+
} else if (input === " ") {
|
|
60
|
+
const pluginName = focusedPlugin.name;
|
|
61
|
+
setSelectedPlugins((prev) => {
|
|
62
|
+
const newSet = new Set(prev);
|
|
63
|
+
if (newSet.has(pluginName)) {
|
|
64
|
+
newSet.delete(pluginName);
|
|
65
|
+
} else {
|
|
66
|
+
newSet.add(pluginName);
|
|
67
|
+
}
|
|
68
|
+
return newSet;
|
|
69
|
+
});
|
|
70
|
+
} else if (key.return) {
|
|
71
|
+
onNavigate({
|
|
72
|
+
screen: "plugin-details-install",
|
|
73
|
+
marketplace,
|
|
74
|
+
plugin: focusedPlugin.name
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
{ isActive: !loading && plugins.length > 0 }
|
|
79
|
+
);
|
|
80
|
+
if (loading) {
|
|
81
|
+
return /* @__PURE__ */ React.createElement(
|
|
82
|
+
Box,
|
|
83
|
+
{
|
|
84
|
+
flexDirection: "column",
|
|
85
|
+
borderStyle: "round",
|
|
86
|
+
borderColor: theme.secondaryBorder,
|
|
87
|
+
paddingX: 2,
|
|
88
|
+
paddingY: 1
|
|
89
|
+
},
|
|
90
|
+
/* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Loading plugins from ", marketplace, "...")
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
if (error) {
|
|
94
|
+
return /* @__PURE__ */ React.createElement(
|
|
95
|
+
Box,
|
|
96
|
+
{
|
|
97
|
+
flexDirection: "column",
|
|
98
|
+
borderStyle: "round",
|
|
99
|
+
borderColor: theme.error,
|
|
100
|
+
paddingX: 2,
|
|
101
|
+
paddingY: 1
|
|
102
|
+
},
|
|
103
|
+
/* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Error"),
|
|
104
|
+
/* @__PURE__ */ React.createElement(Text, null, error),
|
|
105
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press Esc to go back"))
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
if (plugins.length === 0) {
|
|
109
|
+
return /* @__PURE__ */ React.createElement(
|
|
110
|
+
Box,
|
|
111
|
+
{
|
|
112
|
+
flexDirection: "column",
|
|
113
|
+
borderStyle: "round",
|
|
114
|
+
borderColor: theme.secondaryBorder,
|
|
115
|
+
paddingX: 2,
|
|
116
|
+
paddingY: 1
|
|
117
|
+
},
|
|
118
|
+
/* @__PURE__ */ React.createElement(Text, { bold: true }, marketplace, " \u203A Install plugins"),
|
|
119
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "No plugins available in this marketplace")),
|
|
120
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press Esc to go back"))
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
const truncate = (text, maxLength) => {
|
|
124
|
+
if (text.length <= maxLength) return text;
|
|
125
|
+
return text.slice(0, maxLength - 3) + "...";
|
|
126
|
+
};
|
|
127
|
+
return /* @__PURE__ */ React.createElement(
|
|
128
|
+
Box,
|
|
129
|
+
{
|
|
130
|
+
flexDirection: "column",
|
|
131
|
+
borderStyle: "round",
|
|
132
|
+
borderColor: theme.secondaryBorder,
|
|
133
|
+
paddingX: 2,
|
|
134
|
+
paddingY: 1
|
|
135
|
+
},
|
|
136
|
+
/* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, marketplace, " \u203A Install plugins"),
|
|
137
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, plugins.map((plugin, index) => {
|
|
138
|
+
const isFocused = index === focusedIndex;
|
|
139
|
+
const isSelected = selectedPlugins.has(plugin.name);
|
|
140
|
+
const isInstalled = installedPlugins.has(plugin.name);
|
|
141
|
+
return /* @__PURE__ */ React.createElement(
|
|
142
|
+
PluginListItem,
|
|
143
|
+
{
|
|
144
|
+
key: plugin.name,
|
|
145
|
+
plugin,
|
|
146
|
+
isFocused,
|
|
147
|
+
isSelected,
|
|
148
|
+
isInstalled,
|
|
149
|
+
theme,
|
|
150
|
+
truncate
|
|
151
|
+
}
|
|
152
|
+
);
|
|
153
|
+
})),
|
|
154
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, selectedPlugins.size > 0 && /* @__PURE__ */ React.createElement(Text, { color: theme.success }, selectedPlugins.size, " plugin", selectedPlugins.size > 1 ? "s" : "", " selected"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Space: (de)select \xB7 Enter: details \xB7 \u2191\u2193: navigate \xB7 Esc: back"))
|
|
155
|
+
);
|
|
156
|
+
};
|
|
157
|
+
const PluginListItem = ({
|
|
158
|
+
plugin,
|
|
159
|
+
isFocused,
|
|
160
|
+
isSelected,
|
|
161
|
+
isInstalled,
|
|
162
|
+
theme,
|
|
163
|
+
truncate
|
|
164
|
+
}) => {
|
|
165
|
+
const infoItems = [];
|
|
166
|
+
if (plugin.version) {
|
|
167
|
+
infoItems.push(`v${plugin.version}`);
|
|
168
|
+
}
|
|
169
|
+
if (plugin.category) {
|
|
170
|
+
infoItems.push(`[${plugin.category}]`);
|
|
171
|
+
}
|
|
172
|
+
if (isInstalled) {
|
|
173
|
+
infoItems.push("(installed)");
|
|
174
|
+
}
|
|
175
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 0 }, /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: isFocused ? theme.success : void 0 }, isFocused ? "\u276F " : " "), /* @__PURE__ */ React.createElement(Text, { color: isFocused ? theme.success : void 0 }, isSelected ? "\u25C9" : "\u25EF", " "), /* @__PURE__ */ React.createElement(Text, { bold: isFocused, color: isInstalled ? theme.dimColor : void 0 }, plugin.name), infoItems.length > 0 && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", infoItems.join(" "))), plugin.description && /* @__PURE__ */ React.createElement(Box, { marginLeft: 4 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, truncate(plugin.description, 70))));
|
|
176
|
+
};
|
|
177
|
+
export {
|
|
178
|
+
PluginBrowser
|
|
179
|
+
};
|
|
180
|
+
//# sourceMappingURL=PluginBrowser.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/commands/plugin/PluginBrowser.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * Plugin Browser Component\n *\n * Browse and select plugins from a marketplace with multi-select support\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { getMarketplace } from '@utils/marketplaceManager'\nimport { loadAllPlugins } from '@utils/pluginLoader'\nimport { MarketplacePlugin } from '../../types/marketplace'\nimport { NavigationProps } from './types'\n\ninterface PluginBrowserProps extends NavigationProps {\n marketplace: string\n}\n\nexport const PluginBrowser: React.FC<PluginBrowserProps> = ({\n marketplace,\n onNavigate,\n onBack,\n}) => {\n const theme = getTheme()\n const [plugins, setPlugins] = useState<MarketplacePlugin[]>([])\n const [installedPlugins, setInstalledPlugins] = useState<Set<string>>(new Set())\n const [selectedPlugins, setSelectedPlugins] = useState<Set<string>>(new Set())\n const [focusedIndex, setFocusedIndex] = useState(0)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n loadPluginData()\n }, [marketplace])\n\n const loadPluginData = () => {\n try {\n setLoading(true)\n setError(null)\n\n // Load marketplace\n const marketplaceData = getMarketplace(marketplace)\n if (!marketplaceData) {\n setError(`Marketplace \"${marketplace}\" not found`)\n setLoading(false)\n return\n }\n\n // Load plugins from marketplace\n const marketplacePlugins = marketplaceData.manifest.plugins\n setPlugins(marketplacePlugins)\n\n // Load installed plugins to show which are already installed\n const installed = loadAllPlugins()\n const installedNames = new Set(\n installed\n .filter(\n (p) =>\n p.source.type === 'marketplace' &&\n 'marketplace' in p.source &&\n p.source.marketplace === marketplace\n )\n .map((p) => p.manifest.name)\n )\n setInstalledPlugins(installedNames)\n\n // Focus first plugin if available\n if (marketplacePlugins.length > 0) {\n setFocusedIndex(0)\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setLoading(false)\n }\n }\n\n const focusedPlugin = plugins[focusedIndex]\n\n // Keyboard input handling\n useInput(\n (input, key) => {\n if (loading || plugins.length === 0) return\n\n if (key.escape) {\n onBack()\n } else if (key.upArrow) {\n setFocusedIndex((prev) => (prev > 0 ? prev - 1 : plugins.length - 1))\n } else if (key.downArrow) {\n setFocusedIndex((prev) => (prev < plugins.length - 1 ? prev + 1 : 0))\n } else if (input === ' ') {\n // Toggle selection with Space\n const pluginName = focusedPlugin.name\n setSelectedPlugins((prev) => {\n const newSet = new Set(prev)\n if (newSet.has(pluginName)) {\n newSet.delete(pluginName)\n } else {\n newSet.add(pluginName)\n }\n return newSet\n })\n } else if (key.return) {\n // View details on Enter\n onNavigate({\n screen: 'plugin-details-install',\n marketplace,\n plugin: focusedPlugin.name,\n })\n }\n },\n { isActive: !loading && plugins.length > 0 }\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 plugins from {marketplace}...</Text>\n </Box>\n )\n }\n\n if (error) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.error}>Error</Text>\n <Text>{error}</Text>\n <Box marginTop={1}>\n <Text dimColor>Press Esc to go back</Text>\n </Box>\n </Box>\n )\n }\n\n if (plugins.length === 0) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>{marketplace} \u203A Install plugins</Text>\n <Box marginTop={1}>\n <Text dimColor>No plugins available in this marketplace</Text>\n </Box>\n <Box marginTop={1}>\n <Text dimColor>Press Esc to go back</Text>\n </Box>\n </Box>\n )\n }\n\n // Helper to truncate text\n const truncate = (text: string, maxLength: number): string => {\n if (text.length <= maxLength) return text\n return text.slice(0, maxLength - 3) + '...'\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 {marketplace} \u203A Install plugins\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n {plugins.map((plugin, index) => {\n const isFocused = index === focusedIndex\n const isSelected = selectedPlugins.has(plugin.name)\n const isInstalled = installedPlugins.has(plugin.name)\n\n return (\n <PluginListItem\n key={plugin.name}\n plugin={plugin}\n isFocused={isFocused}\n isSelected={isSelected}\n isInstalled={isInstalled}\n theme={theme}\n truncate={truncate}\n />\n )\n })}\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n {selectedPlugins.size > 0 && (\n <Text color={theme.success}>\n {selectedPlugins.size} plugin{selectedPlugins.size > 1 ? 's' : ''} selected\n </Text>\n )}\n <Text dimColor>\n Space: (de)select \u00B7 Enter: details \u00B7 \u2191\u2193: navigate \u00B7 Esc: back\n </Text>\n </Box>\n </Box>\n )\n}\n\ninterface PluginListItemProps {\n plugin: MarketplacePlugin\n isFocused: boolean\n isSelected: boolean\n isInstalled: boolean\n theme: any\n truncate: (text: string, maxLength: number) => string\n}\n\nconst PluginListItem: React.FC<PluginListItemProps> = ({\n plugin,\n isFocused,\n isSelected,\n isInstalled,\n theme,\n truncate,\n}) => {\n // Build plugin info line\n const infoItems: string[] = []\n if (plugin.version) {\n infoItems.push(`v${plugin.version}`)\n }\n if (plugin.category) {\n infoItems.push(`[${plugin.category}]`)\n }\n if (isInstalled) {\n infoItems.push('(installed)')\n }\n\n return (\n <Box flexDirection=\"column\" marginBottom={0}>\n <Box>\n <Text color={isFocused ? theme.success : undefined}>\n {isFocused ? '\u276F ' : ' '}\n </Text>\n <Text color={isFocused ? theme.success : undefined}>\n {isSelected ? '\u25C9' : '\u25EF'}{' '}\n </Text>\n <Text bold={isFocused} color={isInstalled ? theme.dimColor : undefined}>\n {plugin.name}\n </Text>\n {infoItems.length > 0 && (\n <Text dimColor> {infoItems.join(' ')}</Text>\n )}\n </Box>\n {plugin.description && (\n <Box marginLeft={4}>\n <Text dimColor>{truncate(plugin.description, 70)}</Text>\n </Box>\n )}\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import React, { useState, useEffect } from "react";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { Select } from "../../components/CustomSelect/select.js";
|
|
4
|
+
import { getTheme } from "../../utils/theme.js";
|
|
5
|
+
import { getMarketplace, installPluginFromMarketplace } from "../../utils/marketplaceManager.js";
|
|
6
|
+
import { formatAuthor } from "./utils.js";
|
|
7
|
+
import { spawn } from "child_process";
|
|
8
|
+
const PluginDetailsInstall = ({
|
|
9
|
+
marketplace,
|
|
10
|
+
plugin,
|
|
11
|
+
onNavigate,
|
|
12
|
+
onBack,
|
|
13
|
+
onDone
|
|
14
|
+
}) => {
|
|
15
|
+
const theme = getTheme();
|
|
16
|
+
const [pluginData, setPluginData] = useState(null);
|
|
17
|
+
const [installing, setInstalling] = useState(false);
|
|
18
|
+
const [installError, setInstallError] = useState(null);
|
|
19
|
+
const [installSuccess, setInstallSuccess] = useState(false);
|
|
20
|
+
const [loading, setLoading] = useState(true);
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
loadPluginDetails();
|
|
23
|
+
}, [marketplace, plugin]);
|
|
24
|
+
const loadPluginDetails = () => {
|
|
25
|
+
try {
|
|
26
|
+
setLoading(true);
|
|
27
|
+
const marketplaceData = getMarketplace(marketplace);
|
|
28
|
+
if (!marketplaceData) {
|
|
29
|
+
setPluginData(null);
|
|
30
|
+
setLoading(false);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const pluginInfo = marketplaceData.manifest.plugins.find((p) => p.name === plugin);
|
|
34
|
+
setPluginData(pluginInfo || null);
|
|
35
|
+
} catch (err) {
|
|
36
|
+
console.error("Error loading plugin details:", err);
|
|
37
|
+
setPluginData(null);
|
|
38
|
+
} finally {
|
|
39
|
+
setLoading(false);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const handleInstall = async () => {
|
|
43
|
+
if (!pluginData) return;
|
|
44
|
+
setInstalling(true);
|
|
45
|
+
setInstallError(null);
|
|
46
|
+
setInstallSuccess(false);
|
|
47
|
+
try {
|
|
48
|
+
const installPath = await installPluginFromMarketplace(plugin, marketplace);
|
|
49
|
+
setInstallSuccess(true);
|
|
50
|
+
setInstalling(false);
|
|
51
|
+
setTimeout(() => {
|
|
52
|
+
onBack();
|
|
53
|
+
}, 1500);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
setInstalling(false);
|
|
56
|
+
setInstallError(error instanceof Error ? error.message : String(error));
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
const handleOpenHomepage = () => {
|
|
60
|
+
if (!pluginData?.homepage) return;
|
|
61
|
+
const url = pluginData.homepage;
|
|
62
|
+
const command = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
|
|
63
|
+
spawn(command, [url], { detached: true, stdio: "ignore" }).unref();
|
|
64
|
+
};
|
|
65
|
+
const handleAction = (value) => {
|
|
66
|
+
if (value === "install") {
|
|
67
|
+
handleInstall();
|
|
68
|
+
} else if (value === "homepage") {
|
|
69
|
+
handleOpenHomepage();
|
|
70
|
+
} else if (value === "back") {
|
|
71
|
+
onBack();
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
if (loading) {
|
|
75
|
+
return /* @__PURE__ */ React.createElement(
|
|
76
|
+
Box,
|
|
77
|
+
{
|
|
78
|
+
flexDirection: "column",
|
|
79
|
+
borderStyle: "round",
|
|
80
|
+
borderColor: theme.secondaryBorder,
|
|
81
|
+
paddingX: 2,
|
|
82
|
+
paddingY: 1
|
|
83
|
+
},
|
|
84
|
+
/* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Loading plugin details...")
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
if (!pluginData) {
|
|
88
|
+
return /* @__PURE__ */ React.createElement(
|
|
89
|
+
Box,
|
|
90
|
+
{
|
|
91
|
+
flexDirection: "column",
|
|
92
|
+
borderStyle: "round",
|
|
93
|
+
borderColor: theme.error,
|
|
94
|
+
paddingX: 2,
|
|
95
|
+
paddingY: 1
|
|
96
|
+
},
|
|
97
|
+
/* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Plugin not found"),
|
|
98
|
+
/* @__PURE__ */ React.createElement(Text, { dimColor: true }, 'Plugin "', plugin, '" not found in marketplace "', marketplace, '"'),
|
|
99
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press Esc to go back"))
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
const actions = [
|
|
103
|
+
{ label: "Install now", value: "install" }
|
|
104
|
+
];
|
|
105
|
+
if (pluginData.homepage) {
|
|
106
|
+
actions.push({ label: "Open homepage", value: "homepage" });
|
|
107
|
+
}
|
|
108
|
+
actions.push({ label: "Back to plugin list", value: "back" });
|
|
109
|
+
const formatSource = (source) => {
|
|
110
|
+
if (typeof source === "string") {
|
|
111
|
+
return `Relative: ${source}`;
|
|
112
|
+
}
|
|
113
|
+
if (source.source === "github") {
|
|
114
|
+
return `GitHub: ${source.repo}${source.ref ? `@${source.ref}` : ""}`;
|
|
115
|
+
}
|
|
116
|
+
if (source.source === "url") {
|
|
117
|
+
return `URL: ${source.url}`;
|
|
118
|
+
}
|
|
119
|
+
if (source.source === "local") {
|
|
120
|
+
return `Local: ${source.path}`;
|
|
121
|
+
}
|
|
122
|
+
return "Unknown";
|
|
123
|
+
};
|
|
124
|
+
return /* @__PURE__ */ React.createElement(
|
|
125
|
+
Box,
|
|
126
|
+
{
|
|
127
|
+
flexDirection: "column",
|
|
128
|
+
borderStyle: "round",
|
|
129
|
+
borderColor: theme.secondaryBorder,
|
|
130
|
+
paddingX: 2,
|
|
131
|
+
paddingY: 1
|
|
132
|
+
},
|
|
133
|
+
/* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Plugin Details"),
|
|
134
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column", gap: 0 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.success }, pluginData.name), pluginData.version && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " v", pluginData.version), pluginData.category && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " [", pluginData.category, "]")), pluginData.description && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, null, pluginData.description)), pluginData.author && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "By: ", formatAuthor(pluginData.author))), pluginData.license && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "License: ", pluginData.license)), pluginData.homepage && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Homepage: ", pluginData.homepage)), pluginData.repository && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Repository: ", pluginData.repository)), /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Source: ", formatSource(pluginData.source))), pluginData.keywords && pluginData.keywords.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Keywords: ", pluginData.keywords.join(", "))), /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Will install:"), pluginData.agents && pluginData.agents.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 Agents: ", pluginData.agents.join(", "))), pluginData.commands && pluginData.commands.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 Commands: ", pluginData.commands.join(", "))), pluginData.skills && pluginData.skills.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 Skills: ", pluginData.skills.join(", "))), pluginData.hooks && pluginData.hooks.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 Hooks: ", pluginData.hooks.join(", "))), pluginData.mcpServers && pluginData.mcpServers.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 MCP Servers: ", pluginData.mcpServers.join(", "))), !pluginData.agents?.length && !pluginData.commands?.length && !pluginData.skills?.length && !pluginData.hooks?.length && !pluginData.mcpServers?.length && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Components will be auto-discovered from plugin directory")))),
|
|
135
|
+
installing && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Installing ", pluginData.name, "...")),
|
|
136
|
+
installSuccess && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "\u2713 Successfully installed ", pluginData.name)),
|
|
137
|
+
installError && /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "\u2717 Installation failed"), /* @__PURE__ */ React.createElement(Text, { color: theme.error }, installError)),
|
|
138
|
+
!installing && !installSuccess && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(
|
|
139
|
+
Select,
|
|
140
|
+
{
|
|
141
|
+
options: actions,
|
|
142
|
+
onChange: handleAction,
|
|
143
|
+
visibleOptionCount: Math.min(actions.length, 5)
|
|
144
|
+
}
|
|
145
|
+
)),
|
|
146
|
+
!installing && !installSuccess && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2191\u2193: Navigate \xB7 Enter: Select \xB7 Esc: Back"))
|
|
147
|
+
);
|
|
148
|
+
};
|
|
149
|
+
export {
|
|
150
|
+
PluginDetailsInstall
|
|
151
|
+
};
|
|
152
|
+
//# sourceMappingURL=PluginDetailsInstall.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/commands/plugin/PluginDetailsInstall.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * Plugin Details & Install Component\n *\n * Shows complete plugin information and installation actions\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 { getMarketplace, installPluginFromMarketplace } from '@utils/marketplaceManager'\nimport { MarketplacePlugin } from '../../types/marketplace'\nimport { NavigationProps } from './types'\nimport { formatAuthor } from './utils'\nimport { spawn } from 'child_process'\n\ninterface PluginDetailsInstallProps extends NavigationProps {\n marketplace: string\n plugin: string\n}\n\nexport const PluginDetailsInstall: React.FC<PluginDetailsInstallProps> = ({\n marketplace,\n plugin,\n onNavigate,\n onBack,\n onDone,\n}) => {\n const theme = getTheme()\n const [pluginData, setPluginData] = useState<MarketplacePlugin | null>(null)\n const [installing, setInstalling] = useState(false)\n const [installError, setInstallError] = useState<string | null>(null)\n const [installSuccess, setInstallSuccess] = useState(false)\n const [loading, setLoading] = useState(true)\n\n useEffect(() => {\n loadPluginDetails()\n }, [marketplace, plugin])\n\n const loadPluginDetails = () => {\n try {\n setLoading(true)\n\n const marketplaceData = getMarketplace(marketplace)\n if (!marketplaceData) {\n setPluginData(null)\n setLoading(false)\n return\n }\n\n const pluginInfo = marketplaceData.manifest.plugins.find((p) => p.name === plugin)\n setPluginData(pluginInfo || null)\n } catch (err) {\n console.error('Error loading plugin details:', err)\n setPluginData(null)\n } finally {\n setLoading(false)\n }\n }\n\n const handleInstall = async () => {\n if (!pluginData) return\n\n setInstalling(true)\n setInstallError(null)\n setInstallSuccess(false)\n\n try {\n // Install the plugin\n const installPath = await installPluginFromMarketplace(plugin, marketplace)\n\n setInstallSuccess(true)\n setInstalling(false)\n\n // Auto-navigate back after short delay to show success message\n setTimeout(() => {\n onBack()\n }, 1500)\n } catch (error) {\n setInstalling(false)\n setInstallError(error instanceof Error ? error.message : String(error))\n }\n }\n\n const handleOpenHomepage = () => {\n if (!pluginData?.homepage) return\n\n // Open URL in default browser\n const url = pluginData.homepage\n const command = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open'\n\n spawn(command, [url], { detached: true, stdio: 'ignore' }).unref()\n }\n\n const handleAction = (value: string) => {\n if (value === 'install') {\n handleInstall()\n } else if (value === 'homepage') {\n handleOpenHomepage()\n } else if (value === 'back') {\n onBack()\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 plugin details...</Text>\n </Box>\n )\n }\n\n if (!pluginData) {\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}>Plugin not found</Text>\n <Text dimColor>\n Plugin \"{plugin}\" not found in marketplace \"{marketplace}\"\n </Text>\n <Box marginTop={1}>\n <Text dimColor>Press Esc to go back</Text>\n </Box>\n </Box>\n )\n }\n\n // Build action menu\n const actions: Option[] = [\n { label: 'Install now', value: 'install' },\n ]\n\n if (pluginData.homepage) {\n actions.push({ label: 'Open homepage', value: 'homepage' })\n }\n\n actions.push({ label: 'Back to plugin list', value: 'back' })\n\n // Helper to format source\n const formatSource = (source: any): string => {\n if (typeof source === 'string') {\n return `Relative: ${source}`\n }\n if (source.source === 'github') {\n return `GitHub: ${source.repo}${source.ref ? `@${source.ref}` : ''}`\n }\n if (source.source === 'url') {\n return `URL: ${source.url}`\n }\n if (source.source === 'local') {\n return `Local: ${source.path}`\n }\n return 'Unknown'\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 Plugin Details\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\" gap={0}>\n {/* Plugin name and version */}\n <Text>\n <Text bold color={theme.success}>\n {pluginData.name}\n </Text>\n {pluginData.version && <Text dimColor> v{pluginData.version}</Text>}\n {pluginData.category && <Text dimColor> [{pluginData.category}]</Text>}\n </Text>\n\n {/* Description */}\n {pluginData.description && (\n <Box marginTop={0}>\n <Text>{pluginData.description}</Text>\n </Box>\n )}\n\n {/* Author */}\n {pluginData.author && (\n <Box marginTop={0}>\n <Text dimColor>By: {formatAuthor(pluginData.author)}</Text>\n </Box>\n )}\n\n {/* License */}\n {pluginData.license && (\n <Box marginTop={0}>\n <Text dimColor>License: {pluginData.license}</Text>\n </Box>\n )}\n\n {/* Homepage */}\n {pluginData.homepage && (\n <Box marginTop={0}>\n <Text dimColor>Homepage: {pluginData.homepage}</Text>\n </Box>\n )}\n\n {/* Repository */}\n {pluginData.repository && (\n <Box marginTop={0}>\n <Text dimColor>Repository: {pluginData.repository}</Text>\n </Box>\n )}\n\n {/* Source */}\n <Box marginTop={0}>\n <Text dimColor>Source: {formatSource(pluginData.source)}</Text>\n </Box>\n\n {/* Keywords/Tags */}\n {pluginData.keywords && pluginData.keywords.length > 0 && (\n <Box marginTop={0}>\n <Text dimColor>Keywords: {pluginData.keywords.join(', ')}</Text>\n </Box>\n )}\n\n {/* Components */}\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Will install:</Text>\n {pluginData.agents && pluginData.agents.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Agents: {pluginData.agents.join(', ')}</Text>\n </Box>\n )}\n {pluginData.commands && pluginData.commands.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Commands: {pluginData.commands.join(', ')}</Text>\n </Box>\n )}\n {pluginData.skills && pluginData.skills.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Skills: {pluginData.skills.join(', ')}</Text>\n </Box>\n )}\n {pluginData.hooks && pluginData.hooks.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Hooks: {pluginData.hooks.join(', ')}</Text>\n </Box>\n )}\n {pluginData.mcpServers && pluginData.mcpServers.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 MCP Servers: {pluginData.mcpServers.join(', ')}</Text>\n </Box>\n )}\n {!pluginData.agents?.length &&\n !pluginData.commands?.length &&\n !pluginData.skills?.length &&\n !pluginData.hooks?.length &&\n !pluginData.mcpServers?.length && (\n <Box marginLeft={2}>\n <Text dimColor>Components will be auto-discovered from plugin directory</Text>\n </Box>\n )}\n </Box>\n </Box>\n\n {/* Installation status */}\n {installing && (\n <Box marginTop={1}>\n <Text color={theme.primary}>Installing {pluginData.name}...</Text>\n </Box>\n )}\n\n {installSuccess && (\n <Box marginTop={1}>\n <Text color={theme.success}>\u2713 Successfully installed {pluginData.name}</Text>\n </Box>\n )}\n\n {installError && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={theme.error}>\u2717 Installation failed</Text>\n <Text color={theme.error}>{installError}</Text>\n </Box>\n )}\n\n {/* Action menu */}\n {!installing && !installSuccess && (\n <Box marginTop={1}>\n <Select\n options={actions}\n onChange={handleAction}\n visibleOptionCount={Math.min(actions.length, 5)}\n />\n </Box>\n )}\n\n {/* Help text */}\n {!installing && !installSuccess && (\n <Box marginTop={1}>\n <Text dimColor>\u2191\u2193: Navigate \u00B7 Enter: Select \u00B7 Esc: Back</Text>\n </Box>\n )}\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAMA,OAAO,SAAS,UAAU,iBAAiB;AAC3C,SAAS,KAAK,YAAY;AAC1B,SAAS,cAAc;AAEvB,SAAS,gBAAgB;AACzB,SAAS,gBAAgB,oCAAoC;AAG7D,SAAS,oBAAoB;AAC7B,SAAS,aAAa;AAOf,MAAM,uBAA4D,CAAC;AAAA,EACxE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,SAAS;AACvB,QAAM,CAAC,YAAY,aAAa,IAAI,SAAmC,IAAI;AAC3E,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAwB,IAAI;AACpE,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,KAAK;AAC1D,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAE3C,YAAU,MAAM;AACd,sBAAkB;AAAA,EACpB,GAAG,CAAC,aAAa,MAAM,CAAC;AAExB,QAAM,oBAAoB,MAAM;AAC9B,QAAI;AACF,iBAAW,IAAI;AAEf,YAAM,kBAAkB,eAAe,WAAW;AAClD,UAAI,CAAC,iBAAiB;AACpB,sBAAc,IAAI;AAClB,mBAAW,KAAK;AAChB;AAAA,MACF;AAEA,YAAM,aAAa,gBAAgB,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AACjF,oBAAc,cAAc,IAAI;AAAA,IAClC,SAAS,KAAK;AACZ,cAAQ,MAAM,iCAAiC,GAAG;AAClD,oBAAc,IAAI;AAAA,IACpB,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,gBAAgB,YAAY;AAChC,QAAI,CAAC,WAAY;AAEjB,kBAAc,IAAI;AAClB,oBAAgB,IAAI;AACpB,sBAAkB,KAAK;AAEvB,QAAI;AAEF,YAAM,cAAc,MAAM,6BAA6B,QAAQ,WAAW;AAE1E,wBAAkB,IAAI;AACtB,oBAAc,KAAK;AAGnB,iBAAW,MAAM;AACf,eAAO;AAAA,MACT,GAAG,IAAI;AAAA,IACT,SAAS,OAAO;AACd,oBAAc,KAAK;AACnB,sBAAgB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,qBAAqB,MAAM;AAC/B,QAAI,CAAC,YAAY,SAAU;AAG3B,UAAM,MAAM,WAAW;AACvB,UAAM,UAAU,QAAQ,aAAa,WAAW,SAAS,QAAQ,aAAa,UAAU,UAAU;AAElG,UAAM,SAAS,CAAC,GAAG,GAAG,EAAE,UAAU,MAAM,OAAO,SAAS,CAAC,EAAE,MAAM;AAAA,EACnE;AAEA,QAAM,eAAe,CAAC,UAAkB;AACtC,QAAI,UAAU,WAAW;AACvB,oBAAc;AAAA,IAChB,WAAW,UAAU,YAAY;AAC/B,yBAAmB;AAAA,IACrB,WAAW,UAAU,QAAQ;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,SAAS;AACX,WACE;AAAA,MAAC;AAAA;AAAA,QACC,eAAc;AAAA,QACd,aAAY;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB,UAAU;AAAA,QACV,UAAU;AAAA;AAAA,MAEV,oCAAC,QAAK,OAAO,MAAM,WAAS,2BAAyB;AAAA,IACvD;AAAA,EAEJ;AAEA,MAAI,CAAC,YAAY;AACf,WACE;AAAA,MAAC;AAAA;AAAA,QACC,eAAc;AAAA,QACd,aAAY;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB,UAAU;AAAA,QACV,UAAU;AAAA;AAAA,MAEV,oCAAC,QAAK,OAAO,MAAM,SAAO,kBAAgB;AAAA,MAC1C,oCAAC,QAAK,UAAQ,QAAC,YACJ,QAAO,gCAA6B,aAAY,GAC3D;AAAA,MACA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,sBAAoB,CACrC;AAAA,IACF;AAAA,EAEJ;AAGA,QAAM,UAAoB;AAAA,IACxB,EAAE,OAAO,eAAe,OAAO,UAAU;AAAA,EAC3C;AAEA,MAAI,WAAW,UAAU;AACvB,YAAQ,KAAK,EAAE,OAAO,iBAAiB,OAAO,WAAW,CAAC;AAAA,EAC5D;AAEA,UAAQ,KAAK,EAAE,OAAO,uBAAuB,OAAO,OAAO,CAAC;AAG5D,QAAM,eAAe,CAAC,WAAwB;AAC5C,QAAI,OAAO,WAAW,UAAU;AAC9B,aAAO,aAAa,MAAM;AAAA,IAC5B;AACA,QAAI,OAAO,WAAW,UAAU;AAC9B,aAAO,WAAW,OAAO,IAAI,GAAG,OAAO,MAAM,IAAI,OAAO,GAAG,KAAK,EAAE;AAAA,IACpE;AACA,QAAI,OAAO,WAAW,OAAO;AAC3B,aAAO,QAAQ,OAAO,GAAG;AAAA,IAC3B;AACA,QAAI,OAAO,WAAW,SAAS;AAC7B,aAAO,UAAU,OAAO,IAAI;AAAA,IAC9B;AACA,WAAO;AAAA,EACT;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,IAEV,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,gBAEjC;AAAA,IAEA,oCAAC,OAAI,WAAW,GAAG,eAAc,UAAS,KAAK,KAE7C,oCAAC,YACC,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WACrB,WAAW,IACd,GACC,WAAW,WAAW,oCAAC,QAAK,UAAQ,QAAC,MAAG,WAAW,OAAQ,GAC3D,WAAW,YAAY,oCAAC,QAAK,UAAQ,QAAC,MAAG,WAAW,UAAS,GAAC,CACjE,GAGC,WAAW,eACV,oCAAC,OAAI,WAAW,KACd,oCAAC,YAAM,WAAW,WAAY,CAChC,GAID,WAAW,UACV,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,QAAK,aAAa,WAAW,MAAM,CAAE,CACtD,GAID,WAAW,WACV,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,aAAU,WAAW,OAAQ,CAC9C,GAID,WAAW,YACV,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,cAAW,WAAW,QAAS,CAChD,GAID,WAAW,cACV,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,gBAAa,WAAW,UAAW,CACpD,GAIF,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,YAAS,aAAa,WAAW,MAAM,CAAE,CAC1D,GAGC,WAAW,YAAY,WAAW,SAAS,SAAS,KACnD,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,cAAW,WAAW,SAAS,KAAK,IAAI,CAAE,CAC3D,GAIF,oCAAC,OAAI,WAAW,GAAG,eAAc,YAC/B,oCAAC,QAAK,MAAI,QAAC,eAAa,GACvB,WAAW,UAAU,WAAW,OAAO,SAAS,KAC/C,oCAAC,OAAI,YAAY,KACf,oCAAC,YAAK,mBAAW,WAAW,OAAO,KAAK,IAAI,CAAE,CAChD,GAED,WAAW,YAAY,WAAW,SAAS,SAAS,KACnD,oCAAC,OAAI,YAAY,KACf,oCAAC,YAAK,qBAAa,WAAW,SAAS,KAAK,IAAI,CAAE,CACpD,GAED,WAAW,UAAU,WAAW,OAAO,SAAS,KAC/C,oCAAC,OAAI,YAAY,KACf,oCAAC,YAAK,mBAAW,WAAW,OAAO,KAAK,IAAI,CAAE,CAChD,GAED,WAAW,SAAS,WAAW,MAAM,SAAS,KAC7C,oCAAC,OAAI,YAAY,KACf,oCAAC,YAAK,kBAAU,WAAW,MAAM,KAAK,IAAI,CAAE,CAC9C,GAED,WAAW,cAAc,WAAW,WAAW,SAAS,KACvD,oCAAC,OAAI,YAAY,KACf,oCAAC,YAAK,wBAAgB,WAAW,WAAW,KAAK,IAAI,CAAE,CACzD,GAED,CAAC,WAAW,QAAQ,UACnB,CAAC,WAAW,UAAU,UACtB,CAAC,WAAW,QAAQ,UACpB,CAAC,WAAW,OAAO,UACnB,CAAC,WAAW,YAAY,UACtB,oCAAC,OAAI,YAAY,KACf,oCAAC,QAAK,UAAQ,QAAC,0DAAwD,CACzE,CAEN,CACF;AAAA,IAGC,cACC,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAO,MAAM,WAAS,eAAY,WAAW,MAAK,KAAG,CAC7D;AAAA,IAGD,kBACC,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAO,MAAM,WAAS,kCAA0B,WAAW,IAAK,CACxE;AAAA,IAGD,gBACC,oCAAC,OAAI,WAAW,GAAG,eAAc,YAC/B,oCAAC,QAAK,OAAO,MAAM,SAAO,4BAAqB,GAC/C,oCAAC,QAAK,OAAO,MAAM,SAAQ,YAAa,CAC1C;AAAA,IAID,CAAC,cAAc,CAAC,kBACf,oCAAC,OAAI,WAAW,KACd;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,UAAU;AAAA,QACV,oBAAoB,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAAA;AAAA,IAChD,CACF;AAAA,IAID,CAAC,cAAc,CAAC,kBACf,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,0DAAwC,CACzD;AAAA,EAEJ;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import React, { useState, useEffect, useCallback } from "react";
|
|
2
|
+
import { Box, Text, useInput } from "ink";
|
|
3
|
+
import { getPlugin, togglePluginEnabled } from "../../utils/pluginLoader.js";
|
|
4
|
+
import { updateMarketplace, installPluginFromMarketplace } from "../../utils/marketplaceManager.js";
|
|
5
|
+
import { getTheme } from "../../utils/theme.js";
|
|
6
|
+
import { formatAuthor } from "./utils.js";
|
|
7
|
+
import { rmSync } from "fs";
|
|
8
|
+
const PluginDetailsManage = ({
|
|
9
|
+
plugin,
|
|
10
|
+
onNavigate,
|
|
11
|
+
onBack
|
|
12
|
+
}) => {
|
|
13
|
+
const [pluginData, setPluginData] = useState(plugin);
|
|
14
|
+
const [selectedIndex, setSelectedIndex] = useState(0);
|
|
15
|
+
const [showConfirm, setShowConfirm] = useState(false);
|
|
16
|
+
const [confirmAction, setConfirmAction] = useState(null);
|
|
17
|
+
const [actionInProgress, setActionInProgress] = useState(false);
|
|
18
|
+
const [actionMessage, setActionMessage] = useState("");
|
|
19
|
+
const theme = getTheme();
|
|
20
|
+
const marketplace = pluginData.source.type === "marketplace" ? pluginData.source.marketplace : null;
|
|
21
|
+
const loadPluginData = useCallback(() => {
|
|
22
|
+
const p = getPlugin(plugin.manifest.name);
|
|
23
|
+
if (p) {
|
|
24
|
+
setPluginData(p);
|
|
25
|
+
}
|
|
26
|
+
}, [plugin]);
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
loadPluginData();
|
|
29
|
+
}, [loadPluginData]);
|
|
30
|
+
const actions = [
|
|
31
|
+
{
|
|
32
|
+
label: pluginData.enabled ? "Disable plugin" : "Enable plugin",
|
|
33
|
+
value: "toggle"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
label: "Mark for update",
|
|
37
|
+
value: "mark-update",
|
|
38
|
+
disabled: !marketplace
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
label: "Mark for uninstallation",
|
|
42
|
+
value: "mark-uninstall"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
label: "Update now",
|
|
46
|
+
value: "update-now",
|
|
47
|
+
disabled: !marketplace
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
label: "Uninstall now",
|
|
51
|
+
value: "uninstall-now"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
label: "Open homepage",
|
|
55
|
+
value: "homepage",
|
|
56
|
+
disabled: !pluginData.manifest.homepage
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
label: "Back to plugin list",
|
|
60
|
+
value: "back"
|
|
61
|
+
}
|
|
62
|
+
];
|
|
63
|
+
const availableActions = actions.filter((a) => !a.disabled);
|
|
64
|
+
const handleAction = useCallback(
|
|
65
|
+
async (action) => {
|
|
66
|
+
if (!pluginData) return;
|
|
67
|
+
switch (action) {
|
|
68
|
+
case "toggle":
|
|
69
|
+
try {
|
|
70
|
+
togglePluginEnabled(pluginData.manifest.name);
|
|
71
|
+
loadPluginData();
|
|
72
|
+
} catch (error) {
|
|
73
|
+
setActionMessage(
|
|
74
|
+
`Error toggling plugin: ${error instanceof Error ? error.message : String(error)}`
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
break;
|
|
78
|
+
case "mark-update":
|
|
79
|
+
setActionMessage(`Plugin marked for update`);
|
|
80
|
+
setTimeout(() => setActionMessage(""), 3e3);
|
|
81
|
+
break;
|
|
82
|
+
case "mark-uninstall":
|
|
83
|
+
setActionMessage(`Plugin marked for uninstallation`);
|
|
84
|
+
setTimeout(() => setActionMessage(""), 3e3);
|
|
85
|
+
break;
|
|
86
|
+
case "update-now":
|
|
87
|
+
if (marketplace) {
|
|
88
|
+
setConfirmAction("update-now");
|
|
89
|
+
setShowConfirm(true);
|
|
90
|
+
}
|
|
91
|
+
break;
|
|
92
|
+
case "uninstall-now":
|
|
93
|
+
setConfirmAction("uninstall-now");
|
|
94
|
+
setShowConfirm(true);
|
|
95
|
+
break;
|
|
96
|
+
case "homepage":
|
|
97
|
+
if (pluginData.manifest.homepage) {
|
|
98
|
+
setActionMessage(`Opening ${pluginData.manifest.homepage}`);
|
|
99
|
+
setTimeout(() => setActionMessage(""), 3e3);
|
|
100
|
+
}
|
|
101
|
+
break;
|
|
102
|
+
case "back":
|
|
103
|
+
onBack();
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
[pluginData, marketplace, loadPluginData, onBack]
|
|
108
|
+
);
|
|
109
|
+
const handleConfirmAction = useCallback(async () => {
|
|
110
|
+
if (!pluginData || !confirmAction) return;
|
|
111
|
+
setShowConfirm(false);
|
|
112
|
+
setActionInProgress(true);
|
|
113
|
+
try {
|
|
114
|
+
if (confirmAction === "update-now") {
|
|
115
|
+
setActionMessage("Updating plugin...");
|
|
116
|
+
if (marketplace) {
|
|
117
|
+
await updateMarketplace(marketplace);
|
|
118
|
+
rmSync(pluginData.location, { recursive: true, force: true });
|
|
119
|
+
await installPluginFromMarketplace(pluginData.manifest.name, marketplace);
|
|
120
|
+
setActionMessage("Plugin updated successfully!");
|
|
121
|
+
setTimeout(() => {
|
|
122
|
+
setActionMessage("");
|
|
123
|
+
onBack();
|
|
124
|
+
}, 2e3);
|
|
125
|
+
}
|
|
126
|
+
} else if (confirmAction === "uninstall-now") {
|
|
127
|
+
setActionMessage("Uninstalling plugin...");
|
|
128
|
+
rmSync(pluginData.location, { recursive: true, force: true });
|
|
129
|
+
setActionMessage("Plugin uninstalled successfully!");
|
|
130
|
+
setTimeout(() => {
|
|
131
|
+
setActionMessage("");
|
|
132
|
+
onBack();
|
|
133
|
+
}, 2e3);
|
|
134
|
+
}
|
|
135
|
+
} catch (error) {
|
|
136
|
+
setActionMessage(
|
|
137
|
+
`Action failed: ${error instanceof Error ? error.message : String(error)}`
|
|
138
|
+
);
|
|
139
|
+
setTimeout(() => setActionMessage(""), 5e3);
|
|
140
|
+
} finally {
|
|
141
|
+
setActionInProgress(false);
|
|
142
|
+
setConfirmAction(null);
|
|
143
|
+
}
|
|
144
|
+
}, [pluginData, confirmAction, marketplace, onBack]);
|
|
145
|
+
useInput((input, key) => {
|
|
146
|
+
if (actionInProgress) return;
|
|
147
|
+
if (showConfirm) {
|
|
148
|
+
if (key.return || input === "y") {
|
|
149
|
+
handleConfirmAction();
|
|
150
|
+
} else if (key.escape || input === "n") {
|
|
151
|
+
setShowConfirm(false);
|
|
152
|
+
setConfirmAction(null);
|
|
153
|
+
}
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (key.escape) {
|
|
157
|
+
onBack();
|
|
158
|
+
} else if (key.upArrow) {
|
|
159
|
+
setSelectedIndex((prev) => Math.max(0, prev - 1));
|
|
160
|
+
} else if (key.downArrow) {
|
|
161
|
+
setSelectedIndex((prev) => Math.min(availableActions.length - 1, prev + 1));
|
|
162
|
+
} else if (key.return) {
|
|
163
|
+
handleAction(availableActions[selectedIndex].value);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
if (showConfirm && confirmAction) {
|
|
167
|
+
const confirmMessages = {
|
|
168
|
+
"update-now": {
|
|
169
|
+
title: "Confirm Update",
|
|
170
|
+
message: `Update plugin "${pluginData.manifest.name}" to the latest version?`,
|
|
171
|
+
warning: "This will uninstall the current version and install the latest."
|
|
172
|
+
},
|
|
173
|
+
"uninstall-now": {
|
|
174
|
+
title: "Confirm Uninstall",
|
|
175
|
+
message: `Permanently uninstall plugin "${pluginData.manifest.name}"?`,
|
|
176
|
+
warning: "This action cannot be undone. All plugin files will be removed."
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
const confirm = confirmMessages[confirmAction];
|
|
180
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.warning }, confirm.title), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, null, confirm.message), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, confirm.warning), /* @__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"));
|
|
181
|
+
}
|
|
182
|
+
if (actionInProgress) {
|
|
183
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, actionMessage));
|
|
184
|
+
}
|
|
185
|
+
const componentCounts = [
|
|
186
|
+
pluginData.agents.length > 0 && `${pluginData.agents.length} agent(s)`,
|
|
187
|
+
pluginData.commands.length > 0 && `${pluginData.commands.length} command(s)`,
|
|
188
|
+
pluginData.skills.length > 0 && `${pluginData.skills.length} skill(s)`,
|
|
189
|
+
pluginData.hooks.length > 0 && `${pluginData.hooks.length} hook(s)`,
|
|
190
|
+
pluginData.mcpServers.length > 0 && `${pluginData.mcpServers.length} MCP server(s)`
|
|
191
|
+
].filter(Boolean);
|
|
192
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, pluginData.manifest.displayName || pluginData.manifest.name), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, marketplace ? `@${marketplace}` : "local", " \xB7 v", pluginData.manifest.version), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, pluginData.manifest.description), pluginData.manifest.author && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "By ", formatAuthor(pluginData.manifest.author)), /* @__PURE__ */ React.createElement(Text, null, "Status:", " ", /* @__PURE__ */ React.createElement(Text, { color: pluginData.enabled ? theme.success : theme.warning }, pluginData.enabled ? "Enabled" : "Disabled")), componentCounts.length > 0 && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { bold: true }, "Components:"), pluginData.agents.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2022 Agents: ", pluginData.agents.map((a) => a.name).join(", "))), pluginData.commands.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2022 Commands: ", pluginData.commands.map((c) => `/${c.name}`).join(", "))), pluginData.skills.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2022 Skills: ", pluginData.skills.map((s) => s.name).join(", "))))), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Actions:"), availableActions.map((action, index) => {
|
|
193
|
+
const isSelected = index === selectedIndex;
|
|
194
|
+
return /* @__PURE__ */ React.createElement(Box, { key: action.value, marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: isSelected ? theme.success : void 0 }, isSelected ? "\u276F " : " ", action.label));
|
|
195
|
+
}), actionMessage && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, actionMessage))), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2191\u2193 Navigate \xB7 Enter Select \xB7 Esc Back")));
|
|
196
|
+
};
|
|
197
|
+
export {
|
|
198
|
+
PluginDetailsManage
|
|
199
|
+
};
|
|
200
|
+
//# sourceMappingURL=PluginDetailsManage.js.map
|