code-puppy 0.0.656__tar.gz → 0.0.657__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 (515) hide show
  1. {code_puppy-0.0.656 → code_puppy-0.0.657}/PKG-INFO +1 -1
  2. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/state.py +27 -8
  3. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_manager.py +159 -13
  4. {code_puppy-0.0.656 → code_puppy-0.0.657}/pyproject.toml +1 -1
  5. {code_puppy-0.0.656 → code_puppy-0.0.657}/.gitignore +0 -0
  6. {code_puppy-0.0.656 → code_puppy-0.0.657}/LICENSE +0 -0
  7. {code_puppy-0.0.656 → code_puppy-0.0.657}/README.md +0 -0
  8. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/__init__.py +0 -0
  9. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/__main__.py +0 -0
  10. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/__init__.py +0 -0
  11. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/_builder.py +0 -0
  12. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/_compaction.py +0 -0
  13. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/_diagnostics.py +0 -0
  14. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/_history.py +0 -0
  15. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/_key_listeners.py +0 -0
  16. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/_non_streaming_render.py +0 -0
  17. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/_run_signals.py +0 -0
  18. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/_runtime.py +0 -0
  19. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/_steer_processor.py +0 -0
  20. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/agent_code_puppy.py +0 -0
  21. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/agent_creator_agent.py +0 -0
  22. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/agent_helios.py +0 -0
  23. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/agent_manager.py +0 -0
  24. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/agent_planning.py +0 -0
  25. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/agent_qa_kitten.py +0 -0
  26. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/base_agent.py +0 -0
  27. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/event_stream_handler.py +0 -0
  28. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/json_agent.py +0 -0
  29. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/retry_profiles.py +0 -0
  30. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/run_stats.py +0 -0
  31. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/smooth_stream.py +0 -0
  32. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/subagent_stream_handler.py +0 -0
  33. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/callbacks.py +0 -0
  34. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/chatgpt_codex_client.py +0 -0
  35. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/claude_cache_client.py +0 -0
  36. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/cli_runner.py +0 -0
  37. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/__init__.py +0 -0
  38. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/add_model_menu.py +0 -0
  39. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/agent_menu.py +0 -0
  40. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/attachments.py +0 -0
  41. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/autosave_menu.py +0 -0
  42. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/autosave_search.py +0 -0
  43. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/clipboard.py +0 -0
  44. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/colors_menu.py +0 -0
  45. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/command_handler.py +0 -0
  46. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/command_registry.py +0 -0
  47. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/config_apply.py +0 -0
  48. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/config_commands.py +0 -0
  49. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/core_commands.py +0 -0
  50. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/diff_menu.py +0 -0
  51. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/file_index.py +0 -0
  52. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/file_path_completion.py +0 -0
  53. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/image_utils.py +0 -0
  54. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/judges_menu.py +0 -0
  55. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/load_context_completion.py +0 -0
  56. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/__init__.py +0 -0
  57. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/base.py +0 -0
  58. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
  59. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
  60. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
  61. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/edit_command.py +0 -0
  62. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/handler.py +0 -0
  63. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/help_command.py +0 -0
  64. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/install_command.py +0 -0
  65. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/install_menu.py +0 -0
  66. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/list_command.py +0 -0
  67. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/logs_command.py +0 -0
  68. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/remove_command.py +0 -0
  69. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/restart_command.py +0 -0
  70. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/search_command.py +0 -0
  71. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/silence_warning_command.py +0 -0
  72. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/start_all_command.py +0 -0
  73. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/start_command.py +0 -0
  74. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/status_command.py +0 -0
  75. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
  76. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/stop_command.py +0 -0
  77. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/trust_command.py +0 -0
  78. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/utils.py +0 -0
  79. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  80. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp_binding_menu.py +0 -0
  81. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp_completion.py +0 -0
  82. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/model_picker_completion.py +0 -0
  83. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/model_settings_menu.py +0 -0
  84. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/onboarding_slides.py +0 -0
  85. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/onboarding_wizard.py +0 -0
  86. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/pagination.py +0 -0
  87. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/pin_command_completion.py +0 -0
  88. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
  89. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/session_commands.py +0 -0
  90. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/set_menu.py +0 -0
  91. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_catalog.py +0 -0
  92. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_render.py +0 -0
  93. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_schema.py +0 -0
  94. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_settings.py +0 -0
  95. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_shims.py +0 -0
  96. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_values.py +0 -0
  97. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/shell_passthrough.py +0 -0
  98. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/skills_completion.py +0 -0
  99. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/uc_menu.py +0 -0
  100. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/utils.py +0 -0
  101. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/wiggum_state.py +0 -0
  102. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/config.py +0 -0
  103. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/error_logging.py +0 -0
  104. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/gemini_code_assist.py +0 -0
  105. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/gemini_model.py +0 -0
  106. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/hook_engine/README.md +0 -0
  107. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/hook_engine/__init__.py +0 -0
  108. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/hook_engine/aliases.py +0 -0
  109. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/hook_engine/engine.py +0 -0
  110. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/hook_engine/executor.py +0 -0
  111. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/hook_engine/matcher.py +0 -0
  112. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/hook_engine/models.py +0 -0
  113. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/hook_engine/registry.py +0 -0
  114. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/hook_engine/validator.py +0 -0
  115. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/http_utils.py +0 -0
  116. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/__init__.py +0 -0
  117. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/audit.py +0 -0
  118. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/catalog.py +0 -0
  119. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/formats.py +0 -0
  120. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/locale.py +0 -0
  121. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/locales/en-US.json +0 -0
  122. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/locales/es-AR.json +0 -0
  123. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/locales/es-CL.json +0 -0
  124. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/locales/es-CO.json +0 -0
  125. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/locales/es-MX.json +0 -0
  126. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/locales/es.json +0 -0
  127. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/locales/fr-CA.json +0 -0
  128. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/plurals.py +0 -0
  129. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/pseudo.py +0 -0
  130. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/translate.py +0 -0
  131. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/keymap.py +0 -0
  132. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/list_filtering.py +0 -0
  133. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/main.py +0 -0
  134. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/__init__.py +0 -0
  135. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/agent_bindings.py +0 -0
  136. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/async_lifecycle.py +0 -0
  137. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/blocking_startup.py +0 -0
  138. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/captured_stdio_server.py +0 -0
  139. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/circuit_breaker.py +0 -0
  140. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/config_wizard.py +0 -0
  141. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/dashboard.py +0 -0
  142. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/error_isolation.py +0 -0
  143. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/examples/retry_example.py +0 -0
  144. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/health_monitor.py +0 -0
  145. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/managed_server.py +0 -0
  146. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/manager.py +0 -0
  147. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/mcp_logs.py +0 -0
  148. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/project_config.py +0 -0
  149. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/registry.py +0 -0
  150. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/retry_manager.py +0 -0
  151. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/server_registry_catalog.py +0 -0
  152. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/status_tracker.py +0 -0
  153. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/system_tools.py +0 -0
  154. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/tool_arg_coercion.py +0 -0
  155. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_prompts/__init__.py +0 -0
  156. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_prompts/hook_creator.py +0 -0
  157. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/__init__.py +0 -0
  158. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/bar_painters.py +0 -0
  159. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/bar_rendering.py +0 -0
  160. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/bottom_bar.py +0 -0
  161. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/bus.py +0 -0
  162. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/chords.py +0 -0
  163. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/commands.py +0 -0
  164. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/editor_actions.py +0 -0
  165. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/editor_completion.py +0 -0
  166. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/editor_display.py +0 -0
  167. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/editor_history.py +0 -0
  168. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/editor_keys.py +0 -0
  169. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/editor_paste.py +0 -0
  170. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/external_editor.py +0 -0
  171. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/inline_bar.py +0 -0
  172. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/line_editor.py +0 -0
  173. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/markdown_patches.py +0 -0
  174. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/message_queue.py +0 -0
  175. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/messages.py +0 -0
  176. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/pause_controller.py +0 -0
  177. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/prompt_prefix_style.py +0 -0
  178. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/queue_console.py +0 -0
  179. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/renderers.py +0 -0
  180. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/rich_renderer.py +0 -0
  181. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/run_ui.py +0 -0
  182. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/run_ui_wiring.py +0 -0
  183. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/spinner/__init__.py +0 -0
  184. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/subagent_console.py +0 -0
  185. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/transcript_guard.py +0 -0
  186. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/model_descriptions.py +0 -0
  187. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/model_factory.py +0 -0
  188. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/model_switching.py +0 -0
  189. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/model_utils.py +0 -0
  190. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/models.json +0 -0
  191. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/models_dev_api.json +0 -0
  192. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/models_dev_parser.py +0 -0
  193. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/__init__.py +0 -0
  194. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/README.md +0 -0
  195. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/__init__.py +0 -0
  196. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/agent.py +0 -0
  197. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/bridge.py +0 -0
  198. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/capabilities.py +0 -0
  199. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/commands.py +0 -0
  200. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/content.py +0 -0
  201. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/io_delegation.py +0 -0
  202. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/mcp_config.py +0 -0
  203. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/permissions.py +0 -0
  204. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/persistence.py +0 -0
  205. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/register_callbacks.py +0 -0
  206. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/replay.py +0 -0
  207. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/session.py +0 -0
  208. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/session_config.py +0 -0
  209. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/state.py +0 -0
  210. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/__init__.py +0 -0
  211. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/config.py +0 -0
  212. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/discovery.py +0 -0
  213. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/downloader.py +0 -0
  214. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/enabled_skills.py +0 -0
  215. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/installer.py +0 -0
  216. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/metadata.py +0 -0
  217. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/prompt_builder.py +0 -0
  218. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/register_callbacks.py +0 -0
  219. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/remote_catalog.py +0 -0
  220. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/skill_catalog.py +0 -0
  221. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/skill_commands.py +0 -0
  222. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/skills_install_menu.py +0 -0
  223. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/skills_menu.py +0 -0
  224. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/aws_bedrock/__init__.py +0 -0
  225. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/aws_bedrock/config.py +0 -0
  226. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/aws_bedrock/register_callbacks.py +0 -0
  227. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/aws_bedrock/utils.py +0 -0
  228. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/README.md +0 -0
  229. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/__init__.py +0 -0
  230. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/config.py +0 -0
  231. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/discovery.py +0 -0
  232. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/register_callbacks.py +0 -0
  233. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/token.py +0 -0
  234. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/utils.py +0 -0
  235. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/btw/__init__.py +0 -0
  236. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/btw/inline_view.py +0 -0
  237. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/btw/register_callbacks.py +0 -0
  238. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/btw/side_query.py +0 -0
  239. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
  240. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
  241. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
  242. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/image_generation.py +0 -0
  243. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/image_tool.py +0 -0
  244. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
  245. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +0 -0
  246. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +0 -0
  247. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/usage.py +0 -0
  248. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/utils.py +0 -0
  249. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_hooks/__init__.py +0 -0
  250. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_hooks/config.py +0 -0
  251. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_hooks/register_callbacks.py +0 -0
  252. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
  253. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
  254. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
  255. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
  256. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/fast_mode.py +0 -0
  257. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/prompt_handler.py +0 -0
  258. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +0 -0
  259. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/test_fast_mode.py +0 -0
  260. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
  261. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  262. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/utils.py +0 -0
  263. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/code_puppy_agent/SKILL.md +0 -0
  264. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/code_puppy_agent/__init__.py +0 -0
  265. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/code_puppy_agent/register_callbacks.py +0 -0
  266. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/config.py +0 -0
  267. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/context_indicator/__init__.py +0 -0
  268. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/context_indicator/register_callbacks.py +0 -0
  269. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/context_indicator/usage.py +0 -0
  270. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/__init__.py +0 -0
  271. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/config.py +0 -0
  272. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/reasoning_client.py +0 -0
  273. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/register_callbacks.py +0 -0
  274. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/utils.py +0 -0
  275. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
  276. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
  277. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/__init__.py +0 -0
  278. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/cancel.py +0 -0
  279. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/commands.py +0 -0
  280. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/config.py +0 -0
  281. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/lifecycle.py +0 -0
  282. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/register_callbacks.py +0 -0
  283. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/runtime.py +0 -0
  284. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/startup_lock.py +0 -0
  285. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/workflow_ids.py +0 -0
  286. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/wrapper.py +0 -0
  287. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/destructive_command_guard/__init__.py +0 -0
  288. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/destructive_command_guard/detector.py +0 -0
  289. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/destructive_command_guard/register_callbacks.py +0 -0
  290. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/emoji_filter/__init__.py +0 -0
  291. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/emoji_filter/config.py +0 -0
  292. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/emoji_filter/register_callbacks.py +0 -0
  293. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/emoji_filter/stripper.py +0 -0
  294. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/empty_html_comment_filter/register_callbacks.py +0 -0
  295. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/example_custom_command/README.md +0 -0
  296. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
  297. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
  298. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
  299. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/__init__.py +0 -0
  300. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
  301. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
  302. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
  303. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
  304. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
  305. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
  306. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
  307. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
  308. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
  309. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
  310. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
  311. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
  312. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
  313. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
  314. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
  315. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
  316. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
  317. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
  318. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
  319. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
  320. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
  321. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
  322. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
  323. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
  324. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
  325. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/installer.py +0 -0
  326. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/register_callbacks.py +0 -0
  327. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/force_push_guard/__init__.py +0 -0
  328. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/force_push_guard/detector.py +0 -0
  329. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/force_push_guard/register_callbacks.py +0 -0
  330. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/force_push_guard/test_detector.py +0 -0
  331. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/fork/__init__.py +0 -0
  332. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/fork/register_callbacks.py +0 -0
  333. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/frontend_emitter/__init__.py +0 -0
  334. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/frontend_emitter/emitter.py +0 -0
  335. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/frontend_emitter/register_callbacks.py +0 -0
  336. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/frontend_emitter/session_context.py +0 -0
  337. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/__init__.py +0 -0
  338. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/config.py +0 -0
  339. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/oauth_flow.py +0 -0
  340. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/register_callbacks.py +0 -0
  341. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/test_plugin.py +0 -0
  342. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/utils.py +0 -0
  343. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/herdr/README.md +0 -0
  344. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/herdr/__init__.py +0 -0
  345. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/herdr/client.py +0 -0
  346. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/herdr/register_callbacks.py +0 -0
  347. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/herdr/reporter.py +0 -0
  348. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/hook_creator/__init__.py +0 -0
  349. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/hook_creator/register_callbacks.py +0 -0
  350. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/hook_manager/__init__.py +0 -0
  351. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/hook_manager/config.py +0 -0
  352. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/hook_manager/hooks_menu.py +0 -0
  353. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/hook_manager/register_callbacks.py +0 -0
  354. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/no_tools/__init__.py +0 -0
  355. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/no_tools/register_callbacks.py +0 -0
  356. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/oauth_pasteback.py +0 -0
  357. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/oauth_puppy_html.py +0 -0
  358. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/obsidian_agent/README.md +0 -0
  359. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/obsidian_agent/__init__.py +0 -0
  360. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/obsidian_agent/agent_obsidian.py +0 -0
  361. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/obsidian_agent/register_callbacks.py +0 -0
  362. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/ollama/__init__.py +0 -0
  363. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/ollama/register_callbacks.py +0 -0
  364. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/ollama_setup/__init__.py +0 -0
  365. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/ollama_setup/completer.py +0 -0
  366. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/ollama_setup/register_callbacks.py +0 -0
  367. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/__init__.py +0 -0
  368. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugin_contributions.py +0 -0
  369. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugin_meta.py +0 -0
  370. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugin_text_utils.py +0 -0
  371. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugins_menu.py +0 -0
  372. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugins_menu_layout.py +0 -0
  373. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugins_menu_render.py +0 -0
  374. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/project_trust_flow.py +0 -0
  375. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/register_callbacks.py +0 -0
  376. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/pop_command/__init__.py +0 -0
  377. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/pop_command/register_callbacks.py +0 -0
  378. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/prompt_newline/__init__.py +0 -0
  379. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/prompt_newline/config.py +0 -0
  380. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/prompt_newline/register_callbacks.py +0 -0
  381. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/prune/__init__.py +0 -0
  382. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/prune/prune_menu.py +0 -0
  383. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/prune/prune_model.py +0 -0
  384. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/prune/prune_render.py +0 -0
  385. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/prune/register_callbacks.py +0 -0
  386. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/README.md +0 -0
  387. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/__init__.py +0 -0
  388. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/commands.py +0 -0
  389. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/config.py +0 -0
  390. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/kennel.py +0 -0
  391. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/packer.py +0 -0
  392. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/recorder.py +0 -0
  393. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/register_callbacks.py +0 -0
  394. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/retriever.py +0 -0
  395. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/schema.py +0 -0
  396. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/state.py +0 -0
  397. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/tools.py +0 -0
  398. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/wings.py +0 -0
  399. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/README.md +0 -0
  400. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/__init__.py +0 -0
  401. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/builtin_frames.py +0 -0
  402. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/commands.py +0 -0
  403. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/picker.py +0 -0
  404. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/register_callbacks.py +0 -0
  405. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/spinners.py +0 -0
  406. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/quick_resume/__init__.py +0 -0
  407. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/quick_resume/register_callbacks.py +0 -0
  408. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/review_pr/__init__.py +0 -0
  409. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/review_pr/register_callbacks.py +0 -0
  410. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/shell_safety/__init__.py +0 -0
  411. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
  412. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
  413. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
  414. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/stack_dump/__init__.py +0 -0
  415. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/stack_dump/register_callbacks.py +0 -0
  416. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/statusline/__init__.py +0 -0
  417. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/statusline/config.py +0 -0
  418. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/statusline/payload.py +0 -0
  419. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/statusline/prompt_patch.py +0 -0
  420. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/statusline/register_callbacks.py +0 -0
  421. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/statusline/runner.py +0 -0
  422. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/statusline/statusline_command.py +0 -0
  423. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/steer_queue/__init__.py +0 -0
  424. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/steer_queue/queue_menu.py +0 -0
  425. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/steer_queue/register_callbacks.py +0 -0
  426. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/README.md +0 -0
  427. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/__init__.py +0 -0
  428. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/coalesce_patch.py +0 -0
  429. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/panel_render.py +0 -0
  430. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/register_callbacks.py +0 -0
  431. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/resume_repaint.py +0 -0
  432. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/switch_agent_resume/__init__.py +0 -0
  433. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/switch_agent_resume/register_callbacks.py +0 -0
  434. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/README.md +0 -0
  435. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/__init__.py +0 -0
  436. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/bundled_palettes.py +0 -0
  437. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/content_styles.py +0 -0
  438. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/osc_palette.py +0 -0
  439. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/picker.py +0 -0
  440. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/prompt_toolkit_theme.py +0 -0
  441. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/register_callbacks.py +0 -0
  442. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/rich_themes.py +0 -0
  443. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/themes.py +0 -0
  444. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/token_ratio_learner/__init__.py +0 -0
  445. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/token_ratio_learner/ratios.py +0 -0
  446. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/token_ratio_learner/register_callbacks.py +0 -0
  447. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/trust.py +0 -0
  448. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/trust_notice.py +0 -0
  449. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/__init__.py +0 -0
  450. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/models.py +0 -0
  451. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/register_callbacks.py +0 -0
  452. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/registry.py +0 -0
  453. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/sandbox.py +0 -0
  454. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/wide_completion_menu/__init__.py +0 -0
  455. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/wide_completion_menu/register_callbacks.py +0 -0
  456. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/__init__.py +0 -0
  457. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/judge.py +0 -0
  458. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/judge_config.py +0 -0
  459. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/register_callbacks.py +0 -0
  460. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/state.py +0 -0
  461. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/yolo_cli/__init__.py +0 -0
  462. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/yolo_cli/register_callbacks.py +0 -0
  463. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/provider_credentials.py +0 -0
  464. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/provider_identity.py +0 -0
  465. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/pydantic_patches.py +0 -0
  466. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/reopenable_async_client.py +0 -0
  467. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/round_robin_model.py +0 -0
  468. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/secret_store.py +0 -0
  469. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/secret_store_backends.py +0 -0
  470. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/session_lifecycle.py +0 -0
  471. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/session_migration.py +0 -0
  472. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/session_storage.py +0 -0
  473. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/status_display.py +0 -0
  474. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/summarization_agent.py +0 -0
  475. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/terminal_utils.py +0 -0
  476. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/__init__.py +0 -0
  477. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/agent_tools.py +0 -0
  478. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/__init__.py +0 -0
  479. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/constants.py +0 -0
  480. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/demo_tui.py +0 -0
  481. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/handler.py +0 -0
  482. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/models.py +0 -0
  483. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/registration.py +0 -0
  484. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/renderers.py +0 -0
  485. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/terminal_ui.py +0 -0
  486. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/theme.py +0 -0
  487. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/tui_loop.py +0 -0
  488. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/__init__.py +0 -0
  489. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_control.py +0 -0
  490. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_interactions.py +0 -0
  491. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_locator_resolver.py +0 -0
  492. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_locators.py +0 -0
  493. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_navigation.py +0 -0
  494. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_page_snapshot.py +0 -0
  495. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_screenshot.py +0 -0
  496. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_scripts.py +0 -0
  497. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_semantic_interactions.py +0 -0
  498. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_workflows.py +0 -0
  499. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/command_runner.py +0 -0
  500. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/common.py +0 -0
  501. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/display.py +0 -0
  502. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/file_modifications.py +0 -0
  503. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/file_operations.py +0 -0
  504. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/fs_access.py +0 -0
  505. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/image_tools.py +0 -0
  506. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/io_backends.py +0 -0
  507. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/model_tools.py +0 -0
  508. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/shell_backgrounding.py +0 -0
  509. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/skills_tools.py +0 -0
  510. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/subagent_context.py +0 -0
  511. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/subagent_invocation.py +0 -0
  512. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/tools_content.py +0 -0
  513. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/universal_constructor.py +0 -0
  514. {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/undo_manager.py +0 -0
  515. {code_puppy-0.0.656 → code_puppy-0.0.657}/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.656
3
+ Version: 0.0.657
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
@@ -147,25 +147,44 @@ def snapshot() -> List[Dict[str, Any]]:
147
147
  PARENTS are never idle-pruned either: a parent that has invoked children and
148
148
  is merely AWAITING them emits no stream events of its own, so its last_seen
149
149
  goes stale -- but it is busy, not idle. Pruning it would orphan its whole
150
- subtree, making the children re-render as depth-0 roots. So only childless,
151
- not-done, genuinely-stale leaves are eligible. End-of-turn state.clear() is
152
- the real cleanup for anything that errors/cancels without flushing.
150
+ subtree, making the children re-render as depth-0 roots.
151
+
152
+ ROOT rows (parent=None) are never idle-pruned either. A root is the visible
153
+ anchor of a live user-initiated ``invoke_agent`` call; silently deleting it
154
+ while its work is still in flight (e.g. a slow tool call that emits no
155
+ stream events for many minutes) would strand any completed sibling in state
156
+ with no flush trigger, and hide from the user that a real invocation is
157
+ still running. Roots exit via one of three legitimate paths only:
158
+ completion (``_handle_frozen`` -> ``mark_done`` -> ``_maybe_flush_group``),
159
+ cancel (``state.clear()`` from ``_on_agent_run_cancel``), or end-of-turn
160
+ (``state.clear()`` from ``_on_agent_run_end``).
161
+
162
+ So only childless, not-done, genuinely-stale ORPHAN LEAVES are eligible --
163
+ a non-root row whose parent is no longer in the tree AND has been silent
164
+ longer than IDLE_PRUNE_S. End-of-turn ``state.clear()`` remains the real
165
+ cleanup for anything that errors/cancels without flushing.
153
166
  """
154
167
  now = time.time()
155
168
  with _LOCK:
156
169
  ids = set(_AGENTS)
157
170
  # session_ids still referenced as someone's parent == busy (awaiting kids).
158
171
  busy_parents = {e.get("parent") for e in _AGENTS.values() if e.get("parent")}
159
- # Only prune entries DISCONNECTED from the live tree: not a parent of
160
- # anything AND whose own parent is gone (or is 'main', i.e. a root).
161
- # Anything still wired into a tree (busy parents + their descendants)
162
- # is kept until flush/turn-end, so a quiet-but-running node (e.g. a leaf
163
- # mid `sleep`) never vanishes and never orphans its siblings.
172
+ # Prune entries that are ALL of:
173
+ # - not done
174
+ # - not a parent of anything (else pruning orphans their subtree)
175
+ # - NOT a root (parent is not None) -- roots have explicit lifecycle
176
+ # handling; silent idle-eviction of a live root is never correct
177
+ # (see docstring). Without this guard, a childless root awaiting a
178
+ # slow tool would be misclassified as a disconnected orphan because
179
+ # ``None not in ids`` trivially holds.
180
+ # - whose own parent is gone from the tree (a true orphan)
181
+ # - has been silent longer than IDLE_PRUNE_S
164
182
  stale = [
165
183
  s
166
184
  for s, e in _AGENTS.items()
167
185
  if not e.get("done")
168
186
  and s not in busy_parents
187
+ and e.get("parent") is not None
169
188
  and e.get("parent") not in ids
170
189
  and now - e["last_seen"] > IDLE_PRUNE_S
171
190
  ]
@@ -6,6 +6,7 @@ Supports multiple simultaneous instances with unique profile directories.
6
6
  import asyncio
7
7
  import atexit
8
8
  import contextvars
9
+ import math
9
10
  import os
10
11
  from pathlib import Path
11
12
  from typing import Callable, Dict, Optional
@@ -47,6 +48,42 @@ def _load_plugin_browser_types() -> None:
47
48
  # Store active manager instances by session ID
48
49
  _active_managers: dict[str, "BrowserManager"] = {}
49
50
 
51
+
52
+ # --------------------------------------------------------------------------- #
53
+ # Cleanup timeouts
54
+ #
55
+ # Playwright teardown awaits (``context.close``, ``browser.close``,
56
+ # ``playwright.stop``, ``storage_state``) have no internal timeout and can wedge
57
+ # indefinitely when: a page holds an unhandled ``beforeunload`` dialog, a service
58
+ # worker never releases its WebLock, the browser subprocess crashed but did not
59
+ # exit, or the CDP WebSocket went stale (e.g. laptop slept mid-run). Each step
60
+ # below is wrapped in ``asyncio.wait_for`` with a per-step budget so
61
+ # ``_cleanup()`` always returns in bounded time regardless of Playwright state.
62
+ #
63
+ # Overrides are env-var driven so users can bump the budgets on slow machines
64
+ # without a code change. Values are seconds (float, must be finite and > 0 --
65
+ # ``inf``/``nan`` are rejected and fall back to the default).
66
+ # --------------------------------------------------------------------------- #
67
+ def _env_float(name: str, default: float) -> float:
68
+ """Parse a finite positive float from ``os.environ``; fall back on any parse error."""
69
+ raw = os.environ.get(name)
70
+ if not raw:
71
+ return default
72
+ try:
73
+ value = float(raw)
74
+ except ValueError:
75
+ return default
76
+ if not math.isfinite(value) or value <= 0:
77
+ return default
78
+ return value
79
+
80
+
81
+ _STATE_TIMEOUT_S = _env_float("BROWSER_CLEANUP_STATE_TIMEOUT_S", 10.0)
82
+ _CONTEXT_TIMEOUT_S = _env_float("BROWSER_CLEANUP_CONTEXT_TIMEOUT_S", 10.0)
83
+ _BROWSER_TIMEOUT_S = _env_float("BROWSER_CLEANUP_BROWSER_TIMEOUT_S", 5.0)
84
+ _PW_TIMEOUT_S = _env_float("BROWSER_CLEANUP_PW_TIMEOUT_S", 5.0)
85
+
86
+
50
87
  # Context variable for browser session - properly inherits through async tasks
51
88
  # This allows parallel agent invocations to each have their own browser instance
52
89
  _browser_session_var: contextvars.ContextVar[Optional[str]] = contextvars.ContextVar(
@@ -184,6 +221,10 @@ class BrowserManager:
184
221
  emit_info(f"Using persistent profile: {self.profile_dir}")
185
222
 
186
223
  pw = await async_playwright().start()
224
+ # Track the driver instance so ``_cleanup`` can ``.stop()`` it (and,
225
+ # if it hangs, SIGKILL the driver subprocess). Without this reference
226
+ # the node driver leaks until Python GC eventually reaps it.
227
+ self._playwright = pw
187
228
  # Use persistent context directory for Chromium to preserve browser state
188
229
  context = await pw.chromium.launch_persistent_context(
189
230
  user_data_dir=str(self.profile_dir), headless=self.headless
@@ -230,43 +271,148 @@ class BrowserManager:
230
271
  async def _cleanup(self, silent: bool = False) -> None:
231
272
  """Clean up browser resources and save persistent state.
232
273
 
274
+ Every underlying await is bounded by ``asyncio.wait_for`` -- Playwright
275
+ teardown can otherwise wedge indefinitely on unresponsive service
276
+ workers, unhandled ``beforeunload`` prompts, or stale CDP WebSockets.
277
+ If ``playwright.stop()`` times out we escalate to SIGKILL on the node
278
+ driver subprocess, which transitively reaps the browser process (its
279
+ child) so we never leak processes even when CDP is completely wedged.
280
+
233
281
  Args:
234
- silent: If True, suppress all errors (used during shutdown).
282
+ silent: If True, suppress ALL user-facing warnings/info emits (used
283
+ during shutdown/atexit). Timeouts and errors still occur, they
284
+ just don't spam the console.
235
285
  """
286
+ _emit_warning = (lambda _msg: None) if silent else emit_warning
287
+ _emit_success = (lambda _msg: None) if silent else emit_success
288
+
236
289
  try:
237
- # Save browser state before closing (cookies, localStorage, etc.)
290
+ # Save browser state before closing (cookies, localStorage, etc.).
238
291
  if self._context:
292
+ storage_state_path = self.profile_dir / "storage_state.json"
239
293
  try:
240
- storage_state_path = self.profile_dir / "storage_state.json"
241
- await self._context.storage_state(path=str(storage_state_path))
242
- if not silent:
243
- emit_success(f"Browser state saved to {storage_state_path}")
294
+ await asyncio.wait_for(
295
+ self._context.storage_state(path=str(storage_state_path)),
296
+ timeout=_STATE_TIMEOUT_S,
297
+ )
298
+ _emit_success(f"Browser state saved to {storage_state_path}")
299
+ except asyncio.TimeoutError:
300
+ _emit_warning(
301
+ f"Timed out ({_STATE_TIMEOUT_S:g}s) saving browser state; "
302
+ "proceeding with teardown"
303
+ )
244
304
  except Exception as e:
245
- if not silent:
246
- emit_warning(f"Could not save storage state: {e}")
305
+ _emit_warning(f"Could not save storage state: {e}")
306
+
307
+ # Auto-dismiss any beforeunload dialog Playwright might raise during
308
+ # context.close(). Without this, a page that registered a
309
+ # ``beforeunload`` handler causes context.close() to await a
310
+ # dialog handler that was never installed -> hang.
311
+ if self._context:
312
+ self._install_dialog_dismisser(silent=silent)
247
313
 
314
+ # Close the browser context.
315
+ if self._context:
248
316
  try:
249
- await self._context.close()
317
+ await asyncio.wait_for(
318
+ self._context.close(), timeout=_CONTEXT_TIMEOUT_S
319
+ )
320
+ except asyncio.TimeoutError:
321
+ _emit_warning(
322
+ f"Timed out ({_CONTEXT_TIMEOUT_S:g}s) closing browser context; "
323
+ "deferring to later driver cleanup"
324
+ )
250
325
  except Exception:
251
- pass # Ignore errors during context close
326
+ pass # Ignore other errors during context close
252
327
  self._context = None
253
328
 
329
+ # Close the browser. If it wedges (unresponsive CDP), we can only
330
+ # emit a warning here -- current Python Playwright does NOT expose
331
+ # a subprocess handle on ``Browser``. The browser process is a
332
+ # child of the node driver, so ``_force_kill_playwright_process``
333
+ # below transitively reaps it via SIGKILL to the parent driver.
254
334
  if self._browser:
255
335
  try:
256
- await self._browser.close()
336
+ await asyncio.wait_for(
337
+ self._browser.close(), timeout=_BROWSER_TIMEOUT_S
338
+ )
339
+ except asyncio.TimeoutError:
340
+ _emit_warning(
341
+ f"Timed out ({_BROWSER_TIMEOUT_S:g}s) closing browser; "
342
+ "deferring to driver-process kill below"
343
+ )
257
344
  except Exception:
258
- pass # Ignore errors during browser close
345
+ pass # Ignore other errors during browser close
259
346
  self._browser = None
260
347
 
348
+ # Stop the playwright driver subprocess.
349
+ if getattr(self, "_playwright", None):
350
+ try:
351
+ await asyncio.wait_for(
352
+ self._playwright.stop(), timeout=_PW_TIMEOUT_S
353
+ )
354
+ except asyncio.TimeoutError:
355
+ _emit_warning(
356
+ f"Timed out ({_PW_TIMEOUT_S:g}s) stopping playwright driver; "
357
+ "killing subprocess"
358
+ )
359
+ self._force_kill_playwright_process(silent=silent)
360
+ except Exception:
361
+ pass
362
+ self._playwright = None
363
+
261
364
  self._initialized = False
262
365
 
263
366
  # Remove from active managers
264
367
  if self.session_id in _active_managers:
265
368
  del _active_managers[self.session_id]
266
369
 
370
+ except Exception as e:
371
+ _emit_warning(f"Warning during cleanup: {e}")
372
+
373
+ def _install_dialog_dismisser(self, silent: bool = False) -> None:
374
+ """Attach an auto-dismiss dialog handler to every open page.
375
+
376
+ Playwright blocks on unhandled ``beforeunload`` dialogs during
377
+ ``context.close()``. Best-effort: iterate pages, ignore per-page
378
+ failures (a closed page raises when you touch it).
379
+ """
380
+ if not self._context:
381
+ return
382
+ try:
383
+ pages = self._context.pages
384
+ except Exception:
385
+ return
386
+ for page in pages:
387
+ try:
388
+ page.on("dialog", lambda d: asyncio.ensure_future(d.dismiss()))
389
+ except Exception as e:
390
+ if not silent:
391
+ emit_warning(f"Could not install dialog handler: {e}")
392
+
393
+ def _force_kill_playwright_process(self, silent: bool = False) -> None:
394
+ """Force-kill the Playwright node driver subprocess.
395
+
396
+ The browser process is a child of this driver, so a SIGKILL here
397
+ transitively reaps the whole browser tree -- our only reliable escape
398
+ hatch when CDP has gone unresponsive.
399
+
400
+ Attribute path: ``_playwright._impl_obj._connection._transport._proc``.
401
+ This is a private API but has been stable across Playwright releases
402
+ (verified against 1.61.0). If any hop in the chain moves, we no-op
403
+ rather than raise (best-effort).
404
+ """
405
+ impl = getattr(self._playwright, "_impl_obj", None)
406
+ connection = getattr(impl, "_connection", None)
407
+ transport = getattr(connection, "_transport", None)
408
+ proc = getattr(transport, "_proc", None)
409
+ if proc is None:
410
+ return
411
+ try:
412
+ proc.kill()
267
413
  except Exception as e:
268
414
  if not silent:
269
- emit_warning(f"Warning during cleanup: {e}")
415
+ emit_warning(f"Could not kill playwright driver process: {e}")
270
416
 
271
417
  async def close(self) -> None:
272
418
  """Close the browser and clean up resources."""
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "code-puppy"
7
- version = "0.0.656"
7
+ version = "0.0.657"
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