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.
Files changed (339) hide show
  1. {code_puppy-0.0.950 → code_puppy-0.0.952}/PKG-INFO +1 -1
  2. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_builder.py +9 -4
  3. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/edit_command.py +2 -2
  4. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/remove_command.py +19 -7
  5. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/restart_command.py +21 -12
  6. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/start_all_command.py +26 -14
  7. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/start_command.py +18 -16
  8. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/stop_all_command.py +20 -11
  9. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/stop_command.py +14 -6
  10. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/utils.py +8 -3
  11. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/locales/en-US.json +65 -2
  12. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/locales/es.json +65 -2
  13. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/locales/fr-CA.json +65 -2
  14. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/subagent_invocation.py +24 -14
  15. {code_puppy-0.0.950 → code_puppy-0.0.952}/pyproject.toml +1 -1
  16. {code_puppy-0.0.950 → code_puppy-0.0.952}/.gitignore +0 -0
  17. {code_puppy-0.0.950 → code_puppy-0.0.952}/LICENSE +0 -0
  18. {code_puppy-0.0.950 → code_puppy-0.0.952}/README.md +0 -0
  19. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/__init__.py +0 -0
  20. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/__main__.py +0 -0
  21. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/_plugin_i18n_lifecycle.py +0 -0
  22. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/_pydantic_tool_helpers.py +0 -0
  23. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/_pydantic_video_patch.py +0 -0
  24. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agent_completion_inbox.py +0 -0
  25. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agent_execution_context.py +0 -0
  26. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/__init__.py +0 -0
  27. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_code_mode.py +0 -0
  28. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_code_mode_guidance.py +0 -0
  29. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_code_mode_session.py +0 -0
  30. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_compaction.py +0 -0
  31. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_diagnostics.py +0 -0
  32. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_foreign_thinking.py +0 -0
  33. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_history.py +0 -0
  34. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_key_listeners.py +0 -0
  35. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_mcp.py +0 -0
  36. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_model_message_transform.py +0 -0
  37. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_multimodal_error_hint.py +0 -0
  38. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_non_streaming_render.py +0 -0
  39. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_output_limits.py +0 -0
  40. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_rules.py +0 -0
  41. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_run_signals.py +0 -0
  42. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_runtime.py +0 -0
  43. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_steer_processor.py +0 -0
  44. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_subagent_recursion.py +0 -0
  45. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_token_limit_hint.py +0 -0
  46. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_tty_modes.py +0 -0
  47. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_windows_console.py +0 -0
  48. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/_wire_tool_names.py +0 -0
  49. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/agent_code_puppy.py +0 -0
  50. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/agent_creator_agent.py +0 -0
  51. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/agent_helios.py +0 -0
  52. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/agent_manager.py +0 -0
  53. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/agent_model_judge.py +0 -0
  54. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/agent_planning.py +0 -0
  55. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/agent_qa_kitten.py +0 -0
  56. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/agent_web_retriever.py +0 -0
  57. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/base_agent.py +0 -0
  58. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/event_stream_handler.py +0 -0
  59. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/json_agent.py +0 -0
  60. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/retry_checkpoint.py +0 -0
  61. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/retry_profiles.py +0 -0
  62. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/run_invocation.py +0 -0
  63. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/run_stats.py +0 -0
  64. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/smooth_stream.py +0 -0
  65. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/stream_status.py +0 -0
  66. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/subagent_stream_handler.py +0 -0
  67. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/agents/thinking_output.py +0 -0
  68. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/asyncio_cleanup.py +0 -0
  69. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/atomic_io.py +0 -0
  70. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/atomic_json.py +0 -0
  71. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/ca_bundle.py +0 -0
  72. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/callbacks.py +0 -0
  73. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/capabilities/__init__.py +0 -0
  74. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/capabilities/compaction.py +0 -0
  75. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/capabilities/eager_timing.py +0 -0
  76. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/chatgpt_codex_client.py +0 -0
  77. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/claude_cache_client.py +0 -0
  78. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/claude_oauth_transport.py +0 -0
  79. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/claude_thinking_display.py +0 -0
  80. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/cli_runner.py +0 -0
  81. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/__init__.py +0 -0
  82. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/add_model_details.py +0 -0
  83. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/add_model_menu.py +0 -0
  84. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/add_model_menus.py +0 -0
  85. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/add_model_vllm.py +0 -0
  86. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/agent_menu.py +0 -0
  87. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/attachments.py +0 -0
  88. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/autosave_menu.py +0 -0
  89. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/autosave_search.py +0 -0
  90. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/clipboard.py +0 -0
  91. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/colors_menu.py +0 -0
  92. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/command_handler.py +0 -0
  93. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/command_registry.py +0 -0
  94. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/completers.py +0 -0
  95. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/completion_cache.py +0 -0
  96. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/config_apply.py +0 -0
  97. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/config_commands.py +0 -0
  98. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/core_commands.py +0 -0
  99. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/file_index.py +0 -0
  100. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/file_path_completion.py +0 -0
  101. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/help_catalog.py +0 -0
  102. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/help_overlay.py +0 -0
  103. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/image_utils.py +0 -0
  104. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/load_context_completion.py +0 -0
  105. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/__init__.py +0 -0
  106. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/base.py +0 -0
  107. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
  108. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
  109. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
  110. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/handler.py +0 -0
  111. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/help_command.py +0 -0
  112. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/install_command.py +0 -0
  113. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/install_menu.py +0 -0
  114. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/list_command.py +0 -0
  115. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/logs_command.py +0 -0
  116. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/mcp_servers_store.py +0 -0
  117. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/search_command.py +0 -0
  118. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/silence_warning_command.py +0 -0
  119. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/status_command.py +0 -0
  120. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/trust_command.py +0 -0
  121. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  122. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp_binding_menu.py +0 -0
  123. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/mcp_completion.py +0 -0
  124. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/menu_session.py +0 -0
  125. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/model_picker_completion.py +0 -0
  126. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/model_settings_defs.py +0 -0
  127. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/model_settings_menu.py +0 -0
  128. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/onboarding_slides.py +0 -0
  129. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/onboarding_wizard.py +0 -0
  130. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/pagination.py +0 -0
  131. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/pin_command_completion.py +0 -0
  132. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/refresh_models.py +0 -0
  133. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/session_browser.py +0 -0
  134. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/session_browser_data.py +0 -0
  135. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/session_commands.py +0 -0
  136. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/set_menu.py +0 -0
  137. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/set_menu_catalog.py +0 -0
  138. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/set_menu_schema.py +0 -0
  139. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/set_menu_settings.py +0 -0
  140. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/set_menu_shims.py +0 -0
  141. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/set_menu_values.py +0 -0
  142. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/shell_passthrough.py +0 -0
  143. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/skills_completion.py +0 -0
  144. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/tui_style.py +0 -0
  145. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/uc_menu.py +0 -0
  146. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/command_line/utils.py +0 -0
  147. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/config.py +0 -0
  148. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/config_file.py +0 -0
  149. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/context_accounting.py +0 -0
  150. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/diagnostics.py +0 -0
  151. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/error_logging.py +0 -0
  152. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/events/__init__.py +0 -0
  153. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/events/bridge.py +0 -0
  154. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/file_completion_io.py +0 -0
  155. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/file_completion_tokens.py +0 -0
  156. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/gemini_code_assist.py +0 -0
  157. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/gemini_common.py +0 -0
  158. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/gemini_model.py +0 -0
  159. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/hook_engine/README.md +0 -0
  160. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/hook_engine/__init__.py +0 -0
  161. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/hook_engine/aliases.py +0 -0
  162. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/hook_engine/engine.py +0 -0
  163. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/hook_engine/executor.py +0 -0
  164. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/hook_engine/matcher.py +0 -0
  165. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/hook_engine/models.py +0 -0
  166. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/hook_engine/registry.py +0 -0
  167. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/hook_engine/validator.py +0 -0
  168. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/http_retry.py +0 -0
  169. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/http_utils.py +0 -0
  170. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/httpx2_utils.py +0 -0
  171. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/__init__.py +0 -0
  172. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/audit.py +0 -0
  173. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/catalog.py +0 -0
  174. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/formats.py +0 -0
  175. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/interpolation.py +0 -0
  176. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/locale.py +0 -0
  177. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/plugin_catalog.py +0 -0
  178. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/plurals.py +0 -0
  179. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/pseudo.py +0 -0
  180. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/i18n/translate.py +0 -0
  181. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/kennel_provider.py +0 -0
  182. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/keymap.py +0 -0
  183. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/list_filtering.py +0 -0
  184. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/main.py +0 -0
  185. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/malloc_noise_guard.py +0 -0
  186. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/__init__.py +0 -0
  187. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/agent_bindings.py +0 -0
  188. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/async_lifecycle.py +0 -0
  189. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/blocking_startup.py +0 -0
  190. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/circuit_breaker.py +0 -0
  191. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/config_wizard.py +0 -0
  192. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/dashboard.py +0 -0
  193. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/error_isolation.py +0 -0
  194. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/examples/retry_example.py +0 -0
  195. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/health_monitor.py +0 -0
  196. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/http_auth.py +0 -0
  197. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/managed_server.py +0 -0
  198. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/manager.py +0 -0
  199. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/manager_lifecycle.py +0 -0
  200. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/mcp_logs.py +0 -0
  201. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/project_config.py +0 -0
  202. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/registry.py +0 -0
  203. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/retry_manager.py +0 -0
  204. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/server_registry_catalog.py +0 -0
  205. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/status_tracker.py +0 -0
  206. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/system_tools.py +0 -0
  207. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/tool_arg_coercion.py +0 -0
  208. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_/toolset_utils.py +0 -0
  209. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_prompts/__init__.py +0 -0
  210. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/mcp_prompts/hook_creator.py +0 -0
  211. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/__init__.py +0 -0
  212. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/bar_painters.py +0 -0
  213. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/bar_rendering.py +0 -0
  214. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/bottom_bar.py +0 -0
  215. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/bus.py +0 -0
  216. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/chords.py +0 -0
  217. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/commands.py +0 -0
  218. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/editor_actions.py +0 -0
  219. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/editor_completion.py +0 -0
  220. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/editor_display.py +0 -0
  221. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/editor_history.py +0 -0
  222. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/editor_keys.py +0 -0
  223. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/editor_paste.py +0 -0
  224. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/editor_queue.py +0 -0
  225. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/editor_submission.py +0 -0
  226. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/editor_undo.py +0 -0
  227. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/external_editor.py +0 -0
  228. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/identity_line.py +0 -0
  229. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/idle_status.py +0 -0
  230. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/inline_bar.py +0 -0
  231. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/line_editor.py +0 -0
  232. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/markdown_patches.py +0 -0
  233. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/menu_lifecycle.py +0 -0
  234. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/message_queue.py +0 -0
  235. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/messages.py +0 -0
  236. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/pause_controller.py +0 -0
  237. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/prompt_prefix_style.py +0 -0
  238. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/queue_console.py +0 -0
  239. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/renderers.py +0 -0
  240. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/rich_renderer.py +0 -0
  241. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/run_ui.py +0 -0
  242. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/run_ui_wiring.py +0 -0
  243. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/safe_console.py +0 -0
  244. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/safe_stream.py +0 -0
  245. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/speculation_line.py +0 -0
  246. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/speculation_stats.py +0 -0
  247. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/speculation_toggle.py +0 -0
  248. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/spinner/__init__.py +0 -0
  249. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/status_line.py +0 -0
  250. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/subagent_console.py +0 -0
  251. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/theme_accent.py +0 -0
  252. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/tool_output.py +0 -0
  253. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/messaging/transcript_guard.py +0 -0
  254. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/model_descriptions.py +0 -0
  255. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/model_factory.py +0 -0
  256. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/model_switching.py +0 -0
  257. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/model_utils.py +0 -0
  258. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/models.json +0 -0
  259. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/models_dev_api.json +0 -0
  260. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/models_dev_family.py +0 -0
  261. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/models_dev_parser.py +0 -0
  262. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/observability.py +0 -0
  263. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/platform_utils.py +0 -0
  264. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/plugins/__init__.py +0 -0
  265. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/plugins/config.py +0 -0
  266. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/plugins/oauth_pasteback.py +0 -0
  267. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/plugins/oauth_puppy_html.py +0 -0
  268. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/plugins/trust.py +0 -0
  269. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/plugins/trust_notice.py +0 -0
  270. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/private_inference.py +0 -0
  271. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/provider_credentials.py +0 -0
  272. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/provider_identity.py +0 -0
  273. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/pydantic_patches.py +0 -0
  274. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/reopenable_async_client.py +0 -0
  275. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/round_robin_model.py +0 -0
  276. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/secret_store.py +0 -0
  277. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/secret_store_backends.py +0 -0
  278. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/session_format_migration.py +0 -0
  279. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/session_lifecycle.py +0 -0
  280. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/session_migration.py +0 -0
  281. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/session_storage.py +0 -0
  282. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/session_surrogate_unpickler.py +0 -0
  283. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/shared_credentials.py +0 -0
  284. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/skill_provider.py +0 -0
  285. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/splash.py +0 -0
  286. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/status_display.py +0 -0
  287. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/steer_metadata.py +0 -0
  288. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/terminal_utils.py +0 -0
  289. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/token_usage.py +0 -0
  290. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/__init__.py +0 -0
  291. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/_browser_registry.py +0 -0
  292. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/_lazy.py +0 -0
  293. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/agent_tools.py +0 -0
  294. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/approval_feedback.py +0 -0
  295. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/__init__.py +0 -0
  296. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/constants.py +0 -0
  297. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/demo_tui.py +0 -0
  298. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/handler.py +0 -0
  299. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/models.py +0 -0
  300. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/registration.py +0 -0
  301. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/renderers.py +0 -0
  302. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/terminal_ui.py +0 -0
  303. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/theme.py +0 -0
  304. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ask_user_question/tui_loop.py +0 -0
  305. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/__init__.py +0 -0
  306. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_control.py +0 -0
  307. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_interactions.py +0 -0
  308. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_locator_resolver.py +0 -0
  309. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_locators.py +0 -0
  310. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_manager.py +0 -0
  311. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_navigation.py +0 -0
  312. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_page_snapshot.py +0 -0
  313. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_screenshot.py +0 -0
  314. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_scripts.py +0 -0
  315. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_semantic_interactions.py +0 -0
  316. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/browser_workflows.py +0 -0
  317. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/browser/tool_registry.py +0 -0
  318. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/command_runner.py +0 -0
  319. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/common.py +0 -0
  320. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/display.py +0 -0
  321. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/file_modifications.py +0 -0
  322. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/file_operations.py +0 -0
  323. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/file_permission_state.py +0 -0
  324. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/fs_access.py +0 -0
  325. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/image_tools.py +0 -0
  326. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/io_backends.py +0 -0
  327. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/model_tools.py +0 -0
  328. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/ripgrep.py +0 -0
  329. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/shell_backgrounding.py +0 -0
  330. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/skills_tools.py +0 -0
  331. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/subagent_context.py +0 -0
  332. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/subagent_usage_metrics.py +0 -0
  333. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/tools_content.py +0 -0
  334. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/universal_constructor.py +0 -0
  335. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/tools/win_shell_io.py +0 -0
  336. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/undo_manager.py +0 -0
  337. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/universal_constructor_provider.py +0 -0
  338. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/version_checker.py +0 -0
  339. {code_puppy-0.0.950 → code_puppy-0.0.952}/code_puppy/zai_model.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: code-puppy
3
- Version: 0.0.950
3
+ Version: 0.0.952
4
4
  Summary: Code generation agent
5
5
  Project-URL: repository, https://github.com/mpfaffenberger/code_puppy
6
6
  Project-URL: HomePage, https://github.com/mpfaffenberger/code_puppy
@@ -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` only for focused work that benefits from separate "
315
- "context or specialized tools. Handle work directly when you can. "
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: as a GPT-5.6 caller you may only invoke a sub-agent while "
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.edit.usage"), style="yellow"),
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.edit.not_found", server=server_name),
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("Usage: /mcp remove <server_name>", message_group=group_id)
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(f"Server '{server_name}' not found", message_group=group_id)
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(f"✓ Removed server: {server_name}", message_group=group_id)
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
- f" ✓ Also unbound from {len(bound_agents)} agent(s): "
66
- f"{', '.join(bound_agents)}",
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
- f"✗ Failed to remove server: {server_name}", message_group=group_id
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(f"Error removing server: {e}", message_group=group_id)
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("Usage: /mcp restart <server_name>", message_group=group_id)
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(f"Server '{server_name}' not found", message_group=group_id)
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(f"Stopping server: {server_name}", message_group=group_id)
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("Reloading configuration...", message_group=group_id)
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(f"Starting server: {server_name}", message_group=group_id)
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
- f"✓ Restarted server: {server_name}", message_group=group_id
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.from_markup(
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
- f"✗ Failed to start server after reload: {server_name}",
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
- f"✗ Failed to reload server configuration: {server_name}",
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.from_markup(f"[red]Failed to restart server: {e}[/red]"),
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
- "[yellow]No servers registered[/yellow]", message_group=group_id
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(f"Starting {len(servers)} servers...", message_group=group_id)
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
- f" • {server_name}: already running", message_group=group_id
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.from_markup(f" [green]✓ Started: {server_name}[/green]"),
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.from_markup(f" [red]✗ Failed: {server_name}[/red]"),
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.from_markup(
87
- f"[green]Started {started_count} server(s)[/green]"
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
- f"{already_running} server(s) already running",
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.from_markup(
99
- f"[yellow]Failed to start {failed_count} server(s)[/yellow]"
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.from_markup(
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.from_markup(f"[red]Failed to start servers: {e}[/red]"),
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.from_markup("[yellow]Usage: /mcp start <server_name>[/yellow]"),
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
- f"Server '{server_name}' not found",
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
- emit_info(
99
- Text.from_markup(
100
- f"🔗 Bound '{canonical_name}' to agent "
101
- f"'{agent_name}' [dim](this session only)[/dim]"
102
- ),
103
- message_group=group_id,
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
- f"🚀 Starting server: {server_name} (subprocess starting in background)",
117
+ t("mcp.server.starting_background", server=server_name),
114
118
  message_group=group_id,
115
119
  )
116
120
  emit_info(
117
- Text.from_markup(
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
- f"✅ Enabled server: {server_name}",
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
- "Agent reloaded with updated servers",
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
- f"Failed to start server: {server_name}",
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(f"Failed to start server: {e}", message_group=group_id)
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("No servers registered", message_group=group_id)
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("No servers are currently running", message_group=group_id)
54
+ emit_info(t("mcp.server.none_running"), message_group=group_id)
54
55
  return
55
56
 
56
57
  emit_info(
57
- f"Stopping {len(running_servers)} running server(s)...",
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(f" ✓ Stopped: {server_name}", message_group=group_id)
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(f" ✗ Failed: {server_name}", message_group=group_id)
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(f"Stopped {stopped_count} server(s)", message_group=group_id)
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
- f"Failed to stop {failed_count} server(s)", message_group=group_id
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.from_markup(
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(f"Failed to stop servers: {e}", message_group=group_id)
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.from_markup("[yellow]Usage: /mcp stop <server_name>[/yellow]"),
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(f"Server '{server_name}' not found", message_group=group_id)
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(f"✓ Stopped server: {server_name}", message_group=group_id)
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
- "Agent reloaded with updated servers",
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
- f"✗ Failed to stop server: {server_name}", message_group=group_id
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(f"Failed to stop server: {e}", message_group=group_id)
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("No servers are registered", message_group=group_id)
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(f"Did you mean: {', '.join(suggestions)}", message_group=group_id)
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
- f"Available servers: {', '.join(server_names)}", message_group=group_id
129
+ t("mcp.server.available", servers=", ".join(server_names)),
130
+ message_group=group_id,
126
131
  )
127
132
 
128
133
  except Exception as e: