code-puppy 0.0.366__tar.gz → 0.0.367__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 (215) hide show
  1. {code_puppy-0.0.366 → code_puppy-0.0.367}/.gitignore +2 -0
  2. {code_puppy-0.0.366 → code_puppy-0.0.367}/PKG-INFO +2 -2
  3. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/gemini_model.py +115 -11
  4. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/antigravity_oauth/antigravity_model.py +5 -7
  5. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/antigravity_oauth/transport.py +131 -43
  6. {code_puppy-0.0.366 → code_puppy-0.0.367}/pyproject.toml +3 -4
  7. {code_puppy-0.0.366 → code_puppy-0.0.367}/LICENSE +0 -0
  8. {code_puppy-0.0.366 → code_puppy-0.0.367}/README.md +0 -0
  9. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/__init__.py +0 -0
  10. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/__main__.py +0 -0
  11. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/__init__.py +0 -0
  12. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/agent_c_reviewer.py +0 -0
  13. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/agent_code_puppy.py +0 -0
  14. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/agent_code_reviewer.py +0 -0
  15. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/agent_cpp_reviewer.py +0 -0
  16. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/agent_creator_agent.py +0 -0
  17. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/agent_golang_reviewer.py +0 -0
  18. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/agent_javascript_reviewer.py +0 -0
  19. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/agent_manager.py +0 -0
  20. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/agent_pack_leader.py +0 -0
  21. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/agent_planning.py +0 -0
  22. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/agent_python_programmer.py +0 -0
  23. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/agent_python_reviewer.py +0 -0
  24. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/agent_qa_expert.py +0 -0
  25. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/agent_qa_kitten.py +0 -0
  26. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/agent_security_auditor.py +0 -0
  27. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/agent_terminal_qa.py +0 -0
  28. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/agent_typescript_reviewer.py +0 -0
  29. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/base_agent.py +0 -0
  30. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/event_stream_handler.py +0 -0
  31. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/json_agent.py +0 -0
  32. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/pack/__init__.py +0 -0
  33. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/pack/bloodhound.py +0 -0
  34. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/pack/husky.py +0 -0
  35. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/pack/retriever.py +0 -0
  36. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/pack/shepherd.py +0 -0
  37. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/pack/terrier.py +0 -0
  38. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/pack/watchdog.py +0 -0
  39. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/prompt_reviewer.py +0 -0
  40. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/agents/subagent_stream_handler.py +0 -0
  41. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/api/__init__.py +0 -0
  42. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/api/app.py +0 -0
  43. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/api/main.py +0 -0
  44. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/api/pty_manager.py +0 -0
  45. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/api/routers/__init__.py +0 -0
  46. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/api/routers/agents.py +0 -0
  47. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/api/routers/commands.py +0 -0
  48. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/api/routers/config.py +0 -0
  49. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/api/routers/sessions.py +0 -0
  50. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/api/templates/terminal.html +0 -0
  51. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/api/websocket.py +0 -0
  52. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/callbacks.py +0 -0
  53. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/chatgpt_codex_client.py +0 -0
  54. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/claude_cache_client.py +0 -0
  55. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/cli_runner.py +0 -0
  56. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/__init__.py +0 -0
  57. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/add_model_menu.py +0 -0
  58. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/agent_menu.py +0 -0
  59. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/attachments.py +0 -0
  60. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/autosave_menu.py +0 -0
  61. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/clipboard.py +0 -0
  62. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/colors_menu.py +0 -0
  63. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/command_handler.py +0 -0
  64. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/command_registry.py +0 -0
  65. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/config_commands.py +0 -0
  66. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/core_commands.py +0 -0
  67. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/diff_menu.py +0 -0
  68. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/file_path_completion.py +0 -0
  69. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/load_context_completion.py +0 -0
  70. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/__init__.py +0 -0
  71. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/base.py +0 -0
  72. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
  73. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
  74. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
  75. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/edit_command.py +0 -0
  76. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/handler.py +0 -0
  77. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/help_command.py +0 -0
  78. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/install_command.py +0 -0
  79. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/install_menu.py +0 -0
  80. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/list_command.py +0 -0
  81. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/logs_command.py +0 -0
  82. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/remove_command.py +0 -0
  83. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/restart_command.py +0 -0
  84. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/search_command.py +0 -0
  85. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/start_all_command.py +0 -0
  86. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/start_command.py +0 -0
  87. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/status_command.py +0 -0
  88. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
  89. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/stop_command.py +0 -0
  90. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/test_command.py +0 -0
  91. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/utils.py +0 -0
  92. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  93. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/mcp_completion.py +0 -0
  94. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/model_picker_completion.py +0 -0
  95. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/model_settings_menu.py +0 -0
  96. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/motd.py +0 -0
  97. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/onboarding_slides.py +0 -0
  98. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/onboarding_wizard.py +0 -0
  99. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/pin_command_completion.py +0 -0
  100. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
  101. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/session_commands.py +0 -0
  102. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/command_line/utils.py +0 -0
  103. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/config.py +0 -0
  104. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/error_logging.py +0 -0
  105. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/gemini_code_assist.py +0 -0
  106. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/http_utils.py +0 -0
  107. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/keymap.py +0 -0
  108. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/main.py +0 -0
  109. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/mcp_/__init__.py +0 -0
  110. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/mcp_/async_lifecycle.py +0 -0
  111. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/mcp_/blocking_startup.py +0 -0
  112. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/mcp_/captured_stdio_server.py +0 -0
  113. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/mcp_/circuit_breaker.py +0 -0
  114. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/mcp_/config_wizard.py +0 -0
  115. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/mcp_/dashboard.py +0 -0
  116. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/mcp_/error_isolation.py +0 -0
  117. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/mcp_/examples/retry_example.py +0 -0
  118. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/mcp_/health_monitor.py +0 -0
  119. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/mcp_/managed_server.py +0 -0
  120. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/mcp_/manager.py +0 -0
  121. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/mcp_/mcp_logs.py +0 -0
  122. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/mcp_/registry.py +0 -0
  123. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/mcp_/retry_manager.py +0 -0
  124. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/mcp_/server_registry_catalog.py +0 -0
  125. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/mcp_/status_tracker.py +0 -0
  126. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/mcp_/system_tools.py +0 -0
  127. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/messaging/__init__.py +0 -0
  128. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/messaging/bus.py +0 -0
  129. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/messaging/commands.py +0 -0
  130. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/messaging/markdown_patches.py +0 -0
  131. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/messaging/message_queue.py +0 -0
  132. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/messaging/messages.py +0 -0
  133. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/messaging/queue_console.py +0 -0
  134. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/messaging/renderers.py +0 -0
  135. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/messaging/rich_renderer.py +0 -0
  136. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/messaging/spinner/__init__.py +0 -0
  137. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/messaging/spinner/console_spinner.py +0 -0
  138. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/messaging/spinner/spinner_base.py +0 -0
  139. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/messaging/subagent_console.py +0 -0
  140. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/model_factory.py +0 -0
  141. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/model_utils.py +0 -0
  142. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/models.json +0 -0
  143. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/models_dev_api.json +0 -0
  144. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/models_dev_parser.py +0 -0
  145. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/__init__.py +0 -0
  146. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/antigravity_oauth/__init__.py +0 -0
  147. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/antigravity_oauth/accounts.py +0 -0
  148. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/antigravity_oauth/config.py +0 -0
  149. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/antigravity_oauth/constants.py +0 -0
  150. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/antigravity_oauth/oauth.py +0 -0
  151. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/antigravity_oauth/register_callbacks.py +0 -0
  152. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/antigravity_oauth/storage.py +0 -0
  153. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/antigravity_oauth/test_plugin.py +0 -0
  154. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/antigravity_oauth/token.py +0 -0
  155. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/antigravity_oauth/utils.py +0 -0
  156. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
  157. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
  158. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
  159. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +0 -0
  160. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +0 -0
  161. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/chatgpt_oauth/utils.py +0 -0
  162. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
  163. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
  164. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
  165. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
  166. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +0 -0
  167. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
  168. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/claude_code_oauth/utils.py +0 -0
  169. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
  170. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
  171. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/example_custom_command/README.md +0 -0
  172. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
  173. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
  174. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
  175. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/frontend_emitter/__init__.py +0 -0
  176. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/frontend_emitter/emitter.py +0 -0
  177. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/frontend_emitter/register_callbacks.py +0 -0
  178. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/oauth_puppy_html.py +0 -0
  179. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/shell_safety/__init__.py +0 -0
  180. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
  181. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
  182. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
  183. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/prompts/antigravity_system_prompt.md +0 -0
  184. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/prompts/codex_system_prompt.md +0 -0
  185. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/pydantic_patches.py +0 -0
  186. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/reopenable_async_client.py +0 -0
  187. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/round_robin_model.py +0 -0
  188. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/session_storage.py +0 -0
  189. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/status_display.py +0 -0
  190. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/summarization_agent.py +0 -0
  191. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/terminal_utils.py +0 -0
  192. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/__init__.py +0 -0
  193. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/agent_tools.py +0 -0
  194. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/browser/__init__.py +0 -0
  195. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/browser/browser_control.py +0 -0
  196. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/browser/browser_interactions.py +0 -0
  197. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/browser/browser_locators.py +0 -0
  198. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/browser/browser_manager.py +0 -0
  199. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/browser/browser_navigation.py +0 -0
  200. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/browser/browser_screenshot.py +0 -0
  201. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/browser/browser_scripts.py +0 -0
  202. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/browser/browser_workflows.py +0 -0
  203. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/browser/chromium_terminal_manager.py +0 -0
  204. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/browser/terminal_command_tools.py +0 -0
  205. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/browser/terminal_screenshot_tools.py +0 -0
  206. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/browser/terminal_tools.py +0 -0
  207. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/command_runner.py +0 -0
  208. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/common.py +0 -0
  209. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/display.py +0 -0
  210. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/file_modifications.py +0 -0
  211. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/file_operations.py +0 -0
  212. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/subagent_context.py +0 -0
  213. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/tools/tools_content.py +0 -0
  214. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/uvx_detection.py +0 -0
  215. {code_puppy-0.0.366 → code_puppy-0.0.367}/code_puppy/version_checker.py +0 -0
@@ -28,3 +28,5 @@ dummy_path
28
28
  main.dist/
29
29
  nuitka-crash-report.xml
30
30
  *.backup
31
+ main.bin
32
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-puppy
3
- Version: 0.0.366
3
+ Version: 0.0.367
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
@@ -24,7 +24,7 @@ Requires-Dist: openai>=1.99.1
24
24
  Requires-Dist: pillow>=10.0.0
25
25
  Requires-Dist: playwright>=1.40.0
26
26
  Requires-Dist: prompt-toolkit>=3.0.52
27
- Requires-Dist: pydantic-ai-slim[anthropic,openai]==1.25.0
27
+ Requires-Dist: pydantic-ai-slim[anthropic,openai]==1.26.0
28
28
  Requires-Dist: pydantic>=2.4.0
29
29
  Requires-Dist: pyfiglet>=0.8.post1
30
30
  Requires-Dist: python-dotenv>=1.0.0
@@ -46,6 +46,58 @@ def generate_tool_call_id() -> str:
46
46
  return str(uuid.uuid4())
47
47
 
48
48
 
49
+ def _flatten_union_to_object_gemini(union_items: list, defs: dict, resolve_fn) -> dict:
50
+ """Flatten a union of object types into a single object with all properties.
51
+
52
+ For discriminated unions like EditFilePayload, we merge all object types
53
+ into one with all properties (Gemini doesn't support anyOf/oneOf).
54
+ """
55
+ import copy as copy_module
56
+
57
+ merged_properties = {}
58
+ has_string_type = False
59
+
60
+ for item in union_items:
61
+ if not isinstance(item, dict):
62
+ continue
63
+
64
+ # Resolve $ref first
65
+ if "$ref" in item:
66
+ ref_path = item["$ref"]
67
+ ref_name = None
68
+ if ref_path.startswith("#/$defs/"):
69
+ ref_name = ref_path[8:]
70
+ elif ref_path.startswith("#/definitions/"):
71
+ ref_name = ref_path[14:]
72
+ if ref_name and ref_name in defs:
73
+ item = copy_module.deepcopy(defs[ref_name])
74
+ else:
75
+ continue
76
+
77
+ if item.get("type") == "string":
78
+ has_string_type = True
79
+ continue
80
+
81
+ if item.get("type") == "null":
82
+ continue
83
+
84
+ if item.get("type") == "object" or "properties" in item:
85
+ props = item.get("properties", {})
86
+ for prop_name, prop_schema in props.items():
87
+ if prop_name not in merged_properties:
88
+ merged_properties[prop_name] = resolve_fn(
89
+ copy_module.deepcopy(prop_schema)
90
+ )
91
+
92
+ if not merged_properties:
93
+ return {"type": "string"} if has_string_type else {"type": "object"}
94
+
95
+ return {
96
+ "type": "object",
97
+ "properties": merged_properties,
98
+ }
99
+
100
+
49
101
  def _sanitize_schema_for_gemini(schema: dict) -> dict:
50
102
  """Sanitize JSON schema for Gemini API compatibility.
51
103
 
@@ -53,7 +105,9 @@ def _sanitize_schema_for_gemini(schema: dict) -> dict:
53
105
  - $defs, definitions, $schema, $id
54
106
  - additionalProperties
55
107
  - $ref (inlined)
56
- - anyOf/oneOf/allOf (converted to any_of/one_of/all_of)
108
+ - anyOf/oneOf/allOf (flattened - Gemini doesn't support unions!)
109
+ - For unions of objects: merges into single object with all properties
110
+ - For simple unions (string | null): picks first non-null type
57
111
  """
58
112
  import copy
59
113
 
@@ -69,6 +123,62 @@ def _sanitize_schema_for_gemini(schema: dict) -> dict:
69
123
  def resolve_refs(obj):
70
124
  """Recursively resolve $ref references and clean schema."""
71
125
  if isinstance(obj, dict):
126
+ # Handle anyOf/oneOf unions
127
+ for union_key in ["anyOf", "oneOf"]:
128
+ if union_key in obj:
129
+ union = obj[union_key]
130
+ if isinstance(union, list):
131
+ # Check if this is a complex union of objects
132
+ object_count = 0
133
+ has_refs = False
134
+ for item in union:
135
+ if isinstance(item, dict):
136
+ if "$ref" in item:
137
+ has_refs = True
138
+ object_count += 1
139
+ elif (
140
+ item.get("type") == "object" or "properties" in item
141
+ ):
142
+ object_count += 1
143
+
144
+ # If multiple objects or has refs, flatten to single object
145
+ if object_count > 1 or has_refs:
146
+ flattened = _flatten_union_to_object_gemini(
147
+ union, defs, resolve_refs
148
+ )
149
+ if "description" in obj:
150
+ flattened["description"] = obj["description"]
151
+ return flattened
152
+
153
+ # Simple union - pick first non-null type
154
+ for item in union:
155
+ if isinstance(item, dict) and item.get("type") != "null":
156
+ result = dict(item)
157
+ if "description" in obj:
158
+ result["description"] = obj["description"]
159
+ return resolve_refs(result)
160
+
161
+ # Handle allOf by merging all schemas
162
+ if "allOf" in obj:
163
+ all_of = obj["allOf"]
164
+ if isinstance(all_of, list):
165
+ merged = {}
166
+ merged_properties = {}
167
+ for item in all_of:
168
+ if isinstance(item, dict):
169
+ resolved_item = resolve_refs(item)
170
+ if "properties" in resolved_item:
171
+ merged_properties.update(
172
+ resolved_item.pop("properties")
173
+ )
174
+ merged.update(resolved_item)
175
+ if merged_properties:
176
+ merged["properties"] = merged_properties
177
+ for k, v in obj.items():
178
+ if k != "allOf":
179
+ merged[k] = v
180
+ return resolve_refs(merged)
181
+
72
182
  # Check for $ref
73
183
  if "$ref" in obj:
74
184
  ref_path = obj["$ref"]
@@ -102,19 +212,13 @@ def _sanitize_schema_for_gemini(schema: dict) -> dict:
102
212
  "default",
103
213
  "examples",
104
214
  "const",
215
+ "anyOf", # Skip any remaining union types
216
+ "oneOf",
217
+ "allOf",
105
218
  ):
106
219
  continue
107
220
 
108
- # Transform union types for Gemini
109
- new_key = key
110
- if key == "anyOf":
111
- new_key = "any_of"
112
- elif key == "oneOf":
113
- new_key = "one_of"
114
- elif key == "allOf":
115
- new_key = "all_of"
116
-
117
- result[new_key] = resolve_refs(value)
221
+ result[key] = resolve_refs(value)
118
222
  return result
119
223
  elif isinstance(obj, list):
120
224
  return [resolve_refs(item) for item in obj]
@@ -99,12 +99,11 @@ class AntigravityModel(GeminiModel):
99
99
  def _build_tools(self, tools: list) -> list[dict]:
100
100
  """Build tool definitions with model-appropriate schema handling.
101
101
 
102
- Claude and Gemini have different JSON Schema requirements:
103
- - Gemini: needs anyOf->any_of conversion, etc.
104
- - Claude: needs standard JSON Schema, simplified unions
102
+ Both Gemini and Claude require simplified union types in function schemas:
103
+ - Neither supports anyOf/oneOf/allOf in function parameter schemas
104
+ - We simplify by picking the first non-null type from unions
105
105
  """
106
106
 
107
- is_claude = self._is_claude_model()
108
107
  function_declarations = []
109
108
 
110
109
  for tool in tools:
@@ -113,11 +112,10 @@ class AntigravityModel(GeminiModel):
113
112
  "description": tool.description or "",
114
113
  }
115
114
  if tool.parameters_json_schema:
116
- # Use _inline_refs with appropriate flags for the model type
115
+ # Simplify union types for all models (Gemini and Claude both need this)
117
116
  func_decl["parameters"] = _inline_refs(
118
117
  tool.parameters_json_schema,
119
- convert_unions=not is_claude, # Gemini needs any_of conversion
120
- simplify_for_claude=is_claude, # Claude needs simplified unions
118
+ simplify_unions=True, # Both Gemini and Claude need simplified unions
121
119
  )
122
120
  function_declarations.append(func_decl)
123
121
 
@@ -23,20 +23,78 @@ from .constants import (
23
23
  logger = logging.getLogger(__name__)
24
24
 
25
25
 
26
- def _inline_refs(
27
- schema: dict, convert_unions: bool = False, simplify_for_claude: bool = False
28
- ) -> dict:
26
+ def _flatten_union_to_object(union_items: list, defs: dict, resolve_fn) -> dict:
27
+ """Flatten a union of object types into a single object with all properties.
28
+
29
+ For discriminated unions like EditFilePayload (ContentPayload | ReplacementsPayload | DeleteSnippetPayload),
30
+ we merge all object types into one with all properties marked as optional.
31
+ """
32
+ merged_properties = {}
33
+ has_string_type = False
34
+
35
+ for item in union_items:
36
+ if not isinstance(item, dict):
37
+ continue
38
+
39
+ # Resolve $ref first
40
+ if "$ref" in item:
41
+ ref_path = item["$ref"]
42
+ ref_name = None
43
+ if ref_path.startswith("#/$defs/"):
44
+ ref_name = ref_path[8:]
45
+ elif ref_path.startswith("#/definitions/"):
46
+ ref_name = ref_path[14:]
47
+ if ref_name and ref_name in defs:
48
+ item = copy.deepcopy(defs[ref_name])
49
+ else:
50
+ continue
51
+
52
+ # Check for string type (common fallback)
53
+ if item.get("type") == "string":
54
+ has_string_type = True
55
+ continue
56
+
57
+ # Skip null types
58
+ if item.get("type") == "null":
59
+ continue
60
+
61
+ # Merge properties from object types
62
+ if item.get("type") == "object" or "properties" in item:
63
+ props = item.get("properties", {})
64
+ for prop_name, prop_schema in props.items():
65
+ if prop_name not in merged_properties:
66
+ # Resolve the property schema
67
+ merged_properties[prop_name] = resolve_fn(
68
+ copy.deepcopy(prop_schema)
69
+ )
70
+
71
+ if not merged_properties:
72
+ # No object properties found, return string type as fallback
73
+ return {"type": "string"} if has_string_type else {"type": "object"}
74
+
75
+ # Build merged object - no required fields since any subset is valid
76
+ result = {
77
+ "type": "object",
78
+ "properties": merged_properties,
79
+ }
80
+
81
+ return result
82
+
83
+
84
+ def _inline_refs(schema: dict, simplify_unions: bool = False) -> dict:
29
85
  """Inline $ref references and transform schema for Antigravity compatibility.
30
86
 
31
87
  - Inlines $ref references
32
88
  - Removes $defs, definitions, $schema, $id
33
- - Optionally converts anyOf/oneOf/allOf to any_of/one_of/all_of (only for Gemini)
34
89
  - Removes unsupported fields like 'default', 'examples', 'const'
35
- - For Claude: simplifies anyOf unions to single types
90
+ - When simplify_unions=True: flattens anyOf/oneOf unions:
91
+ - For unions of objects: merges into single object with all properties
92
+ - For simple unions (string | null): picks first non-null type
93
+ (required for both Gemini AND Claude - neither supports union types in function schemas!)
36
94
 
37
95
  Args:
38
- convert_unions: If True, convert anyOf->any_of etc. (for Gemini).
39
- simplify_for_claude: If True, simplify anyOf to single types.
96
+ simplify_unions: If True, simplify anyOf/oneOf unions.
97
+ Required for Gemini and Claude models.
40
98
  """
41
99
  if not isinstance(schema, dict):
42
100
  return schema
@@ -47,31 +105,73 @@ def _inline_refs(
47
105
  # Extract $defs for reference resolution
48
106
  defs = schema.pop("$defs", schema.pop("definitions", {}))
49
107
 
50
- def resolve_refs(
51
- obj, convert_unions=convert_unions, simplify_for_claude=simplify_for_claude
52
- ):
108
+ def resolve_refs(obj, simplify_unions=simplify_unions):
53
109
  """Recursively resolve $ref references and transform schema."""
54
110
  if isinstance(obj, dict):
55
- # For Claude: simplify anyOf/oneOf unions to first non-null type
56
- if simplify_for_claude:
111
+ # Handle anyOf/oneOf unions
112
+ if simplify_unions:
57
113
  for union_key in ["anyOf", "oneOf"]:
58
114
  if union_key in obj:
59
115
  union = obj[union_key]
60
116
  if isinstance(union, list):
61
- # Find first non-null type
117
+ # Check if this is a complex union of objects (discriminated union)
118
+ # vs a simple nullable type (string | null)
119
+ object_count = 0
120
+ has_refs = False
121
+ for item in union:
122
+ if isinstance(item, dict):
123
+ if "$ref" in item:
124
+ has_refs = True
125
+ object_count += 1
126
+ elif (
127
+ item.get("type") == "object"
128
+ or "properties" in item
129
+ ):
130
+ object_count += 1
131
+
132
+ # If multiple objects or has refs, flatten to single object
133
+ if object_count > 1 or has_refs:
134
+ flattened = _flatten_union_to_object(
135
+ union, defs, resolve_refs
136
+ )
137
+ # Keep description if present
138
+ if "description" in obj:
139
+ flattened["description"] = obj["description"]
140
+ return flattened
141
+
142
+ # Simple union - pick first non-null type
62
143
  for item in union:
63
144
  if (
64
145
  isinstance(item, dict)
65
146
  and item.get("type") != "null"
66
147
  ):
67
- # Replace the whole object with this type
68
148
  result = dict(item)
69
- # Keep description if present
70
149
  if "description" in obj:
71
150
  result["description"] = obj["description"]
72
- return resolve_refs(
73
- result, convert_unions, simplify_for_claude
74
- )
151
+ return resolve_refs(result, simplify_unions)
152
+
153
+ # Also handle allOf by merging all schemas
154
+ if simplify_unions and "allOf" in obj:
155
+ all_of = obj["allOf"]
156
+ if isinstance(all_of, list):
157
+ merged = {}
158
+ merged_properties = {}
159
+ for item in all_of:
160
+ if isinstance(item, dict):
161
+ resolved_item = resolve_refs(item, simplify_unions)
162
+ # Deep merge properties dicts
163
+ if "properties" in resolved_item:
164
+ merged_properties.update(
165
+ resolved_item.pop("properties")
166
+ )
167
+ merged.update(resolved_item)
168
+ if merged_properties:
169
+ merged["properties"] = merged_properties
170
+ # Keep other fields from original object (except allOf)
171
+ for k, v in obj.items():
172
+ if k != "allOf":
173
+ merged[k] = v
174
+ return resolve_refs(merged, simplify_unions)
75
175
 
76
176
  # Check for $ref
77
177
  if "$ref" in obj:
@@ -111,34 +211,23 @@ def _inline_refs(
111
211
  ):
112
212
  continue
113
213
 
114
- # For Claude: skip additionalProperties
115
- if simplify_for_claude and key == "additionalProperties":
214
+ # Skip additionalProperties (not supported by Gemini or Claude)
215
+ if simplify_unions and key == "additionalProperties":
116
216
  continue
117
217
 
118
- # Optionally transform union types for Gemini
119
- new_key = key
120
- if convert_unions:
121
- if key == "anyOf":
122
- new_key = "any_of"
123
- elif key == "oneOf":
124
- new_key = "one_of"
125
- elif key == "allOf":
126
- new_key = "all_of"
127
- elif key == "additionalProperties":
128
- new_key = "additional_properties"
129
-
130
- result[new_key] = resolve_refs(
131
- value, convert_unions, simplify_for_claude
132
- )
218
+ # Skip any remaining union type keys that weren't simplified above
219
+ # (This shouldn't happen normally, but just in case)
220
+ if simplify_unions and key in ("anyOf", "oneOf", "allOf"):
221
+ continue
222
+
223
+ result[key] = resolve_refs(value, simplify_unions)
133
224
  return result
134
225
  elif isinstance(obj, list):
135
- return [
136
- resolve_refs(item, convert_unions, simplify_for_claude) for item in obj
137
- ]
226
+ return [resolve_refs(item, simplify_unions) for item in obj]
138
227
  else:
139
228
  return obj
140
229
 
141
- return resolve_refs(schema, convert_unions, simplify_for_claude)
230
+ return resolve_refs(schema, simplify_unions)
142
231
 
143
232
 
144
233
  class UnwrappedResponse(httpx.Response):
@@ -405,15 +494,14 @@ class AntigravityClient(httpx.AsyncClient):
405
494
  )
406
495
 
407
496
  # Inline $refs and remove $defs from parameters
408
- # Convert unions (anyOf->any_of) only for Gemini
409
- # Simplify schemas for Claude (no anyOf, no additionalProperties)
497
+ # Simplify union types (anyOf/oneOf/allOf) for BOTH Gemini and Claude
498
+ # Neither API supports union types in function schemas!
410
499
  if "parameters" in func_decl:
411
500
  is_gemini = "gemini" in model.lower()
412
501
  is_claude = "claude" in model.lower()
413
502
  func_decl["parameters"] = _inline_refs(
414
503
  func_decl["parameters"],
415
- convert_unions=is_gemini,
416
- simplify_for_claude=is_claude,
504
+ simplify_unions=(is_gemini or is_claude),
417
505
  )
418
506
 
419
507
  # Fix generationConfig for Antigravity compatibility
@@ -4,15 +4,14 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "code-puppy"
7
- version = "0.0.366"
7
+ version = "0.0.367"
8
8
  description = "Code generation agent"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11,<3.14"
11
11
  dependencies = [
12
- "pydantic-ai-slim[openai,anthropic]==1.25.0",
12
+ "pydantic-ai-slim[openai,anthropic]==1.26.0",
13
13
  "typer>=0.12.0",
14
- "mcp>=1.9.4",
15
-
14
+ "mcp>=1.9.4",
16
15
  "httpx[http2]>=0.24.1",
17
16
  "requests>=2.28.0",
18
17
  "rich>=13.4.2",
File without changes
File without changes