code-puppy 0.0.379__tar.gz → 0.0.380__tar.gz
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-0.0.379 → code_puppy-0.0.380}/PKG-INFO +1 -1
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/base_agent.py +76 -2
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/callbacks.py +14 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/config.py +15 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/mcp_/server_registry_catalog.py +14 -1
- {code_puppy-0.0.379 → code_puppy-0.0.380}/pyproject.toml +1 -1
- {code_puppy-0.0.379 → code_puppy-0.0.380}/.gitignore +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/LICENSE +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/README.md +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/__main__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/agent_c_reviewer.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/agent_code_puppy.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/agent_code_reviewer.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/agent_cpp_reviewer.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/agent_creator_agent.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/agent_golang_reviewer.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/agent_helios.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/agent_javascript_reviewer.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/agent_manager.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/agent_pack_leader.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/agent_planning.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/agent_python_programmer.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/agent_python_reviewer.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/agent_qa_expert.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/agent_qa_kitten.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/agent_security_auditor.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/agent_terminal_qa.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/agent_typescript_reviewer.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/event_stream_handler.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/json_agent.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/pack/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/pack/bloodhound.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/pack/husky.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/pack/retriever.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/pack/shepherd.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/pack/terrier.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/pack/watchdog.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/prompt_reviewer.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/agents/subagent_stream_handler.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/api/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/api/app.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/api/main.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/api/pty_manager.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/api/routers/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/api/routers/agents.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/api/routers/commands.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/api/routers/config.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/api/routers/sessions.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/api/templates/terminal.html +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/api/websocket.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/chatgpt_codex_client.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/claude_cache_client.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/cli_runner.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/add_model_menu.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/agent_menu.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/attachments.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/autosave_menu.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/clipboard.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/colors_menu.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/command_handler.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/command_registry.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/config_commands.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/core_commands.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/diff_menu.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/file_path_completion.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/load_context_completion.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/base.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/edit_command.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/handler.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/help_command.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/install_command.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/install_menu.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/list_command.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/logs_command.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/remove_command.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/restart_command.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/search_command.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/start_all_command.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/start_command.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/status_command.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/stop_command.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/test_command.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/utils.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp_completion.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/model_picker_completion.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/model_settings_menu.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/motd.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/onboarding_slides.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/onboarding_wizard.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/pin_command_completion.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/session_commands.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/uc_menu.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/utils.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/error_logging.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/gemini_code_assist.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/gemini_model.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/http_utils.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/keymap.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/main.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/mcp_/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/mcp_/async_lifecycle.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/mcp_/blocking_startup.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/mcp_/captured_stdio_server.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/mcp_/circuit_breaker.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/mcp_/config_wizard.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/mcp_/dashboard.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/mcp_/error_isolation.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/mcp_/examples/retry_example.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/mcp_/health_monitor.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/mcp_/managed_server.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/mcp_/manager.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/mcp_/mcp_logs.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/mcp_/registry.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/mcp_/retry_manager.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/mcp_/status_tracker.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/mcp_/system_tools.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/messaging/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/messaging/bus.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/messaging/commands.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/messaging/markdown_patches.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/messaging/message_queue.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/messaging/messages.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/messaging/queue_console.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/messaging/renderers.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/messaging/rich_renderer.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/messaging/spinner/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/messaging/spinner/console_spinner.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/messaging/spinner/spinner_base.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/messaging/subagent_console.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/model_factory.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/model_switching.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/model_utils.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/models.json +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/models_dev_api.json +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/models_dev_parser.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/antigravity_oauth/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/antigravity_oauth/accounts.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/antigravity_oauth/antigravity_model.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/antigravity_oauth/config.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/antigravity_oauth/constants.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/antigravity_oauth/oauth.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/antigravity_oauth/register_callbacks.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/antigravity_oauth/storage.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/antigravity_oauth/test_plugin.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/antigravity_oauth/token.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/antigravity_oauth/transport.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/antigravity_oauth/utils.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/chatgpt_oauth/utils.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/claude_code_oauth/utils.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/example_custom_command/README.md +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/frontend_emitter/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/frontend_emitter/emitter.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/frontend_emitter/register_callbacks.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/oauth_puppy_html.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/ralph/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/ralph/agents.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/ralph/commands.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/ralph/loop_controller.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/ralph/models.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/ralph/register_callbacks.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/ralph/state_manager.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/ralph/tools.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/shell_safety/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/universal_constructor/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/universal_constructor/models.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/universal_constructor/register_callbacks.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/universal_constructor/registry.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/universal_constructor/sandbox.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/prompts/antigravity_system_prompt.md +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/pydantic_patches.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/reopenable_async_client.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/round_robin_model.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/session_storage.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/status_display.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/summarization_agent.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/terminal_utils.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/agent_tools.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/browser/__init__.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/browser/browser_control.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/browser/browser_interactions.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/browser/browser_locators.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/browser/browser_manager.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/browser/browser_navigation.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/browser/browser_screenshot.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/browser/browser_scripts.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/browser/browser_workflows.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/browser/chromium_terminal_manager.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/browser/terminal_command_tools.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/browser/terminal_screenshot_tools.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/browser/terminal_tools.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/command_runner.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/common.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/display.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/file_modifications.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/file_operations.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/subagent_context.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/tools_content.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/universal_constructor.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/uvx_detection.py +0 -0
- {code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/version_checker.py +0 -0
|
@@ -3,8 +3,11 @@
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import json
|
|
5
5
|
import math
|
|
6
|
+
import pathlib
|
|
6
7
|
import signal
|
|
7
8
|
import threading
|
|
9
|
+
import time
|
|
10
|
+
import traceback
|
|
8
11
|
import uuid
|
|
9
12
|
from abc import ABC, abstractmethod
|
|
10
13
|
from typing import (
|
|
@@ -37,6 +40,7 @@ from pydantic_ai.durable_exec.dbos import DBOSAgent
|
|
|
37
40
|
from pydantic_ai.messages import (
|
|
38
41
|
ModelMessage,
|
|
39
42
|
ModelRequest,
|
|
43
|
+
ModelResponse,
|
|
40
44
|
TextPart,
|
|
41
45
|
ThinkingPart,
|
|
42
46
|
ToolCallPart,
|
|
@@ -88,6 +92,49 @@ _delayed_compaction_requested = False
|
|
|
88
92
|
_reload_count = 0
|
|
89
93
|
|
|
90
94
|
|
|
95
|
+
def _log_error_to_file(exc: Exception) -> Optional[str]:
|
|
96
|
+
"""Log detailed error information to ~/.code_puppy/error_logs/log_{timestamp}.txt.
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
exc: The exception to log.
|
|
100
|
+
|
|
101
|
+
Returns:
|
|
102
|
+
The path to the log file if successful, None otherwise.
|
|
103
|
+
"""
|
|
104
|
+
try:
|
|
105
|
+
error_logs_dir = pathlib.Path.home() / ".code_puppy" / "error_logs"
|
|
106
|
+
error_logs_dir.mkdir(parents=True, exist_ok=True)
|
|
107
|
+
|
|
108
|
+
timestamp = time.strftime("%Y%m%d_%H%M%S")
|
|
109
|
+
log_file = error_logs_dir / f"log_{timestamp}.txt"
|
|
110
|
+
|
|
111
|
+
with open(log_file, "w", encoding="utf-8") as f:
|
|
112
|
+
f.write(f"Timestamp: {time.strftime('%Y-%m-%d %H:%M:%S')}\n")
|
|
113
|
+
f.write(f"Exception Type: {type(exc).__name__}\n")
|
|
114
|
+
f.write(f"Exception Message: {str(exc)}\n")
|
|
115
|
+
f.write(f"Exception Args: {exc.args}\n")
|
|
116
|
+
f.write("\n--- Full Traceback ---\n")
|
|
117
|
+
f.write(traceback.format_exc())
|
|
118
|
+
f.write("\n--- Exception Chain ---\n")
|
|
119
|
+
# Walk the exception chain for chained exceptions
|
|
120
|
+
current = exc
|
|
121
|
+
chain_depth = 0
|
|
122
|
+
while current is not None and chain_depth < 10:
|
|
123
|
+
f.write(
|
|
124
|
+
f"\n[Cause {chain_depth}] {type(current).__name__}: {current}\n"
|
|
125
|
+
)
|
|
126
|
+
f.write("".join(traceback.format_tb(current.__traceback__)))
|
|
127
|
+
current = (
|
|
128
|
+
current.__cause__ if current.__cause__ else current.__context__
|
|
129
|
+
)
|
|
130
|
+
chain_depth += 1
|
|
131
|
+
|
|
132
|
+
return str(log_file)
|
|
133
|
+
except Exception:
|
|
134
|
+
# Don't let logging errors break the main flow
|
|
135
|
+
return None
|
|
136
|
+
|
|
137
|
+
|
|
91
138
|
class BaseAgent(ABC):
|
|
92
139
|
"""Base class for all agent configurations."""
|
|
93
140
|
|
|
@@ -264,6 +311,33 @@ class BaseAgent(ABC):
|
|
|
264
311
|
cleaned.append(message)
|
|
265
312
|
return cleaned
|
|
266
313
|
|
|
314
|
+
def ensure_history_ends_with_request(
|
|
315
|
+
self, messages: List[ModelMessage]
|
|
316
|
+
) -> List[ModelMessage]:
|
|
317
|
+
"""Ensure message history ends with a ModelRequest.
|
|
318
|
+
|
|
319
|
+
pydantic_ai requires that processed message history ends with a ModelRequest.
|
|
320
|
+
This can fail when swapping models mid-conversation if the history ends with
|
|
321
|
+
a ModelResponse from the previous model.
|
|
322
|
+
|
|
323
|
+
This method trims trailing ModelResponse messages to ensure compatibility.
|
|
324
|
+
|
|
325
|
+
Args:
|
|
326
|
+
messages: List of messages to validate/fix.
|
|
327
|
+
|
|
328
|
+
Returns:
|
|
329
|
+
List of messages guaranteed to end with ModelRequest, or empty list
|
|
330
|
+
if no ModelRequest is found.
|
|
331
|
+
"""
|
|
332
|
+
if not messages:
|
|
333
|
+
return messages
|
|
334
|
+
|
|
335
|
+
# Trim trailing ModelResponse messages
|
|
336
|
+
while messages and isinstance(messages[-1], ModelResponse):
|
|
337
|
+
messages = messages[:-1]
|
|
338
|
+
|
|
339
|
+
return messages
|
|
340
|
+
|
|
267
341
|
# Message history processing methods (moved from state_management.py and message_history_processor.py)
|
|
268
342
|
def _stringify_part(self, part: Any) -> str:
|
|
269
343
|
"""Create a stable string representation for a message part.
|
|
@@ -372,10 +446,10 @@ class BaseAgent(ABC):
|
|
|
372
446
|
|
|
373
447
|
def estimate_token_count(self, text: str) -> int:
|
|
374
448
|
"""
|
|
375
|
-
Simple token estimation using len(message) /
|
|
449
|
+
Simple token estimation using len(message) / 2.5.
|
|
376
450
|
This replaces tiktoken with a much simpler approach.
|
|
377
451
|
"""
|
|
378
|
-
return max(1, math.floor((len(text) /
|
|
452
|
+
return max(1, math.floor((len(text) / 2.5)))
|
|
379
453
|
|
|
380
454
|
def estimate_tokens_for_message(self, message: ModelMessage) -> int:
|
|
381
455
|
"""
|
|
@@ -27,6 +27,7 @@ PhaseType = Literal[
|
|
|
27
27
|
"get_model_system_prompt",
|
|
28
28
|
"agent_run_start",
|
|
29
29
|
"agent_run_end",
|
|
30
|
+
"register_mcp_catalog_servers",
|
|
30
31
|
]
|
|
31
32
|
CallbackFunc = Callable[..., Any]
|
|
32
33
|
|
|
@@ -54,6 +55,7 @@ _callbacks: Dict[PhaseType, List[CallbackFunc]] = {
|
|
|
54
55
|
"get_model_system_prompt": [],
|
|
55
56
|
"agent_run_start": [],
|
|
56
57
|
"agent_run_end": [],
|
|
58
|
+
"register_mcp_catalog_servers": [],
|
|
57
59
|
}
|
|
58
60
|
|
|
59
61
|
logger = logging.getLogger(__name__)
|
|
@@ -517,3 +519,15 @@ async def on_agent_run_end(
|
|
|
517
519
|
response_text,
|
|
518
520
|
metadata,
|
|
519
521
|
)
|
|
522
|
+
|
|
523
|
+
|
|
524
|
+
def on_register_mcp_catalog_servers() -> List[Any]:
|
|
525
|
+
"""Trigger callbacks to register additional MCP catalog servers.
|
|
526
|
+
|
|
527
|
+
Plugins can register callbacks that return List[MCPServerTemplate] to add
|
|
528
|
+
servers to the MCP catalog/marketplace.
|
|
529
|
+
|
|
530
|
+
Returns:
|
|
531
|
+
List of results from all registered callbacks (each should be a list of MCPServerTemplate).
|
|
532
|
+
"""
|
|
533
|
+
return _trigger_callbacks_sync("register_mcp_catalog_servers")
|
|
@@ -144,6 +144,19 @@ def set_universal_constructor_enabled(enabled: bool) -> None:
|
|
|
144
144
|
set_value("enable_universal_constructor", "true" if enabled else "false")
|
|
145
145
|
|
|
146
146
|
|
|
147
|
+
def get_enable_streaming() -> bool:
|
|
148
|
+
"""
|
|
149
|
+
Get the enable_streaming configuration value.
|
|
150
|
+
Controls whether streaming (SSE) is used for model responses.
|
|
151
|
+
Returns True if streaming is enabled, False otherwise.
|
|
152
|
+
Defaults to True.
|
|
153
|
+
"""
|
|
154
|
+
val = get_value("enable_streaming")
|
|
155
|
+
if val is None:
|
|
156
|
+
return True # Default to True for better UX
|
|
157
|
+
return str(val).lower() in ("1", "true", "yes", "on")
|
|
158
|
+
|
|
159
|
+
|
|
147
160
|
DEFAULT_SECTION = "puppy"
|
|
148
161
|
REQUIRED_KEYS = ["puppy_name", "owner_name"]
|
|
149
162
|
|
|
@@ -289,6 +302,8 @@ def get_config_keys():
|
|
|
289
302
|
default_keys.append("enable_pack_agents")
|
|
290
303
|
# Add universal constructor control key
|
|
291
304
|
default_keys.append("enable_universal_constructor")
|
|
305
|
+
# Add streaming control key
|
|
306
|
+
default_keys.append("enable_streaming")
|
|
292
307
|
# Add cancel agent key configuration
|
|
293
308
|
default_keys.append("cancel_agent_key")
|
|
294
309
|
# Add banner color keys
|
|
@@ -1025,7 +1025,20 @@ class MCPServerCatalog:
|
|
|
1025
1025
|
"""Catalog for searching and managing pre-configured MCP servers."""
|
|
1026
1026
|
|
|
1027
1027
|
def __init__(self):
|
|
1028
|
-
|
|
1028
|
+
# Start with built-in servers
|
|
1029
|
+
self.servers = list(MCP_SERVER_REGISTRY)
|
|
1030
|
+
|
|
1031
|
+
# Let plugins add their own catalog entries
|
|
1032
|
+
try:
|
|
1033
|
+
from code_puppy.callbacks import on_register_mcp_catalog_servers
|
|
1034
|
+
|
|
1035
|
+
plugin_results = on_register_mcp_catalog_servers()
|
|
1036
|
+
for result in plugin_results:
|
|
1037
|
+
if isinstance(result, list):
|
|
1038
|
+
self.servers.extend(result)
|
|
1039
|
+
except Exception:
|
|
1040
|
+
pass # Don't break catalog if plugins fail
|
|
1041
|
+
|
|
1029
1042
|
self._build_index()
|
|
1030
1043
|
|
|
1031
1044
|
def _build_index(self):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/load_context_completion.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/catalog_server_installer.py
RENAMED
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/mcp/custom_server_installer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/model_picker_completion.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/command_line/prompt_toolkit_completion.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/antigravity_oauth/antigravity_model.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/antigravity_oauth/register_callbacks.py
RENAMED
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/antigravity_oauth/test_plugin.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/claude_code_oauth/register_callbacks.py
RENAMED
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/claude_code_oauth/test_plugin.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/customizable_commands/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/example_custom_command/README.md
RENAMED
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/file_permission_handler/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/frontend_emitter/register_callbacks.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/shell_safety/agent_shell_safety.py
RENAMED
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/shell_safety/register_callbacks.py
RENAMED
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/universal_constructor/__init__.py
RENAMED
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/universal_constructor/models.py
RENAMED
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/universal_constructor/registry.py
RENAMED
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/plugins/universal_constructor/sandbox.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/browser/chromium_terminal_manager.py
RENAMED
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/browser/terminal_command_tools.py
RENAMED
|
File without changes
|
{code_puppy-0.0.379 → code_puppy-0.0.380}/code_puppy/tools/browser/terminal_screenshot_tools.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|