code-puppy 0.0.169__py3-none-any.whl → 0.0.366__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 +7 -1
- code_puppy/agents/__init__.py +8 -8
- code_puppy/agents/agent_c_reviewer.py +155 -0
- code_puppy/agents/agent_code_puppy.py +9 -2
- 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 +48 -9
- code_puppy/agents/agent_golang_reviewer.py +151 -0
- code_puppy/agents/agent_javascript_reviewer.py +160 -0
- code_puppy/agents/agent_manager.py +146 -199
- code_puppy/agents/agent_pack_leader.py +383 -0
- code_puppy/agents/agent_planning.py +163 -0
- code_puppy/agents/agent_python_programmer.py +165 -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_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 +1713 -1
- code_puppy/agents/event_stream_handler.py +350 -0
- code_puppy/agents/json_agent.py +12 -1
- code_puppy/agents/pack/__init__.py +34 -0
- code_puppy/agents/pack/bloodhound.py +304 -0
- code_puppy/agents/pack/husky.py +321 -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 +446 -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 +74 -0
- code_puppy/api/routers/sessions.py +232 -0
- code_puppy/api/templates/terminal.html +361 -0
- code_puppy/api/websocket.py +154 -0
- code_puppy/callbacks.py +174 -4
- code_puppy/chatgpt_codex_client.py +283 -0
- code_puppy/claude_cache_client.py +586 -0
- code_puppy/cli_runner.py +916 -0
- code_puppy/command_line/add_model_menu.py +1079 -0
- code_puppy/command_line/agent_menu.py +395 -0
- code_puppy/command_line/attachments.py +395 -0
- code_puppy/command_line/autosave_menu.py +605 -0
- code_puppy/command_line/clipboard.py +527 -0
- code_puppy/command_line/colors_menu.py +520 -0
- code_puppy/command_line/command_handler.py +233 -627
- code_puppy/command_line/command_registry.py +150 -0
- code_puppy/command_line/config_commands.py +715 -0
- code_puppy/command_line/core_commands.py +792 -0
- code_puppy/command_line/diff_menu.py +863 -0
- code_puppy/command_line/load_context_completion.py +15 -22
- code_puppy/command_line/mcp/base.py +1 -4
- 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 +9 -4
- code_puppy/command_line/mcp/help_command.py +6 -5
- code_puppy/command_line/mcp/install_command.py +16 -27
- code_puppy/command_line/mcp/install_menu.py +685 -0
- code_puppy/command_line/mcp/list_command.py +3 -3
- code_puppy/command_line/mcp/logs_command.py +174 -65
- code_puppy/command_line/mcp/remove_command.py +2 -2
- code_puppy/command_line/mcp/restart_command.py +12 -4
- code_puppy/command_line/mcp/search_command.py +17 -11
- code_puppy/command_line/mcp/start_all_command.py +22 -13
- code_puppy/command_line/mcp/start_command.py +50 -31
- code_puppy/command_line/mcp/status_command.py +6 -7
- code_puppy/command_line/mcp/stop_all_command.py +11 -8
- code_puppy/command_line/mcp/stop_command.py +11 -10
- code_puppy/command_line/mcp/test_command.py +2 -2
- code_puppy/command_line/mcp/utils.py +1 -1
- code_puppy/command_line/mcp/wizard_utils.py +22 -18
- code_puppy/command_line/mcp_completion.py +174 -0
- code_puppy/command_line/model_picker_completion.py +89 -30
- code_puppy/command_line/model_settings_menu.py +884 -0
- code_puppy/command_line/motd.py +14 -8
- code_puppy/command_line/onboarding_slides.py +179 -0
- code_puppy/command_line/onboarding_wizard.py +340 -0
- code_puppy/command_line/pin_command_completion.py +329 -0
- code_puppy/command_line/prompt_toolkit_completion.py +626 -75
- code_puppy/command_line/session_commands.py +296 -0
- code_puppy/command_line/utils.py +54 -0
- code_puppy/config.py +1181 -51
- code_puppy/error_logging.py +118 -0
- code_puppy/gemini_code_assist.py +385 -0
- code_puppy/gemini_model.py +602 -0
- code_puppy/http_utils.py +220 -104
- code_puppy/keymap.py +128 -0
- code_puppy/main.py +5 -594
- code_puppy/{mcp → mcp_}/__init__.py +17 -0
- code_puppy/{mcp → mcp_}/async_lifecycle.py +35 -4
- code_puppy/{mcp → mcp_}/blocking_startup.py +70 -43
- code_puppy/{mcp → mcp_}/captured_stdio_server.py +2 -2
- code_puppy/{mcp → mcp_}/config_wizard.py +5 -5
- code_puppy/{mcp → mcp_}/dashboard.py +15 -6
- code_puppy/{mcp → mcp_}/examples/retry_example.py +4 -1
- code_puppy/{mcp → mcp_}/managed_server.py +66 -39
- code_puppy/{mcp → mcp_}/manager.py +146 -52
- code_puppy/mcp_/mcp_logs.py +224 -0
- code_puppy/{mcp → mcp_}/registry.py +6 -6
- code_puppy/{mcp → mcp_}/server_registry_catalog.py +25 -8
- code_puppy/messaging/__init__.py +199 -2
- code_puppy/messaging/bus.py +610 -0
- code_puppy/messaging/commands.py +167 -0
- code_puppy/messaging/markdown_patches.py +57 -0
- code_puppy/messaging/message_queue.py +17 -48
- code_puppy/messaging/messages.py +500 -0
- code_puppy/messaging/queue_console.py +1 -24
- code_puppy/messaging/renderers.py +43 -146
- code_puppy/messaging/rich_renderer.py +1027 -0
- code_puppy/messaging/spinner/__init__.py +33 -5
- code_puppy/messaging/spinner/console_spinner.py +92 -52
- code_puppy/messaging/spinner/spinner_base.py +29 -0
- code_puppy/messaging/subagent_console.py +461 -0
- code_puppy/model_factory.py +686 -80
- code_puppy/model_utils.py +167 -0
- code_puppy/models.json +86 -104
- code_puppy/models_dev_api.json +1 -0
- code_puppy/models_dev_parser.py +592 -0
- code_puppy/plugins/__init__.py +164 -10
- 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 +704 -0
- code_puppy/plugins/antigravity_oauth/config.py +42 -0
- code_puppy/plugins/antigravity_oauth/constants.py +136 -0
- code_puppy/plugins/antigravity_oauth/oauth.py +478 -0
- code_puppy/plugins/antigravity_oauth/register_callbacks.py +406 -0
- code_puppy/plugins/antigravity_oauth/storage.py +271 -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 +767 -0
- code_puppy/plugins/antigravity_oauth/utils.py +169 -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 +328 -0
- code_puppy/plugins/chatgpt_oauth/register_callbacks.py +94 -0
- code_puppy/plugins/chatgpt_oauth/test_plugin.py +293 -0
- code_puppy/plugins/chatgpt_oauth/utils.py +489 -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 +6 -0
- code_puppy/plugins/claude_code_oauth/config.py +50 -0
- code_puppy/plugins/claude_code_oauth/register_callbacks.py +308 -0
- code_puppy/plugins/claude_code_oauth/test_plugin.py +283 -0
- code_puppy/plugins/claude_code_oauth/utils.py +518 -0
- code_puppy/plugins/customizable_commands/__init__.py +0 -0
- code_puppy/plugins/customizable_commands/register_callbacks.py +169 -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 +523 -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/oauth_puppy_html.py +228 -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/prompts/antigravity_system_prompt.md +1 -0
- code_puppy/prompts/codex_system_prompt.md +310 -0
- code_puppy/pydantic_patches.py +131 -0
- code_puppy/reopenable_async_client.py +8 -8
- code_puppy/round_robin_model.py +10 -15
- code_puppy/session_storage.py +294 -0
- code_puppy/status_display.py +21 -4
- code_puppy/summarization_agent.py +52 -14
- code_puppy/terminal_utils.py +418 -0
- code_puppy/tools/__init__.py +139 -6
- code_puppy/tools/agent_tools.py +548 -49
- 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 +316 -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 +521 -0
- code_puppy/tools/browser/terminal_screenshot_tools.py +556 -0
- code_puppy/tools/browser/terminal_tools.py +525 -0
- code_puppy/tools/command_runner.py +941 -153
- code_puppy/tools/common.py +1146 -6
- code_puppy/tools/display.py +84 -0
- code_puppy/tools/file_modifications.py +288 -89
- code_puppy/tools/file_operations.py +352 -266
- code_puppy/tools/subagent_context.py +158 -0
- code_puppy/uvx_detection.py +242 -0
- code_puppy/version_checker.py +30 -11
- code_puppy-0.0.366.data/data/code_puppy/models.json +110 -0
- code_puppy-0.0.366.data/data/code_puppy/models_dev_api.json +1 -0
- {code_puppy-0.0.169.dist-info → code_puppy-0.0.366.dist-info}/METADATA +184 -67
- code_puppy-0.0.366.dist-info/RECORD +217 -0
- {code_puppy-0.0.169.dist-info → code_puppy-0.0.366.dist-info}/WHEEL +1 -1
- {code_puppy-0.0.169.dist-info → code_puppy-0.0.366.dist-info}/entry_points.txt +1 -0
- code_puppy/agent.py +0 -231
- code_puppy/agents/agent_orchestrator.json +0 -26
- code_puppy/agents/runtime_manager.py +0 -272
- code_puppy/command_line/mcp/add_command.py +0 -183
- code_puppy/command_line/meta_command_handler.py +0 -153
- code_puppy/message_history_processor.py +0 -490
- code_puppy/messaging/spinner/textual_spinner.py +0 -101
- code_puppy/state_management.py +0 -200
- code_puppy/tui/__init__.py +0 -10
- code_puppy/tui/app.py +0 -986
- code_puppy/tui/components/__init__.py +0 -21
- code_puppy/tui/components/chat_view.py +0 -550
- code_puppy/tui/components/command_history_modal.py +0 -218
- code_puppy/tui/components/copy_button.py +0 -139
- code_puppy/tui/components/custom_widgets.py +0 -63
- code_puppy/tui/components/human_input_modal.py +0 -175
- code_puppy/tui/components/input_area.py +0 -167
- code_puppy/tui/components/sidebar.py +0 -309
- code_puppy/tui/components/status_bar.py +0 -182
- code_puppy/tui/messages.py +0 -27
- code_puppy/tui/models/__init__.py +0 -8
- code_puppy/tui/models/chat_message.py +0 -25
- code_puppy/tui/models/command_history.py +0 -89
- code_puppy/tui/models/enums.py +0 -24
- code_puppy/tui/screens/__init__.py +0 -15
- code_puppy/tui/screens/help.py +0 -130
- code_puppy/tui/screens/mcp_install_wizard.py +0 -803
- code_puppy/tui/screens/settings.py +0 -290
- code_puppy/tui/screens/tools.py +0 -74
- code_puppy-0.0.169.data/data/code_puppy/models.json +0 -128
- code_puppy-0.0.169.dist-info/RECORD +0 -112
- /code_puppy/{mcp → mcp_}/circuit_breaker.py +0 -0
- /code_puppy/{mcp → mcp_}/error_isolation.py +0 -0
- /code_puppy/{mcp → mcp_}/health_monitor.py +0 -0
- /code_puppy/{mcp → mcp_}/retry_manager.py +0 -0
- /code_puppy/{mcp → mcp_}/status_tracker.py +0 -0
- /code_puppy/{mcp → mcp_}/system_tools.py +0 -0
- {code_puppy-0.0.169.dist-info → code_puppy-0.0.366.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
MCP Add Command - Adds new MCP servers from JSON configuration or wizard.
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
import json
|
|
6
|
-
import logging
|
|
7
|
-
import os
|
|
8
|
-
from typing import List, Optional
|
|
9
|
-
|
|
10
|
-
from code_puppy.messaging import emit_info
|
|
11
|
-
from code_puppy.state_management import is_tui_mode
|
|
12
|
-
|
|
13
|
-
from .base import MCPCommandBase
|
|
14
|
-
from .wizard_utils import run_interactive_install_wizard
|
|
15
|
-
|
|
16
|
-
# Configure logging
|
|
17
|
-
logger = logging.getLogger(__name__)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class AddCommand(MCPCommandBase):
|
|
21
|
-
"""
|
|
22
|
-
Command handler for adding MCP servers.
|
|
23
|
-
|
|
24
|
-
Adds new MCP servers from JSON configuration or interactive wizard.
|
|
25
|
-
"""
|
|
26
|
-
|
|
27
|
-
def execute(self, args: List[str], group_id: Optional[str] = None) -> None:
|
|
28
|
-
"""
|
|
29
|
-
Add a new MCP server from JSON configuration or launch wizard.
|
|
30
|
-
|
|
31
|
-
Usage:
|
|
32
|
-
/mcp add - Launch interactive wizard
|
|
33
|
-
/mcp add <json> - Add server from JSON config
|
|
34
|
-
|
|
35
|
-
Example JSON:
|
|
36
|
-
/mcp add {"name": "test", "type": "stdio", "command": "echo", "args": ["hello"]}
|
|
37
|
-
|
|
38
|
-
Args:
|
|
39
|
-
args: Command arguments - JSON config or empty for wizard
|
|
40
|
-
group_id: Optional message group ID for grouping related messages
|
|
41
|
-
"""
|
|
42
|
-
if group_id is None:
|
|
43
|
-
group_id = self.generate_group_id()
|
|
44
|
-
|
|
45
|
-
# Check if in TUI mode and guide user to use Ctrl+T instead
|
|
46
|
-
if is_tui_mode() and not args:
|
|
47
|
-
emit_info(
|
|
48
|
-
"💡 In TUI mode, press Ctrl+T to open the MCP Install Wizard",
|
|
49
|
-
message_group=group_id,
|
|
50
|
-
)
|
|
51
|
-
emit_info(
|
|
52
|
-
" The wizard provides a better interface for browsing and installing MCP servers.",
|
|
53
|
-
message_group=group_id,
|
|
54
|
-
)
|
|
55
|
-
return
|
|
56
|
-
|
|
57
|
-
try:
|
|
58
|
-
if args:
|
|
59
|
-
# Parse JSON from arguments
|
|
60
|
-
json_str = " ".join(args)
|
|
61
|
-
|
|
62
|
-
try:
|
|
63
|
-
config_dict = json.loads(json_str)
|
|
64
|
-
except json.JSONDecodeError as e:
|
|
65
|
-
emit_info(f"Invalid JSON: {e}", message_group=group_id)
|
|
66
|
-
emit_info(
|
|
67
|
-
"Usage: /mcp add <json> or /mcp add (for wizard)",
|
|
68
|
-
message_group=group_id,
|
|
69
|
-
)
|
|
70
|
-
emit_info(
|
|
71
|
-
'Example: /mcp add {"name": "test", "type": "stdio", "command": "echo"}',
|
|
72
|
-
message_group=group_id,
|
|
73
|
-
)
|
|
74
|
-
return
|
|
75
|
-
|
|
76
|
-
# Validate required fields
|
|
77
|
-
if "name" not in config_dict:
|
|
78
|
-
emit_info("Missing required field: 'name'", message_group=group_id)
|
|
79
|
-
return
|
|
80
|
-
if "type" not in config_dict:
|
|
81
|
-
emit_info("Missing required field: 'type'", message_group=group_id)
|
|
82
|
-
return
|
|
83
|
-
|
|
84
|
-
# Add the server
|
|
85
|
-
success = self._add_server_from_json(config_dict, group_id)
|
|
86
|
-
|
|
87
|
-
if success:
|
|
88
|
-
# Reload MCP servers
|
|
89
|
-
try:
|
|
90
|
-
from code_puppy.agent import reload_mcp_servers
|
|
91
|
-
|
|
92
|
-
reload_mcp_servers()
|
|
93
|
-
except ImportError:
|
|
94
|
-
pass
|
|
95
|
-
|
|
96
|
-
emit_info(
|
|
97
|
-
"Use '/mcp list' to see all servers", message_group=group_id
|
|
98
|
-
)
|
|
99
|
-
|
|
100
|
-
else:
|
|
101
|
-
# No arguments - launch interactive wizard with server templates
|
|
102
|
-
success = run_interactive_install_wizard(self.manager, group_id)
|
|
103
|
-
|
|
104
|
-
if success:
|
|
105
|
-
# Reload the agent to pick up new server
|
|
106
|
-
try:
|
|
107
|
-
from code_puppy.agent import reload_mcp_servers
|
|
108
|
-
|
|
109
|
-
reload_mcp_servers()
|
|
110
|
-
except ImportError:
|
|
111
|
-
pass
|
|
112
|
-
|
|
113
|
-
except ImportError as e:
|
|
114
|
-
logger.error(f"Failed to import: {e}")
|
|
115
|
-
emit_info("Required module not available", message_group=group_id)
|
|
116
|
-
except Exception as e:
|
|
117
|
-
logger.error(f"Error in add command: {e}")
|
|
118
|
-
emit_info(f"[red]Error adding server: {e}[/red]", message_group=group_id)
|
|
119
|
-
|
|
120
|
-
def _add_server_from_json(self, config_dict: dict, group_id: str) -> bool:
|
|
121
|
-
"""
|
|
122
|
-
Add a server from JSON configuration.
|
|
123
|
-
|
|
124
|
-
Args:
|
|
125
|
-
config_dict: Server configuration dictionary
|
|
126
|
-
group_id: Message group ID
|
|
127
|
-
|
|
128
|
-
Returns:
|
|
129
|
-
True if successful, False otherwise
|
|
130
|
-
"""
|
|
131
|
-
try:
|
|
132
|
-
from code_puppy.config import MCP_SERVERS_FILE
|
|
133
|
-
from code_puppy.mcp.managed_server import ServerConfig
|
|
134
|
-
|
|
135
|
-
# Extract required fields
|
|
136
|
-
name = config_dict.pop("name")
|
|
137
|
-
server_type = config_dict.pop("type")
|
|
138
|
-
enabled = config_dict.pop("enabled", True)
|
|
139
|
-
|
|
140
|
-
# Everything else goes into config
|
|
141
|
-
server_config = ServerConfig(
|
|
142
|
-
id=f"{name}_{hash(name)}",
|
|
143
|
-
name=name,
|
|
144
|
-
type=server_type,
|
|
145
|
-
enabled=enabled,
|
|
146
|
-
config=config_dict, # Remaining fields are server-specific config
|
|
147
|
-
)
|
|
148
|
-
|
|
149
|
-
# Register the server
|
|
150
|
-
server_id = self.manager.register_server(server_config)
|
|
151
|
-
|
|
152
|
-
if not server_id:
|
|
153
|
-
emit_info(f"Failed to add server '{name}'", message_group=group_id)
|
|
154
|
-
return False
|
|
155
|
-
|
|
156
|
-
emit_info(
|
|
157
|
-
f"✅ Added server '{name}' (ID: {server_id})", message_group=group_id
|
|
158
|
-
)
|
|
159
|
-
|
|
160
|
-
# Save to mcp_servers.json for persistence
|
|
161
|
-
if os.path.exists(MCP_SERVERS_FILE):
|
|
162
|
-
with open(MCP_SERVERS_FILE, "r") as f:
|
|
163
|
-
data = json.load(f)
|
|
164
|
-
servers = data.get("mcp_servers", {})
|
|
165
|
-
else:
|
|
166
|
-
servers = {}
|
|
167
|
-
data = {"mcp_servers": servers}
|
|
168
|
-
|
|
169
|
-
# Add new server
|
|
170
|
-
servers[name] = config_dict.copy()
|
|
171
|
-
servers[name]["type"] = server_type
|
|
172
|
-
|
|
173
|
-
# Save back
|
|
174
|
-
os.makedirs(os.path.dirname(MCP_SERVERS_FILE), exist_ok=True)
|
|
175
|
-
with open(MCP_SERVERS_FILE, "w") as f:
|
|
176
|
-
json.dump(data, f, indent=2)
|
|
177
|
-
|
|
178
|
-
return True
|
|
179
|
-
|
|
180
|
-
except Exception as e:
|
|
181
|
-
logger.error(f"Error adding server from JSON: {e}")
|
|
182
|
-
emit_info(f"[red]Failed to add server: {e}[/red]", message_group=group_id)
|
|
183
|
-
return False
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
|
|
3
|
-
from rich.console import Console
|
|
4
|
-
|
|
5
|
-
from code_puppy.command_line.model_picker_completion import (
|
|
6
|
-
load_model_names,
|
|
7
|
-
update_model_in_input,
|
|
8
|
-
)
|
|
9
|
-
from code_puppy.config import get_config_keys
|
|
10
|
-
from code_puppy.command_line.utils import make_directory_table
|
|
11
|
-
from code_puppy.command_line.motd import print_motd
|
|
12
|
-
|
|
13
|
-
META_COMMANDS_HELP = """
|
|
14
|
-
[bold magenta]Meta Commands Help[/bold magenta]
|
|
15
|
-
~help, ~h Show this help message
|
|
16
|
-
~cd <dir> Change directory or show directories
|
|
17
|
-
~m <model> Set active model
|
|
18
|
-
~motd Show the latest message of the day (MOTD)
|
|
19
|
-
~show Show puppy config key-values
|
|
20
|
-
~set Set puppy config key-values (message_limit, protected_token_count, compaction_threshold, allow_recursion, etc.)
|
|
21
|
-
~<unknown> Show unknown meta command warning
|
|
22
|
-
"""
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def handle_meta_command(command: str, console: Console) -> bool:
|
|
26
|
-
"""
|
|
27
|
-
Handle meta/config commands prefixed with '~'.
|
|
28
|
-
Returns True if the command was handled (even if just an error/help), False if not.
|
|
29
|
-
"""
|
|
30
|
-
command = command.strip()
|
|
31
|
-
|
|
32
|
-
if command.strip().startswith("~motd"):
|
|
33
|
-
print_motd(console, force=True)
|
|
34
|
-
return True
|
|
35
|
-
|
|
36
|
-
if command.startswith("~cd"):
|
|
37
|
-
tokens = command.split()
|
|
38
|
-
if len(tokens) == 1:
|
|
39
|
-
try:
|
|
40
|
-
table = make_directory_table()
|
|
41
|
-
console.print(table)
|
|
42
|
-
except Exception as e:
|
|
43
|
-
console.print(f"[red]Error listing directory:[/red] {e}")
|
|
44
|
-
return True
|
|
45
|
-
elif len(tokens) == 2:
|
|
46
|
-
dirname = tokens[1]
|
|
47
|
-
target = os.path.expanduser(dirname)
|
|
48
|
-
if not os.path.isabs(target):
|
|
49
|
-
target = os.path.join(os.getcwd(), target)
|
|
50
|
-
if os.path.isdir(target):
|
|
51
|
-
os.chdir(target)
|
|
52
|
-
console.print(
|
|
53
|
-
f"[bold green]Changed directory to:[/bold green] [cyan]{target}[/cyan]"
|
|
54
|
-
)
|
|
55
|
-
else:
|
|
56
|
-
console.print(f"[red]Not a directory:[/red] [bold]{dirname}[/bold]")
|
|
57
|
-
return True
|
|
58
|
-
|
|
59
|
-
if command.strip().startswith("~show"):
|
|
60
|
-
from code_puppy.command_line.model_picker_completion import get_active_model
|
|
61
|
-
from code_puppy.config import (
|
|
62
|
-
get_owner_name,
|
|
63
|
-
get_puppy_name,
|
|
64
|
-
get_yolo_mode,
|
|
65
|
-
get_message_limit,
|
|
66
|
-
)
|
|
67
|
-
|
|
68
|
-
puppy_name = get_puppy_name()
|
|
69
|
-
owner_name = get_owner_name()
|
|
70
|
-
model = get_active_model()
|
|
71
|
-
yolo_mode = get_yolo_mode()
|
|
72
|
-
msg_limit = get_message_limit()
|
|
73
|
-
console.print(f"""[bold magenta]🐶 Puppy Status[/bold magenta]
|
|
74
|
-
|
|
75
|
-
[bold]puppy_name:[/bold] [cyan]{puppy_name}[/cyan]
|
|
76
|
-
[bold]owner_name:[/bold] [cyan]{owner_name}[/cyan]
|
|
77
|
-
[bold]model:[/bold] [green]{model}[/green]
|
|
78
|
-
[bold]YOLO_MODE:[/bold] {"[red]ON[/red]" if yolo_mode else "[yellow]off[/yellow]"}
|
|
79
|
-
[bold]message_limit:[/bold] [cyan]{msg_limit}[/cyan] requests per minute
|
|
80
|
-
""")
|
|
81
|
-
return True
|
|
82
|
-
|
|
83
|
-
if command.startswith("~set"):
|
|
84
|
-
# Syntax: ~set KEY=VALUE or ~set KEY VALUE
|
|
85
|
-
from code_puppy.config import set_config_value
|
|
86
|
-
|
|
87
|
-
tokens = command.split(None, 2)
|
|
88
|
-
argstr = command[len("~set") :].strip()
|
|
89
|
-
key = None
|
|
90
|
-
value = None
|
|
91
|
-
if "=" in argstr:
|
|
92
|
-
key, value = argstr.split("=", 1)
|
|
93
|
-
key = key.strip()
|
|
94
|
-
value = value.strip()
|
|
95
|
-
elif len(tokens) >= 3:
|
|
96
|
-
key = tokens[1]
|
|
97
|
-
value = tokens[2]
|
|
98
|
-
elif len(tokens) == 2:
|
|
99
|
-
key = tokens[1]
|
|
100
|
-
value = ""
|
|
101
|
-
else:
|
|
102
|
-
console.print(
|
|
103
|
-
f"[yellow]Usage:[/yellow] ~set KEY=VALUE or ~set KEY VALUE\nConfig keys: {', '.join(get_config_keys())}"
|
|
104
|
-
)
|
|
105
|
-
return True
|
|
106
|
-
if key:
|
|
107
|
-
set_config_value(key, value)
|
|
108
|
-
console.print(
|
|
109
|
-
f'[green]🌶 Set[/green] [cyan]{key}[/cyan] = "{value}" in puppy.cfg!'
|
|
110
|
-
)
|
|
111
|
-
else:
|
|
112
|
-
console.print("[red]You must supply a key.[/red]")
|
|
113
|
-
return True
|
|
114
|
-
|
|
115
|
-
if command.startswith("~m"):
|
|
116
|
-
# Try setting model and show confirmation
|
|
117
|
-
new_input = update_model_in_input(command)
|
|
118
|
-
if new_input is not None:
|
|
119
|
-
from code_puppy.command_line.model_picker_completion import get_active_model
|
|
120
|
-
from code_puppy.agents.runtime_manager import get_runtime_agent_manager
|
|
121
|
-
|
|
122
|
-
model = get_active_model()
|
|
123
|
-
# Make sure this is called for the test
|
|
124
|
-
manager = get_runtime_agent_manager()
|
|
125
|
-
manager.reload_agent()
|
|
126
|
-
console.print(
|
|
127
|
-
f"[bold green]Active model set and loaded:[/bold green] [cyan]{model}[/cyan]"
|
|
128
|
-
)
|
|
129
|
-
return True
|
|
130
|
-
# If no model matched, show available models
|
|
131
|
-
model_names = load_model_names()
|
|
132
|
-
console.print("[yellow]Usage:[/yellow] ~m <model-name>")
|
|
133
|
-
console.print(f"[yellow]Available models:[/yellow] {', '.join(model_names)}")
|
|
134
|
-
return True
|
|
135
|
-
if command in ("~help", "~h"):
|
|
136
|
-
console.print(META_COMMANDS_HELP)
|
|
137
|
-
return True
|
|
138
|
-
if command.startswith("~"):
|
|
139
|
-
name = command[1:].split()[0] if len(command) > 1 else ""
|
|
140
|
-
if name:
|
|
141
|
-
console.print(
|
|
142
|
-
f"[yellow]Unknown meta command:[/yellow] {command}\n[dim]Type ~help for options.[/dim]"
|
|
143
|
-
)
|
|
144
|
-
else:
|
|
145
|
-
# Show current model ONLY here
|
|
146
|
-
from code_puppy.command_line.model_picker_completion import get_active_model
|
|
147
|
-
|
|
148
|
-
current_model = get_active_model()
|
|
149
|
-
console.print(
|
|
150
|
-
f"[bold green]Current Model:[/bold green] [cyan]{current_model}[/cyan]"
|
|
151
|
-
)
|
|
152
|
-
return True
|
|
153
|
-
return False
|