code-puppy 0.0.193__tar.gz → 0.0.194__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 (127) hide show
  1. {code_puppy-0.0.193 → code_puppy-0.0.194}/PKG-INFO +1 -1
  2. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/command_handler.py +13 -1
  3. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/config.py +165 -0
  4. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/main.py +6 -2
  5. {code_puppy-0.0.193 → code_puppy-0.0.194}/pyproject.toml +1 -1
  6. {code_puppy-0.0.193 → code_puppy-0.0.194}/.gitignore +0 -0
  7. {code_puppy-0.0.193 → code_puppy-0.0.194}/LICENSE +0 -0
  8. {code_puppy-0.0.193 → code_puppy-0.0.194}/README.md +0 -0
  9. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/__init__.py +0 -0
  10. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/__main__.py +0 -0
  11. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/agents/__init__.py +0 -0
  12. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/agents/agent_c_reviewer.py +0 -0
  13. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/agents/agent_code_puppy.py +0 -0
  14. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/agents/agent_code_reviewer.py +0 -0
  15. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/agents/agent_cpp_reviewer.py +0 -0
  16. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/agents/agent_creator_agent.py +0 -0
  17. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/agents/agent_golang_reviewer.py +0 -0
  18. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/agents/agent_javascript_reviewer.py +0 -0
  19. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/agents/agent_manager.py +0 -0
  20. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/agents/agent_python_reviewer.py +0 -0
  21. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/agents/agent_qa_expert.py +0 -0
  22. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/agents/agent_qa_kitten.py +0 -0
  23. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/agents/agent_security_auditor.py +0 -0
  24. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/agents/agent_typescript_reviewer.py +0 -0
  25. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/agents/base_agent.py +0 -0
  26. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/agents/json_agent.py +0 -0
  27. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/callbacks.py +0 -0
  28. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/__init__.py +0 -0
  29. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/file_path_completion.py +0 -0
  30. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/load_context_completion.py +0 -0
  31. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/mcp/__init__.py +0 -0
  32. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/mcp/add_command.py +0 -0
  33. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/mcp/base.py +0 -0
  34. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/mcp/handler.py +0 -0
  35. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/mcp/help_command.py +0 -0
  36. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/mcp/install_command.py +0 -0
  37. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/mcp/list_command.py +0 -0
  38. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/mcp/logs_command.py +0 -0
  39. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/mcp/remove_command.py +0 -0
  40. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/mcp/restart_command.py +0 -0
  41. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/mcp/search_command.py +0 -0
  42. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/mcp/start_all_command.py +0 -0
  43. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/mcp/start_command.py +0 -0
  44. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/mcp/status_command.py +0 -0
  45. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
  46. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/mcp/stop_command.py +0 -0
  47. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/mcp/test_command.py +0 -0
  48. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/mcp/utils.py +0 -0
  49. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  50. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/model_picker_completion.py +0 -0
  51. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/motd.py +0 -0
  52. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
  53. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/command_line/utils.py +0 -0
  54. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/http_utils.py +0 -0
  55. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/mcp_/__init__.py +0 -0
  56. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/mcp_/async_lifecycle.py +0 -0
  57. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/mcp_/blocking_startup.py +0 -0
  58. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/mcp_/captured_stdio_server.py +0 -0
  59. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/mcp_/circuit_breaker.py +0 -0
  60. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/mcp_/config_wizard.py +0 -0
  61. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/mcp_/dashboard.py +0 -0
  62. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/mcp_/error_isolation.py +0 -0
  63. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/mcp_/examples/retry_example.py +0 -0
  64. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/mcp_/health_monitor.py +0 -0
  65. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/mcp_/managed_server.py +0 -0
  66. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/mcp_/manager.py +0 -0
  67. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/mcp_/registry.py +0 -0
  68. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/mcp_/retry_manager.py +0 -0
  69. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/mcp_/server_registry_catalog.py +0 -0
  70. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/mcp_/status_tracker.py +0 -0
  71. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/mcp_/system_tools.py +0 -0
  72. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/messaging/__init__.py +0 -0
  73. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/messaging/message_queue.py +0 -0
  74. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/messaging/queue_console.py +0 -0
  75. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/messaging/renderers.py +0 -0
  76. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/messaging/spinner/__init__.py +0 -0
  77. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/messaging/spinner/console_spinner.py +0 -0
  78. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/messaging/spinner/spinner_base.py +0 -0
  79. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/messaging/spinner/textual_spinner.py +0 -0
  80. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/model_factory.py +0 -0
  81. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/models.json +0 -0
  82. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/plugins/__init__.py +0 -0
  83. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
  84. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/reopenable_async_client.py +0 -0
  85. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/round_robin_model.py +0 -0
  86. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/status_display.py +0 -0
  87. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/summarization_agent.py +0 -0
  88. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tools/__init__.py +0 -0
  89. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tools/agent_tools.py +0 -0
  90. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tools/browser/__init__.py +0 -0
  91. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tools/browser/browser_control.py +0 -0
  92. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tools/browser/browser_interactions.py +0 -0
  93. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tools/browser/browser_locators.py +0 -0
  94. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tools/browser/browser_navigation.py +0 -0
  95. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tools/browser/browser_screenshot.py +0 -0
  96. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tools/browser/browser_scripts.py +0 -0
  97. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tools/browser/browser_workflows.py +0 -0
  98. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tools/browser/camoufox_manager.py +0 -0
  99. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tools/browser/vqa_agent.py +0 -0
  100. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tools/command_runner.py +0 -0
  101. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tools/common.py +0 -0
  102. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tools/file_modifications.py +0 -0
  103. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tools/file_operations.py +0 -0
  104. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tools/tools_content.py +0 -0
  105. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/__init__.py +0 -0
  106. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/app.py +0 -0
  107. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/components/__init__.py +0 -0
  108. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/components/chat_view.py +0 -0
  109. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/components/command_history_modal.py +0 -0
  110. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/components/copy_button.py +0 -0
  111. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/components/custom_widgets.py +0 -0
  112. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/components/human_input_modal.py +0 -0
  113. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/components/input_area.py +0 -0
  114. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/components/sidebar.py +0 -0
  115. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/components/status_bar.py +0 -0
  116. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/messages.py +0 -0
  117. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/models/__init__.py +0 -0
  118. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/models/chat_message.py +0 -0
  119. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/models/command_history.py +0 -0
  120. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/models/enums.py +0 -0
  121. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/screens/__init__.py +0 -0
  122. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/screens/help.py +0 -0
  123. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/screens/mcp_install_wizard.py +0 -0
  124. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/screens/settings.py +0 -0
  125. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui/screens/tools.py +0 -0
  126. {code_puppy-0.0.193 → code_puppy-0.0.194}/code_puppy/tui_state.py +0 -0
  127. {code_puppy-0.0.193 → code_puppy-0.0.194}/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.193
3
+ Version: 0.0.194
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
@@ -76,10 +76,22 @@ def get_commands_help():
76
76
  Text("/load_context", style="cyan")
77
77
  + Text(" <name> Load message history from file")
78
78
  )
79
+ help_lines.append(
80
+ Text("", style="cyan")
81
+ + Text("Session Management:", style="bold yellow")
82
+ )
83
+ help_lines.append(
84
+ Text("auto_save_session", style="cyan")
85
+ + Text(" Auto-save session after each response (true/false)")
86
+ )
87
+ help_lines.append(
88
+ Text("max_saved_sessions", style="cyan")
89
+ + Text(" Maximum number of sessions to keep (default: 20, 0 = unlimited)")
90
+ )
79
91
  help_lines.append(
80
92
  Text("/set", style="cyan")
81
93
  + Text(
82
- " Set puppy config key-values (e.g., /set yolo_mode true, /set compaction_strategy truncation)"
94
+ " Set puppy config key-values (e.g., /set yolo_mode true, /set auto_save_session true, /set max_saved_sessions 20)"
83
95
  )
84
96
  )
85
97
  help_lines.append(
@@ -121,6 +121,8 @@ def get_config_keys():
121
121
  "message_limit",
122
122
  "allow_recursion",
123
123
  "openai_reasoning_effort",
124
+ "auto_save_session",
125
+ "max_saved_sessions",
124
126
  ]
125
127
  config = configparser.ConfigParser()
126
128
  config.read(CONFIG_FILE)
@@ -645,3 +647,166 @@ def clear_agent_pinned_model(agent_name: str):
645
647
  # We can't easily delete keys from configparser, so set to empty string
646
648
  # which will be treated as None by get_agent_pinned_model
647
649
  set_config_value(f"agent_model_{agent_name}", "")
650
+
651
+
652
+ def get_auto_save_session() -> bool:
653
+ """
654
+ Checks puppy.cfg for 'auto_save_session' (case-insensitive in value only).
655
+ Defaults to True if not set.
656
+ Allowed values for ON: 1, '1', 'true', 'yes', 'on' (all case-insensitive for value).
657
+ """
658
+ true_vals = {"1", "true", "yes", "on"}
659
+ cfg_val = get_value("auto_save_session")
660
+ if cfg_val is not None:
661
+ if str(cfg_val).strip().lower() in true_vals:
662
+ return True
663
+ return False
664
+ return True
665
+
666
+
667
+ def set_auto_save_session(enabled: bool):
668
+ """Sets the auto_save_session configuration value.
669
+
670
+ Args:
671
+ enabled: Whether to enable auto-saving of sessions
672
+ """
673
+ set_config_value("auto_save_session", "true" if enabled else "false")
674
+
675
+
676
+ def get_max_saved_sessions() -> int:
677
+ """
678
+ Gets the maximum number of sessions to keep.
679
+ Defaults to 20 if not set.
680
+ """
681
+ cfg_val = get_value("max_saved_sessions")
682
+ if cfg_val is not None:
683
+ try:
684
+ val = int(cfg_val)
685
+ return max(0, val) # Ensure non-negative
686
+ except (ValueError, TypeError):
687
+ pass
688
+ return 20
689
+
690
+
691
+ def set_max_saved_sessions(max_sessions: int):
692
+ """Sets the max_saved_sessions configuration value.
693
+
694
+ Args:
695
+ max_sessions: Maximum number of sessions to keep (0 for unlimited)
696
+ """
697
+ set_config_value("max_saved_sessions", str(max_sessions))
698
+
699
+
700
+ def _cleanup_old_sessions():
701
+ """Remove oldest sessions if we exceed the max_saved_sessions limit."""
702
+ max_sessions = get_max_saved_sessions()
703
+ if max_sessions <= 0: # 0 means unlimited
704
+ return
705
+
706
+ from pathlib import Path
707
+
708
+ contexts_dir = Path(CONFIG_DIR) / "contexts"
709
+ if not contexts_dir.exists():
710
+ return
711
+
712
+ # Get all .pkl files (session files) and sort by modification time
713
+ session_files = []
714
+ for pkl_file in contexts_dir.glob("*.pkl"):
715
+ try:
716
+ session_files.append((pkl_file.stat().st_mtime, pkl_file))
717
+ except OSError:
718
+ continue
719
+
720
+ # Sort by modification time (oldest first)
721
+ session_files.sort(key=lambda x: x[0])
722
+
723
+ # If we have more than max_sessions, remove the oldest ones
724
+ if len(session_files) > max_sessions:
725
+ files_to_remove = session_files[:-max_sessions] # All except the last max_sessions
726
+
727
+ from rich.console import Console
728
+ console = Console()
729
+
730
+ for _, old_file in files_to_remove:
731
+ try:
732
+ # Remove the .pkl file
733
+ old_file.unlink()
734
+
735
+ # Also remove the corresponding _meta.json file if it exists
736
+ meta_file = contexts_dir / f"{old_file.stem}_meta.json"
737
+ if meta_file.exists():
738
+ meta_file.unlink()
739
+
740
+ console.print(f"[dim]🗑️ Removed old session: {old_file.name}[/dim]")
741
+
742
+ except OSError as e:
743
+ console.print(f"[dim]❌ Failed to remove {old_file.name}: {e}[/dim]")
744
+
745
+
746
+ def auto_save_session_if_enabled() -> bool:
747
+ """Automatically save the current session if auto_save_session is enabled.
748
+
749
+ Returns:
750
+ True if session was saved, False otherwise
751
+ """
752
+ if not get_auto_save_session():
753
+ return False
754
+
755
+ try:
756
+ import datetime
757
+ import json
758
+ import pickle
759
+ from pathlib import Path
760
+ from code_puppy.agents.agent_manager import get_current_agent
761
+
762
+ # Get current agent and message history
763
+ current_agent = get_current_agent()
764
+ history = current_agent.get_message_history()
765
+
766
+ if not history:
767
+ return False # No history to save
768
+
769
+ # Create timestamp-based session name
770
+ timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
771
+ session_name = f"auto_session_{timestamp}"
772
+
773
+ # Create contexts directory if it doesn't exist
774
+ contexts_dir = Path(CONFIG_DIR) / "contexts"
775
+ contexts_dir.mkdir(parents=True, exist_ok=True)
776
+
777
+ # Save as pickle for exact preservation
778
+ pickle_file = contexts_dir / f"{session_name}.pkl"
779
+ with open(pickle_file, "wb") as f:
780
+ pickle.dump(history, f)
781
+
782
+ # Also save metadata as JSON for readability
783
+ meta_file = contexts_dir / f"{session_name}_meta.json"
784
+ metadata = {
785
+ "session_name": session_name,
786
+ "timestamp": datetime.datetime.now().isoformat(),
787
+ "message_count": len(history),
788
+ "total_tokens": sum(
789
+ current_agent.estimate_tokens_for_message(m) for m in history
790
+ ),
791
+ "file_path": str(pickle_file),
792
+ "auto_saved": True,
793
+ }
794
+
795
+ with open(meta_file, "w") as f:
796
+ json.dump(metadata, f, indent=2)
797
+
798
+ from rich.console import Console
799
+ console = Console()
800
+ console.print(
801
+ f"🐾 [dim]Auto-saved session: {len(history)} messages ({metadata['total_tokens']} tokens)[/dim]"
802
+ )
803
+
804
+ # Cleanup old sessions if limit is set
805
+ _cleanup_old_sessions()
806
+ return True
807
+
808
+ except Exception as e:
809
+ from rich.console import Console
810
+ console = Console()
811
+ console.print(f"[dim]❌ Failed to auto-save session: {str(e)}[/dim]")
812
+ return False
@@ -456,11 +456,15 @@ async def interactive_mode(message_renderer, initial_command: str = None) -> Non
456
456
  f"\n[bold purple]AGENT RESPONSE: [/bold purple]\n{agent_response}"
457
457
  )
458
458
 
459
+ # Auto-save session if enabled
460
+ from code_puppy.config import auto_save_session_if_enabled
461
+ auto_save_session_if_enabled()
462
+
459
463
  # Ensure console output is flushed before next prompt
460
464
  # This fixes the issue where prompt doesn't appear after agent response
461
465
  display_console.file.flush() if hasattr(
462
466
  display_console.file, "flush"
463
- ) else None
467
+ ) else None
464
468
  import time
465
469
 
466
470
  time.sleep(0.1) # Brief pause to ensure all messages are rendered
@@ -592,4 +596,4 @@ def main_entry():
592
596
 
593
597
 
594
598
  if __name__ == "__main__":
595
- main_entry()
599
+ main_entry()
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "code-puppy"
7
- version = "0.0.193"
7
+ version = "0.0.194"
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