code-puppy 0.0.485__tar.gz → 0.0.486__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.486}/PKG-INFO +1 -1
  2. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/file_modifications.py +73 -32
  3. {code_puppy-0.0.485 → code_puppy-0.0.486}/pyproject.toml +1 -1
  4. {code_puppy-0.0.485 → code_puppy-0.0.486}/.gitignore +0 -0
  5. {code_puppy-0.0.485 → code_puppy-0.0.486}/LICENSE +0 -0
  6. {code_puppy-0.0.485 → code_puppy-0.0.486}/README.md +0 -0
  7. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/__init__.py +0 -0
  8. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/__main__.py +0 -0
  9. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/agents/__init__.py +0 -0
  10. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/agents/_builder.py +0 -0
  11. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/agents/_compaction.py +0 -0
  12. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/agents/_diagnostics.py +0 -0
  13. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/agents/_history.py +0 -0
  14. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/agents/_key_listeners.py +0 -0
  15. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/agents/_non_streaming_render.py +0 -0
  16. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/agents/_runtime.py +0 -0
  17. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/agents/agent_code_puppy.py +0 -0
  18. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/agents/agent_creator_agent.py +0 -0
  19. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/agents/agent_helios.py +0 -0
  20. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/agents/agent_manager.py +0 -0
  21. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/agents/agent_planning.py +0 -0
  22. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/agents/agent_qa_kitten.py +0 -0
  23. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/agents/base_agent.py +0 -0
  24. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/agents/event_stream_handler.py +0 -0
  25. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/agents/json_agent.py +0 -0
  26. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/agents/subagent_stream_handler.py +0 -0
  27. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/callbacks.py +0 -0
  28. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/chatgpt_codex_client.py +0 -0
  29. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/claude_cache_client.py +0 -0
  30. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/cli_runner.py +0 -0
  31. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/__init__.py +0 -0
  32. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/add_model_menu.py +0 -0
  33. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/agent_menu.py +0 -0
  34. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/attachments.py +0 -0
  35. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/autosave_menu.py +0 -0
  36. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/clipboard.py +0 -0
  37. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/colors_menu.py +0 -0
  38. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/command_handler.py +0 -0
  39. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/command_registry.py +0 -0
  40. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/config_commands.py +0 -0
  41. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/core_commands.py +0 -0
  42. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/diff_menu.py +0 -0
  43. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/file_path_completion.py +0 -0
  44. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/load_context_completion.py +0 -0
  45. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/__init__.py +0 -0
  46. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/base.py +0 -0
  47. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
  48. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
  49. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
  50. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/edit_command.py +0 -0
  51. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/handler.py +0 -0
  52. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/help_command.py +0 -0
  53. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/install_command.py +0 -0
  54. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/install_menu.py +0 -0
  55. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/list_command.py +0 -0
  56. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/logs_command.py +0 -0
  57. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/remove_command.py +0 -0
  58. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/restart_command.py +0 -0
  59. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/search_command.py +0 -0
  60. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/start_all_command.py +0 -0
  61. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/start_command.py +0 -0
  62. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/status_command.py +0 -0
  63. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
  64. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/stop_command.py +0 -0
  65. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/test_command.py +0 -0
  66. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/utils.py +0 -0
  67. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  68. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/mcp_completion.py +0 -0
  69. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/model_picker_completion.py +0 -0
  70. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/model_settings_menu.py +0 -0
  71. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/onboarding_slides.py +0 -0
  72. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/onboarding_wizard.py +0 -0
  73. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/pagination.py +0 -0
  74. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/pin_command_completion.py +0 -0
  75. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
  76. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/session_commands.py +0 -0
  77. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/shell_passthrough.py +0 -0
  78. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/skills_completion.py +0 -0
  79. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/uc_menu.py +0 -0
  80. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/utils.py +0 -0
  81. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/command_line/wiggum_state.py +0 -0
  82. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/config.py +0 -0
  83. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/error_logging.py +0 -0
  84. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/gemini_code_assist.py +0 -0
  85. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/gemini_model.py +0 -0
  86. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/hook_engine/README.md +0 -0
  87. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/hook_engine/__init__.py +0 -0
  88. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/hook_engine/aliases.py +0 -0
  89. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/hook_engine/engine.py +0 -0
  90. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/hook_engine/executor.py +0 -0
  91. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/hook_engine/matcher.py +0 -0
  92. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/hook_engine/models.py +0 -0
  93. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/hook_engine/registry.py +0 -0
  94. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/hook_engine/validator.py +0 -0
  95. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/http_utils.py +0 -0
  96. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/keymap.py +0 -0
  97. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/list_filtering.py +0 -0
  98. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/main.py +0 -0
  99. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_/__init__.py +0 -0
  100. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_/async_lifecycle.py +0 -0
  101. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_/blocking_startup.py +0 -0
  102. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_/captured_stdio_server.py +0 -0
  103. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_/circuit_breaker.py +0 -0
  104. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_/config_wizard.py +0 -0
  105. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_/dashboard.py +0 -0
  106. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_/error_isolation.py +0 -0
  107. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_/examples/retry_example.py +0 -0
  108. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_/health_monitor.py +0 -0
  109. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_/managed_server.py +0 -0
  110. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_/manager.py +0 -0
  111. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_/mcp_logs.py +0 -0
  112. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_/registry.py +0 -0
  113. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_/retry_manager.py +0 -0
  114. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_/server_registry_catalog.py +0 -0
  115. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_/status_tracker.py +0 -0
  116. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_/system_tools.py +0 -0
  117. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_prompts/__init__.py +0 -0
  118. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/mcp_prompts/hook_creator.py +0 -0
  119. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/messaging/__init__.py +0 -0
  120. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/messaging/bus.py +0 -0
  121. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/messaging/commands.py +0 -0
  122. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/messaging/markdown_patches.py +0 -0
  123. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/messaging/message_queue.py +0 -0
  124. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/messaging/messages.py +0 -0
  125. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/messaging/queue_console.py +0 -0
  126. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/messaging/renderers.py +0 -0
  127. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/messaging/rich_renderer.py +0 -0
  128. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/messaging/spinner/__init__.py +0 -0
  129. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/messaging/spinner/console_spinner.py +0 -0
  130. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/messaging/spinner/spinner_base.py +0 -0
  131. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/messaging/subagent_console.py +0 -0
  132. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/model_factory.py +0 -0
  133. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/model_switching.py +0 -0
  134. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/model_utils.py +0 -0
  135. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/models.json +0 -0
  136. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/models_dev_api.json +0 -0
  137. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/models_dev_parser.py +0 -0
  138. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/__init__.py +0 -0
  139. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/agent_skills/__init__.py +0 -0
  140. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/agent_skills/config.py +0 -0
  141. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/agent_skills/discovery.py +0 -0
  142. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/agent_skills/downloader.py +0 -0
  143. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/agent_skills/installer.py +0 -0
  144. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/agent_skills/metadata.py +0 -0
  145. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/agent_skills/prompt_builder.py +0 -0
  146. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/agent_skills/register_callbacks.py +0 -0
  147. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/agent_skills/remote_catalog.py +0 -0
  148. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/agent_skills/skill_catalog.py +0 -0
  149. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/agent_skills/skills_install_menu.py +0 -0
  150. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/agent_skills/skills_menu.py +0 -0
  151. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/aws_bedrock/__init__.py +0 -0
  152. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/aws_bedrock/config.py +0 -0
  153. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/aws_bedrock/register_callbacks.py +0 -0
  154. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/aws_bedrock/utils.py +0 -0
  155. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/azure_foundry/README.md +0 -0
  156. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/azure_foundry/__init__.py +0 -0
  157. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/azure_foundry/config.py +0 -0
  158. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/azure_foundry/discovery.py +0 -0
  159. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/azure_foundry/register_callbacks.py +0 -0
  160. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/azure_foundry/token.py +0 -0
  161. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/azure_foundry/utils.py +0 -0
  162. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
  163. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
  164. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
  165. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +0 -0
  166. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +0 -0
  167. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/chatgpt_oauth/utils.py +0 -0
  168. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/claude_code_hooks/__init__.py +0 -0
  169. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/claude_code_hooks/config.py +0 -0
  170. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/claude_code_hooks/register_callbacks.py +0 -0
  171. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
  172. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
  173. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
  174. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
  175. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/claude_code_oauth/fast_mode.py +0 -0
  176. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/claude_code_oauth/prompt_handler.py +0 -0
  177. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +0 -0
  178. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/claude_code_oauth/test_fast_mode.py +0 -0
  179. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
  180. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  181. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/claude_code_oauth/utils.py +0 -0
  182. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/copilot_auth/__init__.py +0 -0
  183. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/copilot_auth/config.py +0 -0
  184. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/copilot_auth/reasoning_client.py +0 -0
  185. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/copilot_auth/register_callbacks.py +0 -0
  186. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/copilot_auth/utils.py +0 -0
  187. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
  188. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
  189. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/dbos_durable_exec/__init__.py +0 -0
  190. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/dbos_durable_exec/cancel.py +0 -0
  191. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/dbos_durable_exec/commands.py +0 -0
  192. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/dbos_durable_exec/config.py +0 -0
  193. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/dbos_durable_exec/lifecycle.py +0 -0
  194. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/dbos_durable_exec/register_callbacks.py +0 -0
  195. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/dbos_durable_exec/runtime.py +0 -0
  196. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/dbos_durable_exec/workflow_ids.py +0 -0
  197. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/dbos_durable_exec/wrapper.py +0 -0
  198. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/destructive_command_guard/__init__.py +0 -0
  199. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/destructive_command_guard/detector.py +0 -0
  200. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/example_custom_command/README.md +0 -0
  201. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
  202. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
  203. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
  204. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/force_push_guard/__init__.py +0 -0
  205. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/force_push_guard/detector.py +0 -0
  206. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/force_push_guard/register_callbacks.py +0 -0
  207. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/force_push_guard/test_detector.py +0 -0
  208. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/frontend_emitter/__init__.py +0 -0
  209. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/frontend_emitter/emitter.py +0 -0
  210. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/frontend_emitter/register_callbacks.py +0 -0
  211. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/hook_creator/__init__.py +0 -0
  212. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/hook_creator/register_callbacks.py +0 -0
  213. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/hook_manager/__init__.py +0 -0
  214. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/hook_manager/config.py +0 -0
  215. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/hook_manager/hooks_menu.py +0 -0
  216. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/hook_manager/register_callbacks.py +0 -0
  217. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/oauth_puppy_html.py +0 -0
  218. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/ollama_setup/__init__.py +0 -0
  219. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/ollama_setup/completer.py +0 -0
  220. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/ollama_setup/register_callbacks.py +0 -0
  221. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/pop_command/__init__.py +0 -0
  222. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/pop_command/register_callbacks.py +0 -0
  223. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/shell_safety/__init__.py +0 -0
  224. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
  225. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
  226. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
  227. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/synthetic_status/__init__.py +0 -0
  228. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/synthetic_status/register_callbacks.py +0 -0
  229. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/synthetic_status/status_api.py +0 -0
  230. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/universal_constructor/__init__.py +0 -0
  231. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/universal_constructor/models.py +0 -0
  232. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/universal_constructor/register_callbacks.py +0 -0
  233. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/universal_constructor/registry.py +0 -0
  234. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/plugins/universal_constructor/sandbox.py +0 -0
  235. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/provider_identity.py +0 -0
  236. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/pydantic_patches.py +0 -0
  237. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/reopenable_async_client.py +0 -0
  238. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/round_robin_model.py +0 -0
  239. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/session_storage.py +0 -0
  240. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/status_display.py +0 -0
  241. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/summarization_agent.py +0 -0
  242. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/terminal_utils.py +0 -0
  243. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/__init__.py +0 -0
  244. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/agent_tools.py +0 -0
  245. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/ask_user_question/__init__.py +0 -0
  246. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/ask_user_question/constants.py +0 -0
  247. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/ask_user_question/demo_tui.py +0 -0
  248. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/ask_user_question/handler.py +0 -0
  249. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/ask_user_question/models.py +0 -0
  250. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/ask_user_question/registration.py +0 -0
  251. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/ask_user_question/renderers.py +0 -0
  252. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/ask_user_question/terminal_ui.py +0 -0
  253. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/ask_user_question/theme.py +0 -0
  254. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/ask_user_question/tui_loop.py +0 -0
  255. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/browser/__init__.py +0 -0
  256. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/browser/browser_control.py +0 -0
  257. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/browser/browser_interactions.py +0 -0
  258. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/browser/browser_locators.py +0 -0
  259. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/browser/browser_manager.py +0 -0
  260. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/browser/browser_navigation.py +0 -0
  261. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/browser/browser_screenshot.py +0 -0
  262. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/browser/browser_scripts.py +0 -0
  263. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/browser/browser_workflows.py +0 -0
  264. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/command_runner.py +0 -0
  265. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/common.py +0 -0
  266. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/display.py +0 -0
  267. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/file_operations.py +0 -0
  268. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/image_tools.py +0 -0
  269. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/skills_tools.py +0 -0
  270. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/subagent_context.py +0 -0
  271. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/tools_content.py +0 -0
  272. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/tools/universal_constructor.py +0 -0
  273. {code_puppy-0.0.485 → code_puppy-0.0.486}/code_puppy/uvx_detection.py +0 -0
  274. {code_puppy-0.0.485 → code_puppy-0.0.486}/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.486
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
@@ -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.486"
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