code-puppy 0.0.197__tar.gz → 0.0.199__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 (129) hide show
  1. {code_puppy-0.0.197 → code_puppy-0.0.199}/PKG-INFO +1 -1
  2. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/agents/base_agent.py +14 -9
  3. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/agents/json_agent.py +8 -0
  4. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/command_handler.py +45 -18
  5. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/model_picker_completion.py +14 -5
  6. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/config.py +6 -0
  7. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/main.py +4 -1
  8. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/screens/settings.py +14 -0
  9. {code_puppy-0.0.197 → code_puppy-0.0.199}/pyproject.toml +1 -1
  10. {code_puppy-0.0.197 → code_puppy-0.0.199}/.gitignore +0 -0
  11. {code_puppy-0.0.197 → code_puppy-0.0.199}/LICENSE +0 -0
  12. {code_puppy-0.0.197 → code_puppy-0.0.199}/README.md +0 -0
  13. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/__init__.py +0 -0
  14. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/__main__.py +0 -0
  15. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/agents/__init__.py +0 -0
  16. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/agents/agent_c_reviewer.py +0 -0
  17. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/agents/agent_code_puppy.py +0 -0
  18. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/agents/agent_code_reviewer.py +0 -0
  19. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/agents/agent_cpp_reviewer.py +0 -0
  20. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/agents/agent_creator_agent.py +0 -0
  21. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/agents/agent_golang_reviewer.py +0 -0
  22. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/agents/agent_javascript_reviewer.py +0 -0
  23. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/agents/agent_manager.py +0 -0
  24. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/agents/agent_python_reviewer.py +0 -0
  25. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/agents/agent_qa_expert.py +0 -0
  26. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/agents/agent_qa_kitten.py +0 -0
  27. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/agents/agent_security_auditor.py +0 -0
  28. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/agents/agent_typescript_reviewer.py +0 -0
  29. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/callbacks.py +0 -0
  30. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/__init__.py +0 -0
  31. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/file_path_completion.py +0 -0
  32. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/load_context_completion.py +0 -0
  33. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/mcp/__init__.py +0 -0
  34. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/mcp/add_command.py +0 -0
  35. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/mcp/base.py +0 -0
  36. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/mcp/handler.py +0 -0
  37. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/mcp/help_command.py +0 -0
  38. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/mcp/install_command.py +0 -0
  39. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/mcp/list_command.py +0 -0
  40. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/mcp/logs_command.py +0 -0
  41. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/mcp/remove_command.py +0 -0
  42. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/mcp/restart_command.py +0 -0
  43. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/mcp/search_command.py +0 -0
  44. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/mcp/start_all_command.py +0 -0
  45. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/mcp/start_command.py +0 -0
  46. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/mcp/status_command.py +0 -0
  47. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
  48. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/mcp/stop_command.py +0 -0
  49. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/mcp/test_command.py +0 -0
  50. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/mcp/utils.py +0 -0
  51. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  52. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/motd.py +0 -0
  53. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
  54. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/command_line/utils.py +0 -0
  55. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/http_utils.py +0 -0
  56. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/mcp_/__init__.py +0 -0
  57. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/mcp_/async_lifecycle.py +0 -0
  58. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/mcp_/blocking_startup.py +0 -0
  59. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/mcp_/captured_stdio_server.py +0 -0
  60. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/mcp_/circuit_breaker.py +0 -0
  61. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/mcp_/config_wizard.py +0 -0
  62. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/mcp_/dashboard.py +0 -0
  63. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/mcp_/error_isolation.py +0 -0
  64. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/mcp_/examples/retry_example.py +0 -0
  65. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/mcp_/health_monitor.py +0 -0
  66. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/mcp_/managed_server.py +0 -0
  67. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/mcp_/manager.py +0 -0
  68. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/mcp_/registry.py +0 -0
  69. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/mcp_/retry_manager.py +0 -0
  70. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/mcp_/server_registry_catalog.py +0 -0
  71. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/mcp_/status_tracker.py +0 -0
  72. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/mcp_/system_tools.py +0 -0
  73. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/messaging/__init__.py +0 -0
  74. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/messaging/message_queue.py +0 -0
  75. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/messaging/queue_console.py +0 -0
  76. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/messaging/renderers.py +0 -0
  77. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/messaging/spinner/__init__.py +0 -0
  78. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/messaging/spinner/console_spinner.py +0 -0
  79. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/messaging/spinner/spinner_base.py +0 -0
  80. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/messaging/spinner/textual_spinner.py +0 -0
  81. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/model_factory.py +0 -0
  82. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/models.json +0 -0
  83. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/plugins/__init__.py +0 -0
  84. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
  85. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/reopenable_async_client.py +0 -0
  86. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/round_robin_model.py +0 -0
  87. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/session_storage.py +0 -0
  88. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/status_display.py +0 -0
  89. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/summarization_agent.py +0 -0
  90. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tools/__init__.py +0 -0
  91. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tools/agent_tools.py +0 -0
  92. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tools/browser/__init__.py +0 -0
  93. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tools/browser/browser_control.py +0 -0
  94. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tools/browser/browser_interactions.py +0 -0
  95. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tools/browser/browser_locators.py +0 -0
  96. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tools/browser/browser_navigation.py +0 -0
  97. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tools/browser/browser_screenshot.py +0 -0
  98. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tools/browser/browser_scripts.py +0 -0
  99. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tools/browser/browser_workflows.py +0 -0
  100. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tools/browser/camoufox_manager.py +0 -0
  101. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tools/browser/vqa_agent.py +0 -0
  102. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tools/command_runner.py +0 -0
  103. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tools/common.py +0 -0
  104. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tools/file_modifications.py +0 -0
  105. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tools/file_operations.py +0 -0
  106. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tools/tools_content.py +0 -0
  107. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/__init__.py +0 -0
  108. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/app.py +0 -0
  109. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/components/__init__.py +0 -0
  110. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/components/chat_view.py +0 -0
  111. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/components/command_history_modal.py +0 -0
  112. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/components/copy_button.py +0 -0
  113. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/components/custom_widgets.py +0 -0
  114. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/components/human_input_modal.py +0 -0
  115. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/components/input_area.py +0 -0
  116. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/components/sidebar.py +0 -0
  117. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/components/status_bar.py +0 -0
  118. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/messages.py +0 -0
  119. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/models/__init__.py +0 -0
  120. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/models/chat_message.py +0 -0
  121. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/models/command_history.py +0 -0
  122. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/models/enums.py +0 -0
  123. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/screens/__init__.py +0 -0
  124. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/screens/autosave_picker.py +0 -0
  125. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/screens/help.py +0 -0
  126. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/screens/mcp_install_wizard.py +0 -0
  127. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui/screens/tools.py +0 -0
  128. {code_puppy-0.0.197 → code_puppy-0.0.199}/code_puppy/tui_state.py +0 -0
  129. {code_puppy-0.0.197 → code_puppy-0.0.199}/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.197
3
+ Version: 0.0.199
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
@@ -460,16 +460,21 @@ class BaseAgent(ABC):
460
460
 
461
461
  def get_model_context_length(self) -> int:
462
462
  """
463
- Get the context length for the currently configured model from models.json
464
- """
465
- model_configs = ModelFactory.load_config()
466
- model_name = get_global_model_name()
467
-
468
- # Get context length from model config
469
- model_config = model_configs.get(model_name, {})
470
- context_length = model_config.get("context_length", 128000) # Default value
463
+ Return the context length for this agent's effective model.
471
464
 
472
- return int(context_length)
465
+ Honors per-agent pinned model via `self.get_model_name()`; falls back
466
+ to global model when no pin is set. Defaults conservatively on failure.
467
+ """
468
+ try:
469
+ model_configs = ModelFactory.load_config()
470
+ # Use the agent's effective model (respects /pin_model)
471
+ model_name = self.get_model_name()
472
+ model_config = model_configs.get(model_name, {})
473
+ context_length = model_config.get("context_length", 128000)
474
+ return int(context_length)
475
+ except Exception:
476
+ # Be safe; don't blow up status/compaction if model lookup fails
477
+ return 128000
473
478
 
474
479
  def prune_interrupted_tool_calls(
475
480
  self, messages: List[ModelMessage]
@@ -101,6 +101,14 @@ class JSONAgent(BaseAgent):
101
101
  """Get tool configuration from JSON config."""
102
102
  return self._config.get("tools_config")
103
103
 
104
+ def refresh_config(self) -> None:
105
+ """Reload the agent configuration from disk.
106
+
107
+ This keeps long-lived agent instances in sync after external edits.
108
+ """
109
+ self._config = self._load_config()
110
+ self._validate_config()
111
+
104
112
  def get_model_name(self) -> Optional[str]:
105
113
  """Get pinned model name from JSON config, if specified.
106
114
 
@@ -5,7 +5,11 @@ from pathlib import Path
5
5
  from code_puppy.command_line.model_picker_completion import update_model_in_input
6
6
  from code_puppy.command_line.motd import print_motd
7
7
  from code_puppy.command_line.utils import make_directory_table
8
- from code_puppy.config import CONTEXTS_DIR, get_config_keys
8
+ from code_puppy.config import (
9
+ CONTEXTS_DIR,
10
+ finalize_autosave_session,
11
+ get_config_keys,
12
+ )
9
13
  from code_puppy.session_storage import list_sessions, load_session, save_session
10
14
  from code_puppy.tools.tools_content import tools_content
11
15
 
@@ -429,31 +433,44 @@ def handle_command(command: str):
429
433
  import uuid
430
434
 
431
435
  group_id = str(uuid.uuid4())
436
+ available_agents = get_available_agents()
432
437
 
433
- if set_current_agent(agent_name):
434
- # Reload the agent with new configuration
435
- agent = get_current_agent()
436
- agent.reload_code_generation_agent()
437
- new_agent = get_current_agent()
438
- emit_success(
439
- f"Switched to agent: {new_agent.display_name}",
438
+ if agent_name not in available_agents:
439
+ emit_error(f"Agent '{agent_name}' not found", message_group=group_id)
440
+ emit_warning(
441
+ f"Available agents: {', '.join(available_agents.keys())}",
440
442
  message_group=group_id,
441
443
  )
442
- emit_info(f"[dim]{new_agent.description}[/dim]", message_group=group_id)
443
444
  return True
444
- else:
445
- # Generate a group ID for all messages in this command
446
- import uuid
447
445
 
448
- group_id = str(uuid.uuid4())
446
+ current_agent = get_current_agent()
447
+ if current_agent.name == agent_name:
448
+ emit_info(
449
+ f"Already using agent: {current_agent.display_name}",
450
+ message_group=group_id,
451
+ )
452
+ return True
449
453
 
450
- available_agents = get_available_agents()
451
- emit_error(f"Agent '{agent_name}' not found", message_group=group_id)
454
+ new_session_id = finalize_autosave_session()
455
+ if not set_current_agent(agent_name):
452
456
  emit_warning(
453
- f"Available agents: {', '.join(available_agents.keys())}",
457
+ "Agent switch failed after autosave rotation. Your context was preserved.",
454
458
  message_group=group_id,
455
459
  )
456
460
  return True
461
+
462
+ new_agent = get_current_agent()
463
+ new_agent.reload_code_generation_agent()
464
+ emit_success(
465
+ f"Switched to agent: {new_agent.display_name}",
466
+ message_group=group_id,
467
+ )
468
+ emit_info(f"[dim]{new_agent.description}[/dim]", message_group=group_id)
469
+ emit_info(
470
+ f"[dim]Auto-save session rotated to: {new_session_id}[/dim]",
471
+ message_group=group_id,
472
+ )
473
+ return True
457
474
  else:
458
475
  emit_warning("Usage: /agent [agent-name]")
459
476
  return True
@@ -593,12 +610,22 @@ def handle_command(command: str):
593
610
 
594
611
  emit_success(f"Model '{model_name}' pinned to agent '{agent_name}'")
595
612
 
596
- # If this is the current agent, reload it to use the new model
613
+ # If this is the current agent, refresh it so the prompt updates immediately
597
614
  from code_puppy.agents import get_current_agent
598
615
 
599
616
  current_agent = get_current_agent()
600
617
  if current_agent.name == agent_name:
601
- emit_info(f"Active agent reloaded with pinned model '{model_name}'")
618
+ try:
619
+ if is_json_agent and hasattr(current_agent, "refresh_config"):
620
+ current_agent.refresh_config()
621
+ current_agent.reload_code_generation_agent()
622
+ emit_info(
623
+ f"Active agent reloaded with pinned model '{model_name}'"
624
+ )
625
+ except Exception as reload_error:
626
+ emit_warning(
627
+ f"Pinned model applied but reload failed: {reload_error}"
628
+ )
602
629
 
603
630
  return True
604
631
 
@@ -29,13 +29,22 @@ def set_active_model(model_name: str):
29
29
  Sets the active model name by updating the config (for persistence).
30
30
  """
31
31
  set_model_name(model_name)
32
- # Reload agent globally
32
+ # Reload the currently active agent so the new model takes effect immediately
33
33
  try:
34
- from code_puppy.agent import reload_code_generation_agent
35
-
36
- reload_code_generation_agent() # This will reload dynamically everywhere
34
+ from code_puppy.agents import get_current_agent
35
+
36
+ current_agent = get_current_agent()
37
+ # JSON agents may need to refresh their config before reload
38
+ if hasattr(current_agent, "refresh_config"):
39
+ try:
40
+ current_agent.refresh_config()
41
+ except Exception:
42
+ # Non-fatal, continue to reload
43
+ ...
44
+ current_agent.reload_code_generation_agent()
37
45
  except Exception:
38
- pass # If reload fails, agent will still be switched next interpreter run
46
+ # Swallow errors to avoid breaking the prompt flow; model persists for next run
47
+ pass
39
48
 
40
49
 
41
50
  class ModelNameCompleter(Completer):
@@ -784,3 +784,9 @@ def auto_save_session_if_enabled() -> bool:
784
784
 
785
785
  Console().print(f"[dim]❌ Failed to auto-save session: {exc}[/dim]")
786
786
  return False
787
+
788
+
789
+ def finalize_autosave_session() -> str:
790
+ """Persist the current autosave snapshot and rotate to a fresh session."""
791
+ auto_save_session_if_enabled()
792
+ return rotate_autosave_id()
@@ -24,6 +24,7 @@ from code_puppy.config import (
24
24
  AUTOSAVE_DIR,
25
25
  COMMAND_HISTORY_FILE,
26
26
  ensure_config_exists,
27
+ finalize_autosave_session,
27
28
  initialize_command_history_file,
28
29
  save_command_to_history,
29
30
  )
@@ -414,12 +415,14 @@ async def interactive_mode(message_renderer, initial_command: str = None) -> Non
414
415
 
415
416
  # Check for clear command (supports both `clear` and `/clear`)
416
417
  if task.strip().lower() in ("clear", "/clear"):
417
- from code_puppy.messaging import emit_system_message, emit_warning
418
+ from code_puppy.messaging import emit_info, emit_system_message, emit_warning
418
419
 
419
420
  agent = get_current_agent()
421
+ new_session_id = finalize_autosave_session()
420
422
  agent.clear_message_history()
421
423
  emit_warning("Conversation history cleared!")
422
424
  emit_system_message("The agent will not remember previous interactions.\n")
425
+ emit_info(f"[dim]Auto-save session rotated to: {new_session_id}[/dim]")
423
426
  continue
424
427
 
425
428
  # Handle / commands before anything else
@@ -217,6 +217,20 @@ class SettingsScreen(ModalScreen):
217
217
  # Save model selection
218
218
  if selected_model:
219
219
  set_model_name(selected_model)
220
+ # Reload the active agent so model switch takes effect immediately
221
+ try:
222
+ from code_puppy.agents import get_current_agent
223
+
224
+ current_agent = get_current_agent()
225
+ if hasattr(current_agent, "refresh_config"):
226
+ try:
227
+ current_agent.refresh_config()
228
+ except Exception:
229
+ ...
230
+ current_agent.reload_code_generation_agent()
231
+ except Exception:
232
+ # Non-fatal: settings saved; reload will happen on next run if needed
233
+ pass
220
234
 
221
235
  set_config_value("yolo_mode", yolo_mode)
222
236
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "code-puppy"
7
- version = "0.0.197"
7
+ version = "0.0.199"
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