code-puppy 0.0.655__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.655 → code_puppy-0.0.657}/PKG-INFO +1 -1
  2. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/config_apply.py +1 -0
  3. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/config_commands.py +4 -4
  4. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/model_settings_menu.py +3 -44
  5. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_catalog.py +0 -17
  6. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/config.py +4 -79
  7. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/model_factory.py +11 -9
  8. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/state.py +27 -8
  9. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_manager.py +159 -13
  10. {code_puppy-0.0.655 → code_puppy-0.0.657}/pyproject.toml +1 -1
  11. {code_puppy-0.0.655 → code_puppy-0.0.657}/.gitignore +0 -0
  12. {code_puppy-0.0.655 → code_puppy-0.0.657}/LICENSE +0 -0
  13. {code_puppy-0.0.655 → code_puppy-0.0.657}/README.md +0 -0
  14. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/__init__.py +0 -0
  15. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/__main__.py +0 -0
  16. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/__init__.py +0 -0
  17. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/_builder.py +0 -0
  18. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/_compaction.py +0 -0
  19. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/_diagnostics.py +0 -0
  20. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/_history.py +0 -0
  21. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/_key_listeners.py +0 -0
  22. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/_non_streaming_render.py +0 -0
  23. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/_run_signals.py +0 -0
  24. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/_runtime.py +0 -0
  25. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/_steer_processor.py +0 -0
  26. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/agent_code_puppy.py +0 -0
  27. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/agent_creator_agent.py +0 -0
  28. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/agent_helios.py +0 -0
  29. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/agent_manager.py +0 -0
  30. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/agent_planning.py +0 -0
  31. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/agent_qa_kitten.py +0 -0
  32. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/base_agent.py +0 -0
  33. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/event_stream_handler.py +0 -0
  34. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/json_agent.py +0 -0
  35. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/retry_profiles.py +0 -0
  36. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/run_stats.py +0 -0
  37. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/smooth_stream.py +0 -0
  38. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/subagent_stream_handler.py +0 -0
  39. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/callbacks.py +0 -0
  40. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/chatgpt_codex_client.py +0 -0
  41. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/claude_cache_client.py +0 -0
  42. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/cli_runner.py +0 -0
  43. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/__init__.py +0 -0
  44. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/add_model_menu.py +0 -0
  45. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/agent_menu.py +0 -0
  46. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/attachments.py +0 -0
  47. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/autosave_menu.py +0 -0
  48. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/autosave_search.py +0 -0
  49. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/clipboard.py +0 -0
  50. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/colors_menu.py +0 -0
  51. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/command_handler.py +0 -0
  52. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/command_registry.py +0 -0
  53. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/core_commands.py +0 -0
  54. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/diff_menu.py +0 -0
  55. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/file_index.py +0 -0
  56. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/file_path_completion.py +0 -0
  57. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/image_utils.py +0 -0
  58. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/judges_menu.py +0 -0
  59. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/load_context_completion.py +0 -0
  60. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/__init__.py +0 -0
  61. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/base.py +0 -0
  62. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
  63. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
  64. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
  65. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/edit_command.py +0 -0
  66. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/handler.py +0 -0
  67. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/help_command.py +0 -0
  68. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/install_command.py +0 -0
  69. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/install_menu.py +0 -0
  70. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/list_command.py +0 -0
  71. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/logs_command.py +0 -0
  72. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/remove_command.py +0 -0
  73. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/restart_command.py +0 -0
  74. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/search_command.py +0 -0
  75. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/silence_warning_command.py +0 -0
  76. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/start_all_command.py +0 -0
  77. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/start_command.py +0 -0
  78. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/status_command.py +0 -0
  79. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
  80. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/stop_command.py +0 -0
  81. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/trust_command.py +0 -0
  82. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/utils.py +0 -0
  83. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  84. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp_binding_menu.py +0 -0
  85. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp_completion.py +0 -0
  86. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/model_picker_completion.py +0 -0
  87. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/onboarding_slides.py +0 -0
  88. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/onboarding_wizard.py +0 -0
  89. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/pagination.py +0 -0
  90. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/pin_command_completion.py +0 -0
  91. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
  92. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/session_commands.py +0 -0
  93. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/set_menu.py +0 -0
  94. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_render.py +0 -0
  95. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_schema.py +0 -0
  96. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_settings.py +0 -0
  97. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_shims.py +0 -0
  98. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_values.py +0 -0
  99. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/shell_passthrough.py +0 -0
  100. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/skills_completion.py +0 -0
  101. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/uc_menu.py +0 -0
  102. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/utils.py +0 -0
  103. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/wiggum_state.py +0 -0
  104. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/error_logging.py +0 -0
  105. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/gemini_code_assist.py +0 -0
  106. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/gemini_model.py +0 -0
  107. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/hook_engine/README.md +0 -0
  108. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/hook_engine/__init__.py +0 -0
  109. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/hook_engine/aliases.py +0 -0
  110. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/hook_engine/engine.py +0 -0
  111. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/hook_engine/executor.py +0 -0
  112. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/hook_engine/matcher.py +0 -0
  113. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/hook_engine/models.py +0 -0
  114. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/hook_engine/registry.py +0 -0
  115. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/hook_engine/validator.py +0 -0
  116. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/http_utils.py +0 -0
  117. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/__init__.py +0 -0
  118. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/audit.py +0 -0
  119. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/catalog.py +0 -0
  120. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/formats.py +0 -0
  121. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/locale.py +0 -0
  122. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/locales/en-US.json +0 -0
  123. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/locales/es-AR.json +0 -0
  124. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/locales/es-CL.json +0 -0
  125. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/locales/es-CO.json +0 -0
  126. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/locales/es-MX.json +0 -0
  127. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/locales/es.json +0 -0
  128. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/locales/fr-CA.json +0 -0
  129. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/plurals.py +0 -0
  130. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/pseudo.py +0 -0
  131. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/translate.py +0 -0
  132. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/keymap.py +0 -0
  133. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/list_filtering.py +0 -0
  134. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/main.py +0 -0
  135. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/__init__.py +0 -0
  136. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/agent_bindings.py +0 -0
  137. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/async_lifecycle.py +0 -0
  138. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/blocking_startup.py +0 -0
  139. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/captured_stdio_server.py +0 -0
  140. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/circuit_breaker.py +0 -0
  141. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/config_wizard.py +0 -0
  142. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/dashboard.py +0 -0
  143. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/error_isolation.py +0 -0
  144. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/examples/retry_example.py +0 -0
  145. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/health_monitor.py +0 -0
  146. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/managed_server.py +0 -0
  147. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/manager.py +0 -0
  148. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/mcp_logs.py +0 -0
  149. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/project_config.py +0 -0
  150. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/registry.py +0 -0
  151. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/retry_manager.py +0 -0
  152. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/server_registry_catalog.py +0 -0
  153. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/status_tracker.py +0 -0
  154. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/system_tools.py +0 -0
  155. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/tool_arg_coercion.py +0 -0
  156. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_prompts/__init__.py +0 -0
  157. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_prompts/hook_creator.py +0 -0
  158. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/__init__.py +0 -0
  159. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/bar_painters.py +0 -0
  160. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/bar_rendering.py +0 -0
  161. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/bottom_bar.py +0 -0
  162. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/bus.py +0 -0
  163. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/chords.py +0 -0
  164. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/commands.py +0 -0
  165. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/editor_actions.py +0 -0
  166. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/editor_completion.py +0 -0
  167. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/editor_display.py +0 -0
  168. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/editor_history.py +0 -0
  169. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/editor_keys.py +0 -0
  170. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/editor_paste.py +0 -0
  171. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/external_editor.py +0 -0
  172. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/inline_bar.py +0 -0
  173. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/line_editor.py +0 -0
  174. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/markdown_patches.py +0 -0
  175. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/message_queue.py +0 -0
  176. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/messages.py +0 -0
  177. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/pause_controller.py +0 -0
  178. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/prompt_prefix_style.py +0 -0
  179. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/queue_console.py +0 -0
  180. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/renderers.py +0 -0
  181. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/rich_renderer.py +0 -0
  182. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/run_ui.py +0 -0
  183. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/run_ui_wiring.py +0 -0
  184. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/spinner/__init__.py +0 -0
  185. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/subagent_console.py +0 -0
  186. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/transcript_guard.py +0 -0
  187. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/model_descriptions.py +0 -0
  188. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/model_switching.py +0 -0
  189. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/model_utils.py +0 -0
  190. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/models.json +0 -0
  191. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/models_dev_api.json +0 -0
  192. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/models_dev_parser.py +0 -0
  193. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/__init__.py +0 -0
  194. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/README.md +0 -0
  195. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/__init__.py +0 -0
  196. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/agent.py +0 -0
  197. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/bridge.py +0 -0
  198. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/capabilities.py +0 -0
  199. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/commands.py +0 -0
  200. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/content.py +0 -0
  201. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/io_delegation.py +0 -0
  202. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/mcp_config.py +0 -0
  203. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/permissions.py +0 -0
  204. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/persistence.py +0 -0
  205. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/register_callbacks.py +0 -0
  206. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/replay.py +0 -0
  207. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/session.py +0 -0
  208. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/session_config.py +0 -0
  209. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/state.py +0 -0
  210. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/__init__.py +0 -0
  211. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/config.py +0 -0
  212. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/discovery.py +0 -0
  213. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/downloader.py +0 -0
  214. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/enabled_skills.py +0 -0
  215. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/installer.py +0 -0
  216. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/metadata.py +0 -0
  217. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/prompt_builder.py +0 -0
  218. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/register_callbacks.py +0 -0
  219. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/remote_catalog.py +0 -0
  220. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/skill_catalog.py +0 -0
  221. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/skill_commands.py +0 -0
  222. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/skills_install_menu.py +0 -0
  223. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/skills_menu.py +0 -0
  224. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/aws_bedrock/__init__.py +0 -0
  225. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/aws_bedrock/config.py +0 -0
  226. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/aws_bedrock/register_callbacks.py +0 -0
  227. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/aws_bedrock/utils.py +0 -0
  228. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/README.md +0 -0
  229. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/__init__.py +0 -0
  230. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/config.py +0 -0
  231. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/discovery.py +0 -0
  232. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/register_callbacks.py +0 -0
  233. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/token.py +0 -0
  234. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/utils.py +0 -0
  235. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/btw/__init__.py +0 -0
  236. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/btw/inline_view.py +0 -0
  237. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/btw/register_callbacks.py +0 -0
  238. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/btw/side_query.py +0 -0
  239. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
  240. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
  241. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
  242. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/image_generation.py +0 -0
  243. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/image_tool.py +0 -0
  244. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
  245. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +0 -0
  246. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +0 -0
  247. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/usage.py +0 -0
  248. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/utils.py +0 -0
  249. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_hooks/__init__.py +0 -0
  250. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_hooks/config.py +0 -0
  251. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_hooks/register_callbacks.py +0 -0
  252. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
  253. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
  254. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
  255. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
  256. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/fast_mode.py +0 -0
  257. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/prompt_handler.py +0 -0
  258. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +0 -0
  259. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/test_fast_mode.py +0 -0
  260. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
  261. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  262. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/utils.py +0 -0
  263. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/code_puppy_agent/SKILL.md +0 -0
  264. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/code_puppy_agent/__init__.py +0 -0
  265. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/code_puppy_agent/register_callbacks.py +0 -0
  266. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/config.py +0 -0
  267. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/context_indicator/__init__.py +0 -0
  268. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/context_indicator/register_callbacks.py +0 -0
  269. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/context_indicator/usage.py +0 -0
  270. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/__init__.py +0 -0
  271. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/config.py +0 -0
  272. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/reasoning_client.py +0 -0
  273. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/register_callbacks.py +0 -0
  274. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/utils.py +0 -0
  275. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
  276. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
  277. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/__init__.py +0 -0
  278. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/cancel.py +0 -0
  279. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/commands.py +0 -0
  280. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/config.py +0 -0
  281. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/lifecycle.py +0 -0
  282. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/register_callbacks.py +0 -0
  283. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/runtime.py +0 -0
  284. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/startup_lock.py +0 -0
  285. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/workflow_ids.py +0 -0
  286. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/wrapper.py +0 -0
  287. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/destructive_command_guard/__init__.py +0 -0
  288. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/destructive_command_guard/detector.py +0 -0
  289. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/destructive_command_guard/register_callbacks.py +0 -0
  290. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/emoji_filter/__init__.py +0 -0
  291. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/emoji_filter/config.py +0 -0
  292. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/emoji_filter/register_callbacks.py +0 -0
  293. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/emoji_filter/stripper.py +0 -0
  294. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/empty_html_comment_filter/register_callbacks.py +0 -0
  295. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/example_custom_command/README.md +0 -0
  296. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
  297. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
  298. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
  299. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/__init__.py +0 -0
  300. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
  301. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
  302. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
  303. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
  304. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
  305. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
  306. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
  307. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
  308. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
  309. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
  310. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
  311. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
  312. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
  313. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
  314. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
  315. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
  316. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
  317. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
  318. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
  319. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
  320. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
  321. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
  322. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
  323. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
  324. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
  325. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/installer.py +0 -0
  326. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/register_callbacks.py +0 -0
  327. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/force_push_guard/__init__.py +0 -0
  328. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/force_push_guard/detector.py +0 -0
  329. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/force_push_guard/register_callbacks.py +0 -0
  330. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/force_push_guard/test_detector.py +0 -0
  331. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/fork/__init__.py +0 -0
  332. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/fork/register_callbacks.py +0 -0
  333. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/frontend_emitter/__init__.py +0 -0
  334. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/frontend_emitter/emitter.py +0 -0
  335. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/frontend_emitter/register_callbacks.py +0 -0
  336. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/frontend_emitter/session_context.py +0 -0
  337. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/__init__.py +0 -0
  338. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/config.py +0 -0
  339. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/oauth_flow.py +0 -0
  340. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/register_callbacks.py +0 -0
  341. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/test_plugin.py +0 -0
  342. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/utils.py +0 -0
  343. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/herdr/README.md +0 -0
  344. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/herdr/__init__.py +0 -0
  345. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/herdr/client.py +0 -0
  346. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/herdr/register_callbacks.py +0 -0
  347. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/herdr/reporter.py +0 -0
  348. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/hook_creator/__init__.py +0 -0
  349. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/hook_creator/register_callbacks.py +0 -0
  350. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/hook_manager/__init__.py +0 -0
  351. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/hook_manager/config.py +0 -0
  352. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/hook_manager/hooks_menu.py +0 -0
  353. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/hook_manager/register_callbacks.py +0 -0
  354. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/no_tools/__init__.py +0 -0
  355. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/no_tools/register_callbacks.py +0 -0
  356. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/oauth_pasteback.py +0 -0
  357. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/oauth_puppy_html.py +0 -0
  358. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/obsidian_agent/README.md +0 -0
  359. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/obsidian_agent/__init__.py +0 -0
  360. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/obsidian_agent/agent_obsidian.py +0 -0
  361. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/obsidian_agent/register_callbacks.py +0 -0
  362. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/ollama/__init__.py +0 -0
  363. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/ollama/register_callbacks.py +0 -0
  364. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/ollama_setup/__init__.py +0 -0
  365. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/ollama_setup/completer.py +0 -0
  366. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/ollama_setup/register_callbacks.py +0 -0
  367. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/__init__.py +0 -0
  368. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugin_contributions.py +0 -0
  369. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugin_meta.py +0 -0
  370. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugin_text_utils.py +0 -0
  371. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugins_menu.py +0 -0
  372. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugins_menu_layout.py +0 -0
  373. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugins_menu_render.py +0 -0
  374. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/project_trust_flow.py +0 -0
  375. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/register_callbacks.py +0 -0
  376. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/pop_command/__init__.py +0 -0
  377. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/pop_command/register_callbacks.py +0 -0
  378. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/prompt_newline/__init__.py +0 -0
  379. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/prompt_newline/config.py +0 -0
  380. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/prompt_newline/register_callbacks.py +0 -0
  381. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/prune/__init__.py +0 -0
  382. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/prune/prune_menu.py +0 -0
  383. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/prune/prune_model.py +0 -0
  384. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/prune/prune_render.py +0 -0
  385. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/prune/register_callbacks.py +0 -0
  386. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/README.md +0 -0
  387. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/__init__.py +0 -0
  388. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/commands.py +0 -0
  389. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/config.py +0 -0
  390. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/kennel.py +0 -0
  391. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/packer.py +0 -0
  392. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/recorder.py +0 -0
  393. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/register_callbacks.py +0 -0
  394. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/retriever.py +0 -0
  395. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/schema.py +0 -0
  396. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/state.py +0 -0
  397. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/tools.py +0 -0
  398. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/wings.py +0 -0
  399. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/README.md +0 -0
  400. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/__init__.py +0 -0
  401. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/builtin_frames.py +0 -0
  402. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/commands.py +0 -0
  403. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/picker.py +0 -0
  404. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/register_callbacks.py +0 -0
  405. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/spinners.py +0 -0
  406. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/quick_resume/__init__.py +0 -0
  407. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/quick_resume/register_callbacks.py +0 -0
  408. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/review_pr/__init__.py +0 -0
  409. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/review_pr/register_callbacks.py +0 -0
  410. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/shell_safety/__init__.py +0 -0
  411. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
  412. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
  413. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
  414. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/stack_dump/__init__.py +0 -0
  415. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/stack_dump/register_callbacks.py +0 -0
  416. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/statusline/__init__.py +0 -0
  417. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/statusline/config.py +0 -0
  418. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/statusline/payload.py +0 -0
  419. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/statusline/prompt_patch.py +0 -0
  420. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/statusline/register_callbacks.py +0 -0
  421. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/statusline/runner.py +0 -0
  422. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/statusline/statusline_command.py +0 -0
  423. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/steer_queue/__init__.py +0 -0
  424. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/steer_queue/queue_menu.py +0 -0
  425. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/steer_queue/register_callbacks.py +0 -0
  426. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/README.md +0 -0
  427. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/__init__.py +0 -0
  428. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/coalesce_patch.py +0 -0
  429. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/panel_render.py +0 -0
  430. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/register_callbacks.py +0 -0
  431. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/resume_repaint.py +0 -0
  432. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/switch_agent_resume/__init__.py +0 -0
  433. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/switch_agent_resume/register_callbacks.py +0 -0
  434. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/README.md +0 -0
  435. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/__init__.py +0 -0
  436. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/bundled_palettes.py +0 -0
  437. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/content_styles.py +0 -0
  438. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/osc_palette.py +0 -0
  439. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/picker.py +0 -0
  440. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/prompt_toolkit_theme.py +0 -0
  441. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/register_callbacks.py +0 -0
  442. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/rich_themes.py +0 -0
  443. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/themes.py +0 -0
  444. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/token_ratio_learner/__init__.py +0 -0
  445. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/token_ratio_learner/ratios.py +0 -0
  446. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/token_ratio_learner/register_callbacks.py +0 -0
  447. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/trust.py +0 -0
  448. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/trust_notice.py +0 -0
  449. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/__init__.py +0 -0
  450. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/models.py +0 -0
  451. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/register_callbacks.py +0 -0
  452. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/registry.py +0 -0
  453. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/sandbox.py +0 -0
  454. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/wide_completion_menu/__init__.py +0 -0
  455. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/wide_completion_menu/register_callbacks.py +0 -0
  456. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/__init__.py +0 -0
  457. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/judge.py +0 -0
  458. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/judge_config.py +0 -0
  459. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/register_callbacks.py +0 -0
  460. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/state.py +0 -0
  461. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/yolo_cli/__init__.py +0 -0
  462. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/yolo_cli/register_callbacks.py +0 -0
  463. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/provider_credentials.py +0 -0
  464. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/provider_identity.py +0 -0
  465. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/pydantic_patches.py +0 -0
  466. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/reopenable_async_client.py +0 -0
  467. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/round_robin_model.py +0 -0
  468. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/secret_store.py +0 -0
  469. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/secret_store_backends.py +0 -0
  470. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/session_lifecycle.py +0 -0
  471. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/session_migration.py +0 -0
  472. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/session_storage.py +0 -0
  473. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/status_display.py +0 -0
  474. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/summarization_agent.py +0 -0
  475. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/terminal_utils.py +0 -0
  476. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/__init__.py +0 -0
  477. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/agent_tools.py +0 -0
  478. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/__init__.py +0 -0
  479. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/constants.py +0 -0
  480. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/demo_tui.py +0 -0
  481. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/handler.py +0 -0
  482. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/models.py +0 -0
  483. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/registration.py +0 -0
  484. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/renderers.py +0 -0
  485. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/terminal_ui.py +0 -0
  486. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/theme.py +0 -0
  487. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/tui_loop.py +0 -0
  488. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/__init__.py +0 -0
  489. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_control.py +0 -0
  490. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_interactions.py +0 -0
  491. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_locator_resolver.py +0 -0
  492. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_locators.py +0 -0
  493. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_navigation.py +0 -0
  494. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_page_snapshot.py +0 -0
  495. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_screenshot.py +0 -0
  496. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_scripts.py +0 -0
  497. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_semantic_interactions.py +0 -0
  498. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_workflows.py +0 -0
  499. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/command_runner.py +0 -0
  500. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/common.py +0 -0
  501. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/display.py +0 -0
  502. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/file_modifications.py +0 -0
  503. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/file_operations.py +0 -0
  504. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/fs_access.py +0 -0
  505. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/image_tools.py +0 -0
  506. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/io_backends.py +0 -0
  507. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/model_tools.py +0 -0
  508. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/shell_backgrounding.py +0 -0
  509. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/skills_tools.py +0 -0
  510. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/subagent_context.py +0 -0
  511. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/subagent_invocation.py +0 -0
  512. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/tools_content.py +0 -0
  513. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/universal_constructor.py +0 -0
  514. {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/undo_manager.py +0 -0
  515. {code_puppy-0.0.655 → 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.655
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
@@ -17,6 +17,7 @@ from typing import Optional
17
17
  MODEL_SETTINGS_ONLY_KEYS = frozenset(
18
18
  {
19
19
  "openai_reasoning_effort",
20
+ "openai_reasoning_summary",
20
21
  "openai_verbosity",
21
22
  }
22
23
  )
@@ -38,9 +38,8 @@ def handle_show_command(command: str) -> bool:
38
38
  get_compaction_strategy,
39
39
  get_compaction_threshold,
40
40
  get_default_agent,
41
+ get_effective_model_settings,
41
42
  get_effective_temperature,
42
- get_openai_reasoning_effort,
43
- get_openai_verbosity,
44
43
  get_owner_name,
45
44
  get_protected_token_count,
46
45
  get_puppy_name,
@@ -63,6 +62,7 @@ def handle_show_command(command: str) -> bool:
63
62
  compaction_strategy = get_compaction_strategy()
64
63
  global_temperature = get_temperature()
65
64
  effective_temperature = get_effective_temperature(model)
65
+ model_settings = get_effective_model_settings(model)
66
66
 
67
67
  # Get current agent info
68
68
  current_agent = get_current_agent()
@@ -81,8 +81,8 @@ def handle_show_command(command: str) -> bool:
81
81
  [bold]compaction_threshold:[/bold] [cyan]{compaction_threshold:.1%}[/cyan] context usage triggers compaction
82
82
  [bold]compaction_strategy:[/bold] [cyan]{compaction_strategy}[/cyan] (summarization or truncation)
83
83
  [bold]resume_message_count:[/bold] [cyan]{get_resume_message_count()}[/cyan] messages shown on /resume
84
- [bold]reasoning_effort:[/bold] [cyan]{get_openai_reasoning_effort()}[/cyan]
85
- [bold]verbosity:[/bold] [cyan]{get_openai_verbosity()}[/cyan]
84
+ [bold]reasoning_effort:[/bold] [cyan]{model_settings.get("reasoning_effort", "(model default)")}[/cyan]
85
+ [bold]verbosity:[/bold] [cyan]{model_settings.get("verbosity", "(model default)")}[/cyan]
86
86
  [bold]temperature:[/bold] [cyan]{effective_temperature if effective_temperature is not None else "(model default)"}[/cyan]{" (per-model)" if effective_temperature != global_temperature and effective_temperature is not None else ""}
87
87
  [bold]cancel_agent_key:[/bold] [cyan]{get_cancel_agent_display_name()}[/cyan] (options: ctrl+c, ctrl+k, ctrl+q)
88
88
 
@@ -23,16 +23,10 @@ from code_puppy.command_line.pagination import (
23
23
  from code_puppy.config import (
24
24
  get_all_model_settings,
25
25
  get_global_model_name,
26
- get_openai_reasoning_effort,
27
- get_openai_reasoning_summary,
28
- get_openai_verbosity,
29
26
  get_value,
30
27
  model_supports_setting,
31
28
  reset_value,
32
29
  set_model_setting,
33
- set_openai_reasoning_effort,
34
- set_openai_reasoning_summary,
35
- set_openai_verbosity,
36
30
  set_value,
37
31
  )
38
32
  from code_puppy.messaging import emit_info
@@ -276,20 +270,13 @@ def _write_per_model_retry(model_name: str, menu_key: str, value) -> None:
276
270
 
277
271
 
278
272
  def _get_model_display_settings(model_name: str) -> Dict:
279
- """Get model settings merged with global OpenAI controls for display."""
273
+ """Get configured model settings plus model-specific display defaults."""
280
274
  settings = get_all_model_settings(model_name)
281
275
 
282
- if model_supports_setting(model_name, "reasoning_effort"):
283
- settings["reasoning_effort"] = get_openai_reasoning_effort()
284
276
  if model_supports_setting(model_name, "reasoning_context"):
285
277
  settings.setdefault("reasoning_context", "all_turns")
286
278
  if model_supports_setting(model_name, "reasoning_mode"):
287
279
  settings.setdefault("reasoning_mode", "standard")
288
- if model_supports_setting(model_name, "summary"):
289
- settings["summary"] = get_openai_reasoning_summary()
290
- if model_supports_setting(model_name, "verbosity"):
291
- settings["verbosity"] = get_openai_verbosity()
292
-
293
280
  # Per-model retry overrides live in their own namespace, so inject their
294
281
  # current values here (only when actually set -- unset shows the default).
295
282
  for menu_key in _RETRY_MENU_KEYS:
@@ -692,14 +679,6 @@ class ModelSettingsMenu:
692
679
  lines.append(("class:tui.label", f" {setting_def['name']}"))
693
680
  lines.append(("", "\n"))
694
681
 
695
- # Show if this is a global setting
696
- if setting_key in ("reasoning_effort", "verbosity"):
697
- lines.append(
698
- (
699
- "class:tui.warning",
700
- " ⚠ Global setting (applies to all GPT-5 models)",
701
- )
702
- )
703
682
  lines.append(("", "\n\n"))
704
683
 
705
684
  # Description
@@ -864,17 +843,7 @@ class ModelSettingsMenu:
864
843
 
865
844
  setting_key = self.supported_settings[self.setting_index]
866
845
 
867
- # Handle global OpenAI settings specially
868
- if setting_key == "reasoning_effort":
869
- if self.edit_value is not None:
870
- set_openai_reasoning_effort(self.edit_value)
871
- elif setting_key == "summary":
872
- if self.edit_value is not None:
873
- set_openai_reasoning_summary(self.edit_value)
874
- elif setting_key == "verbosity":
875
- if self.edit_value is not None:
876
- set_openai_verbosity(self.edit_value)
877
- elif setting_key in _RETRY_MENU_KEYS:
846
+ if setting_key in _RETRY_MENU_KEYS:
878
847
  # Per-model retry override -> dedicated retry_model_ namespace.
879
848
  _write_per_model_retry(self.selected_model, setting_key, self.edit_value)
880
849
  else:
@@ -907,17 +876,7 @@ class ModelSettingsMenu:
907
876
  # Reset edit value to default
908
877
  self.edit_value = _get_setting_default(setting_key, self.selected_model)
909
878
  else:
910
- # Handle global OpenAI settings - reset to their defaults
911
- if setting_key == "reasoning_effort":
912
- set_openai_reasoning_effort("medium") # Default
913
- self.current_settings[setting_key] = "medium"
914
- elif setting_key == "summary":
915
- set_openai_reasoning_summary("auto") # Default
916
- self.current_settings[setting_key] = "auto"
917
- elif setting_key == "verbosity":
918
- set_openai_verbosity("medium") # Default
919
- self.current_settings[setting_key] = "medium"
920
- elif setting_key in _RETRY_MENU_KEYS:
879
+ if setting_key in _RETRY_MENU_KEYS:
921
880
  # Clear the per-model retry override -> falls back to global.
922
881
  _write_per_model_retry(self.selected_model, setting_key, None)
923
882
  if setting_key in self.current_settings:
@@ -43,7 +43,6 @@ from code_puppy.config import (
43
43
  get_mcp_disabled,
44
44
  get_mcp_unbound_warning_silenced,
45
45
  get_message_limit,
46
- get_openai_reasoning_summary,
47
46
  get_output_level,
48
47
  get_owner_name,
49
48
  get_pack_agents_enabled,
@@ -265,21 +264,6 @@ _COMPACTION = SettingsCategory(
265
264
  )
266
265
 
267
266
 
268
- _OPENAI = SettingsCategory(
269
- name="OpenAI",
270
- settings=(
271
- Setting(
272
- key="openai_reasoning_summary",
273
- display_name="Reasoning Summary",
274
- description="Style of reasoning summary shown to the user.",
275
- type_hint="choice",
276
- valid_values=("auto", "concise", "detailed"),
277
- effective_getter=get_openai_reasoning_summary,
278
- ),
279
- ),
280
- )
281
-
282
-
283
267
  _FEATURES = SettingsCategory(
284
268
  name="Features",
285
269
  settings=(
@@ -629,7 +613,6 @@ SETTINGS_CATEGORIES: Tuple[SettingsCategory, ...] = (
629
613
  _SESSION,
630
614
  _COMPACTION,
631
615
  _OUTPUT,
632
- _OPENAI,
633
616
  _FEATURES,
634
617
  _MCP,
635
618
  _GOAL,
@@ -5,7 +5,7 @@ import json
5
5
  import logging
6
6
  import os
7
7
  import pathlib
8
- from typing import Optional
8
+ from typing import Any, Optional
9
9
 
10
10
  from code_puppy.session_storage import save_session
11
11
 
@@ -393,9 +393,6 @@ def get_config_keys():
393
393
  "summarization_model",
394
394
  "message_limit",
395
395
  "allow_recursion",
396
- "openai_reasoning_effort",
397
- "openai_reasoning_summary",
398
- "openai_verbosity",
399
396
  "auto_save_session",
400
397
  "max_saved_sessions",
401
398
  "http2",
@@ -855,78 +852,6 @@ def set_puppy_token(token: str):
855
852
  set_config_value("puppy_token", token)
856
853
 
857
854
 
858
- def get_openai_reasoning_effort() -> str:
859
- """Return the configured OpenAI reasoning effort."""
860
- allowed_values = {"minimal", "low", "medium", "high", "xhigh", "ultra"}
861
- configured = (get_value("openai_reasoning_effort") or "medium").strip().lower()
862
- if configured not in allowed_values:
863
- return "medium"
864
- return configured
865
-
866
-
867
- def set_openai_reasoning_effort(value: str) -> None:
868
- """Persist the OpenAI reasoning effort ensuring it remains within allowed values."""
869
- allowed_values = {"minimal", "low", "medium", "high", "xhigh", "ultra"}
870
- normalized = (value or "").strip().lower()
871
- if normalized not in allowed_values:
872
- raise ValueError(
873
- f"Invalid reasoning effort '{value}'. Allowed: {', '.join(sorted(allowed_values))}"
874
- )
875
- set_config_value("openai_reasoning_effort", normalized)
876
-
877
-
878
- def get_openai_reasoning_summary() -> str:
879
- """Return the configured OpenAI reasoning summary mode.
880
-
881
- Supported values:
882
- - auto: let the provider decide the best summary style
883
- - concise: shorter reasoning summaries
884
- - detailed: fuller reasoning summaries
885
- """
886
- allowed_values = {"auto", "concise", "detailed"}
887
- configured = (get_value("openai_reasoning_summary") or "detailed").strip().lower()
888
- if configured not in allowed_values:
889
- return "auto"
890
- return configured
891
-
892
-
893
- def set_openai_reasoning_summary(value: str) -> None:
894
- """Persist the OpenAI reasoning summary mode ensuring it remains valid."""
895
- allowed_values = {"auto", "concise", "detailed"}
896
- normalized = (value or "").strip().lower()
897
- if normalized not in allowed_values:
898
- raise ValueError(
899
- f"Invalid reasoning summary '{value}'. Allowed: {', '.join(sorted(allowed_values))}"
900
- )
901
- set_config_value("openai_reasoning_summary", normalized)
902
-
903
-
904
- def get_openai_verbosity() -> str:
905
- """Return the configured OpenAI verbosity (low, medium, high).
906
-
907
- Controls how concise vs. verbose the model's responses are:
908
- - low: more concise responses
909
- - medium: balanced (default)
910
- - high: more verbose responses
911
- """
912
- allowed_values = {"low", "medium", "high"}
913
- configured = (get_value("openai_verbosity") or "medium").strip().lower()
914
- if configured not in allowed_values:
915
- return "medium"
916
- return configured
917
-
918
-
919
- def set_openai_verbosity(value: str) -> None:
920
- """Persist the OpenAI verbosity ensuring it remains within allowed values."""
921
- allowed_values = {"low", "medium", "high"}
922
- normalized = (value or "").strip().lower()
923
- if normalized not in allowed_values:
924
- raise ValueError(
925
- f"Invalid verbosity '{value}'. Allowed: {', '.join(sorted(allowed_values))}"
926
- )
927
- set_config_value("openai_verbosity", normalized)
928
-
929
-
930
855
  def get_temperature() -> Optional[float]:
931
856
  """Return the configured model temperature (0.0 to 2.0).
932
857
 
@@ -1001,13 +926,13 @@ def get_model_setting(
1001
926
  return default
1002
927
 
1003
928
 
1004
- def set_model_setting(model_name: str, setting: str, value: Optional[float]) -> None:
929
+ def set_model_setting(model_name: str, setting: str, value: Any | None) -> None:
1005
930
  """Set a specific setting for a model.
1006
931
 
1007
932
  Args:
1008
933
  model_name: The model name (e.g., 'gpt-5', 'zai-glm-5.1-api')
1009
- setting: The setting name (e.g., 'temperature', 'seed')
1010
- value: The value to set, or None to clear
934
+ setting: The setting name (e.g., 'temperature', 'reasoning_effort')
935
+ value: The numeric, string, or boolean value to set, or None to clear
1011
936
  """
1012
937
  sanitized_name = _sanitize_model_name_for_key(model_name)
1013
938
  key = f"model_settings_{sanitized_name}_{setting}"
@@ -171,9 +171,6 @@ def make_model_settings(
171
171
  """
172
172
  from code_puppy.config import (
173
173
  get_effective_model_settings,
174
- get_openai_reasoning_effort,
175
- get_openai_reasoning_summary,
176
- get_openai_verbosity,
177
174
  model_supports_setting,
178
175
  )
179
176
 
@@ -293,7 +290,9 @@ def make_model_settings(
293
290
  model_settings = OpenAIChatModelSettings(**model_settings_dict)
294
291
 
295
292
  elif "gpt-5" in model_name:
296
- model_settings_dict["openai_reasoning_effort"] = get_openai_reasoning_effort()
293
+ model_settings_dict["openai_reasoning_effort"] = effective_settings.get(
294
+ "reasoning_effort", "medium"
295
+ )
297
296
 
298
297
  uses_responses_api = (
299
298
  model_type == "chatgpt_oauth"
@@ -306,11 +305,13 @@ def make_model_settings(
306
305
  )
307
306
 
308
307
  if uses_responses_api:
309
- model_settings_dict["openai_reasoning_summary"] = (
310
- get_openai_reasoning_summary()
308
+ model_settings_dict["openai_reasoning_summary"] = effective_settings.get(
309
+ "summary", "auto"
311
310
  )
312
311
  if "codex" not in model_name:
313
- model_settings_dict["openai_text_verbosity"] = get_openai_verbosity()
312
+ model_settings_dict["openai_text_verbosity"] = effective_settings.get(
313
+ "verbosity", "medium"
314
+ )
314
315
 
315
316
  underlying_name = str(model_config.get("name", "")).lower()
316
317
  is_gpt_5_6 = "gpt-5.6" in model_name.lower() or "gpt-5.6" in underlying_name
@@ -336,8 +337,9 @@ def make_model_settings(
336
337
  # Chat Completions models don't support configurable reasoning summaries.
337
338
  # Keep the old verbosity injection path for non-Responses GPT-5 models.
338
339
  if "codex" not in model_name:
339
- verbosity = get_openai_verbosity()
340
- model_settings_dict["extra_body"] = {"verbosity": verbosity}
340
+ model_settings_dict["extra_body"] = {
341
+ "verbosity": effective_settings.get("verbosity", "medium")
342
+ }
341
343
  model_settings = OpenAIChatModelSettings(**model_settings_dict)
342
344
  elif _is_anthropic_model(model_name, model_config):
343
345
  # Handle Anthropic extended thinking settings
@@ -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.655"
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