code-puppy 0.0.367__tar.gz → 0.0.368__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.367 → code_puppy-0.0.368}/PKG-INFO +1 -1
  2. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/claude_cache_client.py +45 -7
  3. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/claude_code_oauth/utils.py +4 -1
  4. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/pydantic_patches.py +62 -0
  5. {code_puppy-0.0.367 → code_puppy-0.0.368}/pyproject.toml +1 -1
  6. {code_puppy-0.0.367 → code_puppy-0.0.368}/.gitignore +0 -0
  7. {code_puppy-0.0.367 → code_puppy-0.0.368}/LICENSE +0 -0
  8. {code_puppy-0.0.367 → code_puppy-0.0.368}/README.md +0 -0
  9. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/__init__.py +0 -0
  10. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/__main__.py +0 -0
  11. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/__init__.py +0 -0
  12. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/agent_c_reviewer.py +0 -0
  13. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/agent_code_puppy.py +0 -0
  14. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/agent_code_reviewer.py +0 -0
  15. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/agent_cpp_reviewer.py +0 -0
  16. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/agent_creator_agent.py +0 -0
  17. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/agent_golang_reviewer.py +0 -0
  18. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/agent_javascript_reviewer.py +0 -0
  19. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/agent_manager.py +0 -0
  20. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/agent_pack_leader.py +0 -0
  21. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/agent_planning.py +0 -0
  22. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/agent_python_programmer.py +0 -0
  23. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/agent_python_reviewer.py +0 -0
  24. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/agent_qa_expert.py +0 -0
  25. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/agent_qa_kitten.py +0 -0
  26. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/agent_security_auditor.py +0 -0
  27. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/agent_terminal_qa.py +0 -0
  28. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/agent_typescript_reviewer.py +0 -0
  29. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/base_agent.py +0 -0
  30. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/event_stream_handler.py +0 -0
  31. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/json_agent.py +0 -0
  32. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/pack/__init__.py +0 -0
  33. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/pack/bloodhound.py +0 -0
  34. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/pack/husky.py +0 -0
  35. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/pack/retriever.py +0 -0
  36. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/pack/shepherd.py +0 -0
  37. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/pack/terrier.py +0 -0
  38. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/pack/watchdog.py +0 -0
  39. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/prompt_reviewer.py +0 -0
  40. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/agents/subagent_stream_handler.py +0 -0
  41. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/api/__init__.py +0 -0
  42. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/api/app.py +0 -0
  43. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/api/main.py +0 -0
  44. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/api/pty_manager.py +0 -0
  45. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/api/routers/__init__.py +0 -0
  46. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/api/routers/agents.py +0 -0
  47. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/api/routers/commands.py +0 -0
  48. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/api/routers/config.py +0 -0
  49. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/api/routers/sessions.py +0 -0
  50. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/api/templates/terminal.html +0 -0
  51. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/api/websocket.py +0 -0
  52. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/callbacks.py +0 -0
  53. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/chatgpt_codex_client.py +0 -0
  54. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/cli_runner.py +0 -0
  55. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/__init__.py +0 -0
  56. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/add_model_menu.py +0 -0
  57. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/agent_menu.py +0 -0
  58. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/attachments.py +0 -0
  59. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/autosave_menu.py +0 -0
  60. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/clipboard.py +0 -0
  61. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/colors_menu.py +0 -0
  62. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/command_handler.py +0 -0
  63. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/command_registry.py +0 -0
  64. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/config_commands.py +0 -0
  65. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/core_commands.py +0 -0
  66. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/diff_menu.py +0 -0
  67. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/file_path_completion.py +0 -0
  68. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/load_context_completion.py +0 -0
  69. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/__init__.py +0 -0
  70. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/base.py +0 -0
  71. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
  72. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
  73. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
  74. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/edit_command.py +0 -0
  75. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/handler.py +0 -0
  76. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/help_command.py +0 -0
  77. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/install_command.py +0 -0
  78. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/install_menu.py +0 -0
  79. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/list_command.py +0 -0
  80. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/logs_command.py +0 -0
  81. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/remove_command.py +0 -0
  82. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/restart_command.py +0 -0
  83. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/search_command.py +0 -0
  84. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/start_all_command.py +0 -0
  85. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/start_command.py +0 -0
  86. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/status_command.py +0 -0
  87. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
  88. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/stop_command.py +0 -0
  89. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/test_command.py +0 -0
  90. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/utils.py +0 -0
  91. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  92. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/mcp_completion.py +0 -0
  93. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/model_picker_completion.py +0 -0
  94. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/model_settings_menu.py +0 -0
  95. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/motd.py +0 -0
  96. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/onboarding_slides.py +0 -0
  97. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/onboarding_wizard.py +0 -0
  98. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/pin_command_completion.py +0 -0
  99. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
  100. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/session_commands.py +0 -0
  101. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/command_line/utils.py +0 -0
  102. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/config.py +0 -0
  103. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/error_logging.py +0 -0
  104. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/gemini_code_assist.py +0 -0
  105. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/gemini_model.py +0 -0
  106. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/http_utils.py +0 -0
  107. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/keymap.py +0 -0
  108. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/main.py +0 -0
  109. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/mcp_/__init__.py +0 -0
  110. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/mcp_/async_lifecycle.py +0 -0
  111. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/mcp_/blocking_startup.py +0 -0
  112. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/mcp_/captured_stdio_server.py +0 -0
  113. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/mcp_/circuit_breaker.py +0 -0
  114. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/mcp_/config_wizard.py +0 -0
  115. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/mcp_/dashboard.py +0 -0
  116. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/mcp_/error_isolation.py +0 -0
  117. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/mcp_/examples/retry_example.py +0 -0
  118. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/mcp_/health_monitor.py +0 -0
  119. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/mcp_/managed_server.py +0 -0
  120. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/mcp_/manager.py +0 -0
  121. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/mcp_/mcp_logs.py +0 -0
  122. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/mcp_/registry.py +0 -0
  123. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/mcp_/retry_manager.py +0 -0
  124. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/mcp_/server_registry_catalog.py +0 -0
  125. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/mcp_/status_tracker.py +0 -0
  126. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/mcp_/system_tools.py +0 -0
  127. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/messaging/__init__.py +0 -0
  128. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/messaging/bus.py +0 -0
  129. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/messaging/commands.py +0 -0
  130. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/messaging/markdown_patches.py +0 -0
  131. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/messaging/message_queue.py +0 -0
  132. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/messaging/messages.py +0 -0
  133. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/messaging/queue_console.py +0 -0
  134. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/messaging/renderers.py +0 -0
  135. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/messaging/rich_renderer.py +0 -0
  136. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/messaging/spinner/__init__.py +0 -0
  137. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/messaging/spinner/console_spinner.py +0 -0
  138. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/messaging/spinner/spinner_base.py +0 -0
  139. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/messaging/subagent_console.py +0 -0
  140. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/model_factory.py +0 -0
  141. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/model_utils.py +0 -0
  142. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/models.json +0 -0
  143. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/models_dev_api.json +0 -0
  144. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/models_dev_parser.py +0 -0
  145. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/__init__.py +0 -0
  146. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/antigravity_oauth/__init__.py +0 -0
  147. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/antigravity_oauth/accounts.py +0 -0
  148. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/antigravity_oauth/antigravity_model.py +0 -0
  149. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/antigravity_oauth/config.py +0 -0
  150. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/antigravity_oauth/constants.py +0 -0
  151. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/antigravity_oauth/oauth.py +0 -0
  152. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/antigravity_oauth/register_callbacks.py +0 -0
  153. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/antigravity_oauth/storage.py +0 -0
  154. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/antigravity_oauth/test_plugin.py +0 -0
  155. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/antigravity_oauth/token.py +0 -0
  156. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/antigravity_oauth/transport.py +0 -0
  157. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/antigravity_oauth/utils.py +0 -0
  158. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
  159. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
  160. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
  161. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +0 -0
  162. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +0 -0
  163. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/chatgpt_oauth/utils.py +0 -0
  164. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
  165. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
  166. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
  167. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
  168. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +0 -0
  169. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
  170. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
  171. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
  172. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/example_custom_command/README.md +0 -0
  173. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
  174. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
  175. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
  176. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/frontend_emitter/__init__.py +0 -0
  177. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/frontend_emitter/emitter.py +0 -0
  178. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/frontend_emitter/register_callbacks.py +0 -0
  179. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/oauth_puppy_html.py +0 -0
  180. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/shell_safety/__init__.py +0 -0
  181. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
  182. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
  183. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
  184. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/prompts/antigravity_system_prompt.md +0 -0
  185. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/prompts/codex_system_prompt.md +0 -0
  186. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/reopenable_async_client.py +0 -0
  187. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/round_robin_model.py +0 -0
  188. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/session_storage.py +0 -0
  189. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/status_display.py +0 -0
  190. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/summarization_agent.py +0 -0
  191. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/terminal_utils.py +0 -0
  192. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/__init__.py +0 -0
  193. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/agent_tools.py +0 -0
  194. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/browser/__init__.py +0 -0
  195. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/browser/browser_control.py +0 -0
  196. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/browser/browser_interactions.py +0 -0
  197. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/browser/browser_locators.py +0 -0
  198. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/browser/browser_manager.py +0 -0
  199. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/browser/browser_navigation.py +0 -0
  200. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/browser/browser_screenshot.py +0 -0
  201. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/browser/browser_scripts.py +0 -0
  202. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/browser/browser_workflows.py +0 -0
  203. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/browser/chromium_terminal_manager.py +0 -0
  204. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/browser/terminal_command_tools.py +0 -0
  205. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/browser/terminal_screenshot_tools.py +0 -0
  206. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/browser/terminal_tools.py +0 -0
  207. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/command_runner.py +0 -0
  208. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/common.py +0 -0
  209. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/display.py +0 -0
  210. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/file_modifications.py +0 -0
  211. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/file_operations.py +0 -0
  212. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/subagent_context.py +0 -0
  213. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/tools/tools_content.py +0 -0
  214. {code_puppy-0.0.367 → code_puppy-0.0.368}/code_puppy/uvx_detection.py +0 -0
  215. {code_puppy-0.0.367 → code_puppy-0.0.368}/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.367
3
+ Version: 0.0.368
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
@@ -119,24 +119,62 @@ class ClaudeCacheAsyncClient(httpx.AsyncClient):
119
119
  return None
120
120
 
121
121
  def _should_refresh_token(self, request: httpx.Request) -> bool:
122
- """Check if the token in the request is older than 1 hour."""
122
+ """Check if the token should be refreshed (within 1 hour of expiry).
123
+
124
+ Uses two strategies:
125
+ 1. Decode JWT to check token age (if possible)
126
+ 2. Fall back to stored expires_at from token file
127
+
128
+ Returns True if token expires within TOKEN_MAX_AGE_SECONDS (1 hour).
129
+ """
123
130
  token = self._extract_bearer_token(request)
124
131
  if not token:
125
132
  return False
126
133
 
134
+ # Strategy 1: Try to decode JWT age
127
135
  age = self._get_jwt_age_seconds(token)
128
- if age is None:
129
- return False
130
-
131
- should_refresh = age >= TOKEN_MAX_AGE_SECONDS
136
+ if age is not None:
137
+ should_refresh = age >= TOKEN_MAX_AGE_SECONDS
138
+ if should_refresh:
139
+ logger.info(
140
+ "JWT token is %.1f seconds old (>= %d), will refresh proactively",
141
+ age,
142
+ TOKEN_MAX_AGE_SECONDS,
143
+ )
144
+ return should_refresh
145
+
146
+ # Strategy 2: Fall back to stored expires_at from token file
147
+ should_refresh = self._check_stored_token_expiry()
132
148
  if should_refresh:
133
149
  logger.info(
134
- "JWT token is %.1f seconds old (>= %d), will refresh proactively",
135
- age,
150
+ "Stored token expires within %d seconds, will refresh proactively",
136
151
  TOKEN_MAX_AGE_SECONDS,
137
152
  )
138
153
  return should_refresh
139
154
 
155
+ @staticmethod
156
+ def _check_stored_token_expiry() -> bool:
157
+ """Check if the stored token expires within TOKEN_MAX_AGE_SECONDS.
158
+
159
+ This is a fallback for when JWT decoding fails or isn't available.
160
+ Uses the expires_at timestamp from the stored token file.
161
+ """
162
+ try:
163
+ from code_puppy.plugins.claude_code_oauth.utils import (
164
+ is_token_expired,
165
+ load_stored_tokens,
166
+ )
167
+
168
+ tokens = load_stored_tokens()
169
+ if not tokens:
170
+ return False
171
+
172
+ # is_token_expired already uses TOKEN_REFRESH_BUFFER_SECONDS (1 hour)
173
+ return is_token_expired(tokens)
174
+ except Exception as exc:
175
+ logger.debug("Error checking stored token expiry: %s", exc)
176
+ return False
177
+
140
178
  @staticmethod
141
179
  def _prefix_tool_names(body: bytes) -> bytes | None:
142
180
  """Prefix all tool names in the request body with TOOL_PREFIX.
@@ -21,7 +21,10 @@ from .config import (
21
21
  get_token_storage_path,
22
22
  )
23
23
 
24
- TOKEN_REFRESH_BUFFER_SECONDS = 60
24
+ # Proactive refresh buffer: refresh tokens 1 hour before expiration
25
+ # This ensures smooth operation by refreshing during model requests,
26
+ # well before the token actually expires
27
+ TOKEN_REFRESH_BUFFER_SECONDS = 3600 # 1 hour
25
28
 
26
29
  logger = logging.getLogger(__name__)
27
30
 
@@ -121,6 +121,67 @@ def patch_process_message_history() -> None:
121
121
  pass
122
122
 
123
123
 
124
+ def patch_tool_call_json_repair() -> None:
125
+ """Patch pydantic-ai's _call_tool to auto-repair malformed JSON arguments.
126
+
127
+ LLMs sometimes produce slightly broken JSON in tool calls (trailing commas,
128
+ missing quotes, etc.). This patch intercepts tool calls and runs json_repair
129
+ on the arguments before validation, preventing unnecessary retries.
130
+ """
131
+ try:
132
+ import json_repair
133
+ from pydantic_ai._tool_manager import ToolManager
134
+
135
+ # Store the original method
136
+ _original_call_tool = ToolManager._call_tool
137
+
138
+ async def _patched_call_tool(
139
+ self,
140
+ call,
141
+ *,
142
+ allow_partial: bool,
143
+ wrap_validation_errors: bool,
144
+ approved: bool,
145
+ ):
146
+ """Patched _call_tool that repairs malformed JSON before validation."""
147
+ # Only attempt repair if args is a string (JSON)
148
+ if isinstance(call.args, str) and call.args:
149
+ try:
150
+ repaired = json_repair.repair_json(call.args)
151
+ if repaired != call.args:
152
+ # JSON was repaired! Log and update
153
+ try:
154
+ from rich.console import Console
155
+ console = Console(stderr=True)
156
+ console.print(
157
+ "[bold yellow]🐕 WOOF! Repaired malformed tool call JSON! AWOOOOOOOOOO![/]"
158
+ )
159
+ except ImportError:
160
+ pass # No rich console available
161
+
162
+ # Update the call args with repaired JSON
163
+ call.args = repaired
164
+ except Exception:
165
+ pass # If repair fails, let original validation handle it
166
+
167
+ # Call the original method
168
+ return await _original_call_tool(
169
+ self,
170
+ call,
171
+ allow_partial=allow_partial,
172
+ wrap_validation_errors=wrap_validation_errors,
173
+ approved=approved,
174
+ )
175
+
176
+ # Apply the patch
177
+ ToolManager._call_tool = _patched_call_tool
178
+
179
+ except ImportError:
180
+ pass # json_repair or pydantic_ai not available
181
+ except Exception:
182
+ pass # Don't crash on patch failure
183
+
184
+
124
185
  def apply_all_patches() -> None:
125
186
  """Apply all pydantic-ai monkey patches.
126
187
 
@@ -129,3 +190,4 @@ def apply_all_patches() -> None:
129
190
  patch_user_agent()
130
191
  patch_message_history_cleaning()
131
192
  patch_process_message_history()
193
+ patch_tool_call_json_repair()
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "code-puppy"
7
- version = "0.0.367"
7
+ version = "0.0.368"
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