codepp 0.0.437__py3-none-any.whl
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.
- code_puppy/__init__.py +10 -0
- code_puppy/__main__.py +10 -0
- code_puppy/agents/__init__.py +31 -0
- code_puppy/agents/agent_c_reviewer.py +155 -0
- code_puppy/agents/agent_code_puppy.py +117 -0
- code_puppy/agents/agent_code_reviewer.py +90 -0
- code_puppy/agents/agent_cpp_reviewer.py +132 -0
- code_puppy/agents/agent_creator_agent.py +638 -0
- code_puppy/agents/agent_golang_reviewer.py +151 -0
- code_puppy/agents/agent_helios.py +124 -0
- code_puppy/agents/agent_javascript_reviewer.py +160 -0
- code_puppy/agents/agent_manager.py +742 -0
- code_puppy/agents/agent_pack_leader.py +385 -0
- code_puppy/agents/agent_planning.py +165 -0
- code_puppy/agents/agent_python_programmer.py +169 -0
- code_puppy/agents/agent_python_reviewer.py +90 -0
- code_puppy/agents/agent_qa_expert.py +163 -0
- code_puppy/agents/agent_qa_kitten.py +208 -0
- code_puppy/agents/agent_scheduler.py +121 -0
- code_puppy/agents/agent_security_auditor.py +181 -0
- code_puppy/agents/agent_terminal_qa.py +323 -0
- code_puppy/agents/agent_typescript_reviewer.py +166 -0
- code_puppy/agents/base_agent.py +2156 -0
- code_puppy/agents/event_stream_handler.py +348 -0
- code_puppy/agents/json_agent.py +202 -0
- code_puppy/agents/pack/__init__.py +34 -0
- code_puppy/agents/pack/bloodhound.py +304 -0
- code_puppy/agents/pack/husky.py +327 -0
- code_puppy/agents/pack/retriever.py +393 -0
- code_puppy/agents/pack/shepherd.py +348 -0
- code_puppy/agents/pack/terrier.py +287 -0
- code_puppy/agents/pack/watchdog.py +367 -0
- code_puppy/agents/prompt_reviewer.py +145 -0
- code_puppy/agents/subagent_stream_handler.py +276 -0
- code_puppy/api/__init__.py +13 -0
- code_puppy/api/app.py +169 -0
- code_puppy/api/main.py +21 -0
- code_puppy/api/pty_manager.py +453 -0
- code_puppy/api/routers/__init__.py +12 -0
- code_puppy/api/routers/agents.py +36 -0
- code_puppy/api/routers/commands.py +217 -0
- code_puppy/api/routers/config.py +75 -0
- code_puppy/api/routers/sessions.py +234 -0
- code_puppy/api/templates/terminal.html +361 -0
- code_puppy/api/websocket.py +154 -0
- code_puppy/callbacks.py +692 -0
- code_puppy/chatgpt_codex_client.py +338 -0
- code_puppy/claude_cache_client.py +672 -0
- code_puppy/cli_runner.py +1073 -0
- code_puppy/command_line/__init__.py +1 -0
- code_puppy/command_line/add_model_menu.py +1092 -0
- code_puppy/command_line/agent_menu.py +662 -0
- code_puppy/command_line/attachments.py +395 -0
- code_puppy/command_line/autosave_menu.py +704 -0
- code_puppy/command_line/clipboard.py +527 -0
- code_puppy/command_line/colors_menu.py +532 -0
- code_puppy/command_line/command_handler.py +293 -0
- code_puppy/command_line/command_registry.py +150 -0
- code_puppy/command_line/config_commands.py +719 -0
- code_puppy/command_line/core_commands.py +867 -0
- code_puppy/command_line/diff_menu.py +865 -0
- code_puppy/command_line/file_path_completion.py +73 -0
- code_puppy/command_line/load_context_completion.py +52 -0
- code_puppy/command_line/mcp/__init__.py +10 -0
- code_puppy/command_line/mcp/base.py +32 -0
- code_puppy/command_line/mcp/catalog_server_installer.py +175 -0
- code_puppy/command_line/mcp/custom_server_form.py +688 -0
- code_puppy/command_line/mcp/custom_server_installer.py +195 -0
- code_puppy/command_line/mcp/edit_command.py +148 -0
- code_puppy/command_line/mcp/handler.py +138 -0
- code_puppy/command_line/mcp/help_command.py +147 -0
- code_puppy/command_line/mcp/install_command.py +214 -0
- code_puppy/command_line/mcp/install_menu.py +705 -0
- code_puppy/command_line/mcp/list_command.py +94 -0
- code_puppy/command_line/mcp/logs_command.py +235 -0
- code_puppy/command_line/mcp/remove_command.py +82 -0
- code_puppy/command_line/mcp/restart_command.py +100 -0
- code_puppy/command_line/mcp/search_command.py +123 -0
- code_puppy/command_line/mcp/start_all_command.py +135 -0
- code_puppy/command_line/mcp/start_command.py +117 -0
- code_puppy/command_line/mcp/status_command.py +184 -0
- code_puppy/command_line/mcp/stop_all_command.py +112 -0
- code_puppy/command_line/mcp/stop_command.py +80 -0
- code_puppy/command_line/mcp/test_command.py +107 -0
- code_puppy/command_line/mcp/utils.py +129 -0
- code_puppy/command_line/mcp/wizard_utils.py +334 -0
- code_puppy/command_line/mcp_completion.py +174 -0
- code_puppy/command_line/model_picker_completion.py +197 -0
- code_puppy/command_line/model_settings_menu.py +932 -0
- code_puppy/command_line/motd.py +96 -0
- code_puppy/command_line/onboarding_slides.py +179 -0
- code_puppy/command_line/onboarding_wizard.py +342 -0
- code_puppy/command_line/pin_command_completion.py +329 -0
- code_puppy/command_line/prompt_toolkit_completion.py +846 -0
- code_puppy/command_line/session_commands.py +302 -0
- code_puppy/command_line/shell_passthrough.py +145 -0
- code_puppy/command_line/skills_completion.py +160 -0
- code_puppy/command_line/uc_menu.py +893 -0
- code_puppy/command_line/utils.py +93 -0
- code_puppy/command_line/wiggum_state.py +78 -0
- code_puppy/config.py +1770 -0
- code_puppy/error_logging.py +134 -0
- code_puppy/gemini_code_assist.py +385 -0
- code_puppy/gemini_model.py +754 -0
- code_puppy/hook_engine/README.md +105 -0
- code_puppy/hook_engine/__init__.py +21 -0
- code_puppy/hook_engine/aliases.py +155 -0
- code_puppy/hook_engine/engine.py +221 -0
- code_puppy/hook_engine/executor.py +296 -0
- code_puppy/hook_engine/matcher.py +156 -0
- code_puppy/hook_engine/models.py +240 -0
- code_puppy/hook_engine/registry.py +106 -0
- code_puppy/hook_engine/validator.py +144 -0
- code_puppy/http_utils.py +361 -0
- code_puppy/keymap.py +128 -0
- code_puppy/main.py +10 -0
- code_puppy/mcp_/__init__.py +66 -0
- code_puppy/mcp_/async_lifecycle.py +286 -0
- code_puppy/mcp_/blocking_startup.py +469 -0
- code_puppy/mcp_/captured_stdio_server.py +275 -0
- code_puppy/mcp_/circuit_breaker.py +290 -0
- code_puppy/mcp_/config_wizard.py +507 -0
- code_puppy/mcp_/dashboard.py +308 -0
- code_puppy/mcp_/error_isolation.py +407 -0
- code_puppy/mcp_/examples/retry_example.py +226 -0
- code_puppy/mcp_/health_monitor.py +589 -0
- code_puppy/mcp_/managed_server.py +428 -0
- code_puppy/mcp_/manager.py +807 -0
- code_puppy/mcp_/mcp_logs.py +224 -0
- code_puppy/mcp_/registry.py +451 -0
- code_puppy/mcp_/retry_manager.py +337 -0
- code_puppy/mcp_/server_registry_catalog.py +1126 -0
- code_puppy/mcp_/status_tracker.py +355 -0
- code_puppy/mcp_/system_tools.py +209 -0
- code_puppy/mcp_prompts/__init__.py +1 -0
- code_puppy/mcp_prompts/hook_creator.py +103 -0
- code_puppy/messaging/__init__.py +255 -0
- code_puppy/messaging/bus.py +613 -0
- code_puppy/messaging/commands.py +167 -0
- code_puppy/messaging/markdown_patches.py +57 -0
- code_puppy/messaging/message_queue.py +361 -0
- code_puppy/messaging/messages.py +569 -0
- code_puppy/messaging/queue_console.py +271 -0
- code_puppy/messaging/renderers.py +311 -0
- code_puppy/messaging/rich_renderer.py +1158 -0
- code_puppy/messaging/spinner/__init__.py +83 -0
- code_puppy/messaging/spinner/console_spinner.py +240 -0
- code_puppy/messaging/spinner/spinner_base.py +95 -0
- code_puppy/messaging/subagent_console.py +460 -0
- code_puppy/model_factory.py +848 -0
- code_puppy/model_switching.py +63 -0
- code_puppy/model_utils.py +168 -0
- code_puppy/models.json +174 -0
- code_puppy/models_dev_api.json +1 -0
- code_puppy/models_dev_parser.py +592 -0
- code_puppy/plugins/__init__.py +186 -0
- code_puppy/plugins/agent_skills/__init__.py +22 -0
- code_puppy/plugins/agent_skills/config.py +175 -0
- code_puppy/plugins/agent_skills/discovery.py +136 -0
- code_puppy/plugins/agent_skills/downloader.py +392 -0
- code_puppy/plugins/agent_skills/installer.py +22 -0
- code_puppy/plugins/agent_skills/metadata.py +219 -0
- code_puppy/plugins/agent_skills/prompt_builder.py +60 -0
- code_puppy/plugins/agent_skills/register_callbacks.py +241 -0
- code_puppy/plugins/agent_skills/remote_catalog.py +322 -0
- code_puppy/plugins/agent_skills/skill_catalog.py +257 -0
- code_puppy/plugins/agent_skills/skills_install_menu.py +664 -0
- code_puppy/plugins/agent_skills/skills_menu.py +781 -0
- code_puppy/plugins/antigravity_oauth/__init__.py +10 -0
- code_puppy/plugins/antigravity_oauth/accounts.py +406 -0
- code_puppy/plugins/antigravity_oauth/antigravity_model.py +706 -0
- code_puppy/plugins/antigravity_oauth/config.py +42 -0
- code_puppy/plugins/antigravity_oauth/constants.py +133 -0
- code_puppy/plugins/antigravity_oauth/oauth.py +478 -0
- code_puppy/plugins/antigravity_oauth/register_callbacks.py +518 -0
- code_puppy/plugins/antigravity_oauth/storage.py +288 -0
- code_puppy/plugins/antigravity_oauth/test_plugin.py +319 -0
- code_puppy/plugins/antigravity_oauth/token.py +167 -0
- code_puppy/plugins/antigravity_oauth/transport.py +863 -0
- code_puppy/plugins/antigravity_oauth/utils.py +168 -0
- code_puppy/plugins/chatgpt_oauth/__init__.py +8 -0
- code_puppy/plugins/chatgpt_oauth/config.py +52 -0
- code_puppy/plugins/chatgpt_oauth/oauth_flow.py +329 -0
- code_puppy/plugins/chatgpt_oauth/register_callbacks.py +176 -0
- code_puppy/plugins/chatgpt_oauth/test_plugin.py +301 -0
- code_puppy/plugins/chatgpt_oauth/utils.py +523 -0
- code_puppy/plugins/claude_code_hooks/__init__.py +1 -0
- code_puppy/plugins/claude_code_hooks/config.py +137 -0
- code_puppy/plugins/claude_code_hooks/register_callbacks.py +175 -0
- code_puppy/plugins/claude_code_oauth/README.md +167 -0
- code_puppy/plugins/claude_code_oauth/SETUP.md +93 -0
- code_puppy/plugins/claude_code_oauth/__init__.py +25 -0
- code_puppy/plugins/claude_code_oauth/config.py +52 -0
- code_puppy/plugins/claude_code_oauth/register_callbacks.py +453 -0
- code_puppy/plugins/claude_code_oauth/test_plugin.py +283 -0
- code_puppy/plugins/claude_code_oauth/token_refresh_heartbeat.py +241 -0
- code_puppy/plugins/claude_code_oauth/utils.py +640 -0
- code_puppy/plugins/customizable_commands/__init__.py +0 -0
- code_puppy/plugins/customizable_commands/register_callbacks.py +152 -0
- code_puppy/plugins/example_custom_command/README.md +280 -0
- code_puppy/plugins/example_custom_command/register_callbacks.py +51 -0
- code_puppy/plugins/file_permission_handler/__init__.py +4 -0
- code_puppy/plugins/file_permission_handler/register_callbacks.py +470 -0
- code_puppy/plugins/frontend_emitter/__init__.py +25 -0
- code_puppy/plugins/frontend_emitter/emitter.py +121 -0
- code_puppy/plugins/frontend_emitter/register_callbacks.py +261 -0
- code_puppy/plugins/hook_creator/__init__.py +1 -0
- code_puppy/plugins/hook_creator/register_callbacks.py +33 -0
- code_puppy/plugins/hook_manager/__init__.py +1 -0
- code_puppy/plugins/hook_manager/config.py +290 -0
- code_puppy/plugins/hook_manager/hooks_menu.py +564 -0
- code_puppy/plugins/hook_manager/register_callbacks.py +227 -0
- code_puppy/plugins/oauth_puppy_html.py +228 -0
- code_puppy/plugins/scheduler/__init__.py +1 -0
- code_puppy/plugins/scheduler/register_callbacks.py +88 -0
- code_puppy/plugins/scheduler/scheduler_menu.py +522 -0
- code_puppy/plugins/scheduler/scheduler_wizard.py +341 -0
- code_puppy/plugins/shell_safety/__init__.py +6 -0
- code_puppy/plugins/shell_safety/agent_shell_safety.py +69 -0
- code_puppy/plugins/shell_safety/command_cache.py +156 -0
- code_puppy/plugins/shell_safety/register_callbacks.py +202 -0
- code_puppy/plugins/synthetic_status/__init__.py +1 -0
- code_puppy/plugins/synthetic_status/register_callbacks.py +132 -0
- code_puppy/plugins/synthetic_status/status_api.py +147 -0
- code_puppy/plugins/universal_constructor/__init__.py +13 -0
- code_puppy/plugins/universal_constructor/models.py +138 -0
- code_puppy/plugins/universal_constructor/register_callbacks.py +47 -0
- code_puppy/plugins/universal_constructor/registry.py +302 -0
- code_puppy/plugins/universal_constructor/sandbox.py +584 -0
- code_puppy/prompts/antigravity_system_prompt.md +1 -0
- code_puppy/pydantic_patches.py +356 -0
- code_puppy/reopenable_async_client.py +232 -0
- code_puppy/round_robin_model.py +150 -0
- code_puppy/scheduler/__init__.py +41 -0
- code_puppy/scheduler/__main__.py +9 -0
- code_puppy/scheduler/cli.py +118 -0
- code_puppy/scheduler/config.py +126 -0
- code_puppy/scheduler/daemon.py +280 -0
- code_puppy/scheduler/executor.py +155 -0
- code_puppy/scheduler/platform.py +19 -0
- code_puppy/scheduler/platform_unix.py +22 -0
- code_puppy/scheduler/platform_win.py +32 -0
- code_puppy/session_storage.py +338 -0
- code_puppy/status_display.py +257 -0
- code_puppy/summarization_agent.py +176 -0
- code_puppy/terminal_utils.py +418 -0
- code_puppy/tools/__init__.py +501 -0
- code_puppy/tools/agent_tools.py +603 -0
- code_puppy/tools/ask_user_question/__init__.py +26 -0
- code_puppy/tools/ask_user_question/constants.py +73 -0
- code_puppy/tools/ask_user_question/demo_tui.py +55 -0
- code_puppy/tools/ask_user_question/handler.py +232 -0
- code_puppy/tools/ask_user_question/models.py +304 -0
- code_puppy/tools/ask_user_question/registration.py +26 -0
- code_puppy/tools/ask_user_question/renderers.py +309 -0
- code_puppy/tools/ask_user_question/terminal_ui.py +329 -0
- code_puppy/tools/ask_user_question/theme.py +155 -0
- code_puppy/tools/ask_user_question/tui_loop.py +423 -0
- code_puppy/tools/browser/__init__.py +37 -0
- code_puppy/tools/browser/browser_control.py +289 -0
- code_puppy/tools/browser/browser_interactions.py +545 -0
- code_puppy/tools/browser/browser_locators.py +640 -0
- code_puppy/tools/browser/browser_manager.py +378 -0
- code_puppy/tools/browser/browser_navigation.py +251 -0
- code_puppy/tools/browser/browser_screenshot.py +179 -0
- code_puppy/tools/browser/browser_scripts.py +462 -0
- code_puppy/tools/browser/browser_workflows.py +221 -0
- code_puppy/tools/browser/chromium_terminal_manager.py +259 -0
- code_puppy/tools/browser/terminal_command_tools.py +534 -0
- code_puppy/tools/browser/terminal_screenshot_tools.py +552 -0
- code_puppy/tools/browser/terminal_tools.py +525 -0
- code_puppy/tools/command_runner.py +1346 -0
- code_puppy/tools/common.py +1409 -0
- code_puppy/tools/display.py +84 -0
- code_puppy/tools/file_modifications.py +886 -0
- code_puppy/tools/file_operations.py +802 -0
- code_puppy/tools/scheduler_tools.py +412 -0
- code_puppy/tools/skills_tools.py +244 -0
- code_puppy/tools/subagent_context.py +158 -0
- code_puppy/tools/tools_content.py +51 -0
- code_puppy/tools/universal_constructor.py +889 -0
- code_puppy/uvx_detection.py +242 -0
- code_puppy/version_checker.py +82 -0
- codepp-0.0.437.dist-info/METADATA +766 -0
- codepp-0.0.437.dist-info/RECORD +288 -0
- codepp-0.0.437.dist-info/WHEEL +4 -0
- codepp-0.0.437.dist-info/entry_points.txt +3 -0
- codepp-0.0.437.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"""
|
|
2
|
+
MCP Install Command - Installs pre-configured MCP servers from the registry.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from typing import List, Optional
|
|
7
|
+
|
|
8
|
+
from rich.text import Text
|
|
9
|
+
|
|
10
|
+
from code_puppy.messaging import emit_error, emit_info
|
|
11
|
+
|
|
12
|
+
from .base import MCPCommandBase
|
|
13
|
+
from .install_menu import run_mcp_install_menu
|
|
14
|
+
|
|
15
|
+
# Configure logging
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class InstallCommand(MCPCommandBase):
|
|
20
|
+
"""
|
|
21
|
+
Command handler for installing MCP servers from registry.
|
|
22
|
+
|
|
23
|
+
Installs pre-configured MCP servers with interactive menu-based browser.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
def execute(self, args: List[str], group_id: Optional[str] = None) -> None:
|
|
27
|
+
"""
|
|
28
|
+
Install a pre-configured MCP server from the registry.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
args: Server ID and optional custom name
|
|
32
|
+
group_id: Optional message group ID for grouping related messages
|
|
33
|
+
"""
|
|
34
|
+
if group_id is None:
|
|
35
|
+
group_id = self.generate_group_id()
|
|
36
|
+
|
|
37
|
+
try:
|
|
38
|
+
# In interactive mode, use the menu-based browser
|
|
39
|
+
if not args:
|
|
40
|
+
# No args - launch interactive menu
|
|
41
|
+
run_mcp_install_menu(self.manager)
|
|
42
|
+
return
|
|
43
|
+
|
|
44
|
+
# Has args - install directly from catalog
|
|
45
|
+
server_id = args[0]
|
|
46
|
+
success = self._install_from_catalog(server_id, group_id)
|
|
47
|
+
if success:
|
|
48
|
+
try:
|
|
49
|
+
from code_puppy.agent import reload_mcp_servers
|
|
50
|
+
|
|
51
|
+
reload_mcp_servers()
|
|
52
|
+
except ImportError:
|
|
53
|
+
pass
|
|
54
|
+
return
|
|
55
|
+
|
|
56
|
+
except ImportError:
|
|
57
|
+
emit_info("Server registry not available", message_group=group_id)
|
|
58
|
+
except Exception as e:
|
|
59
|
+
logger.error(f"Error installing server: {e}")
|
|
60
|
+
emit_info(f"Installation failed: {e}", message_group=group_id)
|
|
61
|
+
|
|
62
|
+
def _install_from_catalog(self, server_name_or_id: str, group_id: str) -> bool:
|
|
63
|
+
"""Install a server directly from the catalog by name or ID."""
|
|
64
|
+
try:
|
|
65
|
+
from code_puppy.mcp_.server_registry_catalog import catalog
|
|
66
|
+
from code_puppy.messaging import emit_prompt
|
|
67
|
+
|
|
68
|
+
from .utils import find_server_id_by_name
|
|
69
|
+
from .wizard_utils import install_server_from_catalog
|
|
70
|
+
|
|
71
|
+
# Try to find server by ID first, then by name/search
|
|
72
|
+
selected_server = catalog.get_by_id(server_name_or_id)
|
|
73
|
+
|
|
74
|
+
if not selected_server:
|
|
75
|
+
# Try searching by name
|
|
76
|
+
results = catalog.search(server_name_or_id)
|
|
77
|
+
if not results:
|
|
78
|
+
emit_info(
|
|
79
|
+
f"❌ No server found matching '{server_name_or_id}'",
|
|
80
|
+
message_group=group_id,
|
|
81
|
+
)
|
|
82
|
+
emit_info(
|
|
83
|
+
"Try '/mcp install' to browse available servers",
|
|
84
|
+
message_group=group_id,
|
|
85
|
+
)
|
|
86
|
+
return False
|
|
87
|
+
elif len(results) == 1:
|
|
88
|
+
selected_server = results[0]
|
|
89
|
+
else:
|
|
90
|
+
# Multiple matches, show them
|
|
91
|
+
emit_info(
|
|
92
|
+
f"🔍 Multiple servers found matching '{server_name_or_id}':",
|
|
93
|
+
message_group=group_id,
|
|
94
|
+
)
|
|
95
|
+
for i, server in enumerate(results[:5]):
|
|
96
|
+
indicators = []
|
|
97
|
+
if server.verified:
|
|
98
|
+
indicators.append("✓")
|
|
99
|
+
if server.popular:
|
|
100
|
+
indicators.append("⭐")
|
|
101
|
+
|
|
102
|
+
indicator_str = ""
|
|
103
|
+
if indicators:
|
|
104
|
+
indicator_str = " " + "".join(indicators)
|
|
105
|
+
|
|
106
|
+
emit_info(
|
|
107
|
+
f" {i + 1}. {server.display_name}{indicator_str}",
|
|
108
|
+
message_group=group_id,
|
|
109
|
+
)
|
|
110
|
+
emit_info(f" ID: {server.id}", message_group=group_id)
|
|
111
|
+
|
|
112
|
+
emit_info(
|
|
113
|
+
"Please use the exact server ID: '/mcp install <server_id>'",
|
|
114
|
+
message_group=group_id,
|
|
115
|
+
)
|
|
116
|
+
return False
|
|
117
|
+
|
|
118
|
+
# Show what we're installing
|
|
119
|
+
emit_info(
|
|
120
|
+
f"📦 Installing: {selected_server.display_name}", message_group=group_id
|
|
121
|
+
)
|
|
122
|
+
description = (
|
|
123
|
+
selected_server.description
|
|
124
|
+
if selected_server.description
|
|
125
|
+
else "No description available"
|
|
126
|
+
)
|
|
127
|
+
emit_info(f"Description: {description}", message_group=group_id)
|
|
128
|
+
emit_info("", message_group=group_id)
|
|
129
|
+
|
|
130
|
+
# Get custom name (default to server name)
|
|
131
|
+
server_name = emit_prompt(
|
|
132
|
+
f"Enter custom name for this server [{selected_server.name}]: "
|
|
133
|
+
).strip()
|
|
134
|
+
if not server_name:
|
|
135
|
+
server_name = selected_server.name
|
|
136
|
+
|
|
137
|
+
# Check if name already exists
|
|
138
|
+
existing_server = find_server_id_by_name(self.manager, server_name)
|
|
139
|
+
if existing_server:
|
|
140
|
+
override = emit_prompt(
|
|
141
|
+
f"Server '{server_name}' already exists. Override it? [y/N]: "
|
|
142
|
+
)
|
|
143
|
+
if not override.lower().startswith("y"):
|
|
144
|
+
emit_info("Installation cancelled", message_group=group_id)
|
|
145
|
+
return False
|
|
146
|
+
|
|
147
|
+
# Collect environment variables and command line arguments
|
|
148
|
+
env_vars = {}
|
|
149
|
+
cmd_args = {}
|
|
150
|
+
|
|
151
|
+
# Get environment variables
|
|
152
|
+
required_env_vars = selected_server.get_environment_vars()
|
|
153
|
+
if required_env_vars:
|
|
154
|
+
emit_info(
|
|
155
|
+
Text.from_markup(
|
|
156
|
+
"\n[yellow]Required Environment Variables:[/yellow]"
|
|
157
|
+
),
|
|
158
|
+
message_group=group_id,
|
|
159
|
+
)
|
|
160
|
+
for var in required_env_vars:
|
|
161
|
+
# Check if already set in environment
|
|
162
|
+
import os
|
|
163
|
+
|
|
164
|
+
current_value = os.environ.get(var, "")
|
|
165
|
+
if current_value:
|
|
166
|
+
emit_info(
|
|
167
|
+
Text.from_markup(f" {var}: [green]Already set[/green]"),
|
|
168
|
+
message_group=group_id,
|
|
169
|
+
)
|
|
170
|
+
env_vars[var] = current_value
|
|
171
|
+
else:
|
|
172
|
+
value = emit_prompt(f" Enter value for {var}: ").strip()
|
|
173
|
+
if value:
|
|
174
|
+
env_vars[var] = value
|
|
175
|
+
|
|
176
|
+
# Get command line arguments
|
|
177
|
+
required_cmd_args = selected_server.get_command_line_args()
|
|
178
|
+
if required_cmd_args:
|
|
179
|
+
emit_info(
|
|
180
|
+
Text.from_markup("\n[yellow]Command Line Arguments:[/yellow]"),
|
|
181
|
+
message_group=group_id,
|
|
182
|
+
)
|
|
183
|
+
for arg_config in required_cmd_args:
|
|
184
|
+
name = arg_config.get("name", "")
|
|
185
|
+
prompt = arg_config.get("prompt", name)
|
|
186
|
+
default = arg_config.get("default", "")
|
|
187
|
+
required = arg_config.get("required", True)
|
|
188
|
+
|
|
189
|
+
# If required or has default, prompt user
|
|
190
|
+
if required or default:
|
|
191
|
+
arg_prompt = f" {prompt}"
|
|
192
|
+
if default:
|
|
193
|
+
arg_prompt += f" [{default}]"
|
|
194
|
+
if not required:
|
|
195
|
+
arg_prompt += " (optional)"
|
|
196
|
+
|
|
197
|
+
value = emit_prompt(f"{arg_prompt}: ").strip()
|
|
198
|
+
if value:
|
|
199
|
+
cmd_args[name] = value
|
|
200
|
+
elif default:
|
|
201
|
+
cmd_args[name] = default
|
|
202
|
+
|
|
203
|
+
# Install the server
|
|
204
|
+
return install_server_from_catalog(
|
|
205
|
+
self.manager, selected_server, server_name, env_vars, cmd_args, group_id
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
except ImportError:
|
|
209
|
+
emit_info("Server catalog not available", message_group=group_id)
|
|
210
|
+
return False
|
|
211
|
+
except Exception as e:
|
|
212
|
+
logger.error(f"Error installing from catalog: {e}")
|
|
213
|
+
emit_error(f"Installation error: {e}", message_group=group_id)
|
|
214
|
+
return False
|