code-puppy 0.0.950__tar.gz → 0.0.952__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.950 → code_puppy-0.0.952}/PKG-INFO +1 -1
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_builder.py +9 -4
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/edit_command.py +2 -2
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/remove_command.py +19 -7
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/restart_command.py +21 -12
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/start_all_command.py +26 -14
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/start_command.py +18 -16
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/stop_all_command.py +20 -11
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/stop_command.py +14 -6
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/utils.py +8 -3
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/locales/en-US.json +65 -2
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/locales/es.json +65 -2
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/locales/fr-CA.json +65 -2
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/subagent_invocation.py +24 -14
- {code_puppy-0.0.950 → code_puppy-0.0.952}/pyproject.toml +1 -1
- {code_puppy-0.0.950 → code_puppy-0.0.952}/.gitignore +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/LICENSE +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/README.md +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/__init__.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/__main__.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/_plugin_i18n_lifecycle.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/_pydantic_tool_helpers.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/_pydantic_video_patch.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agent_completion_inbox.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agent_execution_context.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/__init__.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_code_mode.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_code_mode_guidance.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_code_mode_session.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_compaction.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_diagnostics.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_foreign_thinking.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_history.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_key_listeners.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_mcp.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_model_message_transform.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_multimodal_error_hint.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_non_streaming_render.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_output_limits.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_rules.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_run_signals.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_runtime.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_steer_processor.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_subagent_recursion.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_token_limit_hint.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_tty_modes.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_windows_console.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_wire_tool_names.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/agent_code_puppy.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/agent_creator_agent.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/agent_helios.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/agent_manager.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/agent_model_judge.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/agent_planning.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/agent_qa_kitten.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/agent_web_retriever.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/base_agent.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/event_stream_handler.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/json_agent.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/retry_checkpoint.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/retry_profiles.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/run_invocation.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/run_stats.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/smooth_stream.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/stream_status.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/subagent_stream_handler.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/thinking_output.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/asyncio_cleanup.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/atomic_io.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/atomic_json.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/ca_bundle.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/callbacks.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/capabilities/__init__.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/capabilities/compaction.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/capabilities/eager_timing.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/chatgpt_codex_client.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/claude_cache_client.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/claude_oauth_transport.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/claude_thinking_display.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/cli_runner.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/__init__.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/add_model_details.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/add_model_menu.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/add_model_menus.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/add_model_vllm.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/agent_menu.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/attachments.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/autosave_menu.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/autosave_search.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/clipboard.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/colors_menu.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/command_handler.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/command_registry.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/completers.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/completion_cache.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/config_apply.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/config_commands.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/core_commands.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/file_index.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/file_path_completion.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/help_catalog.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/help_overlay.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/image_utils.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/load_context_completion.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/__init__.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/base.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/handler.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/help_command.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/install_command.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/install_menu.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/list_command.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/logs_command.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/mcp_servers_store.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/search_command.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/silence_warning_command.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/status_command.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/trust_command.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp_binding_menu.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp_completion.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/menu_session.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/model_picker_completion.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/model_settings_defs.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/model_settings_menu.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/onboarding_slides.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/onboarding_wizard.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/pagination.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/pin_command_completion.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/refresh_models.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/session_browser.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/session_browser_data.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/session_commands.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/set_menu.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/set_menu_catalog.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/set_menu_schema.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/set_menu_settings.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/set_menu_shims.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/set_menu_values.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/shell_passthrough.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/skills_completion.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/tui_style.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/uc_menu.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/utils.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/config.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/config_file.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/context_accounting.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/diagnostics.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/error_logging.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/events/__init__.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/events/bridge.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/file_completion_io.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/file_completion_tokens.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/gemini_code_assist.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/gemini_common.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/gemini_model.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/hook_engine/README.md +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/hook_engine/__init__.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/hook_engine/aliases.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/hook_engine/engine.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/hook_engine/executor.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/hook_engine/matcher.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/hook_engine/models.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/hook_engine/registry.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/hook_engine/validator.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/http_retry.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/http_utils.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/httpx2_utils.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/__init__.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/audit.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/catalog.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/formats.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/interpolation.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/locale.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/plugin_catalog.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/plurals.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/pseudo.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/translate.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/kennel_provider.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/keymap.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/list_filtering.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/main.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/malloc_noise_guard.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/__init__.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/agent_bindings.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/async_lifecycle.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/blocking_startup.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/circuit_breaker.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/config_wizard.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/dashboard.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/error_isolation.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/examples/retry_example.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/health_monitor.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/http_auth.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/managed_server.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/manager.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/manager_lifecycle.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/mcp_logs.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/project_config.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/registry.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/retry_manager.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/server_registry_catalog.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/status_tracker.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/system_tools.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/tool_arg_coercion.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/toolset_utils.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_prompts/__init__.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_prompts/hook_creator.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/__init__.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/bar_painters.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/bar_rendering.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/bottom_bar.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/bus.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/chords.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/commands.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/editor_actions.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/editor_completion.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/editor_display.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/editor_history.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/editor_keys.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/editor_paste.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/editor_queue.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/editor_submission.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/editor_undo.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/external_editor.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/identity_line.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/idle_status.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/inline_bar.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/line_editor.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/markdown_patches.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/menu_lifecycle.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/message_queue.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/messages.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/pause_controller.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/prompt_prefix_style.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/queue_console.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/renderers.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/rich_renderer.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/run_ui.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/run_ui_wiring.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/safe_console.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/safe_stream.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/speculation_line.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/speculation_stats.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/speculation_toggle.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/spinner/__init__.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/status_line.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/subagent_console.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/theme_accent.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/tool_output.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/transcript_guard.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/model_descriptions.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/model_factory.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/model_switching.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/model_utils.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/models.json +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/models_dev_api.json +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/models_dev_family.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/models_dev_parser.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/observability.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/platform_utils.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/plugins/__init__.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/plugins/config.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/plugins/oauth_pasteback.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/plugins/oauth_puppy_html.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/plugins/trust.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/plugins/trust_notice.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/private_inference.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/provider_credentials.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/provider_identity.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/pydantic_patches.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/reopenable_async_client.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/round_robin_model.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/secret_store.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/secret_store_backends.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/session_format_migration.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/session_lifecycle.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/session_migration.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/session_storage.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/session_surrogate_unpickler.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/shared_credentials.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/skill_provider.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/splash.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/status_display.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/steer_metadata.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/terminal_utils.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/token_usage.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/__init__.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/_browser_registry.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/_lazy.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/agent_tools.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/approval_feedback.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/__init__.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/constants.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/demo_tui.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/handler.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/models.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/registration.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/renderers.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/terminal_ui.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/theme.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/tui_loop.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/__init__.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_control.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_interactions.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_locator_resolver.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_locators.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_manager.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_navigation.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_page_snapshot.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_screenshot.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_scripts.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_semantic_interactions.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_workflows.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/tool_registry.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/command_runner.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/common.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/display.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/file_modifications.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/file_operations.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/file_permission_state.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/fs_access.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/image_tools.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/io_backends.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/model_tools.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ripgrep.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/shell_backgrounding.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/skills_tools.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/subagent_context.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/subagent_usage_metrics.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/tools_content.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/universal_constructor.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/win_shell_io.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/undo_manager.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/universal_constructor_provider.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/version_checker.py +0 -0
- {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/zai_model.py +0 -0
|
@@ -311,11 +311,16 @@ def _build_gpt_5_6_invoke_agent_guard_text() -> str:
|
|
|
311
311
|
limit = get_subagent_recursion_limit_gpt_5_6()
|
|
312
312
|
return (
|
|
313
313
|
"\n\n## Sub-Agent Delegation (GPT-5.6)\n"
|
|
314
|
-
"Use `invoke_agent`
|
|
315
|
-
"context or specialized tools
|
|
314
|
+
"Use `invoke_agent` for focused work that benefits from separate "
|
|
315
|
+
"context or specialized tools; handle small work directly. When a task "
|
|
316
|
+
"has independent, tightly scoped pieces, invoke them as multiple "
|
|
317
|
+
"sub-agents concurrently in one batch (several `invoke_agent` calls in "
|
|
318
|
+
"the same response) rather than one at a time. Each must be a direct "
|
|
319
|
+
"child told not to delegate further. Wait for the batch, then "
|
|
320
|
+
"synthesize the results yourself; "
|
|
321
|
+
"do not start recursive or repeated follow-up delegation chains. "
|
|
316
322
|
"Never invoke `planning-agent`. "
|
|
317
|
-
f"Hard cap:
|
|
318
|
-
f"the resulting chain depth stays at or below {limit} "
|
|
323
|
+
f"Hard cap: the resulting chain depth must stay at or below {limit} "
|
|
319
324
|
f"(main agent = depth 0). Do not attempt deeper chains.\n"
|
|
320
325
|
)
|
|
321
326
|
|
|
@@ -42,7 +42,7 @@ class EditCommand(MCPCommandBase):
|
|
|
42
42
|
# Need a server name
|
|
43
43
|
if not args:
|
|
44
44
|
emit_info(
|
|
45
|
-
Text(t("mcp.
|
|
45
|
+
Text(t("mcp.server.usage", command="edit"), style="yellow"),
|
|
46
46
|
message_group=group_id,
|
|
47
47
|
)
|
|
48
48
|
emit_info(
|
|
@@ -113,7 +113,7 @@ class EditCommand(MCPCommandBase):
|
|
|
113
113
|
|
|
114
114
|
if server_name not in servers:
|
|
115
115
|
emit_error(
|
|
116
|
-
t("mcp.
|
|
116
|
+
t("mcp.server.not_found", server=server_name),
|
|
117
117
|
message_group=group_id,
|
|
118
118
|
)
|
|
119
119
|
# Show available servers
|
|
@@ -5,6 +5,7 @@ MCP Remove Command - Removes an MCP server.
|
|
|
5
5
|
import logging
|
|
6
6
|
from typing import List, Optional
|
|
7
7
|
|
|
8
|
+
from code_puppy.i18n import ngettext, t
|
|
8
9
|
from code_puppy.messaging import emit_error, emit_info
|
|
9
10
|
|
|
10
11
|
from .base import MCPCommandBase
|
|
@@ -33,7 +34,7 @@ class RemoveCommand(MCPCommandBase):
|
|
|
33
34
|
group_id = self.generate_group_id()
|
|
34
35
|
|
|
35
36
|
if not args:
|
|
36
|
-
emit_info("
|
|
37
|
+
emit_info(t("mcp.server.usage", command="remove"), message_group=group_id)
|
|
37
38
|
return
|
|
38
39
|
|
|
39
40
|
server_name = args[0]
|
|
@@ -42,7 +43,10 @@ class RemoveCommand(MCPCommandBase):
|
|
|
42
43
|
# Find server by name
|
|
43
44
|
server_id = find_server_id_by_name(self.manager, server_name)
|
|
44
45
|
if not server_id:
|
|
45
|
-
emit_info(
|
|
46
|
+
emit_info(
|
|
47
|
+
t("mcp.server.not_found", server=server_name),
|
|
48
|
+
message_group=group_id,
|
|
49
|
+
)
|
|
46
50
|
suggest_similar_servers(self.manager, server_name, group_id=group_id)
|
|
47
51
|
return
|
|
48
52
|
|
|
@@ -59,11 +63,18 @@ class RemoveCommand(MCPCommandBase):
|
|
|
59
63
|
success = self.manager.remove_server(server_id)
|
|
60
64
|
|
|
61
65
|
if success:
|
|
62
|
-
emit_info(
|
|
66
|
+
emit_info(
|
|
67
|
+
t("mcp.server.removed", server=server_name),
|
|
68
|
+
message_group=group_id,
|
|
69
|
+
)
|
|
63
70
|
if bound_agents:
|
|
64
71
|
emit_info(
|
|
65
|
-
|
|
66
|
-
|
|
72
|
+
" "
|
|
73
|
+
+ ngettext(
|
|
74
|
+
"mcp.server.unbound",
|
|
75
|
+
len(bound_agents),
|
|
76
|
+
agents=", ".join(bound_agents),
|
|
77
|
+
),
|
|
67
78
|
message_group=group_id,
|
|
68
79
|
)
|
|
69
80
|
|
|
@@ -78,9 +89,10 @@ class RemoveCommand(MCPCommandBase):
|
|
|
78
89
|
logger.warning(f"Could not update mcp_servers.json: {e}")
|
|
79
90
|
else:
|
|
80
91
|
emit_info(
|
|
81
|
-
|
|
92
|
+
t("mcp.server.remove_failed", server=server_name),
|
|
93
|
+
message_group=group_id,
|
|
82
94
|
)
|
|
83
95
|
|
|
84
96
|
except Exception as e:
|
|
85
97
|
logger.error(f"Error removing server '{server_name}': {e}")
|
|
86
|
-
emit_error(
|
|
98
|
+
emit_error(t("mcp.server.remove_error", error=e), message_group=group_id)
|
|
@@ -7,6 +7,7 @@ from typing import List, Optional
|
|
|
7
7
|
|
|
8
8
|
from rich.text import Text
|
|
9
9
|
|
|
10
|
+
from code_puppy.i18n import t
|
|
10
11
|
from code_puppy.messaging import emit_info
|
|
11
12
|
|
|
12
13
|
from .base import MCPCommandBase
|
|
@@ -35,7 +36,7 @@ class RestartCommand(MCPCommandBase):
|
|
|
35
36
|
group_id = self.generate_group_id()
|
|
36
37
|
|
|
37
38
|
if not args:
|
|
38
|
-
emit_info("
|
|
39
|
+
emit_info(t("mcp.server.usage", command="restart"), message_group=group_id)
|
|
39
40
|
return
|
|
40
41
|
|
|
41
42
|
server_name = args[0]
|
|
@@ -44,25 +45,35 @@ class RestartCommand(MCPCommandBase):
|
|
|
44
45
|
# Find server by name
|
|
45
46
|
server_id = find_server_id_by_name(self.manager, server_name)
|
|
46
47
|
if not server_id:
|
|
47
|
-
emit_info(
|
|
48
|
+
emit_info(
|
|
49
|
+
t("mcp.server.not_found", server=server_name),
|
|
50
|
+
message_group=group_id,
|
|
51
|
+
)
|
|
48
52
|
suggest_similar_servers(self.manager, server_name, group_id=group_id)
|
|
49
53
|
return
|
|
50
54
|
|
|
51
55
|
# Stop the server first
|
|
52
|
-
emit_info(
|
|
56
|
+
emit_info(
|
|
57
|
+
t("mcp.server.stopping", server=server_name),
|
|
58
|
+
message_group=group_id,
|
|
59
|
+
)
|
|
53
60
|
self.manager.stop_server_sync(server_id)
|
|
54
61
|
|
|
55
62
|
# Then reload and start it
|
|
56
|
-
emit_info("
|
|
63
|
+
emit_info(t("mcp.server.reloading_config"), message_group=group_id)
|
|
57
64
|
reload_success = self.manager.reload_server(server_id)
|
|
58
65
|
|
|
59
66
|
if reload_success:
|
|
60
|
-
emit_info(
|
|
67
|
+
emit_info(
|
|
68
|
+
t("mcp.server.starting", server=server_name),
|
|
69
|
+
message_group=group_id,
|
|
70
|
+
)
|
|
61
71
|
start_success = self.manager.start_server_sync(server_id)
|
|
62
72
|
|
|
63
73
|
if start_success:
|
|
64
74
|
emit_info(
|
|
65
|
-
|
|
75
|
+
t("mcp.server.restarted", server=server_name),
|
|
76
|
+
message_group=group_id,
|
|
66
77
|
)
|
|
67
78
|
|
|
68
79
|
# Reload the agent to pick up the server changes
|
|
@@ -74,27 +85,25 @@ class RestartCommand(MCPCommandBase):
|
|
|
74
85
|
# Update MCP tool cache immediately so token counts reflect the change
|
|
75
86
|
agent.update_mcp_tool_cache_sync()
|
|
76
87
|
emit_info(
|
|
77
|
-
Text.
|
|
78
|
-
"[dim]Agent reloaded with updated servers[/dim]"
|
|
79
|
-
),
|
|
88
|
+
Text(t("mcp.server.agent_reloaded"), style="dim"),
|
|
80
89
|
message_group=group_id,
|
|
81
90
|
)
|
|
82
91
|
except Exception as e:
|
|
83
92
|
logger.warning(f"Could not reload agent: {e}")
|
|
84
93
|
else:
|
|
85
94
|
emit_info(
|
|
86
|
-
|
|
95
|
+
t("mcp.server.restart_start_failed", server=server_name),
|
|
87
96
|
message_group=group_id,
|
|
88
97
|
)
|
|
89
98
|
else:
|
|
90
99
|
emit_info(
|
|
91
|
-
|
|
100
|
+
t("mcp.server.reload_failed", server=server_name),
|
|
92
101
|
message_group=group_id,
|
|
93
102
|
)
|
|
94
103
|
|
|
95
104
|
except Exception as e:
|
|
96
105
|
logger.error(f"Error restarting server '{server_name}': {e}")
|
|
97
106
|
emit_info(
|
|
98
|
-
Text
|
|
107
|
+
Text(t("mcp.server.restart_error", error=e), style="red"),
|
|
99
108
|
message_group=group_id,
|
|
100
109
|
)
|
|
@@ -8,6 +8,7 @@ from typing import List, Optional
|
|
|
8
8
|
|
|
9
9
|
from rich.text import Text
|
|
10
10
|
|
|
11
|
+
from code_puppy.i18n import ngettext, t
|
|
11
12
|
from code_puppy.mcp_.managed_server import ServerState
|
|
12
13
|
from code_puppy.messaging import emit_info
|
|
13
14
|
|
|
@@ -41,7 +42,8 @@ class StartAllCommand(MCPCommandBase):
|
|
|
41
42
|
|
|
42
43
|
if not servers:
|
|
43
44
|
emit_info(
|
|
44
|
-
"
|
|
45
|
+
Text(t("mcp.server.none_registered"), style="yellow"),
|
|
46
|
+
message_group=group_id,
|
|
45
47
|
)
|
|
46
48
|
return
|
|
47
49
|
|
|
@@ -49,7 +51,10 @@ class StartAllCommand(MCPCommandBase):
|
|
|
49
51
|
failed_count = 0
|
|
50
52
|
already_running = 0
|
|
51
53
|
|
|
52
|
-
emit_info(
|
|
54
|
+
emit_info(
|
|
55
|
+
ngettext("mcp.server.starting_all", len(servers)),
|
|
56
|
+
message_group=group_id,
|
|
57
|
+
)
|
|
53
58
|
|
|
54
59
|
for server_info in servers:
|
|
55
60
|
server_id = server_info.id
|
|
@@ -59,7 +64,8 @@ class StartAllCommand(MCPCommandBase):
|
|
|
59
64
|
if server_info.state == ServerState.RUNNING:
|
|
60
65
|
already_running += 1
|
|
61
66
|
emit_info(
|
|
62
|
-
|
|
67
|
+
" • " + t("mcp.server.already_running", server=server_name),
|
|
68
|
+
message_group=group_id,
|
|
63
69
|
)
|
|
64
70
|
continue
|
|
65
71
|
|
|
@@ -69,13 +75,19 @@ class StartAllCommand(MCPCommandBase):
|
|
|
69
75
|
if success:
|
|
70
76
|
started_count += 1
|
|
71
77
|
emit_info(
|
|
72
|
-
Text
|
|
78
|
+
Text(
|
|
79
|
+
" " + t("mcp.server.item_started", server=server_name),
|
|
80
|
+
style="green",
|
|
81
|
+
),
|
|
73
82
|
message_group=group_id,
|
|
74
83
|
)
|
|
75
84
|
else:
|
|
76
85
|
failed_count += 1
|
|
77
86
|
emit_info(
|
|
78
|
-
Text
|
|
87
|
+
Text(
|
|
88
|
+
" " + t("mcp.server.item_failed", server=server_name),
|
|
89
|
+
style="red",
|
|
90
|
+
),
|
|
79
91
|
message_group=group_id,
|
|
80
92
|
)
|
|
81
93
|
|
|
@@ -83,20 +95,22 @@ class StartAllCommand(MCPCommandBase):
|
|
|
83
95
|
emit_info("", message_group=group_id)
|
|
84
96
|
if started_count > 0:
|
|
85
97
|
emit_info(
|
|
86
|
-
Text
|
|
87
|
-
|
|
98
|
+
Text(
|
|
99
|
+
ngettext("mcp.server.count_started", started_count),
|
|
100
|
+
style="green",
|
|
88
101
|
),
|
|
89
102
|
message_group=group_id,
|
|
90
103
|
)
|
|
91
104
|
if already_running > 0:
|
|
92
105
|
emit_info(
|
|
93
|
-
|
|
106
|
+
ngettext("mcp.server.count_already_running", already_running),
|
|
94
107
|
message_group=group_id,
|
|
95
108
|
)
|
|
96
109
|
if failed_count > 0:
|
|
97
110
|
emit_info(
|
|
98
|
-
Text
|
|
99
|
-
|
|
111
|
+
Text(
|
|
112
|
+
ngettext("mcp.server.count_start_failed", failed_count),
|
|
113
|
+
style="yellow",
|
|
100
114
|
),
|
|
101
115
|
message_group=group_id,
|
|
102
116
|
)
|
|
@@ -119,9 +133,7 @@ class StartAllCommand(MCPCommandBase):
|
|
|
119
133
|
# Update MCP tool cache immediately so token counts reflect the change
|
|
120
134
|
agent.update_mcp_tool_cache_sync()
|
|
121
135
|
emit_info(
|
|
122
|
-
Text.
|
|
123
|
-
"[dim]Agent reloaded with updated servers[/dim]"
|
|
124
|
-
),
|
|
136
|
+
Text(t("mcp.server.agent_reloaded"), style="dim"),
|
|
125
137
|
message_group=group_id,
|
|
126
138
|
)
|
|
127
139
|
except Exception as e:
|
|
@@ -130,6 +142,6 @@ class StartAllCommand(MCPCommandBase):
|
|
|
130
142
|
except Exception as e:
|
|
131
143
|
logger.error(f"Error starting all servers: {e}")
|
|
132
144
|
emit_info(
|
|
133
|
-
Text
|
|
145
|
+
Text(t("mcp.server.start_all_error", error=e), style="red"),
|
|
134
146
|
message_group=group_id,
|
|
135
147
|
)
|
|
@@ -7,6 +7,7 @@ from typing import List, Optional
|
|
|
7
7
|
|
|
8
8
|
from rich.text import Text
|
|
9
9
|
|
|
10
|
+
from code_puppy.i18n import t
|
|
10
11
|
from code_puppy.mcp_.agent_bindings import is_bound, set_session_binding
|
|
11
12
|
from code_puppy.messaging import emit_error, emit_info, emit_success
|
|
12
13
|
|
|
@@ -39,7 +40,7 @@ class StartCommand(MCPCommandBase):
|
|
|
39
40
|
|
|
40
41
|
if not args:
|
|
41
42
|
emit_info(
|
|
42
|
-
Text
|
|
43
|
+
Text(t("mcp.server.usage", command="start"), style="yellow"),
|
|
43
44
|
message_group=group_id,
|
|
44
45
|
)
|
|
45
46
|
return
|
|
@@ -51,7 +52,7 @@ class StartCommand(MCPCommandBase):
|
|
|
51
52
|
server_id = find_server_id_by_name(self.manager, server_name)
|
|
52
53
|
if not server_id:
|
|
53
54
|
emit_error(
|
|
54
|
-
|
|
55
|
+
t("mcp.server.not_found", server=server_name),
|
|
55
56
|
message_group=group_id,
|
|
56
57
|
)
|
|
57
58
|
suggest_similar_servers(self.manager, server_name, group_id=group_id)
|
|
@@ -95,13 +96,16 @@ class StartCommand(MCPCommandBase):
|
|
|
95
96
|
agent_name = getattr(agent, "name", None)
|
|
96
97
|
if agent_name and not is_bound(agent_name, canonical_name):
|
|
97
98
|
set_session_binding(agent_name, canonical_name)
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
99
|
+
bound = Text(
|
|
100
|
+
t(
|
|
101
|
+
"mcp.server.bound",
|
|
102
|
+
server=canonical_name,
|
|
103
|
+
agent=agent_name,
|
|
104
|
+
)
|
|
104
105
|
)
|
|
106
|
+
bound.append(" ")
|
|
107
|
+
bound.append(t("mcp.server.bound_session_only"), style="dim")
|
|
108
|
+
emit_info(bound, message_group=group_id)
|
|
105
109
|
except Exception as e:
|
|
106
110
|
logger.warning(
|
|
107
111
|
f"Could not auto-bind '{canonical_name}' to current agent: {e}"
|
|
@@ -110,19 +114,17 @@ class StartCommand(MCPCommandBase):
|
|
|
110
114
|
if server_type == "stdio":
|
|
111
115
|
# Stdio servers start subprocess asynchronously
|
|
112
116
|
emit_success(
|
|
113
|
-
|
|
117
|
+
t("mcp.server.starting_background", server=server_name),
|
|
114
118
|
message_group=group_id,
|
|
115
119
|
)
|
|
116
120
|
emit_info(
|
|
117
|
-
Text.
|
|
118
|
-
"[dim]Tip: Use /mcp status to check if the server is fully initialized[/dim]"
|
|
119
|
-
),
|
|
121
|
+
Text(t("mcp.server.status_tip"), style="dim"),
|
|
120
122
|
message_group=group_id,
|
|
121
123
|
)
|
|
122
124
|
else:
|
|
123
125
|
# SSE/HTTP servers connect on first use
|
|
124
126
|
emit_success(
|
|
125
|
-
|
|
127
|
+
t("mcp.server.enabled", server=server_name),
|
|
126
128
|
message_group=group_id,
|
|
127
129
|
)
|
|
128
130
|
|
|
@@ -135,17 +137,17 @@ class StartCommand(MCPCommandBase):
|
|
|
135
137
|
# Clear MCP tool cache - it will be repopulated on next run
|
|
136
138
|
agent.update_mcp_tool_cache_sync()
|
|
137
139
|
emit_info(
|
|
138
|
-
"
|
|
140
|
+
t("mcp.server.agent_reloaded"),
|
|
139
141
|
message_group=group_id,
|
|
140
142
|
)
|
|
141
143
|
except Exception as e:
|
|
142
144
|
logger.warning(f"Could not reload agent: {e}")
|
|
143
145
|
else:
|
|
144
146
|
emit_error(
|
|
145
|
-
|
|
147
|
+
t("mcp.server.start_failed", server=server_name),
|
|
146
148
|
message_group=group_id,
|
|
147
149
|
)
|
|
148
150
|
|
|
149
151
|
except Exception as e:
|
|
150
152
|
logger.error(f"Error starting server '{server_name}': {e}")
|
|
151
|
-
emit_error(
|
|
153
|
+
emit_error(t("mcp.server.start_error", error=e), message_group=group_id)
|
|
@@ -8,6 +8,7 @@ from typing import List, Optional
|
|
|
8
8
|
|
|
9
9
|
from rich.text import Text
|
|
10
10
|
|
|
11
|
+
from code_puppy.i18n import ngettext, t
|
|
11
12
|
from code_puppy.mcp_.managed_server import ServerState
|
|
12
13
|
from code_puppy.messaging import emit_info
|
|
13
14
|
|
|
@@ -40,7 +41,7 @@ class StopAllCommand(MCPCommandBase):
|
|
|
40
41
|
servers = self.manager.list_servers()
|
|
41
42
|
|
|
42
43
|
if not servers:
|
|
43
|
-
emit_info("
|
|
44
|
+
emit_info(t("mcp.server.none_registered"), message_group=group_id)
|
|
44
45
|
return
|
|
45
46
|
|
|
46
47
|
stopped_count = 0
|
|
@@ -50,11 +51,11 @@ class StopAllCommand(MCPCommandBase):
|
|
|
50
51
|
running_servers = [s for s in servers if s.state == ServerState.RUNNING]
|
|
51
52
|
|
|
52
53
|
if not running_servers:
|
|
53
|
-
emit_info("
|
|
54
|
+
emit_info(t("mcp.server.none_running"), message_group=group_id)
|
|
54
55
|
return
|
|
55
56
|
|
|
56
57
|
emit_info(
|
|
57
|
-
|
|
58
|
+
ngettext("mcp.server.stopping_all", len(running_servers)),
|
|
58
59
|
message_group=group_id,
|
|
59
60
|
)
|
|
60
61
|
|
|
@@ -67,18 +68,28 @@ class StopAllCommand(MCPCommandBase):
|
|
|
67
68
|
|
|
68
69
|
if success:
|
|
69
70
|
stopped_count += 1
|
|
70
|
-
emit_info(
|
|
71
|
+
emit_info(
|
|
72
|
+
" " + t("mcp.server.item_stopped", server=server_name),
|
|
73
|
+
message_group=group_id,
|
|
74
|
+
)
|
|
71
75
|
else:
|
|
72
76
|
failed_count += 1
|
|
73
|
-
emit_info(
|
|
77
|
+
emit_info(
|
|
78
|
+
" " + t("mcp.server.item_failed", server=server_name),
|
|
79
|
+
message_group=group_id,
|
|
80
|
+
)
|
|
74
81
|
|
|
75
82
|
# Summary
|
|
76
83
|
emit_info("", message_group=group_id)
|
|
77
84
|
if stopped_count > 0:
|
|
78
|
-
emit_info(
|
|
85
|
+
emit_info(
|
|
86
|
+
ngettext("mcp.server.count_stopped", stopped_count),
|
|
87
|
+
message_group=group_id,
|
|
88
|
+
)
|
|
79
89
|
if failed_count > 0:
|
|
80
90
|
emit_info(
|
|
81
|
-
|
|
91
|
+
ngettext("mcp.server.count_stop_failed", failed_count),
|
|
92
|
+
message_group=group_id,
|
|
82
93
|
)
|
|
83
94
|
|
|
84
95
|
# Reload agent if any servers were stopped
|
|
@@ -99,9 +110,7 @@ class StopAllCommand(MCPCommandBase):
|
|
|
99
110
|
# Update MCP tool cache immediately so token counts reflect the change
|
|
100
111
|
agent.update_mcp_tool_cache_sync()
|
|
101
112
|
emit_info(
|
|
102
|
-
Text.
|
|
103
|
-
"[dim]Agent reloaded with updated servers[/dim]"
|
|
104
|
-
),
|
|
113
|
+
Text(t("mcp.server.agent_reloaded"), style="dim"),
|
|
105
114
|
message_group=group_id,
|
|
106
115
|
)
|
|
107
116
|
except Exception as e:
|
|
@@ -109,4 +118,4 @@ class StopAllCommand(MCPCommandBase):
|
|
|
109
118
|
|
|
110
119
|
except Exception as e:
|
|
111
120
|
logger.error(f"Error stopping all servers: {e}")
|
|
112
|
-
emit_info(
|
|
121
|
+
emit_info(t("mcp.server.stop_all_error", error=e), message_group=group_id)
|
|
@@ -7,6 +7,7 @@ from typing import List, Optional
|
|
|
7
7
|
|
|
8
8
|
from rich.text import Text
|
|
9
9
|
|
|
10
|
+
from code_puppy.i18n import t
|
|
10
11
|
from code_puppy.messaging import emit_error, emit_info
|
|
11
12
|
|
|
12
13
|
from ...agents import get_current_agent
|
|
@@ -37,7 +38,7 @@ class StopCommand(MCPCommandBase):
|
|
|
37
38
|
|
|
38
39
|
if not args:
|
|
39
40
|
emit_info(
|
|
40
|
-
Text
|
|
41
|
+
Text(t("mcp.server.usage", command="stop"), style="yellow"),
|
|
41
42
|
message_group=group_id,
|
|
42
43
|
)
|
|
43
44
|
return
|
|
@@ -48,7 +49,10 @@ class StopCommand(MCPCommandBase):
|
|
|
48
49
|
# Find server by name
|
|
49
50
|
server_id = find_server_id_by_name(self.manager, server_name)
|
|
50
51
|
if not server_id:
|
|
51
|
-
emit_info(
|
|
52
|
+
emit_info(
|
|
53
|
+
t("mcp.server.not_found", server=server_name),
|
|
54
|
+
message_group=group_id,
|
|
55
|
+
)
|
|
52
56
|
suggest_similar_servers(self.manager, server_name, group_id=group_id)
|
|
53
57
|
return
|
|
54
58
|
|
|
@@ -56,7 +60,10 @@ class StopCommand(MCPCommandBase):
|
|
|
56
60
|
success = self.manager.stop_server_sync(server_id)
|
|
57
61
|
|
|
58
62
|
if success:
|
|
59
|
-
emit_info(
|
|
63
|
+
emit_info(
|
|
64
|
+
t("mcp.server.stopped", server=server_name),
|
|
65
|
+
message_group=group_id,
|
|
66
|
+
)
|
|
60
67
|
|
|
61
68
|
# Reload the agent to remove the disabled server
|
|
62
69
|
try:
|
|
@@ -65,16 +72,17 @@ class StopCommand(MCPCommandBase):
|
|
|
65
72
|
# Update MCP tool cache immediately so token counts reflect the change
|
|
66
73
|
agent.update_mcp_tool_cache_sync()
|
|
67
74
|
emit_info(
|
|
68
|
-
"
|
|
75
|
+
t("mcp.server.agent_reloaded"),
|
|
69
76
|
message_group=group_id,
|
|
70
77
|
)
|
|
71
78
|
except Exception as e:
|
|
72
79
|
logger.warning(f"Could not reload agent: {e}")
|
|
73
80
|
else:
|
|
74
81
|
emit_info(
|
|
75
|
-
|
|
82
|
+
t("mcp.server.stop_failed", server=server_name),
|
|
83
|
+
message_group=group_id,
|
|
76
84
|
)
|
|
77
85
|
|
|
78
86
|
except Exception as e:
|
|
79
87
|
logger.error(f"Error stopping server '{server_name}': {e}")
|
|
80
|
-
emit_error(
|
|
88
|
+
emit_error(t("mcp.server.stop_error", error=e), message_group=group_id)
|
|
@@ -99,6 +99,7 @@ def suggest_similar_servers(
|
|
|
99
99
|
"""
|
|
100
100
|
import logging
|
|
101
101
|
|
|
102
|
+
from code_puppy.i18n import t
|
|
102
103
|
from code_puppy.messaging import emit_info
|
|
103
104
|
|
|
104
105
|
logger = logging.getLogger(__name__)
|
|
@@ -106,7 +107,7 @@ def suggest_similar_servers(
|
|
|
106
107
|
try:
|
|
107
108
|
servers = manager.list_servers()
|
|
108
109
|
if not servers:
|
|
109
|
-
emit_info("
|
|
110
|
+
emit_info(t("mcp.server.none_registered"), message_group=group_id)
|
|
110
111
|
return
|
|
111
112
|
|
|
112
113
|
# Simple suggestion based on partial matching
|
|
@@ -118,11 +119,15 @@ def suggest_similar_servers(
|
|
|
118
119
|
suggestions.append(server.name)
|
|
119
120
|
|
|
120
121
|
if suggestions:
|
|
121
|
-
emit_info(
|
|
122
|
+
emit_info(
|
|
123
|
+
t("mcp.server.did_you_mean", suggestions=", ".join(suggestions)),
|
|
124
|
+
message_group=group_id,
|
|
125
|
+
)
|
|
122
126
|
else:
|
|
123
127
|
server_names = [s.name for s in servers]
|
|
124
128
|
emit_info(
|
|
125
|
-
|
|
129
|
+
t("mcp.server.available", servers=", ".join(server_names)),
|
|
130
|
+
message_group=group_id,
|
|
126
131
|
)
|
|
127
132
|
|
|
128
133
|
except Exception as e:
|