code-puppy 0.0.376__tar.gz → 0.0.378__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 (232) hide show
  1. {code_puppy-0.0.376 → code_puppy-0.0.378}/PKG-INFO +1 -1
  2. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/add_model_menu.py +2 -0
  3. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/autosave_menu.py +2 -0
  4. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/colors_menu.py +2 -0
  5. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/diff_menu.py +2 -0
  6. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/model_settings_menu.py +15 -0
  7. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/onboarding_wizard.py +2 -0
  8. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/gemini_model.py +63 -22
  9. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/model_factory.py +13 -0
  10. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/models.json +2 -2
  11. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/common.py +10 -2
  12. {code_puppy-0.0.376 → code_puppy-0.0.378}/pyproject.toml +1 -1
  13. {code_puppy-0.0.376 → code_puppy-0.0.378}/.gitignore +0 -0
  14. {code_puppy-0.0.376 → code_puppy-0.0.378}/LICENSE +0 -0
  15. {code_puppy-0.0.376 → code_puppy-0.0.378}/README.md +0 -0
  16. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/__init__.py +0 -0
  17. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/__main__.py +0 -0
  18. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/__init__.py +0 -0
  19. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/agent_c_reviewer.py +0 -0
  20. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/agent_code_puppy.py +0 -0
  21. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/agent_code_reviewer.py +0 -0
  22. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/agent_cpp_reviewer.py +0 -0
  23. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/agent_creator_agent.py +0 -0
  24. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/agent_golang_reviewer.py +0 -0
  25. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/agent_helios.py +0 -0
  26. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/agent_javascript_reviewer.py +0 -0
  27. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/agent_manager.py +0 -0
  28. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/agent_pack_leader.py +0 -0
  29. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/agent_planning.py +0 -0
  30. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/agent_python_programmer.py +0 -0
  31. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/agent_python_reviewer.py +0 -0
  32. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/agent_qa_expert.py +0 -0
  33. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/agent_qa_kitten.py +0 -0
  34. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/agent_security_auditor.py +0 -0
  35. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/agent_terminal_qa.py +0 -0
  36. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/agent_typescript_reviewer.py +0 -0
  37. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/base_agent.py +0 -0
  38. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/event_stream_handler.py +0 -0
  39. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/json_agent.py +0 -0
  40. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/pack/__init__.py +0 -0
  41. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/pack/bloodhound.py +0 -0
  42. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/pack/husky.py +0 -0
  43. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/pack/retriever.py +0 -0
  44. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/pack/shepherd.py +0 -0
  45. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/pack/terrier.py +0 -0
  46. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/pack/watchdog.py +0 -0
  47. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/prompt_reviewer.py +0 -0
  48. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/agents/subagent_stream_handler.py +0 -0
  49. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/api/__init__.py +0 -0
  50. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/api/app.py +0 -0
  51. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/api/main.py +0 -0
  52. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/api/pty_manager.py +0 -0
  53. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/api/routers/__init__.py +0 -0
  54. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/api/routers/agents.py +0 -0
  55. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/api/routers/commands.py +0 -0
  56. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/api/routers/config.py +0 -0
  57. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/api/routers/sessions.py +0 -0
  58. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/api/templates/terminal.html +0 -0
  59. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/api/websocket.py +0 -0
  60. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/callbacks.py +0 -0
  61. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/chatgpt_codex_client.py +0 -0
  62. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/claude_cache_client.py +0 -0
  63. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/cli_runner.py +0 -0
  64. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/__init__.py +0 -0
  65. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/agent_menu.py +0 -0
  66. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/attachments.py +0 -0
  67. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/clipboard.py +0 -0
  68. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/command_handler.py +0 -0
  69. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/command_registry.py +0 -0
  70. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/config_commands.py +0 -0
  71. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/core_commands.py +0 -0
  72. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/file_path_completion.py +0 -0
  73. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/load_context_completion.py +0 -0
  74. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/__init__.py +0 -0
  75. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/base.py +0 -0
  76. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
  77. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
  78. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
  79. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/edit_command.py +0 -0
  80. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/handler.py +0 -0
  81. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/help_command.py +0 -0
  82. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/install_command.py +0 -0
  83. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/install_menu.py +0 -0
  84. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/list_command.py +0 -0
  85. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/logs_command.py +0 -0
  86. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/remove_command.py +0 -0
  87. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/restart_command.py +0 -0
  88. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/search_command.py +0 -0
  89. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/start_all_command.py +0 -0
  90. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/start_command.py +0 -0
  91. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/status_command.py +0 -0
  92. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
  93. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/stop_command.py +0 -0
  94. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/test_command.py +0 -0
  95. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/utils.py +0 -0
  96. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  97. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/mcp_completion.py +0 -0
  98. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/model_picker_completion.py +0 -0
  99. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/motd.py +0 -0
  100. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/onboarding_slides.py +0 -0
  101. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/pin_command_completion.py +0 -0
  102. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
  103. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/session_commands.py +0 -0
  104. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/uc_menu.py +0 -0
  105. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/command_line/utils.py +0 -0
  106. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/config.py +0 -0
  107. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/error_logging.py +0 -0
  108. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/gemini_code_assist.py +0 -0
  109. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/http_utils.py +0 -0
  110. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/keymap.py +0 -0
  111. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/main.py +0 -0
  112. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/mcp_/__init__.py +0 -0
  113. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/mcp_/async_lifecycle.py +0 -0
  114. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/mcp_/blocking_startup.py +0 -0
  115. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/mcp_/captured_stdio_server.py +0 -0
  116. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/mcp_/circuit_breaker.py +0 -0
  117. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/mcp_/config_wizard.py +0 -0
  118. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/mcp_/dashboard.py +0 -0
  119. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/mcp_/error_isolation.py +0 -0
  120. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/mcp_/examples/retry_example.py +0 -0
  121. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/mcp_/health_monitor.py +0 -0
  122. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/mcp_/managed_server.py +0 -0
  123. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/mcp_/manager.py +0 -0
  124. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/mcp_/mcp_logs.py +0 -0
  125. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/mcp_/registry.py +0 -0
  126. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/mcp_/retry_manager.py +0 -0
  127. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/mcp_/server_registry_catalog.py +0 -0
  128. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/mcp_/status_tracker.py +0 -0
  129. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/mcp_/system_tools.py +0 -0
  130. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/messaging/__init__.py +0 -0
  131. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/messaging/bus.py +0 -0
  132. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/messaging/commands.py +0 -0
  133. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/messaging/markdown_patches.py +0 -0
  134. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/messaging/message_queue.py +0 -0
  135. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/messaging/messages.py +0 -0
  136. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/messaging/queue_console.py +0 -0
  137. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/messaging/renderers.py +0 -0
  138. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/messaging/rich_renderer.py +0 -0
  139. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/messaging/spinner/__init__.py +0 -0
  140. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/messaging/spinner/console_spinner.py +0 -0
  141. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/messaging/spinner/spinner_base.py +0 -0
  142. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/messaging/subagent_console.py +0 -0
  143. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/model_switching.py +0 -0
  144. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/model_utils.py +0 -0
  145. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/models_dev_api.json +0 -0
  146. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/models_dev_parser.py +0 -0
  147. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/__init__.py +0 -0
  148. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/antigravity_oauth/__init__.py +0 -0
  149. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/antigravity_oauth/accounts.py +0 -0
  150. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/antigravity_oauth/antigravity_model.py +0 -0
  151. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/antigravity_oauth/config.py +0 -0
  152. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/antigravity_oauth/constants.py +0 -0
  153. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/antigravity_oauth/oauth.py +0 -0
  154. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/antigravity_oauth/register_callbacks.py +0 -0
  155. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/antigravity_oauth/storage.py +0 -0
  156. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/antigravity_oauth/test_plugin.py +0 -0
  157. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/antigravity_oauth/token.py +0 -0
  158. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/antigravity_oauth/transport.py +0 -0
  159. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/antigravity_oauth/utils.py +0 -0
  160. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
  161. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
  162. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
  163. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +0 -0
  164. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +0 -0
  165. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/chatgpt_oauth/utils.py +0 -0
  166. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
  167. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
  168. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
  169. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
  170. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +0 -0
  171. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
  172. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  173. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/claude_code_oauth/utils.py +0 -0
  174. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
  175. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
  176. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/example_custom_command/README.md +0 -0
  177. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
  178. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
  179. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
  180. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/frontend_emitter/__init__.py +0 -0
  181. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/frontend_emitter/emitter.py +0 -0
  182. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/frontend_emitter/register_callbacks.py +0 -0
  183. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/oauth_puppy_html.py +0 -0
  184. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/ralph/__init__.py +0 -0
  185. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/ralph/agents.py +0 -0
  186. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/ralph/commands.py +0 -0
  187. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/ralph/loop_controller.py +0 -0
  188. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/ralph/models.py +0 -0
  189. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/ralph/register_callbacks.py +0 -0
  190. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/ralph/state_manager.py +0 -0
  191. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/ralph/tools.py +0 -0
  192. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/shell_safety/__init__.py +0 -0
  193. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
  194. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
  195. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
  196. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/universal_constructor/__init__.py +0 -0
  197. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/universal_constructor/models.py +0 -0
  198. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/universal_constructor/register_callbacks.py +0 -0
  199. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/universal_constructor/registry.py +0 -0
  200. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/plugins/universal_constructor/sandbox.py +0 -0
  201. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/prompts/antigravity_system_prompt.md +0 -0
  202. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/pydantic_patches.py +0 -0
  203. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/reopenable_async_client.py +0 -0
  204. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/round_robin_model.py +0 -0
  205. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/session_storage.py +0 -0
  206. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/status_display.py +0 -0
  207. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/summarization_agent.py +0 -0
  208. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/terminal_utils.py +0 -0
  209. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/__init__.py +0 -0
  210. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/agent_tools.py +0 -0
  211. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/browser/__init__.py +0 -0
  212. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/browser/browser_control.py +0 -0
  213. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/browser/browser_interactions.py +0 -0
  214. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/browser/browser_locators.py +0 -0
  215. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/browser/browser_manager.py +0 -0
  216. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/browser/browser_navigation.py +0 -0
  217. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/browser/browser_screenshot.py +0 -0
  218. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/browser/browser_scripts.py +0 -0
  219. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/browser/browser_workflows.py +0 -0
  220. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/browser/chromium_terminal_manager.py +0 -0
  221. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/browser/terminal_command_tools.py +0 -0
  222. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/browser/terminal_screenshot_tools.py +0 -0
  223. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/browser/terminal_tools.py +0 -0
  224. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/command_runner.py +0 -0
  225. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/display.py +0 -0
  226. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/file_modifications.py +0 -0
  227. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/file_operations.py +0 -0
  228. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/subagent_context.py +0 -0
  229. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/tools_content.py +0 -0
  230. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/tools/universal_constructor.py +0 -0
  231. {code_puppy-0.0.376 → code_puppy-0.0.378}/code_puppy/uvx_detection.py +0 -0
  232. {code_puppy-0.0.376 → code_puppy-0.0.378}/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.376
3
+ Version: 0.0.378
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
@@ -893,6 +893,7 @@ class AddModelMenu:
893
893
  kb = KeyBindings()
894
894
 
895
895
  @kb.add("up")
896
+ @kb.add("c-p") # Ctrl+P = previous (Emacs-style)
896
897
  def _(event):
897
898
  if self.view_mode == "providers":
898
899
  if self.selected_provider_idx > 0:
@@ -905,6 +906,7 @@ class AddModelMenu:
905
906
  self.update_display()
906
907
 
907
908
  @kb.add("down")
909
+ @kb.add("c-n") # Ctrl+N = next (Emacs-style)
908
910
  def _(event):
909
911
  if self.view_mode == "providers":
910
912
  if self.selected_provider_idx < len(self.providers) - 1:
@@ -470,6 +470,7 @@ async def interactive_autosave_picker() -> Optional[str]:
470
470
  kb = KeyBindings()
471
471
 
472
472
  @kb.add("up")
473
+ @kb.add("c-p") # Ctrl+P = previous (Emacs-style)
473
474
  def _(event):
474
475
  if browse_mode[0]:
475
476
  # In browse mode: go to older message
@@ -485,6 +486,7 @@ async def interactive_autosave_picker() -> Optional[str]:
485
486
  update_display()
486
487
 
487
488
  @kb.add("down")
489
+ @kb.add("c-n") # Ctrl+N = next (Emacs-style)
488
490
  def _(event):
489
491
  if browse_mode[0]:
490
492
  # In browse mode: go to newer message
@@ -299,6 +299,7 @@ async def _split_panel_selector(
299
299
  kb = KeyBindings()
300
300
 
301
301
  @kb.add("up")
302
+ @kb.add("c-p") # Ctrl+P = previous (Emacs-style)
302
303
  def move_up(event):
303
304
  if choices:
304
305
  # Skip separator lines
@@ -310,6 +311,7 @@ async def _split_panel_selector(
310
311
  event.app.invalidate()
311
312
 
312
313
  @kb.add("down")
314
+ @kb.add("c-n") # Ctrl+N = next (Emacs-style)
313
315
  def move_down(event):
314
316
  if choices:
315
317
  # Skip separator lines
@@ -533,6 +533,7 @@ async def _split_panel_selector(
533
533
  kb = KeyBindings()
534
534
 
535
535
  @kb.add("up")
536
+ @kb.add("c-p") # Ctrl+P = previous (Emacs-style)
536
537
  def move_up(event):
537
538
  if choices:
538
539
  selected_index[0] = (selected_index[0] - 1) % len(choices)
@@ -540,6 +541,7 @@ async def _split_panel_selector(
540
541
  event.app.invalidate()
541
542
 
542
543
  @kb.add("down")
544
+ @kb.add("c-n") # Ctrl+N = next (Emacs-style)
543
545
  def move_down(event):
544
546
  if choices:
545
547
  selected_index[0] = (selected_index[0] + 1) % len(choices)
@@ -106,6 +106,19 @@ SETTING_DEFINITIONS: Dict[str, Dict] = {
106
106
  "type": "boolean",
107
107
  "default": False,
108
108
  },
109
+ "thinking_enabled": {
110
+ "name": "Thinking Enabled",
111
+ "description": "Enable thinking mode for Gemini 3 Pro models. When enabled, the model will show its reasoning process.",
112
+ "type": "boolean",
113
+ "default": True,
114
+ },
115
+ "thinking_level": {
116
+ "name": "Thinking Level",
117
+ "description": "Controls the depth of thinking for Gemini 3 Pro models. Low = faster responses, High = more thorough reasoning.",
118
+ "type": "choice",
119
+ "choices": ["low", "high"],
120
+ "default": "low",
121
+ },
109
122
  }
110
123
 
111
124
 
@@ -730,6 +743,7 @@ class ModelSettingsMenu:
730
743
  kb = KeyBindings()
731
744
 
732
745
  @kb.add("up")
746
+ @kb.add("c-p") # Ctrl+P = previous (Emacs-style)
733
747
  def _(event):
734
748
  if self.view_mode == "models":
735
749
  if self.model_index > 0:
@@ -742,6 +756,7 @@ class ModelSettingsMenu:
742
756
  self.update_display()
743
757
 
744
758
  @kb.add("down")
759
+ @kb.add("c-n") # Ctrl+N = next (Emacs-style)
745
760
  def _(event):
746
761
  if self.view_mode == "models":
747
762
  if self.model_index < len(self.all_models) - 1:
@@ -249,12 +249,14 @@ async def run_onboarding_wizard() -> Optional[str]:
249
249
 
250
250
  @kb.add("down")
251
251
  @kb.add("j")
252
+ @kb.add("c-n") # Ctrl+N = next (Emacs-style)
252
253
  def next_option(event):
253
254
  wizard.next_option()
254
255
  event.app.invalidate()
255
256
 
256
257
  @kb.add("up")
257
258
  @kb.add("k")
259
+ @kb.add("c-p") # Ctrl+P = previous (Emacs-style)
258
260
  def prev_option(event):
259
261
  wizard.prev_option()
260
262
  event.app.invalidate()
@@ -40,6 +40,10 @@ from pydantic_ai.usage import RequestUsage
40
40
 
41
41
  logger = logging.getLogger(__name__)
42
42
 
43
+ # Bypass thought signature for Gemini when no pending signature is available
44
+ # This allows function calls to work with thinking models
45
+ BYPASS_THOUGHT_SIGNATURE = "context_engineering_is_the_way_to_go"
46
+
43
47
 
44
48
  def generate_tool_call_id() -> str:
45
49
  """Generate a unique tool call ID."""
@@ -410,27 +414,48 @@ class GeminiModel(Model):
410
414
  return system_instruction, contents
411
415
 
412
416
  def _map_model_response(self, m: ModelResponse) -> dict[str, Any] | None:
413
- """Map a ModelResponse to Gemini content format."""
417
+ """Map a ModelResponse to Gemini content format.
418
+
419
+ For Gemini thinking models, we need to track thought signatures from
420
+ ThinkingParts and apply them to subsequent function_call parts.
421
+ """
414
422
  parts: list[dict[str, Any]] = []
423
+ pending_signature: str | None = None
415
424
 
416
425
  for item in m.parts:
417
426
  if isinstance(item, ToolCallPart):
418
- parts.append(
419
- {
420
- "function_call": {
421
- "name": item.tool_name,
422
- "args": item.args_as_dict(),
423
- "id": item.tool_call_id,
424
- }
427
+ part_dict: dict[str, Any] = {
428
+ "function_call": {
429
+ "name": item.tool_name,
430
+ "args": item.args_as_dict(),
431
+ "id": item.tool_call_id,
425
432
  }
433
+ }
434
+ # Gemini thinking models REQUIRE thoughtSignature on function calls
435
+ # Use pending signature from thinking or bypass signature
436
+ part_dict["thoughtSignature"] = (
437
+ pending_signature
438
+ if pending_signature is not None
439
+ else BYPASS_THOUGHT_SIGNATURE
426
440
  )
441
+ parts.append(part_dict)
427
442
  elif isinstance(item, TextPart):
428
- parts.append({"text": item.content})
443
+ part_dict = {"text": item.content}
444
+ # Apply pending signature to text parts too if present
445
+ if pending_signature is not None:
446
+ part_dict["thoughtSignature"] = pending_signature
447
+ pending_signature = None
448
+ parts.append(part_dict)
429
449
  elif isinstance(item, ThinkingPart):
430
450
  if item.content:
431
- part_dict: dict[str, Any] = {"text": item.content, "thought": True}
451
+ part_dict = {"text": item.content, "thought": True}
432
452
  if item.signature:
433
453
  part_dict["thoughtSignature"] = item.signature
454
+ # Store signature for subsequent parts
455
+ pending_signature = item.signature
456
+ else:
457
+ # No signature on thinking part, use bypass
458
+ pending_signature = BYPASS_THOUGHT_SIGNATURE
434
459
  parts.append(part_dict)
435
460
 
436
461
  if not parts:
@@ -462,18 +487,34 @@ class GeminiModel(Model):
462
487
  config: dict[str, Any] = {}
463
488
 
464
489
  if model_settings:
465
- if (
466
- hasattr(model_settings, "temperature")
467
- and model_settings.temperature is not None
468
- ):
469
- config["temperature"] = model_settings.temperature
470
- if hasattr(model_settings, "top_p") and model_settings.top_p is not None:
471
- config["topP"] = model_settings.top_p
472
- if (
473
- hasattr(model_settings, "max_tokens")
474
- and model_settings.max_tokens is not None
475
- ):
476
- config["maxOutputTokens"] = model_settings.max_tokens
490
+ # ModelSettings is a TypedDict, so use .get() for all access
491
+ temperature = model_settings.get("temperature")
492
+ if temperature is not None:
493
+ config["temperature"] = temperature
494
+
495
+ top_p = model_settings.get("top_p")
496
+ if top_p is not None:
497
+ config["topP"] = top_p
498
+
499
+ max_tokens = model_settings.get("max_tokens")
500
+ if max_tokens is not None:
501
+ config["maxOutputTokens"] = max_tokens
502
+
503
+ # Handle Gemini 3 Pro thinking settings
504
+ thinking_enabled = model_settings.get("thinking_enabled")
505
+ thinking_level = model_settings.get("thinking_level")
506
+
507
+ # Build thinkingConfig if thinking settings are present
508
+ if thinking_enabled is False:
509
+ # Disable thinking by not including thinkingConfig
510
+ pass
511
+ elif thinking_level is not None:
512
+ # Gemini 3 Pro uses thinkingLevel with values "low" or "high"
513
+ # includeThoughts=True is required to surface the thinking in the response
514
+ config["thinkingConfig"] = {
515
+ "thinkingLevel": thinking_level,
516
+ "includeThoughts": True,
517
+ }
477
518
 
478
519
  return config
479
520
 
@@ -74,6 +74,7 @@ def make_model_settings(
74
74
  get_effective_model_settings,
75
75
  get_openai_reasoning_effort,
76
76
  get_openai_verbosity,
77
+ model_supports_setting,
77
78
  )
78
79
 
79
80
  model_settings_dict: dict = {}
@@ -131,6 +132,18 @@ def make_model_settings(
131
132
  }
132
133
  model_settings = AnthropicModelSettings(**model_settings_dict)
133
134
 
135
+ # Handle Gemini thinking models (Gemini-3)
136
+ # Check if model supports thinking settings and apply defaults
137
+ if model_supports_setting(model_name, "thinking_level"):
138
+ # Apply defaults if not explicitly set by user
139
+ # Default: thinking_enabled=True, thinking_level="low"
140
+ if "thinking_enabled" not in model_settings_dict:
141
+ model_settings_dict["thinking_enabled"] = True
142
+ if "thinking_level" not in model_settings_dict:
143
+ model_settings_dict["thinking_level"] = "low"
144
+ # Recreate settings with Gemini thinking config
145
+ model_settings = ModelSettings(**model_settings_dict)
146
+
134
147
  return model_settings
135
148
 
136
149
 
@@ -33,13 +33,13 @@
33
33
  "type": "gemini",
34
34
  "name": "gemini-3-pro-preview",
35
35
  "context_length": 200000,
36
- "supported_settings": ["temperature", "top_p"]
36
+ "supported_settings": ["temperature", "top_p", "thinking_enabled", "thinking_level"]
37
37
  },
38
38
  "Gemini-3-Long-Context": {
39
39
  "type": "gemini",
40
40
  "name": "gemini-3-pro-preview",
41
41
  "context_length": 1000000,
42
- "supported_settings": ["temperature", "top_p"]
42
+ "supported_settings": ["temperature", "top_p", "thinking_enabled", "thinking_level"]
43
43
  },
44
44
  "gpt-5.1": {
45
45
  "type": "openai",
@@ -880,18 +880,22 @@ async def arrow_select_async(
880
880
  lines.append(border_bottom)
881
881
  lines.append("")
882
882
 
883
- lines.append("<ansicyan>(Use ↑↓ arrows to select, Enter to confirm)</ansicyan>")
883
+ lines.append(
884
+ "<ansicyan>(Use ↑↓ or Ctrl+P/N to select, Enter to confirm)</ansicyan>"
885
+ )
884
886
  return HTML("\n".join(lines))
885
887
 
886
888
  # Key bindings
887
889
  kb = KeyBindings()
888
890
 
889
891
  @kb.add("up")
892
+ @kb.add("c-p") # Ctrl+P = previous (Emacs-style)
890
893
  def move_up(event):
891
894
  selected_index[0] = (selected_index[0] - 1) % len(choices)
892
895
  event.app.invalidate() # Force redraw to update preview
893
896
 
894
897
  @kb.add("down")
898
+ @kb.add("c-n") # Ctrl+N = next (Emacs-style)
895
899
  def move_down(event):
896
900
  selected_index[0] = (selected_index[0] + 1) % len(choices)
897
901
  event.app.invalidate() # Force redraw to update preview
@@ -957,18 +961,22 @@ def arrow_select(message: str, choices: list[str]) -> str:
957
961
  else:
958
962
  lines.append(f" {choice}")
959
963
  lines.append("")
960
- lines.append("<ansicyan>(Use ↑↓ arrows to select, Enter to confirm)</ansicyan>")
964
+ lines.append(
965
+ "<ansicyan>(Use ↑↓ or Ctrl+P/N to select, Enter to confirm)</ansicyan>"
966
+ )
961
967
  return HTML("\n".join(lines))
962
968
 
963
969
  # Key bindings
964
970
  kb = KeyBindings()
965
971
 
966
972
  @kb.add("up")
973
+ @kb.add("c-p") # Ctrl+P = previous (Emacs-style)
967
974
  def move_up(event):
968
975
  selected_index[0] = (selected_index[0] - 1) % len(choices)
969
976
  event.app.invalidate() # Force redraw to update preview
970
977
 
971
978
  @kb.add("down")
979
+ @kb.add("c-n") # Ctrl+N = next (Emacs-style)
972
980
  def move_down(event):
973
981
  selected_index[0] = (selected_index[0] + 1) % len(choices)
974
982
  event.app.invalidate() # Force redraw to update preview
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "code-puppy"
7
- version = "0.0.376"
7
+ version = "0.0.378"
8
8
  description = "Code generation agent"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11,<3.14"
File without changes
File without changes
File without changes