code-puppy 0.0.167__tar.gz → 0.0.169__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 (111) hide show
  1. {code_puppy-0.0.167 → code_puppy-0.0.169}/PKG-INFO +13 -1
  2. {code_puppy-0.0.167 → code_puppy-0.0.169}/README.md +12 -0
  3. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/command_handler.py +37 -0
  4. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/http_utils.py +3 -3
  5. {code_puppy-0.0.167 → code_puppy-0.0.169}/pyproject.toml +1 -1
  6. {code_puppy-0.0.167 → code_puppy-0.0.169}/.gitignore +0 -0
  7. {code_puppy-0.0.167 → code_puppy-0.0.169}/LICENSE +0 -0
  8. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/__init__.py +0 -0
  9. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/__main__.py +0 -0
  10. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/agent.py +0 -0
  11. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/agents/__init__.py +0 -0
  12. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/agents/agent_code_puppy.py +0 -0
  13. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/agents/agent_creator_agent.py +0 -0
  14. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/agents/agent_manager.py +0 -0
  15. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/agents/agent_orchestrator.json +0 -0
  16. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/agents/base_agent.py +0 -0
  17. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/agents/json_agent.py +0 -0
  18. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/agents/runtime_manager.py +0 -0
  19. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/callbacks.py +0 -0
  20. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/__init__.py +0 -0
  21. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/file_path_completion.py +0 -0
  22. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/load_context_completion.py +0 -0
  23. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/mcp/__init__.py +0 -0
  24. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/mcp/add_command.py +0 -0
  25. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/mcp/base.py +0 -0
  26. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/mcp/handler.py +0 -0
  27. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/mcp/help_command.py +0 -0
  28. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/mcp/install_command.py +0 -0
  29. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/mcp/list_command.py +0 -0
  30. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/mcp/logs_command.py +0 -0
  31. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/mcp/remove_command.py +0 -0
  32. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/mcp/restart_command.py +0 -0
  33. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/mcp/search_command.py +0 -0
  34. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/mcp/start_all_command.py +0 -0
  35. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/mcp/start_command.py +0 -0
  36. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/mcp/status_command.py +0 -0
  37. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
  38. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/mcp/stop_command.py +0 -0
  39. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/mcp/test_command.py +0 -0
  40. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/mcp/utils.py +0 -0
  41. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  42. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/meta_command_handler.py +0 -0
  43. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/model_picker_completion.py +0 -0
  44. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/motd.py +0 -0
  45. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
  46. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/command_line/utils.py +0 -0
  47. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/config.py +0 -0
  48. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/main.py +0 -0
  49. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/mcp/__init__.py +0 -0
  50. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/mcp/async_lifecycle.py +0 -0
  51. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/mcp/blocking_startup.py +0 -0
  52. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/mcp/captured_stdio_server.py +0 -0
  53. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/mcp/circuit_breaker.py +0 -0
  54. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/mcp/config_wizard.py +0 -0
  55. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/mcp/dashboard.py +0 -0
  56. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/mcp/error_isolation.py +0 -0
  57. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/mcp/examples/retry_example.py +0 -0
  58. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/mcp/health_monitor.py +0 -0
  59. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/mcp/managed_server.py +0 -0
  60. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/mcp/manager.py +0 -0
  61. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/mcp/registry.py +0 -0
  62. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/mcp/retry_manager.py +0 -0
  63. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/mcp/server_registry_catalog.py +0 -0
  64. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/mcp/status_tracker.py +0 -0
  65. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/mcp/system_tools.py +0 -0
  66. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/message_history_processor.py +0 -0
  67. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/messaging/__init__.py +0 -0
  68. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/messaging/message_queue.py +0 -0
  69. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/messaging/queue_console.py +0 -0
  70. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/messaging/renderers.py +0 -0
  71. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/messaging/spinner/__init__.py +0 -0
  72. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/messaging/spinner/console_spinner.py +0 -0
  73. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/messaging/spinner/spinner_base.py +0 -0
  74. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/messaging/spinner/textual_spinner.py +0 -0
  75. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/model_factory.py +0 -0
  76. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/models.json +0 -0
  77. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/plugins/__init__.py +0 -0
  78. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/reopenable_async_client.py +0 -0
  79. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/round_robin_model.py +0 -0
  80. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/state_management.py +0 -0
  81. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/status_display.py +0 -0
  82. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/summarization_agent.py +0 -0
  83. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tools/__init__.py +0 -0
  84. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tools/agent_tools.py +0 -0
  85. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tools/command_runner.py +0 -0
  86. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tools/common.py +0 -0
  87. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tools/file_modifications.py +0 -0
  88. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tools/file_operations.py +0 -0
  89. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tools/tools_content.py +0 -0
  90. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/__init__.py +0 -0
  91. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/app.py +0 -0
  92. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/components/__init__.py +0 -0
  93. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/components/chat_view.py +0 -0
  94. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/components/command_history_modal.py +0 -0
  95. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/components/copy_button.py +0 -0
  96. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/components/custom_widgets.py +0 -0
  97. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/components/human_input_modal.py +0 -0
  98. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/components/input_area.py +0 -0
  99. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/components/sidebar.py +0 -0
  100. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/components/status_bar.py +0 -0
  101. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/messages.py +0 -0
  102. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/models/__init__.py +0 -0
  103. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/models/chat_message.py +0 -0
  104. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/models/command_history.py +0 -0
  105. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/models/enums.py +0 -0
  106. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/screens/__init__.py +0 -0
  107. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/screens/help.py +0 -0
  108. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/screens/mcp_install_wizard.py +0 -0
  109. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/screens/settings.py +0 -0
  110. {code_puppy-0.0.167 → code_puppy-0.0.169}/code_puppy/tui/screens/tools.py +0 -0
  111. {code_puppy-0.0.167 → code_puppy-0.0.169}/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.167
3
+ Version: 0.0.169
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
@@ -211,6 +211,18 @@ Switches to the specified agent
211
211
  ```
212
212
  Switches to the Agent Creator for building custom agents
213
213
 
214
+ ### Truncate Message History
215
+ ```bash
216
+ /truncate <N>
217
+ ```
218
+ Truncates the message history to keep only the N most recent messages while protecting the first (system) message. For example:
219
+ ```bash
220
+ /truncate 20
221
+ ```
222
+ Would keep the system message plus the 19 most recent messages, removing older ones from the history.
223
+
224
+ This is useful for managing context length when you have a long conversation history but only need the most recent interactions.
225
+
214
226
  ## Available Agents
215
227
 
216
228
  ### Code-Puppy 🐶 (Default)
@@ -167,6 +167,18 @@ Switches to the specified agent
167
167
  ```
168
168
  Switches to the Agent Creator for building custom agents
169
169
 
170
+ ### Truncate Message History
171
+ ```bash
172
+ /truncate <N>
173
+ ```
174
+ Truncates the message history to keep only the N most recent messages while protecting the first (system) message. For example:
175
+ ```bash
176
+ /truncate 20
177
+ ```
178
+ Would keep the system message plus the 19 most recent messages, removing older ones from the history.
179
+
180
+ This is useful for managing context length when you have a long conversation history but only need the most recent interactions.
181
+
170
182
  ## Available Agents
171
183
 
172
184
  ### Code-Puppy 🐶 (Default)
@@ -79,6 +79,10 @@ def get_commands_help():
79
79
  Text("/tools", style="cyan")
80
80
  + Text(" Show available tools and capabilities")
81
81
  )
82
+ help_lines.append(
83
+ Text("/truncate", style="cyan")
84
+ + Text(" <N> Truncate message history to N most recent messages (keeping system message)")
85
+ )
82
86
  help_lines.append(
83
87
  Text("/<unknown>", style="cyan")
84
88
  + Text(" Show unknown command warning")
@@ -615,6 +619,39 @@ def handle_command(command: str):
615
619
  emit_error(f"Failed to load context: {e}")
616
620
  return True
617
621
 
622
+ if command.startswith("/truncate"):
623
+ tokens = command.split()
624
+ if len(tokens) != 2:
625
+ emit_error("Usage: /truncate <N> (where N is the number of messages to keep)")
626
+ return True
627
+
628
+ try:
629
+ n = int(tokens[1])
630
+ if n < 1:
631
+ emit_error("N must be a positive integer")
632
+ return True
633
+ except ValueError:
634
+ emit_error("N must be a valid integer")
635
+ return True
636
+
637
+ from code_puppy.state_management import get_message_history, set_message_history
638
+
639
+ history = get_message_history()
640
+ if not history:
641
+ emit_warning("No history to truncate yet. Ask me something first!")
642
+ return True
643
+
644
+ if len(history) <= n:
645
+ emit_info(f"History already has {len(history)} messages, which is <= {n}. Nothing to truncate.")
646
+ return True
647
+
648
+ # Always keep the first message (system message) and then keep the N-1 most recent messages
649
+ truncated_history = [history[0]] + history[-(n-1):] if n > 1 else [history[0]]
650
+
651
+ set_message_history(truncated_history)
652
+ emit_success(f"Truncated message history from {len(history)} to {len(truncated_history)} messages (keeping system message and {n-1} most recent)")
653
+ return True
654
+
618
655
  if command in ("/exit", "/quit"):
619
656
  emit_success("Goodbye!")
620
657
  # Signal to the main app that we want to exit
@@ -70,7 +70,7 @@ def create_client(
70
70
  fallback_strategy=wait_exponential(multiplier=1, max=60),
71
71
  max_wait=300
72
72
  ),
73
- stop=stop_after_attempt(5),
73
+ stop=stop_after_attempt(10),
74
74
  reraise=True
75
75
  ),
76
76
  validate_response=should_retry_status
@@ -106,7 +106,7 @@ def create_async_client(
106
106
  fallback_strategy=wait_exponential(multiplier=1, max=60),
107
107
  max_wait=300
108
108
  ),
109
- stop=stop_after_attempt(5),
109
+ stop=stop_after_attempt(10),
110
110
  reraise=True
111
111
  ),
112
112
  validate_response=should_retry_status
@@ -182,7 +182,7 @@ def create_reopenable_async_client(
182
182
  fallback_strategy=wait_exponential(multiplier=1, max=60),
183
183
  max_wait=300
184
184
  ),
185
- stop=stop_after_attempt(5),
185
+ stop=stop_after_attempt(10),
186
186
  reraise=True
187
187
  ),
188
188
  validate_response=should_retry_status
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "code-puppy"
7
- version = "0.0.167"
7
+ version = "0.0.169"
8
8
  description = "Code generation agent"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
File without changes
File without changes