code-puppy 0.0.591__tar.gz → 0.0.593__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 (407) hide show
  1. {code_puppy-0.0.591 → code_puppy-0.0.593}/PKG-INFO +1 -1
  2. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/_runtime.py +31 -15
  3. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/claude_cache_client.py +9 -2
  4. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/auth_retry.py +70 -2
  5. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/utils.py +22 -0
  6. {code_puppy-0.0.591 → code_puppy-0.0.593}/pyproject.toml +1 -1
  7. {code_puppy-0.0.591 → code_puppy-0.0.593}/.gitignore +0 -0
  8. {code_puppy-0.0.591 → code_puppy-0.0.593}/LICENSE +0 -0
  9. {code_puppy-0.0.591 → code_puppy-0.0.593}/README.md +0 -0
  10. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/__init__.py +0 -0
  11. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/__main__.py +0 -0
  12. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/__init__.py +0 -0
  13. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/_builder.py +0 -0
  14. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/_compaction.py +0 -0
  15. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/_diagnostics.py +0 -0
  16. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/_history.py +0 -0
  17. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/_key_listeners.py +0 -0
  18. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/_non_streaming_render.py +0 -0
  19. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/_run_signals.py +0 -0
  20. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/_steer_processor.py +0 -0
  21. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/agent_code_puppy.py +0 -0
  22. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/agent_creator_agent.py +0 -0
  23. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/agent_helios.py +0 -0
  24. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/agent_manager.py +0 -0
  25. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/agent_planning.py +0 -0
  26. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/agent_qa_kitten.py +0 -0
  27. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/base_agent.py +0 -0
  28. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/event_stream_handler.py +0 -0
  29. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/json_agent.py +0 -0
  30. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/run_stats.py +0 -0
  31. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/smooth_stream.py +0 -0
  32. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/subagent_stream_handler.py +0 -0
  33. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/callbacks.py +0 -0
  34. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/chatgpt_codex_client.py +0 -0
  35. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/cli_runner.py +0 -0
  36. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/__init__.py +0 -0
  37. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/add_model_menu.py +0 -0
  38. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/agent_menu.py +0 -0
  39. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/attachments.py +0 -0
  40. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/autosave_menu.py +0 -0
  41. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/autosave_search.py +0 -0
  42. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/clipboard.py +0 -0
  43. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/colors_menu.py +0 -0
  44. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/command_handler.py +0 -0
  45. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/command_registry.py +0 -0
  46. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/config_apply.py +0 -0
  47. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/config_commands.py +0 -0
  48. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/core_commands.py +0 -0
  49. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/diff_menu.py +0 -0
  50. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/file_index.py +0 -0
  51. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/file_path_completion.py +0 -0
  52. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/judges_menu.py +0 -0
  53. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/load_context_completion.py +0 -0
  54. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/__init__.py +0 -0
  55. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/base.py +0 -0
  56. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
  57. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
  58. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
  59. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/edit_command.py +0 -0
  60. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/handler.py +0 -0
  61. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/help_command.py +0 -0
  62. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/install_command.py +0 -0
  63. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/install_menu.py +0 -0
  64. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/list_command.py +0 -0
  65. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/logs_command.py +0 -0
  66. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/remove_command.py +0 -0
  67. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/restart_command.py +0 -0
  68. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/search_command.py +0 -0
  69. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/silence_warning_command.py +0 -0
  70. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/start_all_command.py +0 -0
  71. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/start_command.py +0 -0
  72. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/status_command.py +0 -0
  73. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
  74. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/stop_command.py +0 -0
  75. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/utils.py +0 -0
  76. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  77. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp_binding_menu.py +0 -0
  78. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp_completion.py +0 -0
  79. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/model_picker_completion.py +0 -0
  80. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/model_settings_menu.py +0 -0
  81. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/onboarding_slides.py +0 -0
  82. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/onboarding_wizard.py +0 -0
  83. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/pagination.py +0 -0
  84. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/pin_command_completion.py +0 -0
  85. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
  86. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/session_commands.py +0 -0
  87. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/set_menu.py +0 -0
  88. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/set_menu_catalog.py +0 -0
  89. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/set_menu_render.py +0 -0
  90. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/set_menu_schema.py +0 -0
  91. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/set_menu_settings.py +0 -0
  92. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/set_menu_shims.py +0 -0
  93. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/set_menu_values.py +0 -0
  94. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/shell_passthrough.py +0 -0
  95. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/skills_completion.py +0 -0
  96. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/uc_menu.py +0 -0
  97. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/utils.py +0 -0
  98. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/wiggum_state.py +0 -0
  99. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/config.py +0 -0
  100. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/error_logging.py +0 -0
  101. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/gemini_code_assist.py +0 -0
  102. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/gemini_model.py +0 -0
  103. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/hook_engine/README.md +0 -0
  104. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/hook_engine/__init__.py +0 -0
  105. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/hook_engine/aliases.py +0 -0
  106. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/hook_engine/engine.py +0 -0
  107. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/hook_engine/executor.py +0 -0
  108. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/hook_engine/matcher.py +0 -0
  109. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/hook_engine/models.py +0 -0
  110. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/hook_engine/registry.py +0 -0
  111. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/hook_engine/validator.py +0 -0
  112. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/http_utils.py +0 -0
  113. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/keymap.py +0 -0
  114. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/list_filtering.py +0 -0
  115. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/main.py +0 -0
  116. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/__init__.py +0 -0
  117. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/agent_bindings.py +0 -0
  118. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/async_lifecycle.py +0 -0
  119. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/blocking_startup.py +0 -0
  120. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/captured_stdio_server.py +0 -0
  121. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/circuit_breaker.py +0 -0
  122. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/config_wizard.py +0 -0
  123. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/dashboard.py +0 -0
  124. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/error_isolation.py +0 -0
  125. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/examples/retry_example.py +0 -0
  126. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/health_monitor.py +0 -0
  127. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/managed_server.py +0 -0
  128. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/manager.py +0 -0
  129. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/mcp_logs.py +0 -0
  130. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/registry.py +0 -0
  131. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/retry_manager.py +0 -0
  132. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/server_registry_catalog.py +0 -0
  133. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/status_tracker.py +0 -0
  134. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/system_tools.py +0 -0
  135. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/tool_arg_coercion.py +0 -0
  136. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_prompts/__init__.py +0 -0
  137. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_prompts/hook_creator.py +0 -0
  138. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/__init__.py +0 -0
  139. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/bar_painters.py +0 -0
  140. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/bar_rendering.py +0 -0
  141. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/bottom_bar.py +0 -0
  142. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/bus.py +0 -0
  143. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/commands.py +0 -0
  144. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/editor_actions.py +0 -0
  145. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/editor_completion.py +0 -0
  146. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/editor_display.py +0 -0
  147. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/editor_history.py +0 -0
  148. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/editor_keys.py +0 -0
  149. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/editor_paste.py +0 -0
  150. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/line_editor.py +0 -0
  151. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/markdown_patches.py +0 -0
  152. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/message_queue.py +0 -0
  153. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/messages.py +0 -0
  154. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/pause_controller.py +0 -0
  155. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/prompt_prefix_style.py +0 -0
  156. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/queue_console.py +0 -0
  157. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/renderers.py +0 -0
  158. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/rich_renderer.py +0 -0
  159. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/run_ui.py +0 -0
  160. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/run_ui_wiring.py +0 -0
  161. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/spinner/__init__.py +0 -0
  162. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/subagent_console.py +0 -0
  163. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/model_descriptions.py +0 -0
  164. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/model_factory.py +0 -0
  165. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/model_switching.py +0 -0
  166. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/model_utils.py +0 -0
  167. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/models.json +0 -0
  168. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/models_dev_api.json +0 -0
  169. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/models_dev_parser.py +0 -0
  170. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/__init__.py +0 -0
  171. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/__init__.py +0 -0
  172. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/config.py +0 -0
  173. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/discovery.py +0 -0
  174. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/downloader.py +0 -0
  175. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/enabled_skills.py +0 -0
  176. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/installer.py +0 -0
  177. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/metadata.py +0 -0
  178. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/prompt_builder.py +0 -0
  179. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/register_callbacks.py +0 -0
  180. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/remote_catalog.py +0 -0
  181. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/skill_catalog.py +0 -0
  182. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/skill_commands.py +0 -0
  183. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/skills_install_menu.py +0 -0
  184. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/skills_menu.py +0 -0
  185. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/aws_bedrock/__init__.py +0 -0
  186. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/aws_bedrock/config.py +0 -0
  187. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/aws_bedrock/register_callbacks.py +0 -0
  188. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/aws_bedrock/utils.py +0 -0
  189. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/azure_foundry/README.md +0 -0
  190. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/azure_foundry/__init__.py +0 -0
  191. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/azure_foundry/config.py +0 -0
  192. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/azure_foundry/discovery.py +0 -0
  193. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/azure_foundry/register_callbacks.py +0 -0
  194. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/azure_foundry/token.py +0 -0
  195. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/azure_foundry/utils.py +0 -0
  196. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/btw/__init__.py +0 -0
  197. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/btw/inline_view.py +0 -0
  198. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/btw/register_callbacks.py +0 -0
  199. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/btw/side_query.py +0 -0
  200. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
  201. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
  202. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
  203. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +0 -0
  204. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +0 -0
  205. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/chatgpt_oauth/utils.py +0 -0
  206. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_hooks/__init__.py +0 -0
  207. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_hooks/config.py +0 -0
  208. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_hooks/register_callbacks.py +0 -0
  209. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
  210. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
  211. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
  212. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
  213. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/fast_mode.py +0 -0
  214. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/prompt_handler.py +0 -0
  215. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +0 -0
  216. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/test_fast_mode.py +0 -0
  217. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
  218. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  219. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/code_puppy_agent/SKILL.md +0 -0
  220. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/code_puppy_agent/__init__.py +0 -0
  221. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/code_puppy_agent/register_callbacks.py +0 -0
  222. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/config.py +0 -0
  223. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/context_indicator/__init__.py +0 -0
  224. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/context_indicator/register_callbacks.py +0 -0
  225. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/context_indicator/usage.py +0 -0
  226. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/copilot_auth/__init__.py +0 -0
  227. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/copilot_auth/config.py +0 -0
  228. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/copilot_auth/reasoning_client.py +0 -0
  229. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/copilot_auth/register_callbacks.py +0 -0
  230. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/copilot_auth/utils.py +0 -0
  231. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
  232. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
  233. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/__init__.py +0 -0
  234. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/cancel.py +0 -0
  235. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/commands.py +0 -0
  236. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/config.py +0 -0
  237. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/lifecycle.py +0 -0
  238. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/register_callbacks.py +0 -0
  239. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/runtime.py +0 -0
  240. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/startup_lock.py +0 -0
  241. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/workflow_ids.py +0 -0
  242. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/wrapper.py +0 -0
  243. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/destructive_command_guard/__init__.py +0 -0
  244. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/destructive_command_guard/detector.py +0 -0
  245. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/destructive_command_guard/register_callbacks.py +0 -0
  246. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/emoji_filter/__init__.py +0 -0
  247. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/emoji_filter/config.py +0 -0
  248. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/emoji_filter/register_callbacks.py +0 -0
  249. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/emoji_filter/stripper.py +0 -0
  250. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/example_custom_command/README.md +0 -0
  251. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
  252. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
  253. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
  254. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/force_push_guard/__init__.py +0 -0
  255. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/force_push_guard/detector.py +0 -0
  256. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/force_push_guard/register_callbacks.py +0 -0
  257. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/force_push_guard/test_detector.py +0 -0
  258. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/frontend_emitter/__init__.py +0 -0
  259. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/frontend_emitter/emitter.py +0 -0
  260. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/frontend_emitter/register_callbacks.py +0 -0
  261. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/frontend_emitter/session_context.py +0 -0
  262. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/hook_creator/__init__.py +0 -0
  263. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/hook_creator/register_callbacks.py +0 -0
  264. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/hook_manager/__init__.py +0 -0
  265. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/hook_manager/config.py +0 -0
  266. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/hook_manager/hooks_menu.py +0 -0
  267. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/hook_manager/register_callbacks.py +0 -0
  268. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/oauth_puppy_html.py +0 -0
  269. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/obsidian_agent/README.md +0 -0
  270. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/obsidian_agent/__init__.py +0 -0
  271. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/obsidian_agent/agent_obsidian.py +0 -0
  272. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/obsidian_agent/register_callbacks.py +0 -0
  273. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/ollama/__init__.py +0 -0
  274. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/ollama/register_callbacks.py +0 -0
  275. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/ollama_setup/__init__.py +0 -0
  276. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/ollama_setup/completer.py +0 -0
  277. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/ollama_setup/register_callbacks.py +0 -0
  278. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/plugin_list/__init__.py +0 -0
  279. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/plugin_list/plugin_contributions.py +0 -0
  280. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/plugin_list/plugin_meta.py +0 -0
  281. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/plugin_list/plugin_text_utils.py +0 -0
  282. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/plugin_list/plugins_menu.py +0 -0
  283. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/plugin_list/plugins_menu_render.py +0 -0
  284. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/plugin_list/register_callbacks.py +0 -0
  285. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/pop_command/__init__.py +0 -0
  286. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/pop_command/register_callbacks.py +0 -0
  287. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/prompt_newline/__init__.py +0 -0
  288. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/prompt_newline/config.py +0 -0
  289. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/prompt_newline/register_callbacks.py +0 -0
  290. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/prune/__init__.py +0 -0
  291. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/prune/prune_menu.py +0 -0
  292. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/prune/prune_model.py +0 -0
  293. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/prune/prune_render.py +0 -0
  294. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/prune/register_callbacks.py +0 -0
  295. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/README.md +0 -0
  296. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/__init__.py +0 -0
  297. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/commands.py +0 -0
  298. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/config.py +0 -0
  299. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/kennel.py +0 -0
  300. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/packer.py +0 -0
  301. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/recorder.py +0 -0
  302. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/register_callbacks.py +0 -0
  303. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/retriever.py +0 -0
  304. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/schema.py +0 -0
  305. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/state.py +0 -0
  306. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/tools.py +0 -0
  307. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/wings.py +0 -0
  308. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_spinner/__init__.py +0 -0
  309. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_spinner/register_callbacks.py +0 -0
  310. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/quick_resume/__init__.py +0 -0
  311. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/quick_resume/register_callbacks.py +0 -0
  312. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/review_pr/__init__.py +0 -0
  313. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/review_pr/register_callbacks.py +0 -0
  314. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/shell_safety/__init__.py +0 -0
  315. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
  316. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
  317. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
  318. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/statusline/__init__.py +0 -0
  319. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/statusline/config.py +0 -0
  320. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/statusline/payload.py +0 -0
  321. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/statusline/prompt_patch.py +0 -0
  322. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/statusline/register_callbacks.py +0 -0
  323. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/statusline/runner.py +0 -0
  324. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/statusline/statusline_command.py +0 -0
  325. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/steer_queue/__init__.py +0 -0
  326. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/steer_queue/queue_menu.py +0 -0
  327. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/steer_queue/register_callbacks.py +0 -0
  328. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/subagent_panel/README.md +0 -0
  329. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/subagent_panel/__init__.py +0 -0
  330. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/subagent_panel/coalesce_patch.py +0 -0
  331. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/subagent_panel/panel_render.py +0 -0
  332. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/subagent_panel/register_callbacks.py +0 -0
  333. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/subagent_panel/resume_repaint.py +0 -0
  334. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/subagent_panel/state.py +0 -0
  335. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/switch_agent_resume/__init__.py +0 -0
  336. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/switch_agent_resume/register_callbacks.py +0 -0
  337. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/theme/README.md +0 -0
  338. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/theme/__init__.py +0 -0
  339. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/theme/bundled_palettes.py +0 -0
  340. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/theme/content_styles.py +0 -0
  341. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/theme/osc_palette.py +0 -0
  342. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/theme/picker.py +0 -0
  343. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/theme/register_callbacks.py +0 -0
  344. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/theme/rich_themes.py +0 -0
  345. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/theme/themes.py +0 -0
  346. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/token_ratio_learner/__init__.py +0 -0
  347. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/token_ratio_learner/ratios.py +0 -0
  348. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/token_ratio_learner/register_callbacks.py +0 -0
  349. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/universal_constructor/__init__.py +0 -0
  350. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/universal_constructor/models.py +0 -0
  351. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/universal_constructor/register_callbacks.py +0 -0
  352. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/universal_constructor/registry.py +0 -0
  353. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/universal_constructor/sandbox.py +0 -0
  354. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/wide_completion_menu/__init__.py +0 -0
  355. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/wide_completion_menu/register_callbacks.py +0 -0
  356. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/wiggum/__init__.py +0 -0
  357. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/wiggum/judge.py +0 -0
  358. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/wiggum/judge_config.py +0 -0
  359. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/wiggum/register_callbacks.py +0 -0
  360. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/wiggum/state.py +0 -0
  361. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/provider_credentials.py +0 -0
  362. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/provider_identity.py +0 -0
  363. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/pydantic_patches.py +0 -0
  364. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/reopenable_async_client.py +0 -0
  365. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/round_robin_model.py +0 -0
  366. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/session_lifecycle.py +0 -0
  367. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/session_migration.py +0 -0
  368. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/session_storage.py +0 -0
  369. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/status_display.py +0 -0
  370. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/summarization_agent.py +0 -0
  371. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/terminal_utils.py +0 -0
  372. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/__init__.py +0 -0
  373. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/agent_tools.py +0 -0
  374. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/__init__.py +0 -0
  375. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/constants.py +0 -0
  376. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/demo_tui.py +0 -0
  377. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/handler.py +0 -0
  378. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/models.py +0 -0
  379. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/registration.py +0 -0
  380. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/renderers.py +0 -0
  381. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/terminal_ui.py +0 -0
  382. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/theme.py +0 -0
  383. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/tui_loop.py +0 -0
  384. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/browser/__init__.py +0 -0
  385. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/browser/browser_control.py +0 -0
  386. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/browser/browser_interactions.py +0 -0
  387. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/browser/browser_locators.py +0 -0
  388. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/browser/browser_manager.py +0 -0
  389. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/browser/browser_navigation.py +0 -0
  390. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/browser/browser_screenshot.py +0 -0
  391. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/browser/browser_scripts.py +0 -0
  392. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/browser/browser_workflows.py +0 -0
  393. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/command_runner.py +0 -0
  394. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/common.py +0 -0
  395. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/display.py +0 -0
  396. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/file_modifications.py +0 -0
  397. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/file_operations.py +0 -0
  398. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/image_tools.py +0 -0
  399. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/model_tools.py +0 -0
  400. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/skills_tools.py +0 -0
  401. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/subagent_context.py +0 -0
  402. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/subagent_invocation.py +0 -0
  403. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/tools_content.py +0 -0
  404. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/universal_constructor.py +0 -0
  405. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/undo_manager.py +0 -0
  406. {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/uvx_detection.py +0 -0
  407. {code_puppy-0.0.591 → code_puppy-0.0.593}/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.591
3
+ Version: 0.0.593
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
@@ -19,6 +19,7 @@ from __future__ import annotations
19
19
  import asyncio
20
20
  import signal
21
21
  import threading
22
+ import time
22
23
  import uuid
23
24
  from contextlib import AsyncExitStack
24
25
  from typing import Any, Callable, Iterator, List, Optional, Sequence, Type, Union
@@ -297,6 +298,7 @@ def streaming_retry(
297
298
  max_attempts: int = 3,
298
299
  delays: Sequence[float] = (1, 2, 4),
299
300
  model_name: Optional[str] = None,
301
+ progress_window: float = 120.0,
300
302
  ) -> Callable[[Callable[[], Any]], Callable[[], Any]]:
301
303
  """Wrap a no-arg async callable with streaming-retry semantics.
302
304
 
@@ -311,36 +313,43 @@ def streaming_retry(
311
313
  ``agent_retryable_exception`` hook, so plugins can opt provider-specific
312
314
  failures (e.g. OAuth auth errors) into this same retry schedule.
313
315
  ``model_name`` is forwarded to the hook so plugins can scope themselves.
316
+
317
+ ``max_attempts`` caps *consecutive rapid* failures, not total failures
318
+ per run. An agent run wraps many model calls; a long run can hit several
319
+ unrelated provider blips spread across minutes of successful work. If an
320
+ attempt survives at least ``progress_window`` seconds before failing, it
321
+ clearly made progress, so the failure streak resets and the blip gets a
322
+ fresh retry budget. Only back-to-back quick failures — the actual
323
+ hopeless-loop signature — burn through the cap.
314
324
  """
315
325
  from code_puppy.error_logging import log_error
316
326
 
317
327
  def decorator(factory: Callable[[], Any]) -> Callable[[], Any]:
318
328
  async def runner() -> Any:
319
- last_exc: Optional[Exception] = None
320
- for attempt in range(max_attempts):
329
+ streak = 0 # consecutive rapid failures
330
+ while True:
331
+ attempt_started = time.monotonic()
321
332
  try:
322
333
  return await factory()
323
334
  except Exception as exc:
335
+ made_progress = (
336
+ time.monotonic() - attempt_started >= progress_window
337
+ )
324
338
  if not should_retry_streaming(exc) and not await _plugin_says_retry(
325
- exc, model_name, attempt + 1, max_attempts
339
+ exc, model_name, streak + 1, max_attempts
326
340
  ):
327
341
  raise
328
- last_exc = exc
342
+ if made_progress:
343
+ streak = 0
344
+ streak += 1
329
345
  log_error(
330
346
  exc,
331
347
  context=(
332
348
  f"streaming_retry: transient exception on attempt "
333
- f"{attempt + 1}/{max_attempts}"
349
+ f"{streak}/{max_attempts}"
334
350
  ),
335
351
  )
336
- if attempt < max_attempts - 1:
337
- delay = delays[attempt] if attempt < len(delays) else delays[-1]
338
- emit_warning(
339
- f"\u26a1 Streaming interrupted, auto-retrying in {delay}s... "
340
- f"(attempt {attempt + 1}/{max_attempts})"
341
- )
342
- await asyncio.sleep(delay)
343
- else:
352
+ if streak >= max_attempts:
344
353
  log_error(
345
354
  exc,
346
355
  context=(
@@ -351,8 +360,15 @@ def streaming_retry(
351
360
  emit_error(
352
361
  f"\u274c Streaming failed after {max_attempts} attempts"
353
362
  )
354
- assert last_exc is not None # loop always sets this before exiting
355
- raise last_exc
363
+ raise
364
+ delay = (
365
+ delays[streak - 1] if streak - 1 < len(delays) else delays[-1]
366
+ )
367
+ emit_warning(
368
+ f"\u26a1 Streaming interrupted, auto-retrying in {delay}s... "
369
+ f"(attempt {streak}/{max_attempts})"
370
+ )
371
+ await asyncio.sleep(delay)
356
372
 
357
373
  return runner
358
374
 
@@ -440,8 +440,15 @@ class ClaudeCacheAsyncClient(httpx.AsyncClient):
440
440
  if response.status_code == 400:
441
441
  is_auth_error = await self._is_cloudflare_html_error(response)
442
442
  if is_auth_error:
443
- logger.info(
444
- "Detected Cloudflare 400 error (likely auth-related), attempting token refresh"
443
+ # cf-ray + request size make edge flaps diagnosable
444
+ # (and reportable to Anthropic) from errors.log alone.
445
+ request_body = self._extract_body_bytes(request) or b""
446
+ logger.warning(
447
+ "Detected Cloudflare HTML 400 (cf-ray=%s, "
448
+ "request_bytes=%d, url=%s); attempting token refresh",
449
+ response.headers.get("cf-ray"),
450
+ len(request_body),
451
+ request.url.path,
445
452
  )
446
453
 
447
454
  if is_auth_error:
@@ -15,12 +15,20 @@ and return ``True`` so the exception rides the **main agent retry loop**
15
15
  (``streaming_retry``) — the same delays, banners, error-logging, and
16
16
  attempt cap as a 429. The loop's ``max_attempts`` bounds us, so a dead
17
17
  refresh token can't spin forever.
18
+
19
+ Recovery escalation ladder for Cloudflare HTML 400s specifically:
20
+ refresh-token exchanges only buy temporary recovery (the edge starts
21
+ flapping again minutes later), while a full interactive re-auth durably
22
+ cures it. So the first CF400 gets the cheap refresh+retry; a recurrence
23
+ within ``CLOUDFLARE_REAUTH_WINDOW_SECONDS`` escalates to the browser
24
+ sign-in flow before retrying.
18
25
  """
19
26
 
20
27
  from __future__ import annotations
21
28
 
22
29
  import asyncio
23
30
  import logging
31
+ import time
24
32
  from typing import Any, Callable, Iterator, Optional
25
33
  from weakref import WeakSet
26
34
 
@@ -34,6 +42,17 @@ logger = logging.getLogger(__name__)
34
42
  AUTH_STATUS_CODES = frozenset({401, 403})
35
43
  CLOUDFLARE_400_MARKERS = ("cloudflare", "400 bad request")
36
44
 
45
+ # Cloudflare 400s are only *durably* cured by a full interactive re-auth
46
+ # (field evidence: refresh-token exchanges buy temporary recovery, then the
47
+ # edge starts flapping again; a browser sign-in stops it entirely). The
48
+ # first CF400 gets the cheap refresh+retry. A recurrence within this window
49
+ # proves refresh isn't curing it, so we escalate to the browser flow.
50
+ CLOUDFLARE_REAUTH_WINDOW_SECONDS = 900.0 # 15 minutes
51
+
52
+ # Monotonic timestamp of the last Cloudflare-400 recovery attempt.
53
+ # Module-level: recurrence is a per-process pattern, not per-run.
54
+ _last_cloudflare_event_at: float = 0.0
55
+
37
56
  # Live-client token updaters, registered when a claude_code model is built.
38
57
  # Weak references: entries vanish automatically when a model is torn down
39
58
  # (the client holds the only strong ref to its updater closure).
@@ -101,6 +120,25 @@ def is_claude_auth_error(exc: BaseException) -> bool:
101
120
  return False
102
121
 
103
122
 
123
+ def is_cloudflare_error(exc: BaseException) -> bool:
124
+ """True when any link in the chain is specifically a Cloudflare 400."""
125
+ return any(
126
+ _is_cloudflare_400(link, _status_code_of(link))
127
+ for link in _iter_exception_chain(exc)
128
+ )
129
+
130
+
131
+ def _run_full_reauthentication(model_name: str) -> Optional[str]:
132
+ """Launch the interactive browser OAuth flow; returns a token or None.
133
+
134
+ Lazy import: register_callbacks imports this module at load time, so a
135
+ top-level import here would be circular.
136
+ """
137
+ from .register_callbacks import _reauthenticate_after_expired_oauth
138
+
139
+ return _reauthenticate_after_expired_oauth(model_name)
140
+
141
+
104
142
  async def handle_retryable_exception(
105
143
  exception: Exception, *args: Any, **kwargs: Any
106
144
  ) -> bool:
@@ -126,15 +164,45 @@ async def handle_retryable_exception(
126
164
  )
127
165
  return False
128
166
 
167
+ # Cloudflare 400s that keep recurring are not cured by refresh-token
168
+ # exchanges (field-proven); only a full interactive re-auth stops them.
169
+ global _last_cloudflare_event_at
170
+ if is_cloudflare_error(exception):
171
+ now = time.monotonic()
172
+ recurring = (
173
+ _last_cloudflare_event_at > 0
174
+ and (now - _last_cloudflare_event_at) < CLOUDFLARE_REAUTH_WINDOW_SECONDS
175
+ )
176
+ _last_cloudflare_event_at = now
177
+ if recurring:
178
+ emit_warning(
179
+ "Cloudflare keeps rejecting requests and token refresh isn't "
180
+ "curing it — escalating to full browser re-authentication…"
181
+ )
182
+ token = await asyncio.to_thread(_run_full_reauthentication, model_name)
183
+ if token:
184
+ _broadcast_token(token)
185
+ _last_cloudflare_event_at = 0.0 # cured; future CF400s start fresh
186
+ emit_info("Claude Code re-authentication complete; retrying.")
187
+ return True
188
+ emit_warning(
189
+ "Re-authentication did not produce a usable token. "
190
+ "Run /claude-code-auth manually."
191
+ )
192
+ return False
193
+
129
194
  emit_warning(
130
- "Claude Code OAuth rejected the request — refreshing token before the retry…"
195
+ "Claude Code OAuth rejected the request — ensuring a fresh token "
196
+ "before the retry…"
131
197
  )
132
198
 
133
199
  # refresh_access_token does blocking network I/O; keep the loop free.
200
+ # (It has a built-in cooldown: if a refresh just happened, it reuses the
201
+ # still-warm token instead of burning another refresh-token rotation.)
134
202
  refreshed = await asyncio.to_thread(refresh_access_token, True)
135
203
  if refreshed:
136
204
  _broadcast_token(refreshed)
137
- emit_info("Claude Code OAuth token refreshed.")
205
+ emit_info("Claude Code OAuth token ready; retrying.")
138
206
  else:
139
207
  # Still opt in: the HTTP client gets a fresh shot at recovery on the
140
208
  # next attempt (including its interactive reauthentication fallback).
@@ -26,6 +26,14 @@ from .config import (
26
26
  TOKEN_REFRESH_BUFFER_SECONDS = 300
27
27
  MIN_REFRESH_BUFFER_SECONDS = 30
28
28
 
29
+ # Cooldown for *forced* refreshes (seconds). Every refresh-token exchange
30
+ # rotates the refresh token; hammering the endpoint during a flappy episode
31
+ # (e.g. repeated Cloudflare 400s that a new token can't cure anyway) burns
32
+ # through rotations for nothing and risks invalidating the token family.
33
+ # If the stored tokens were refreshed within this window and are still
34
+ # valid, force=True short-circuits to the existing access token.
35
+ FORCE_REFRESH_COOLDOWN_SECONDS = 30
36
+
29
37
  logger = logging.getLogger(__name__)
30
38
 
31
39
 
@@ -213,6 +221,19 @@ def refresh_access_token(force: bool = False) -> Optional[str]:
213
221
  if not force and not is_token_expired(tokens):
214
222
  return tokens.get("access_token")
215
223
 
224
+ # Forced-refresh cooldown: a token minted seconds ago is as fresh as a
225
+ # new exchange would produce. Skip the rotation and reuse it.
226
+ if force and tokens.get("access_token") and not is_token_expired(tokens):
227
+ seconds_since_refresh = time.time() - float(tokens.get("refreshed_at") or 0)
228
+ if seconds_since_refresh < FORCE_REFRESH_COOLDOWN_SECONDS:
229
+ logger.info(
230
+ "Skipping forced token refresh (last refresh %.0fs ago, "
231
+ "cooldown %ds); reusing current access token",
232
+ seconds_since_refresh,
233
+ FORCE_REFRESH_COOLDOWN_SECONDS,
234
+ )
235
+ return tokens.get("access_token")
236
+
216
237
  refresh_token = tokens.get("refresh_token")
217
238
  if not refresh_token:
218
239
  logger.debug("No refresh_token available")
@@ -259,6 +280,7 @@ def refresh_access_token(force: bool = False) -> Optional[str]:
259
280
  if expires_in_value is not None:
260
281
  tokens["expires_in"] = expires_in_value
261
282
  tokens["expires_at"] = _calculate_expires_at(expires_in_value)
283
+ tokens["refreshed_at"] = time.time()
262
284
  if save_tokens(tokens):
263
285
  update_claude_code_model_tokens(tokens["access_token"])
264
286
  return tokens["access_token"]
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "code-puppy"
7
- version = "0.0.591"
7
+ version = "0.0.593"
8
8
  description = "Code generation agent"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11,<3.15"
File without changes
File without changes
File without changes