code-puppy 0.0.485__tar.gz → 0.0.487__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 (274) hide show
  1. {code_puppy-0.0.485 → code_puppy-0.0.487}/PKG-INFO +1 -1
  2. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/http_utils.py +0 -60
  3. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/model_factory.py +9 -23
  4. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/copilot_auth/register_callbacks.py +4 -6
  5. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/file_modifications.py +73 -32
  6. {code_puppy-0.0.485 → code_puppy-0.0.487}/pyproject.toml +1 -1
  7. {code_puppy-0.0.485 → code_puppy-0.0.487}/.gitignore +0 -0
  8. {code_puppy-0.0.485 → code_puppy-0.0.487}/LICENSE +0 -0
  9. {code_puppy-0.0.485 → code_puppy-0.0.487}/README.md +0 -0
  10. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/__init__.py +0 -0
  11. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/__main__.py +0 -0
  12. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/agents/__init__.py +0 -0
  13. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/agents/_builder.py +0 -0
  14. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/agents/_compaction.py +0 -0
  15. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/agents/_diagnostics.py +0 -0
  16. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/agents/_history.py +0 -0
  17. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/agents/_key_listeners.py +0 -0
  18. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/agents/_non_streaming_render.py +0 -0
  19. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/agents/_runtime.py +0 -0
  20. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/agents/agent_code_puppy.py +0 -0
  21. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/agents/agent_creator_agent.py +0 -0
  22. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/agents/agent_helios.py +0 -0
  23. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/agents/agent_manager.py +0 -0
  24. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/agents/agent_planning.py +0 -0
  25. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/agents/agent_qa_kitten.py +0 -0
  26. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/agents/base_agent.py +0 -0
  27. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/agents/event_stream_handler.py +0 -0
  28. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/agents/json_agent.py +0 -0
  29. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/agents/subagent_stream_handler.py +0 -0
  30. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/callbacks.py +0 -0
  31. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/chatgpt_codex_client.py +0 -0
  32. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/claude_cache_client.py +0 -0
  33. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/cli_runner.py +0 -0
  34. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/__init__.py +0 -0
  35. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/add_model_menu.py +0 -0
  36. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/agent_menu.py +0 -0
  37. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/attachments.py +0 -0
  38. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/autosave_menu.py +0 -0
  39. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/clipboard.py +0 -0
  40. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/colors_menu.py +0 -0
  41. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/command_handler.py +0 -0
  42. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/command_registry.py +0 -0
  43. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/config_commands.py +0 -0
  44. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/core_commands.py +0 -0
  45. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/diff_menu.py +0 -0
  46. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/file_path_completion.py +0 -0
  47. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/load_context_completion.py +0 -0
  48. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/__init__.py +0 -0
  49. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/base.py +0 -0
  50. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
  51. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
  52. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
  53. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/edit_command.py +0 -0
  54. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/handler.py +0 -0
  55. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/help_command.py +0 -0
  56. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/install_command.py +0 -0
  57. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/install_menu.py +0 -0
  58. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/list_command.py +0 -0
  59. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/logs_command.py +0 -0
  60. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/remove_command.py +0 -0
  61. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/restart_command.py +0 -0
  62. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/search_command.py +0 -0
  63. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/start_all_command.py +0 -0
  64. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/start_command.py +0 -0
  65. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/status_command.py +0 -0
  66. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
  67. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/stop_command.py +0 -0
  68. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/test_command.py +0 -0
  69. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/utils.py +0 -0
  70. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  71. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/mcp_completion.py +0 -0
  72. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/model_picker_completion.py +0 -0
  73. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/model_settings_menu.py +0 -0
  74. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/onboarding_slides.py +0 -0
  75. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/onboarding_wizard.py +0 -0
  76. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/pagination.py +0 -0
  77. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/pin_command_completion.py +0 -0
  78. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
  79. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/session_commands.py +0 -0
  80. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/shell_passthrough.py +0 -0
  81. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/skills_completion.py +0 -0
  82. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/uc_menu.py +0 -0
  83. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/utils.py +0 -0
  84. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/command_line/wiggum_state.py +0 -0
  85. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/config.py +0 -0
  86. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/error_logging.py +0 -0
  87. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/gemini_code_assist.py +0 -0
  88. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/gemini_model.py +0 -0
  89. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/hook_engine/README.md +0 -0
  90. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/hook_engine/__init__.py +0 -0
  91. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/hook_engine/aliases.py +0 -0
  92. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/hook_engine/engine.py +0 -0
  93. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/hook_engine/executor.py +0 -0
  94. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/hook_engine/matcher.py +0 -0
  95. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/hook_engine/models.py +0 -0
  96. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/hook_engine/registry.py +0 -0
  97. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/hook_engine/validator.py +0 -0
  98. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/keymap.py +0 -0
  99. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/list_filtering.py +0 -0
  100. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/main.py +0 -0
  101. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_/__init__.py +0 -0
  102. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_/async_lifecycle.py +0 -0
  103. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_/blocking_startup.py +0 -0
  104. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_/captured_stdio_server.py +0 -0
  105. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_/circuit_breaker.py +0 -0
  106. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_/config_wizard.py +0 -0
  107. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_/dashboard.py +0 -0
  108. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_/error_isolation.py +0 -0
  109. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_/examples/retry_example.py +0 -0
  110. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_/health_monitor.py +0 -0
  111. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_/managed_server.py +0 -0
  112. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_/manager.py +0 -0
  113. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_/mcp_logs.py +0 -0
  114. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_/registry.py +0 -0
  115. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_/retry_manager.py +0 -0
  116. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_/server_registry_catalog.py +0 -0
  117. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_/status_tracker.py +0 -0
  118. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_/system_tools.py +0 -0
  119. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_prompts/__init__.py +0 -0
  120. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/mcp_prompts/hook_creator.py +0 -0
  121. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/messaging/__init__.py +0 -0
  122. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/messaging/bus.py +0 -0
  123. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/messaging/commands.py +0 -0
  124. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/messaging/markdown_patches.py +0 -0
  125. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/messaging/message_queue.py +0 -0
  126. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/messaging/messages.py +0 -0
  127. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/messaging/queue_console.py +0 -0
  128. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/messaging/renderers.py +0 -0
  129. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/messaging/rich_renderer.py +0 -0
  130. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/messaging/spinner/__init__.py +0 -0
  131. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/messaging/spinner/console_spinner.py +0 -0
  132. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/messaging/spinner/spinner_base.py +0 -0
  133. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/messaging/subagent_console.py +0 -0
  134. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/model_switching.py +0 -0
  135. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/model_utils.py +0 -0
  136. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/models.json +0 -0
  137. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/models_dev_api.json +0 -0
  138. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/models_dev_parser.py +0 -0
  139. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/__init__.py +0 -0
  140. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/agent_skills/__init__.py +0 -0
  141. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/agent_skills/config.py +0 -0
  142. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/agent_skills/discovery.py +0 -0
  143. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/agent_skills/downloader.py +0 -0
  144. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/agent_skills/installer.py +0 -0
  145. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/agent_skills/metadata.py +0 -0
  146. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/agent_skills/prompt_builder.py +0 -0
  147. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/agent_skills/register_callbacks.py +0 -0
  148. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/agent_skills/remote_catalog.py +0 -0
  149. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/agent_skills/skill_catalog.py +0 -0
  150. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/agent_skills/skills_install_menu.py +0 -0
  151. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/agent_skills/skills_menu.py +0 -0
  152. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/aws_bedrock/__init__.py +0 -0
  153. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/aws_bedrock/config.py +0 -0
  154. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/aws_bedrock/register_callbacks.py +0 -0
  155. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/aws_bedrock/utils.py +0 -0
  156. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/azure_foundry/README.md +0 -0
  157. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/azure_foundry/__init__.py +0 -0
  158. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/azure_foundry/config.py +0 -0
  159. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/azure_foundry/discovery.py +0 -0
  160. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/azure_foundry/register_callbacks.py +0 -0
  161. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/azure_foundry/token.py +0 -0
  162. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/azure_foundry/utils.py +0 -0
  163. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
  164. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
  165. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
  166. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +0 -0
  167. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +0 -0
  168. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/chatgpt_oauth/utils.py +0 -0
  169. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/claude_code_hooks/__init__.py +0 -0
  170. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/claude_code_hooks/config.py +0 -0
  171. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/claude_code_hooks/register_callbacks.py +0 -0
  172. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
  173. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
  174. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
  175. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
  176. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/claude_code_oauth/fast_mode.py +0 -0
  177. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/claude_code_oauth/prompt_handler.py +0 -0
  178. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +0 -0
  179. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/claude_code_oauth/test_fast_mode.py +0 -0
  180. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
  181. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  182. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/claude_code_oauth/utils.py +0 -0
  183. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/copilot_auth/__init__.py +0 -0
  184. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/copilot_auth/config.py +0 -0
  185. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/copilot_auth/reasoning_client.py +0 -0
  186. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/copilot_auth/utils.py +0 -0
  187. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
  188. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
  189. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/dbos_durable_exec/__init__.py +0 -0
  190. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/dbos_durable_exec/cancel.py +0 -0
  191. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/dbos_durable_exec/commands.py +0 -0
  192. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/dbos_durable_exec/config.py +0 -0
  193. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/dbos_durable_exec/lifecycle.py +0 -0
  194. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/dbos_durable_exec/register_callbacks.py +0 -0
  195. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/dbos_durable_exec/runtime.py +0 -0
  196. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/dbos_durable_exec/workflow_ids.py +0 -0
  197. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/dbos_durable_exec/wrapper.py +0 -0
  198. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/destructive_command_guard/__init__.py +0 -0
  199. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/destructive_command_guard/detector.py +0 -0
  200. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/example_custom_command/README.md +0 -0
  201. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
  202. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
  203. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
  204. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/force_push_guard/__init__.py +0 -0
  205. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/force_push_guard/detector.py +0 -0
  206. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/force_push_guard/register_callbacks.py +0 -0
  207. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/force_push_guard/test_detector.py +0 -0
  208. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/frontend_emitter/__init__.py +0 -0
  209. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/frontend_emitter/emitter.py +0 -0
  210. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/frontend_emitter/register_callbacks.py +0 -0
  211. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/hook_creator/__init__.py +0 -0
  212. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/hook_creator/register_callbacks.py +0 -0
  213. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/hook_manager/__init__.py +0 -0
  214. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/hook_manager/config.py +0 -0
  215. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/hook_manager/hooks_menu.py +0 -0
  216. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/hook_manager/register_callbacks.py +0 -0
  217. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/oauth_puppy_html.py +0 -0
  218. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/ollama_setup/__init__.py +0 -0
  219. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/ollama_setup/completer.py +0 -0
  220. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/ollama_setup/register_callbacks.py +0 -0
  221. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/pop_command/__init__.py +0 -0
  222. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/pop_command/register_callbacks.py +0 -0
  223. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/shell_safety/__init__.py +0 -0
  224. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
  225. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
  226. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
  227. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/synthetic_status/__init__.py +0 -0
  228. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/synthetic_status/register_callbacks.py +0 -0
  229. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/synthetic_status/status_api.py +0 -0
  230. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/universal_constructor/__init__.py +0 -0
  231. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/universal_constructor/models.py +0 -0
  232. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/universal_constructor/register_callbacks.py +0 -0
  233. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/universal_constructor/registry.py +0 -0
  234. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/plugins/universal_constructor/sandbox.py +0 -0
  235. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/provider_identity.py +0 -0
  236. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/pydantic_patches.py +0 -0
  237. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/reopenable_async_client.py +0 -0
  238. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/round_robin_model.py +0 -0
  239. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/session_storage.py +0 -0
  240. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/status_display.py +0 -0
  241. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/summarization_agent.py +0 -0
  242. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/terminal_utils.py +0 -0
  243. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/__init__.py +0 -0
  244. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/agent_tools.py +0 -0
  245. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/ask_user_question/__init__.py +0 -0
  246. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/ask_user_question/constants.py +0 -0
  247. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/ask_user_question/demo_tui.py +0 -0
  248. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/ask_user_question/handler.py +0 -0
  249. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/ask_user_question/models.py +0 -0
  250. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/ask_user_question/registration.py +0 -0
  251. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/ask_user_question/renderers.py +0 -0
  252. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/ask_user_question/terminal_ui.py +0 -0
  253. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/ask_user_question/theme.py +0 -0
  254. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/ask_user_question/tui_loop.py +0 -0
  255. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/browser/__init__.py +0 -0
  256. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/browser/browser_control.py +0 -0
  257. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/browser/browser_interactions.py +0 -0
  258. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/browser/browser_locators.py +0 -0
  259. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/browser/browser_manager.py +0 -0
  260. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/browser/browser_navigation.py +0 -0
  261. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/browser/browser_screenshot.py +0 -0
  262. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/browser/browser_scripts.py +0 -0
  263. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/browser/browser_workflows.py +0 -0
  264. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/command_runner.py +0 -0
  265. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/common.py +0 -0
  266. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/display.py +0 -0
  267. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/file_operations.py +0 -0
  268. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/image_tools.py +0 -0
  269. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/skills_tools.py +0 -0
  270. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/subagent_context.py +0 -0
  271. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/tools_content.py +0 -0
  272. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/tools/universal_constructor.py +0 -0
  273. {code_puppy-0.0.485 → code_puppy-0.0.487}/code_puppy/uvx_detection.py +0 -0
  274. {code_puppy-0.0.485 → code_puppy-0.0.487}/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.485
3
+ Version: 0.0.487
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
@@ -5,7 +5,6 @@ This module provides functions for creating properly configured HTTP clients.
5
5
  """
6
6
 
7
7
  import asyncio
8
- import logging
9
8
  import os
10
9
  import socket
11
10
  import time
@@ -18,8 +17,6 @@ if TYPE_CHECKING:
18
17
  import requests
19
18
  from code_puppy.config import get_http2
20
19
 
21
- logger = logging.getLogger(__name__)
22
-
23
20
 
24
21
  @dataclass
25
22
  class ProxyConfig:
@@ -343,63 +340,6 @@ def create_reopenable_async_client(
343
340
  return httpx.AsyncClient(**base_kwargs)
344
341
 
345
342
 
346
- def disable_openai_sdk_retries(
347
- http_client: httpx.AsyncClient,
348
- **openai_kwargs: Any,
349
- ) -> dict:
350
- """When a RetryingAsyncClient is used as http_client for the OpenAI SDK,
351
- disable the SDK's own retries to avoid multiplicative retry explosion.
352
-
353
- The OpenAI SDK defaults to max_retries=2, and RetryingAsyncClient has 5.
354
- Together with 3 streaming retries, a 429 can trigger up to
355
- 3 x 3 x 5 = 45 retries. Disabling SDK retries caps this at 3 x 5 = 15.
356
-
357
- Returns provider kwargs. If the client is NOT a RetryingAsyncClient,
358
- returns {"http_client": client} (+ any openai_kwargs as separate keys).
359
- If it IS a RetryingAsyncClient, returns {"openai_client": AsyncOpenAI(...)}
360
- with max_retries=0 and the provided openai_kwargs folded in.
361
- Falls back to {"http_client": client} if AsyncOpenAI construction fails
362
- (e.g. missing api_key).
363
-
364
- Args:
365
- http_client: The httpx client (possibly RetryingAsyncClient).
366
- **openai_kwargs: Extra kwargs for AsyncOpenAI (api_key, base_url, etc).
367
- Only used when creating an openai_client to bypass SDK retries.
368
- """
369
- if isinstance(http_client, RetryingAsyncClient):
370
- try:
371
- from openai import AsyncOpenAI
372
-
373
- openai_client = AsyncOpenAI(
374
- http_client=http_client,
375
- max_retries=0,
376
- **openai_kwargs,
377
- )
378
- return {"openai_client": openai_client}
379
- except ImportError:
380
- # openai package not installed; fall through
381
- pass
382
- except Exception as exc:
383
- # Missing api_key (OpenAIError), wrong kwargs (TypeError),
384
- # or other construction failures — fall back gracefully.
385
- try:
386
- from openai import OpenAIError as _OpenAIError
387
-
388
- _warnable = (TypeError, ValueError, _OpenAIError)
389
- except ImportError:
390
- _warnable = (TypeError, ValueError)
391
- if isinstance(exc, _warnable):
392
- emit_warning(
393
- f"Could not disable OpenAI SDK retries ({exc}). "
394
- f"Falling back to http_client mode — multiplicative retries possible."
395
- )
396
- else: # pragma: no cover
397
- logger.debug("Unexpected error disabling OpenAI SDK retries: %s", exc)
398
- result = {"http_client": http_client}
399
- result.update(openai_kwargs)
400
- return result
401
-
402
-
403
343
  def is_cert_bundle_available() -> bool:
404
344
  cert_path = get_cert_bundle_path()
405
345
  if cert_path is None:
@@ -25,12 +25,7 @@ from code_puppy.messaging import emit_warning
25
25
  from . import callbacks
26
26
  from .claude_cache_client import ClaudeCacheAsyncClient, patch_anthropic_client_messages
27
27
  from .config import EXTRA_MODELS_FILE, get_value, get_yolo_mode
28
- from .http_utils import (
29
- create_async_client,
30
- disable_openai_sdk_retries,
31
- get_cert_bundle_path,
32
- get_http2,
33
- )
28
+ from .http_utils import create_async_client, get_cert_bundle_path, get_http2
34
29
  from .provider_identity import (
35
30
  make_anthropic_provider,
36
31
  make_openai_provider,
@@ -705,20 +700,11 @@ class ModelFactory:
705
700
  verify=verify,
706
701
  timeout=timeout if timeout is not None else 180,
707
702
  )
703
+ provider_args = {"base_url": url}
708
704
  if isinstance(client, httpx.AsyncClient):
709
- # Disable OpenAI SDK retries when using our own
710
- # RetryingAsyncClient to avoid multiplicative retry explosion
711
- # (3 streaming x 3 SDK x 5 HTTP = 45 retries on 429)
712
- openai_kwargs = {}
713
- if url:
714
- openai_kwargs["base_url"] = url
715
- if api_key:
716
- openai_kwargs["api_key"] = api_key
717
- provider_args = disable_openai_sdk_retries(client, **openai_kwargs)
718
- else:
719
- provider_args = {"base_url": url}
720
- if api_key:
721
- provider_args["api_key"] = api_key
705
+ provider_args["http_client"] = client
706
+ if api_key:
707
+ provider_args["api_key"] = api_key
722
708
  provider = make_openai_provider(provider_identity, **provider_args)
723
709
  model = OpenAIChatModel(model_name=model_config["name"], provider=provider)
724
710
  if model_name == "chatgpt-gpt-5-codex":
@@ -805,10 +791,10 @@ class ModelFactory:
805
791
  model_name="cerebras",
806
792
  timeout=timeout if timeout is not None else 180,
807
793
  )
808
- # Disable OpenAI SDK retries when using our own
809
- # RetryingAsyncClient to avoid multiplicative retry explosion
810
- # (3 streaming x 3 SDK x 5 HTTP = 45 retries on 429)
811
- provider_args = disable_openai_sdk_retries(client, api_key=api_key)
794
+ provider_args = dict(
795
+ api_key=api_key,
796
+ http_client=client,
797
+ )
812
798
  provider = ZaiCerebrasProvider(**provider_args)
813
799
 
814
800
  return OpenAIChatModel(model_name=model_config["name"], provider=provider)
@@ -358,7 +358,7 @@ def _create_copilot_model(model_name: str, model_config: Dict, config: Dict) ->
358
358
  from pydantic_ai.models.openai import OpenAIChatModel
359
359
  from pydantic_ai.providers.openai import OpenAIProvider
360
360
 
361
- from code_puppy.http_utils import create_async_client, disable_openai_sdk_retries
361
+ from code_puppy.http_utils import create_async_client
362
362
 
363
363
  # Discover token — match against the host stored in the model config
364
364
  host = model_config.get("copilot_host", "github.com")
@@ -414,14 +414,12 @@ def _create_copilot_model(model_name: str, model_config: Dict, config: Dict) ->
414
414
  if config_url:
415
415
  base_url = config_url
416
416
 
417
- # Disable OpenAI SDK retries when using our own RetryingAsyncClient
418
- # to avoid multiplicative retry explosion (3 streaming x 3 SDK x 5 HTTP = 45)
419
- provider_kwargs = disable_openai_sdk_retries(
420
- client,
417
+ # Use a placeholder API key the actual token is injected by _CopilotAuth
418
+ provider = OpenAIProvider(
421
419
  api_key="copilot-session-managed",
422
420
  base_url=base_url,
421
+ http_client=client,
423
422
  )
424
- provider = OpenAIProvider(**provider_kwargs)
425
423
 
426
424
  # Build a model profile that tells pydantic-ai how to handle thinking.
427
425
  # Claude models behind the Copilot API return thinking in a custom field
@@ -793,6 +793,21 @@ _REPLACEMENT_ITEM_SCHEMA = {
793
793
  InlineReplacement = Annotated[Dict[str, str], WithJsonSchema(_REPLACEMENT_ITEM_SCHEMA)]
794
794
 
795
795
 
796
+ def _try_json_repair(v: Any) -> Any:
797
+ """Best-effort: turn a JSON-ish string into a real Python value.
798
+
799
+ Returns the parsed object on success, or the original ``v`` unchanged on
800
+ failure (or if ``v`` isn't a string in the first place). Used by both the
801
+ outer list coercion and the per-item validation in ``replace_in_file``.
802
+ """
803
+ if not isinstance(v, str):
804
+ return v
805
+ try:
806
+ return json.loads(json_repair.repair_json(v))
807
+ except Exception:
808
+ return v
809
+
810
+
796
811
  def _coerce_replacements_arg(v: Any) -> Any:
797
812
  """Coerce a stringified JSON array back into an actual list.
798
813
 
@@ -803,13 +818,7 @@ def _coerce_replacements_arg(v: Any) -> Any:
803
818
  the normal validator. Non-strings pass through untouched so regular list
804
819
  inputs keep their fast path.
805
820
  """
806
- if isinstance(v, str):
807
- try:
808
- return json.loads(json_repair.repair_json(v))
809
- except Exception:
810
- # Fall through; let Pydantic raise its normal, informative error.
811
- return v
812
- return v
821
+ return _try_json_repair(v)
813
822
 
814
823
 
815
824
  # List type that tolerates JSON-string-encoded arrays coming from the wire.
@@ -836,32 +845,64 @@ def register_replace_in_file(agent):
836
845
  Replacements are applied sequentially. Prefer this over full file rewrites.
837
846
  """
838
847
  group_id = generate_group_id("replace_in_file", file_path)
839
- # replacements arrive as plain dicts — pass them straight through
840
- replacements_dict = [
841
- {"old_str": r["old_str"], "new_str": r["new_str"]} for r in replacements
842
- ]
843
- result = _replace_in_file_helper(
844
- context, file_path, replacements_dict, message_group=group_id
845
- )
846
- if "diff" in result:
847
- del result["diff"]
848
-
849
- # Trigger legacy edit_file callbacks for backward compatibility
850
- payload = ReplacementsPayload(
851
- file_path=file_path,
852
- replacements=[
853
- Replacement(old_str=r["old_str"], new_str=r["new_str"])
854
- for r in replacements
855
- ],
856
- )
857
- enhanced_results = on_edit_file(context, result, payload)
858
- if enhanced_results:
859
- for enhanced_result in enhanced_results:
860
- if enhanced_result is not None:
861
- result = enhanced_result
862
- break
848
+ try:
849
+ # Validate replacements up front so a malformed payload from the
850
+ # model returns a clean error instead of bubbling a KeyError up
851
+ # through pydantic_ai and tearing down the whole agent run.
852
+ normalized: List[Dict[str, str]] = []
853
+ for idx, raw in enumerate(replacements):
854
+ # Per-item json_repair: some models stringify each replacement
855
+ # individually (e.g. ["{\"old_str\": ...}", ...]). Heal those
856
+ # before strict validation so we don't reject recoverable input.
857
+ r = _try_json_repair(raw)
858
+ if not isinstance(r, dict):
859
+ return {
860
+ "error": (
861
+ f"replacements[{idx}] must be an object with "
862
+ f"'old_str' and 'new_str' keys, got {type(raw).__name__}."
863
+ )
864
+ }
865
+ missing = [k for k in ("old_str", "new_str") if k not in r]
866
+ if missing:
867
+ return {
868
+ "error": (
869
+ f"replacements[{idx}] is missing required key(s): "
870
+ f"{', '.join(missing)}. Each replacement must include "
871
+ f"both 'old_str' and 'new_str'."
872
+ )
873
+ }
874
+ normalized.append({"old_str": r["old_str"], "new_str": r["new_str"]})
863
875
 
864
- return result
876
+ result = _replace_in_file_helper(
877
+ context, file_path, normalized, message_group=group_id
878
+ )
879
+ if "diff" in result:
880
+ del result["diff"]
881
+
882
+ # Trigger legacy edit_file callbacks for backward compatibility
883
+ payload = ReplacementsPayload(
884
+ file_path=file_path,
885
+ replacements=[
886
+ Replacement(old_str=r["old_str"], new_str=r["new_str"])
887
+ for r in normalized
888
+ ],
889
+ )
890
+ enhanced_results = on_edit_file(context, result, payload)
891
+ if enhanced_results:
892
+ for enhanced_result in enhanced_results:
893
+ if enhanced_result is not None:
894
+ result = enhanced_result
895
+ break
896
+
897
+ return result
898
+ except Exception as exc:
899
+ # Last line of defense — never let this tool crash the agent run.
900
+ _log_error(
901
+ "Unhandled exception in replace_in_file",
902
+ exc,
903
+ message_group=group_id,
904
+ )
905
+ return {"error": f"replace_in_file failed: {exc}"}
865
906
 
866
907
 
867
908
  def register_delete_snippet(agent):
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "code-puppy"
7
- version = "0.0.485"
7
+ version = "0.0.487"
8
8
  description = "Code generation agent"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11,<3.15"
File without changes
File without changes
File without changes