code-puppy 0.0.183__tar.gz → 0.0.184__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 (126) hide show
  1. {code_puppy-0.0.183 → code_puppy-0.0.184}/PKG-INFO +1 -1
  2. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/agents/base_agent.py +63 -2
  3. {code_puppy-0.0.183 → code_puppy-0.0.184}/pyproject.toml +1 -1
  4. {code_puppy-0.0.183 → code_puppy-0.0.184}/.gitignore +0 -0
  5. {code_puppy-0.0.183 → code_puppy-0.0.184}/LICENSE +0 -0
  6. {code_puppy-0.0.183 → code_puppy-0.0.184}/README.md +0 -0
  7. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/__init__.py +0 -0
  8. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/__main__.py +0 -0
  9. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/agents/__init__.py +0 -0
  10. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/agents/agent_c_reviewer.py +0 -0
  11. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/agents/agent_code_puppy.py +0 -0
  12. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/agents/agent_code_reviewer.py +0 -0
  13. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/agents/agent_cpp_reviewer.py +0 -0
  14. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/agents/agent_creator_agent.py +0 -0
  15. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/agents/agent_golang_reviewer.py +0 -0
  16. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/agents/agent_javascript_reviewer.py +0 -0
  17. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/agents/agent_manager.py +0 -0
  18. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/agents/agent_python_reviewer.py +0 -0
  19. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/agents/agent_qa_expert.py +0 -0
  20. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/agents/agent_qa_kitten.py +0 -0
  21. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/agents/agent_security_auditor.py +0 -0
  22. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/agents/agent_typescript_reviewer.py +0 -0
  23. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/agents/json_agent.py +0 -0
  24. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/callbacks.py +0 -0
  25. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/__init__.py +0 -0
  26. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/command_handler.py +0 -0
  27. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/file_path_completion.py +0 -0
  28. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/load_context_completion.py +0 -0
  29. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/mcp/__init__.py +0 -0
  30. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/mcp/add_command.py +0 -0
  31. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/mcp/base.py +0 -0
  32. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/mcp/handler.py +0 -0
  33. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/mcp/help_command.py +0 -0
  34. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/mcp/install_command.py +0 -0
  35. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/mcp/list_command.py +0 -0
  36. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/mcp/logs_command.py +0 -0
  37. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/mcp/remove_command.py +0 -0
  38. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/mcp/restart_command.py +0 -0
  39. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/mcp/search_command.py +0 -0
  40. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/mcp/start_all_command.py +0 -0
  41. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/mcp/start_command.py +0 -0
  42. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/mcp/status_command.py +0 -0
  43. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
  44. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/mcp/stop_command.py +0 -0
  45. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/mcp/test_command.py +0 -0
  46. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/mcp/utils.py +0 -0
  47. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  48. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/model_picker_completion.py +0 -0
  49. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/motd.py +0 -0
  50. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
  51. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/command_line/utils.py +0 -0
  52. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/config.py +0 -0
  53. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/http_utils.py +0 -0
  54. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/main.py +0 -0
  55. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/mcp_/__init__.py +0 -0
  56. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/mcp_/async_lifecycle.py +0 -0
  57. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/mcp_/blocking_startup.py +0 -0
  58. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/mcp_/captured_stdio_server.py +0 -0
  59. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/mcp_/circuit_breaker.py +0 -0
  60. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/mcp_/config_wizard.py +0 -0
  61. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/mcp_/dashboard.py +0 -0
  62. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/mcp_/error_isolation.py +0 -0
  63. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/mcp_/examples/retry_example.py +0 -0
  64. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/mcp_/health_monitor.py +0 -0
  65. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/mcp_/managed_server.py +0 -0
  66. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/mcp_/manager.py +0 -0
  67. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/mcp_/registry.py +0 -0
  68. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/mcp_/retry_manager.py +0 -0
  69. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/mcp_/server_registry_catalog.py +0 -0
  70. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/mcp_/status_tracker.py +0 -0
  71. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/mcp_/system_tools.py +0 -0
  72. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/messaging/__init__.py +0 -0
  73. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/messaging/message_queue.py +0 -0
  74. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/messaging/queue_console.py +0 -0
  75. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/messaging/renderers.py +0 -0
  76. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/messaging/spinner/__init__.py +0 -0
  77. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/messaging/spinner/console_spinner.py +0 -0
  78. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/messaging/spinner/spinner_base.py +0 -0
  79. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/messaging/spinner/textual_spinner.py +0 -0
  80. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/model_factory.py +0 -0
  81. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/models.json +0 -0
  82. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/plugins/__init__.py +0 -0
  83. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/reopenable_async_client.py +0 -0
  84. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/round_robin_model.py +0 -0
  85. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/status_display.py +0 -0
  86. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/summarization_agent.py +0 -0
  87. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tools/__init__.py +0 -0
  88. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tools/agent_tools.py +0 -0
  89. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tools/browser/__init__.py +0 -0
  90. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tools/browser/browser_control.py +0 -0
  91. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tools/browser/browser_interactions.py +0 -0
  92. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tools/browser/browser_locators.py +0 -0
  93. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tools/browser/browser_navigation.py +0 -0
  94. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tools/browser/browser_screenshot.py +0 -0
  95. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tools/browser/browser_scripts.py +0 -0
  96. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tools/browser/browser_workflows.py +0 -0
  97. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tools/browser/camoufox_manager.py +0 -0
  98. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tools/browser/vqa_agent.py +0 -0
  99. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tools/command_runner.py +0 -0
  100. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tools/common.py +0 -0
  101. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tools/file_modifications.py +0 -0
  102. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tools/file_operations.py +0 -0
  103. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tools/tools_content.py +0 -0
  104. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/__init__.py +0 -0
  105. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/app.py +0 -0
  106. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/components/__init__.py +0 -0
  107. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/components/chat_view.py +0 -0
  108. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/components/command_history_modal.py +0 -0
  109. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/components/copy_button.py +0 -0
  110. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/components/custom_widgets.py +0 -0
  111. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/components/human_input_modal.py +0 -0
  112. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/components/input_area.py +0 -0
  113. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/components/sidebar.py +0 -0
  114. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/components/status_bar.py +0 -0
  115. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/messages.py +0 -0
  116. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/models/__init__.py +0 -0
  117. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/models/chat_message.py +0 -0
  118. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/models/command_history.py +0 -0
  119. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/models/enums.py +0 -0
  120. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/screens/__init__.py +0 -0
  121. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/screens/help.py +0 -0
  122. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/screens/mcp_install_wizard.py +0 -0
  123. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/screens/settings.py +0 -0
  124. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui/screens/tools.py +0 -0
  125. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/tui_state.py +0 -0
  126. {code_puppy-0.0.183 → code_puppy-0.0.184}/code_puppy/version_checker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-puppy
3
- Version: 0.0.183
3
+ Version: 0.0.184
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
@@ -729,6 +729,63 @@ class BaseAgent(ABC):
729
729
  manager = get_mcp_manager()
730
730
  return manager.get_servers_for_agent()
731
731
 
732
+ def _load_model_with_fallback(
733
+ self,
734
+ requested_model_name: str,
735
+ models_config: Dict[str, Any],
736
+ message_group: str,
737
+ ) -> Tuple[Any, str]:
738
+ """Load the requested model, applying a friendly fallback when unavailable."""
739
+ try:
740
+ model = ModelFactory.get_model(requested_model_name, models_config)
741
+ return model, requested_model_name
742
+ except ValueError as exc:
743
+ available_models = list(models_config.keys())
744
+ available_str = (
745
+ ", ".join(sorted(available_models))
746
+ if available_models
747
+ else "no configured models"
748
+ )
749
+ emit_warning(
750
+ (
751
+ f"[yellow]Model '{requested_model_name}' not found. "
752
+ f"Available models: {available_str}[/yellow]"
753
+ ),
754
+ message_group=message_group,
755
+ )
756
+
757
+ fallback_candidates: List[str] = []
758
+ global_candidate = get_global_model_name()
759
+ if global_candidate:
760
+ fallback_candidates.append(global_candidate)
761
+
762
+ for candidate in available_models:
763
+ if candidate not in fallback_candidates:
764
+ fallback_candidates.append(candidate)
765
+
766
+ for candidate in fallback_candidates:
767
+ if not candidate or candidate == requested_model_name:
768
+ continue
769
+ try:
770
+ model = ModelFactory.get_model(candidate, models_config)
771
+ emit_info(
772
+ f"[bold cyan]Using fallback model: {candidate}[/bold cyan]",
773
+ message_group=message_group,
774
+ )
775
+ return model, candidate
776
+ except ValueError:
777
+ continue
778
+
779
+ friendly_message = (
780
+ "No valid model could be loaded. Update the model configuration or set "
781
+ "a valid model with `config set`."
782
+ )
783
+ emit_error(
784
+ f"[bold red]{friendly_message}[/bold red]",
785
+ message_group=message_group,
786
+ )
787
+ raise ValueError(friendly_message) from exc
788
+
732
789
  def reload_code_generation_agent(self, message_group: Optional[str] = None):
733
790
  """Force-reload the pydantic-ai Agent based on current config and model."""
734
791
  from code_puppy.tools import register_tools_for_agent
@@ -743,7 +800,11 @@ class BaseAgent(ABC):
743
800
  message_group=message_group,
744
801
  )
745
802
  models_config = ModelFactory.load_config()
746
- model = ModelFactory.get_model(model_name, models_config)
803
+ model, resolved_model_name = self._load_model_with_fallback(
804
+ model_name,
805
+ models_config,
806
+ message_group,
807
+ )
747
808
 
748
809
  emit_info(
749
810
  f"[bold magenta]Loading Agent: {self.name}[/bold magenta]",
@@ -786,7 +847,7 @@ class BaseAgent(ABC):
786
847
  register_tools_for_agent(p_agent, agent_tools)
787
848
 
788
849
  self._code_generation_agent = p_agent
789
- self._last_model_name = model_name
850
+ self._last_model_name = resolved_model_name
790
851
  # expose for run_with_mcp
791
852
  self.pydantic_agent = p_agent
792
853
  return self._code_generation_agent
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "code-puppy"
7
- version = "0.0.183"
7
+ version = "0.0.184"
8
8
  description = "Code generation agent"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
File without changes
File without changes
File without changes