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.
Files changed (243) hide show
  1. code_puppy/__init__.py +7 -1
  2. code_puppy/agents/__init__.py +8 -8
  3. code_puppy/agents/agent_c_reviewer.py +155 -0
  4. code_puppy/agents/agent_code_puppy.py +9 -2
  5. code_puppy/agents/agent_code_reviewer.py +90 -0
  6. code_puppy/agents/agent_cpp_reviewer.py +132 -0
  7. code_puppy/agents/agent_creator_agent.py +48 -9
  8. code_puppy/agents/agent_golang_reviewer.py +151 -0
  9. code_puppy/agents/agent_javascript_reviewer.py +160 -0
  10. code_puppy/agents/agent_manager.py +146 -199
  11. code_puppy/agents/agent_pack_leader.py +383 -0
  12. code_puppy/agents/agent_planning.py +163 -0
  13. code_puppy/agents/agent_python_programmer.py +165 -0
  14. code_puppy/agents/agent_python_reviewer.py +90 -0
  15. code_puppy/agents/agent_qa_expert.py +163 -0
  16. code_puppy/agents/agent_qa_kitten.py +208 -0
  17. code_puppy/agents/agent_security_auditor.py +181 -0
  18. code_puppy/agents/agent_terminal_qa.py +323 -0
  19. code_puppy/agents/agent_typescript_reviewer.py +166 -0
  20. code_puppy/agents/base_agent.py +1713 -1
  21. code_puppy/agents/event_stream_handler.py +350 -0
  22. code_puppy/agents/json_agent.py +12 -1
  23. code_puppy/agents/pack/__init__.py +34 -0
  24. code_puppy/agents/pack/bloodhound.py +304 -0
  25. code_puppy/agents/pack/husky.py +321 -0
  26. code_puppy/agents/pack/retriever.py +393 -0
  27. code_puppy/agents/pack/shepherd.py +348 -0
  28. code_puppy/agents/pack/terrier.py +287 -0
  29. code_puppy/agents/pack/watchdog.py +367 -0
  30. code_puppy/agents/prompt_reviewer.py +145 -0
  31. code_puppy/agents/subagent_stream_handler.py +276 -0
  32. code_puppy/api/__init__.py +13 -0
  33. code_puppy/api/app.py +169 -0
  34. code_puppy/api/main.py +21 -0
  35. code_puppy/api/pty_manager.py +446 -0
  36. code_puppy/api/routers/__init__.py +12 -0
  37. code_puppy/api/routers/agents.py +36 -0
  38. code_puppy/api/routers/commands.py +217 -0
  39. code_puppy/api/routers/config.py +74 -0
  40. code_puppy/api/routers/sessions.py +232 -0
  41. code_puppy/api/templates/terminal.html +361 -0
  42. code_puppy/api/websocket.py +154 -0
  43. code_puppy/callbacks.py +174 -4
  44. code_puppy/chatgpt_codex_client.py +283 -0
  45. code_puppy/claude_cache_client.py +586 -0
  46. code_puppy/cli_runner.py +916 -0
  47. code_puppy/command_line/add_model_menu.py +1079 -0
  48. code_puppy/command_line/agent_menu.py +395 -0
  49. code_puppy/command_line/attachments.py +395 -0
  50. code_puppy/command_line/autosave_menu.py +605 -0
  51. code_puppy/command_line/clipboard.py +527 -0
  52. code_puppy/command_line/colors_menu.py +520 -0
  53. code_puppy/command_line/command_handler.py +233 -627
  54. code_puppy/command_line/command_registry.py +150 -0
  55. code_puppy/command_line/config_commands.py +715 -0
  56. code_puppy/command_line/core_commands.py +792 -0
  57. code_puppy/command_line/diff_menu.py +863 -0
  58. code_puppy/command_line/load_context_completion.py +15 -22
  59. code_puppy/command_line/mcp/base.py +1 -4
  60. code_puppy/command_line/mcp/catalog_server_installer.py +175 -0
  61. code_puppy/command_line/mcp/custom_server_form.py +688 -0
  62. code_puppy/command_line/mcp/custom_server_installer.py +195 -0
  63. code_puppy/command_line/mcp/edit_command.py +148 -0
  64. code_puppy/command_line/mcp/handler.py +9 -4
  65. code_puppy/command_line/mcp/help_command.py +6 -5
  66. code_puppy/command_line/mcp/install_command.py +16 -27
  67. code_puppy/command_line/mcp/install_menu.py +685 -0
  68. code_puppy/command_line/mcp/list_command.py +3 -3
  69. code_puppy/command_line/mcp/logs_command.py +174 -65
  70. code_puppy/command_line/mcp/remove_command.py +2 -2
  71. code_puppy/command_line/mcp/restart_command.py +12 -4
  72. code_puppy/command_line/mcp/search_command.py +17 -11
  73. code_puppy/command_line/mcp/start_all_command.py +22 -13
  74. code_puppy/command_line/mcp/start_command.py +50 -31
  75. code_puppy/command_line/mcp/status_command.py +6 -7
  76. code_puppy/command_line/mcp/stop_all_command.py +11 -8
  77. code_puppy/command_line/mcp/stop_command.py +11 -10
  78. code_puppy/command_line/mcp/test_command.py +2 -2
  79. code_puppy/command_line/mcp/utils.py +1 -1
  80. code_puppy/command_line/mcp/wizard_utils.py +22 -18
  81. code_puppy/command_line/mcp_completion.py +174 -0
  82. code_puppy/command_line/model_picker_completion.py +89 -30
  83. code_puppy/command_line/model_settings_menu.py +884 -0
  84. code_puppy/command_line/motd.py +14 -8
  85. code_puppy/command_line/onboarding_slides.py +179 -0
  86. code_puppy/command_line/onboarding_wizard.py +340 -0
  87. code_puppy/command_line/pin_command_completion.py +329 -0
  88. code_puppy/command_line/prompt_toolkit_completion.py +626 -75
  89. code_puppy/command_line/session_commands.py +296 -0
  90. code_puppy/command_line/utils.py +54 -0
  91. code_puppy/config.py +1181 -51
  92. code_puppy/error_logging.py +118 -0
  93. code_puppy/gemini_code_assist.py +385 -0
  94. code_puppy/gemini_model.py +602 -0
  95. code_puppy/http_utils.py +220 -104
  96. code_puppy/keymap.py +128 -0
  97. code_puppy/main.py +5 -594
  98. code_puppy/{mcp → mcp_}/__init__.py +17 -0
  99. code_puppy/{mcp → mcp_}/async_lifecycle.py +35 -4
  100. code_puppy/{mcp → mcp_}/blocking_startup.py +70 -43
  101. code_puppy/{mcp → mcp_}/captured_stdio_server.py +2 -2
  102. code_puppy/{mcp → mcp_}/config_wizard.py +5 -5
  103. code_puppy/{mcp → mcp_}/dashboard.py +15 -6
  104. code_puppy/{mcp → mcp_}/examples/retry_example.py +4 -1
  105. code_puppy/{mcp → mcp_}/managed_server.py +66 -39
  106. code_puppy/{mcp → mcp_}/manager.py +146 -52
  107. code_puppy/mcp_/mcp_logs.py +224 -0
  108. code_puppy/{mcp → mcp_}/registry.py +6 -6
  109. code_puppy/{mcp → mcp_}/server_registry_catalog.py +25 -8
  110. code_puppy/messaging/__init__.py +199 -2
  111. code_puppy/messaging/bus.py +610 -0
  112. code_puppy/messaging/commands.py +167 -0
  113. code_puppy/messaging/markdown_patches.py +57 -0
  114. code_puppy/messaging/message_queue.py +17 -48
  115. code_puppy/messaging/messages.py +500 -0
  116. code_puppy/messaging/queue_console.py +1 -24
  117. code_puppy/messaging/renderers.py +43 -146
  118. code_puppy/messaging/rich_renderer.py +1027 -0
  119. code_puppy/messaging/spinner/__init__.py +33 -5
  120. code_puppy/messaging/spinner/console_spinner.py +92 -52
  121. code_puppy/messaging/spinner/spinner_base.py +29 -0
  122. code_puppy/messaging/subagent_console.py +461 -0
  123. code_puppy/model_factory.py +686 -80
  124. code_puppy/model_utils.py +167 -0
  125. code_puppy/models.json +86 -104
  126. code_puppy/models_dev_api.json +1 -0
  127. code_puppy/models_dev_parser.py +592 -0
  128. code_puppy/plugins/__init__.py +164 -10
  129. code_puppy/plugins/antigravity_oauth/__init__.py +10 -0
  130. code_puppy/plugins/antigravity_oauth/accounts.py +406 -0
  131. code_puppy/plugins/antigravity_oauth/antigravity_model.py +704 -0
  132. code_puppy/plugins/antigravity_oauth/config.py +42 -0
  133. code_puppy/plugins/antigravity_oauth/constants.py +136 -0
  134. code_puppy/plugins/antigravity_oauth/oauth.py +478 -0
  135. code_puppy/plugins/antigravity_oauth/register_callbacks.py +406 -0
  136. code_puppy/plugins/antigravity_oauth/storage.py +271 -0
  137. code_puppy/plugins/antigravity_oauth/test_plugin.py +319 -0
  138. code_puppy/plugins/antigravity_oauth/token.py +167 -0
  139. code_puppy/plugins/antigravity_oauth/transport.py +767 -0
  140. code_puppy/plugins/antigravity_oauth/utils.py +169 -0
  141. code_puppy/plugins/chatgpt_oauth/__init__.py +8 -0
  142. code_puppy/plugins/chatgpt_oauth/config.py +52 -0
  143. code_puppy/plugins/chatgpt_oauth/oauth_flow.py +328 -0
  144. code_puppy/plugins/chatgpt_oauth/register_callbacks.py +94 -0
  145. code_puppy/plugins/chatgpt_oauth/test_plugin.py +293 -0
  146. code_puppy/plugins/chatgpt_oauth/utils.py +489 -0
  147. code_puppy/plugins/claude_code_oauth/README.md +167 -0
  148. code_puppy/plugins/claude_code_oauth/SETUP.md +93 -0
  149. code_puppy/plugins/claude_code_oauth/__init__.py +6 -0
  150. code_puppy/plugins/claude_code_oauth/config.py +50 -0
  151. code_puppy/plugins/claude_code_oauth/register_callbacks.py +308 -0
  152. code_puppy/plugins/claude_code_oauth/test_plugin.py +283 -0
  153. code_puppy/plugins/claude_code_oauth/utils.py +518 -0
  154. code_puppy/plugins/customizable_commands/__init__.py +0 -0
  155. code_puppy/plugins/customizable_commands/register_callbacks.py +169 -0
  156. code_puppy/plugins/example_custom_command/README.md +280 -0
  157. code_puppy/plugins/example_custom_command/register_callbacks.py +51 -0
  158. code_puppy/plugins/file_permission_handler/__init__.py +4 -0
  159. code_puppy/plugins/file_permission_handler/register_callbacks.py +523 -0
  160. code_puppy/plugins/frontend_emitter/__init__.py +25 -0
  161. code_puppy/plugins/frontend_emitter/emitter.py +121 -0
  162. code_puppy/plugins/frontend_emitter/register_callbacks.py +261 -0
  163. code_puppy/plugins/oauth_puppy_html.py +228 -0
  164. code_puppy/plugins/shell_safety/__init__.py +6 -0
  165. code_puppy/plugins/shell_safety/agent_shell_safety.py +69 -0
  166. code_puppy/plugins/shell_safety/command_cache.py +156 -0
  167. code_puppy/plugins/shell_safety/register_callbacks.py +202 -0
  168. code_puppy/prompts/antigravity_system_prompt.md +1 -0
  169. code_puppy/prompts/codex_system_prompt.md +310 -0
  170. code_puppy/pydantic_patches.py +131 -0
  171. code_puppy/reopenable_async_client.py +8 -8
  172. code_puppy/round_robin_model.py +10 -15
  173. code_puppy/session_storage.py +294 -0
  174. code_puppy/status_display.py +21 -4
  175. code_puppy/summarization_agent.py +52 -14
  176. code_puppy/terminal_utils.py +418 -0
  177. code_puppy/tools/__init__.py +139 -6
  178. code_puppy/tools/agent_tools.py +548 -49
  179. code_puppy/tools/browser/__init__.py +37 -0
  180. code_puppy/tools/browser/browser_control.py +289 -0
  181. code_puppy/tools/browser/browser_interactions.py +545 -0
  182. code_puppy/tools/browser/browser_locators.py +640 -0
  183. code_puppy/tools/browser/browser_manager.py +316 -0
  184. code_puppy/tools/browser/browser_navigation.py +251 -0
  185. code_puppy/tools/browser/browser_screenshot.py +179 -0
  186. code_puppy/tools/browser/browser_scripts.py +462 -0
  187. code_puppy/tools/browser/browser_workflows.py +221 -0
  188. code_puppy/tools/browser/chromium_terminal_manager.py +259 -0
  189. code_puppy/tools/browser/terminal_command_tools.py +521 -0
  190. code_puppy/tools/browser/terminal_screenshot_tools.py +556 -0
  191. code_puppy/tools/browser/terminal_tools.py +525 -0
  192. code_puppy/tools/command_runner.py +941 -153
  193. code_puppy/tools/common.py +1146 -6
  194. code_puppy/tools/display.py +84 -0
  195. code_puppy/tools/file_modifications.py +288 -89
  196. code_puppy/tools/file_operations.py +352 -266
  197. code_puppy/tools/subagent_context.py +158 -0
  198. code_puppy/uvx_detection.py +242 -0
  199. code_puppy/version_checker.py +30 -11
  200. code_puppy-0.0.366.data/data/code_puppy/models.json +110 -0
  201. code_puppy-0.0.366.data/data/code_puppy/models_dev_api.json +1 -0
  202. {code_puppy-0.0.169.dist-info → code_puppy-0.0.366.dist-info}/METADATA +184 -67
  203. code_puppy-0.0.366.dist-info/RECORD +217 -0
  204. {code_puppy-0.0.169.dist-info → code_puppy-0.0.366.dist-info}/WHEEL +1 -1
  205. {code_puppy-0.0.169.dist-info → code_puppy-0.0.366.dist-info}/entry_points.txt +1 -0
  206. code_puppy/agent.py +0 -231
  207. code_puppy/agents/agent_orchestrator.json +0 -26
  208. code_puppy/agents/runtime_manager.py +0 -272
  209. code_puppy/command_line/mcp/add_command.py +0 -183
  210. code_puppy/command_line/meta_command_handler.py +0 -153
  211. code_puppy/message_history_processor.py +0 -490
  212. code_puppy/messaging/spinner/textual_spinner.py +0 -101
  213. code_puppy/state_management.py +0 -200
  214. code_puppy/tui/__init__.py +0 -10
  215. code_puppy/tui/app.py +0 -986
  216. code_puppy/tui/components/__init__.py +0 -21
  217. code_puppy/tui/components/chat_view.py +0 -550
  218. code_puppy/tui/components/command_history_modal.py +0 -218
  219. code_puppy/tui/components/copy_button.py +0 -139
  220. code_puppy/tui/components/custom_widgets.py +0 -63
  221. code_puppy/tui/components/human_input_modal.py +0 -175
  222. code_puppy/tui/components/input_area.py +0 -167
  223. code_puppy/tui/components/sidebar.py +0 -309
  224. code_puppy/tui/components/status_bar.py +0 -182
  225. code_puppy/tui/messages.py +0 -27
  226. code_puppy/tui/models/__init__.py +0 -8
  227. code_puppy/tui/models/chat_message.py +0 -25
  228. code_puppy/tui/models/command_history.py +0 -89
  229. code_puppy/tui/models/enums.py +0 -24
  230. code_puppy/tui/screens/__init__.py +0 -15
  231. code_puppy/tui/screens/help.py +0 -130
  232. code_puppy/tui/screens/mcp_install_wizard.py +0 -803
  233. code_puppy/tui/screens/settings.py +0 -290
  234. code_puppy/tui/screens/tools.py +0 -74
  235. code_puppy-0.0.169.data/data/code_puppy/models.json +0 -128
  236. code_puppy-0.0.169.dist-info/RECORD +0 -112
  237. /code_puppy/{mcp → mcp_}/circuit_breaker.py +0 -0
  238. /code_puppy/{mcp → mcp_}/error_isolation.py +0 -0
  239. /code_puppy/{mcp → mcp_}/health_monitor.py +0 -0
  240. /code_puppy/{mcp → mcp_}/retry_manager.py +0 -0
  241. /code_puppy/{mcp → mcp_}/status_tracker.py +0 -0
  242. /code_puppy/{mcp → mcp_}/system_tools.py +0 -0
  243. {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