code-puppy 0.0.602__tar.gz → 0.0.604__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 (424) hide show
  1. {code_puppy-0.0.602 → code_puppy-0.0.604}/PKG-INFO +1 -1
  2. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/__init__.py +181 -73
  3. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/plugin_list/plugins_menu.py +149 -135
  4. code_puppy-0.0.604/code_puppy/plugins/plugin_list/plugins_menu_layout.py +197 -0
  5. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/plugin_list/plugins_menu_render.py +139 -3
  6. code_puppy-0.0.604/code_puppy/plugins/plugin_list/project_trust_flow.py +164 -0
  7. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/plugin_list/register_callbacks.py +92 -6
  8. code_puppy-0.0.604/code_puppy/plugins/puppy_spinner/README.md +92 -0
  9. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/puppy_spinner/__init__.py +4 -0
  10. code_puppy-0.0.604/code_puppy/plugins/puppy_spinner/builtin_frames.py +172 -0
  11. code_puppy-0.0.604/code_puppy/plugins/puppy_spinner/commands.py +117 -0
  12. code_puppy-0.0.604/code_puppy/plugins/puppy_spinner/picker.py +380 -0
  13. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/puppy_spinner/register_callbacks.py +44 -8
  14. code_puppy-0.0.604/code_puppy/plugins/puppy_spinner/spinners.py +439 -0
  15. code_puppy-0.0.604/code_puppy/plugins/trust.py +146 -0
  16. code_puppy-0.0.604/code_puppy/plugins/trust_notice.py +69 -0
  17. {code_puppy-0.0.602 → code_puppy-0.0.604}/pyproject.toml +1 -1
  18. {code_puppy-0.0.602 → code_puppy-0.0.604}/.gitignore +0 -0
  19. {code_puppy-0.0.602 → code_puppy-0.0.604}/LICENSE +0 -0
  20. {code_puppy-0.0.602 → code_puppy-0.0.604}/README.md +0 -0
  21. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/__init__.py +0 -0
  22. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/__main__.py +0 -0
  23. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/__init__.py +0 -0
  24. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/_builder.py +0 -0
  25. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/_compaction.py +0 -0
  26. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/_diagnostics.py +0 -0
  27. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/_history.py +0 -0
  28. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/_key_listeners.py +0 -0
  29. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/_non_streaming_render.py +0 -0
  30. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/_run_signals.py +0 -0
  31. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/_runtime.py +0 -0
  32. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/_steer_processor.py +0 -0
  33. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/agent_code_puppy.py +0 -0
  34. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/agent_creator_agent.py +0 -0
  35. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/agent_helios.py +0 -0
  36. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/agent_manager.py +0 -0
  37. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/agent_planning.py +0 -0
  38. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/agent_qa_kitten.py +0 -0
  39. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/base_agent.py +0 -0
  40. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/event_stream_handler.py +0 -0
  41. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/json_agent.py +0 -0
  42. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/run_stats.py +0 -0
  43. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/smooth_stream.py +0 -0
  44. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/agents/subagent_stream_handler.py +0 -0
  45. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/callbacks.py +0 -0
  46. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/chatgpt_codex_client.py +0 -0
  47. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/claude_cache_client.py +0 -0
  48. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/cli_runner.py +0 -0
  49. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/__init__.py +0 -0
  50. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/add_model_menu.py +0 -0
  51. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/agent_menu.py +0 -0
  52. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/attachments.py +0 -0
  53. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/autosave_menu.py +0 -0
  54. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/autosave_search.py +0 -0
  55. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/clipboard.py +0 -0
  56. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/colors_menu.py +0 -0
  57. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/command_handler.py +0 -0
  58. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/command_registry.py +0 -0
  59. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/config_apply.py +0 -0
  60. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/config_commands.py +0 -0
  61. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/core_commands.py +0 -0
  62. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/diff_menu.py +0 -0
  63. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/file_index.py +0 -0
  64. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/file_path_completion.py +0 -0
  65. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/judges_menu.py +0 -0
  66. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/load_context_completion.py +0 -0
  67. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/__init__.py +0 -0
  68. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/base.py +0 -0
  69. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
  70. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
  71. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
  72. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/edit_command.py +0 -0
  73. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/handler.py +0 -0
  74. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/help_command.py +0 -0
  75. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/install_command.py +0 -0
  76. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/install_menu.py +0 -0
  77. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/list_command.py +0 -0
  78. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/logs_command.py +0 -0
  79. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/remove_command.py +0 -0
  80. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/restart_command.py +0 -0
  81. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/search_command.py +0 -0
  82. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/silence_warning_command.py +0 -0
  83. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/start_all_command.py +0 -0
  84. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/start_command.py +0 -0
  85. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/status_command.py +0 -0
  86. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
  87. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/stop_command.py +0 -0
  88. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/utils.py +0 -0
  89. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  90. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp_binding_menu.py +0 -0
  91. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/mcp_completion.py +0 -0
  92. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/model_picker_completion.py +0 -0
  93. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/model_settings_menu.py +0 -0
  94. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/onboarding_slides.py +0 -0
  95. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/onboarding_wizard.py +0 -0
  96. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/pagination.py +0 -0
  97. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/pin_command_completion.py +0 -0
  98. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
  99. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/session_commands.py +0 -0
  100. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/set_menu.py +0 -0
  101. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/set_menu_catalog.py +0 -0
  102. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/set_menu_render.py +0 -0
  103. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/set_menu_schema.py +0 -0
  104. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/set_menu_settings.py +0 -0
  105. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/set_menu_shims.py +0 -0
  106. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/set_menu_values.py +0 -0
  107. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/shell_passthrough.py +0 -0
  108. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/skills_completion.py +0 -0
  109. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/uc_menu.py +0 -0
  110. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/utils.py +0 -0
  111. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/command_line/wiggum_state.py +0 -0
  112. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/config.py +0 -0
  113. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/error_logging.py +0 -0
  114. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/gemini_code_assist.py +0 -0
  115. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/gemini_model.py +0 -0
  116. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/hook_engine/README.md +0 -0
  117. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/hook_engine/__init__.py +0 -0
  118. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/hook_engine/aliases.py +0 -0
  119. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/hook_engine/engine.py +0 -0
  120. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/hook_engine/executor.py +0 -0
  121. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/hook_engine/matcher.py +0 -0
  122. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/hook_engine/models.py +0 -0
  123. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/hook_engine/registry.py +0 -0
  124. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/hook_engine/validator.py +0 -0
  125. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/http_utils.py +0 -0
  126. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/keymap.py +0 -0
  127. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/list_filtering.py +0 -0
  128. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/main.py +0 -0
  129. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/__init__.py +0 -0
  130. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/agent_bindings.py +0 -0
  131. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/async_lifecycle.py +0 -0
  132. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/blocking_startup.py +0 -0
  133. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/captured_stdio_server.py +0 -0
  134. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/circuit_breaker.py +0 -0
  135. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/config_wizard.py +0 -0
  136. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/dashboard.py +0 -0
  137. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/error_isolation.py +0 -0
  138. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/examples/retry_example.py +0 -0
  139. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/health_monitor.py +0 -0
  140. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/managed_server.py +0 -0
  141. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/manager.py +0 -0
  142. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/mcp_logs.py +0 -0
  143. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/registry.py +0 -0
  144. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/retry_manager.py +0 -0
  145. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/server_registry_catalog.py +0 -0
  146. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/status_tracker.py +0 -0
  147. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/system_tools.py +0 -0
  148. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_/tool_arg_coercion.py +0 -0
  149. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_prompts/__init__.py +0 -0
  150. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/mcp_prompts/hook_creator.py +0 -0
  151. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/__init__.py +0 -0
  152. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/bar_painters.py +0 -0
  153. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/bar_rendering.py +0 -0
  154. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/bottom_bar.py +0 -0
  155. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/bus.py +0 -0
  156. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/commands.py +0 -0
  157. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/editor_actions.py +0 -0
  158. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/editor_completion.py +0 -0
  159. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/editor_display.py +0 -0
  160. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/editor_history.py +0 -0
  161. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/editor_keys.py +0 -0
  162. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/editor_paste.py +0 -0
  163. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/line_editor.py +0 -0
  164. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/markdown_patches.py +0 -0
  165. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/message_queue.py +0 -0
  166. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/messages.py +0 -0
  167. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/pause_controller.py +0 -0
  168. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/prompt_prefix_style.py +0 -0
  169. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/queue_console.py +0 -0
  170. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/renderers.py +0 -0
  171. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/rich_renderer.py +0 -0
  172. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/run_ui.py +0 -0
  173. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/run_ui_wiring.py +0 -0
  174. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/spinner/__init__.py +0 -0
  175. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/messaging/subagent_console.py +0 -0
  176. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/model_descriptions.py +0 -0
  177. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/model_factory.py +0 -0
  178. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/model_switching.py +0 -0
  179. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/model_utils.py +0 -0
  180. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/models.json +0 -0
  181. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/models_dev_api.json +0 -0
  182. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/models_dev_parser.py +0 -0
  183. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/agent_skills/__init__.py +0 -0
  184. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/agent_skills/config.py +0 -0
  185. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/agent_skills/discovery.py +0 -0
  186. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/agent_skills/downloader.py +0 -0
  187. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/agent_skills/enabled_skills.py +0 -0
  188. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/agent_skills/installer.py +0 -0
  189. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/agent_skills/metadata.py +0 -0
  190. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/agent_skills/prompt_builder.py +0 -0
  191. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/agent_skills/register_callbacks.py +0 -0
  192. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/agent_skills/remote_catalog.py +0 -0
  193. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/agent_skills/skill_catalog.py +0 -0
  194. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/agent_skills/skill_commands.py +0 -0
  195. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/agent_skills/skills_install_menu.py +0 -0
  196. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/agent_skills/skills_menu.py +0 -0
  197. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/aws_bedrock/__init__.py +0 -0
  198. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/aws_bedrock/config.py +0 -0
  199. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/aws_bedrock/register_callbacks.py +0 -0
  200. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/aws_bedrock/utils.py +0 -0
  201. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/azure_foundry/README.md +0 -0
  202. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/azure_foundry/__init__.py +0 -0
  203. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/azure_foundry/config.py +0 -0
  204. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/azure_foundry/discovery.py +0 -0
  205. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/azure_foundry/register_callbacks.py +0 -0
  206. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/azure_foundry/token.py +0 -0
  207. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/azure_foundry/utils.py +0 -0
  208. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/btw/__init__.py +0 -0
  209. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/btw/inline_view.py +0 -0
  210. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/btw/register_callbacks.py +0 -0
  211. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/btw/side_query.py +0 -0
  212. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
  213. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
  214. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
  215. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +0 -0
  216. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +0 -0
  217. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/chatgpt_oauth/utils.py +0 -0
  218. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/claude_code_hooks/__init__.py +0 -0
  219. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/claude_code_hooks/config.py +0 -0
  220. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/claude_code_hooks/register_callbacks.py +0 -0
  221. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
  222. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
  223. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
  224. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
  225. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/claude_code_oauth/fast_mode.py +0 -0
  226. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/claude_code_oauth/prompt_handler.py +0 -0
  227. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +0 -0
  228. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/claude_code_oauth/test_fast_mode.py +0 -0
  229. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
  230. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  231. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/claude_code_oauth/utils.py +0 -0
  232. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/code_puppy_agent/SKILL.md +0 -0
  233. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/code_puppy_agent/__init__.py +0 -0
  234. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/code_puppy_agent/register_callbacks.py +0 -0
  235. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/config.py +0 -0
  236. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/context_indicator/__init__.py +0 -0
  237. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/context_indicator/register_callbacks.py +0 -0
  238. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/context_indicator/usage.py +0 -0
  239. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/copilot_auth/__init__.py +0 -0
  240. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/copilot_auth/config.py +0 -0
  241. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/copilot_auth/reasoning_client.py +0 -0
  242. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/copilot_auth/register_callbacks.py +0 -0
  243. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/copilot_auth/utils.py +0 -0
  244. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
  245. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
  246. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/dbos_durable_exec/__init__.py +0 -0
  247. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/dbos_durable_exec/cancel.py +0 -0
  248. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/dbos_durable_exec/commands.py +0 -0
  249. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/dbos_durable_exec/config.py +0 -0
  250. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/dbos_durable_exec/lifecycle.py +0 -0
  251. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/dbos_durable_exec/register_callbacks.py +0 -0
  252. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/dbos_durable_exec/runtime.py +0 -0
  253. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/dbos_durable_exec/startup_lock.py +0 -0
  254. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/dbos_durable_exec/workflow_ids.py +0 -0
  255. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/dbos_durable_exec/wrapper.py +0 -0
  256. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/destructive_command_guard/__init__.py +0 -0
  257. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/destructive_command_guard/detector.py +0 -0
  258. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/destructive_command_guard/register_callbacks.py +0 -0
  259. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/emoji_filter/__init__.py +0 -0
  260. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/emoji_filter/config.py +0 -0
  261. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/emoji_filter/register_callbacks.py +0 -0
  262. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/emoji_filter/stripper.py +0 -0
  263. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/example_custom_command/README.md +0 -0
  264. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
  265. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
  266. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
  267. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/force_push_guard/__init__.py +0 -0
  268. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/force_push_guard/detector.py +0 -0
  269. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/force_push_guard/register_callbacks.py +0 -0
  270. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/force_push_guard/test_detector.py +0 -0
  271. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/frontend_emitter/__init__.py +0 -0
  272. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/frontend_emitter/emitter.py +0 -0
  273. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/frontend_emitter/register_callbacks.py +0 -0
  274. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/frontend_emitter/session_context.py +0 -0
  275. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/herdr/README.md +0 -0
  276. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/herdr/__init__.py +0 -0
  277. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/herdr/client.py +0 -0
  278. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/herdr/register_callbacks.py +0 -0
  279. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/herdr/reporter.py +0 -0
  280. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/hook_creator/__init__.py +0 -0
  281. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/hook_creator/register_callbacks.py +0 -0
  282. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/hook_manager/__init__.py +0 -0
  283. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/hook_manager/config.py +0 -0
  284. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/hook_manager/hooks_menu.py +0 -0
  285. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/hook_manager/register_callbacks.py +0 -0
  286. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/oauth_puppy_html.py +0 -0
  287. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/obsidian_agent/README.md +0 -0
  288. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/obsidian_agent/__init__.py +0 -0
  289. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/obsidian_agent/agent_obsidian.py +0 -0
  290. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/obsidian_agent/register_callbacks.py +0 -0
  291. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/ollama/__init__.py +0 -0
  292. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/ollama/register_callbacks.py +0 -0
  293. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/ollama_setup/__init__.py +0 -0
  294. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/ollama_setup/completer.py +0 -0
  295. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/ollama_setup/register_callbacks.py +0 -0
  296. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/plugin_list/__init__.py +0 -0
  297. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/plugin_list/plugin_contributions.py +0 -0
  298. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/plugin_list/plugin_meta.py +0 -0
  299. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/plugin_list/plugin_text_utils.py +0 -0
  300. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/pop_command/__init__.py +0 -0
  301. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/pop_command/register_callbacks.py +0 -0
  302. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/prompt_newline/__init__.py +0 -0
  303. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/prompt_newline/config.py +0 -0
  304. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/prompt_newline/register_callbacks.py +0 -0
  305. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/prune/__init__.py +0 -0
  306. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/prune/prune_menu.py +0 -0
  307. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/prune/prune_model.py +0 -0
  308. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/prune/prune_render.py +0 -0
  309. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/prune/register_callbacks.py +0 -0
  310. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/puppy_kennel/README.md +0 -0
  311. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/puppy_kennel/__init__.py +0 -0
  312. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/puppy_kennel/commands.py +0 -0
  313. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/puppy_kennel/config.py +0 -0
  314. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/puppy_kennel/kennel.py +0 -0
  315. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/puppy_kennel/packer.py +0 -0
  316. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/puppy_kennel/recorder.py +0 -0
  317. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/puppy_kennel/register_callbacks.py +0 -0
  318. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/puppy_kennel/retriever.py +0 -0
  319. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/puppy_kennel/schema.py +0 -0
  320. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/puppy_kennel/state.py +0 -0
  321. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/puppy_kennel/tools.py +0 -0
  322. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/puppy_kennel/wings.py +0 -0
  323. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/quick_resume/__init__.py +0 -0
  324. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/quick_resume/register_callbacks.py +0 -0
  325. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/review_pr/__init__.py +0 -0
  326. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/review_pr/register_callbacks.py +0 -0
  327. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/shell_safety/__init__.py +0 -0
  328. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
  329. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
  330. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
  331. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/stack_dump/__init__.py +0 -0
  332. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/stack_dump/register_callbacks.py +0 -0
  333. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/statusline/__init__.py +0 -0
  334. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/statusline/config.py +0 -0
  335. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/statusline/payload.py +0 -0
  336. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/statusline/prompt_patch.py +0 -0
  337. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/statusline/register_callbacks.py +0 -0
  338. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/statusline/runner.py +0 -0
  339. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/statusline/statusline_command.py +0 -0
  340. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/steer_queue/__init__.py +0 -0
  341. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/steer_queue/queue_menu.py +0 -0
  342. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/steer_queue/register_callbacks.py +0 -0
  343. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/subagent_panel/README.md +0 -0
  344. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/subagent_panel/__init__.py +0 -0
  345. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/subagent_panel/coalesce_patch.py +0 -0
  346. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/subagent_panel/panel_render.py +0 -0
  347. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/subagent_panel/register_callbacks.py +0 -0
  348. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/subagent_panel/resume_repaint.py +0 -0
  349. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/subagent_panel/state.py +0 -0
  350. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/switch_agent_resume/__init__.py +0 -0
  351. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/switch_agent_resume/register_callbacks.py +0 -0
  352. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/theme/README.md +0 -0
  353. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/theme/__init__.py +0 -0
  354. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/theme/bundled_palettes.py +0 -0
  355. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/theme/content_styles.py +0 -0
  356. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/theme/osc_palette.py +0 -0
  357. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/theme/picker.py +0 -0
  358. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/theme/register_callbacks.py +0 -0
  359. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/theme/rich_themes.py +0 -0
  360. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/theme/themes.py +0 -0
  361. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/token_ratio_learner/__init__.py +0 -0
  362. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/token_ratio_learner/ratios.py +0 -0
  363. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/token_ratio_learner/register_callbacks.py +0 -0
  364. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/universal_constructor/__init__.py +0 -0
  365. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/universal_constructor/models.py +0 -0
  366. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/universal_constructor/register_callbacks.py +0 -0
  367. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/universal_constructor/registry.py +0 -0
  368. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/universal_constructor/sandbox.py +0 -0
  369. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/wide_completion_menu/__init__.py +0 -0
  370. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/wide_completion_menu/register_callbacks.py +0 -0
  371. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/wiggum/__init__.py +0 -0
  372. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/wiggum/judge.py +0 -0
  373. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/wiggum/judge_config.py +0 -0
  374. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/wiggum/register_callbacks.py +0 -0
  375. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/plugins/wiggum/state.py +0 -0
  376. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/provider_credentials.py +0 -0
  377. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/provider_identity.py +0 -0
  378. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/pydantic_patches.py +0 -0
  379. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/reopenable_async_client.py +0 -0
  380. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/round_robin_model.py +0 -0
  381. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/session_lifecycle.py +0 -0
  382. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/session_migration.py +0 -0
  383. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/session_storage.py +0 -0
  384. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/status_display.py +0 -0
  385. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/summarization_agent.py +0 -0
  386. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/terminal_utils.py +0 -0
  387. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/__init__.py +0 -0
  388. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/agent_tools.py +0 -0
  389. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/ask_user_question/__init__.py +0 -0
  390. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/ask_user_question/constants.py +0 -0
  391. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/ask_user_question/demo_tui.py +0 -0
  392. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/ask_user_question/handler.py +0 -0
  393. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/ask_user_question/models.py +0 -0
  394. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/ask_user_question/registration.py +0 -0
  395. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/ask_user_question/renderers.py +0 -0
  396. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/ask_user_question/terminal_ui.py +0 -0
  397. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/ask_user_question/theme.py +0 -0
  398. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/ask_user_question/tui_loop.py +0 -0
  399. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/browser/__init__.py +0 -0
  400. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/browser/browser_control.py +0 -0
  401. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/browser/browser_interactions.py +0 -0
  402. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/browser/browser_locator_resolver.py +0 -0
  403. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/browser/browser_locators.py +0 -0
  404. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/browser/browser_manager.py +0 -0
  405. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/browser/browser_navigation.py +0 -0
  406. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/browser/browser_page_snapshot.py +0 -0
  407. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/browser/browser_screenshot.py +0 -0
  408. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/browser/browser_scripts.py +0 -0
  409. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/browser/browser_semantic_interactions.py +0 -0
  410. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/browser/browser_workflows.py +0 -0
  411. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/command_runner.py +0 -0
  412. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/common.py +0 -0
  413. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/display.py +0 -0
  414. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/file_modifications.py +0 -0
  415. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/file_operations.py +0 -0
  416. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/image_tools.py +0 -0
  417. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/model_tools.py +0 -0
  418. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/skills_tools.py +0 -0
  419. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/subagent_context.py +0 -0
  420. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/subagent_invocation.py +0 -0
  421. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/tools_content.py +0 -0
  422. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/tools/universal_constructor.py +0 -0
  423. {code_puppy-0.0.602 → code_puppy-0.0.604}/code_puppy/undo_manager.py +0 -0
  424. {code_puppy-0.0.602 → code_puppy-0.0.604}/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.602
3
+ Version: 0.0.604
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
@@ -6,6 +6,7 @@ import types
6
6
  from pathlib import Path
7
7
 
8
8
  from code_puppy.callbacks import clear_loading_context, set_loading_context
9
+ from code_puppy.plugins import trust as _trust
9
10
 
10
11
  logger = logging.getLogger(__name__)
11
12
 
@@ -19,6 +20,11 @@ _PLUGINS_LOADED = False
19
20
  # Populated once, then read by get_loaded_plugins().
20
21
  _loaded_plugin_names: dict[str, list[str]] = {"builtin": [], "user": [], "project": []}
21
22
 
23
+ # Status of every discovered project plugin, keyed by name:
24
+ # "loaded" | "untrusted" | "changed" | "disabled" | "error".
25
+ # Read by /plugins UI via get_project_plugin_status().
26
+ _project_plugin_status: dict[str, str] = {}
27
+
22
28
 
23
29
  def _load_builtin_plugins(plugins_dir: Path) -> list[str]:
24
30
  """Load built-in plugins from the package plugins directory.
@@ -261,23 +267,98 @@ def _ensure_plugin_package(plugin_dir: Path, plugin_name: str) -> bool:
261
267
  return False
262
268
 
263
269
 
270
+ def _load_one_project_plugin(plugin_dir: Path, plugin_name: str) -> bool:
271
+ """Import a single (already trusted) project plugin.
272
+
273
+ SECURITY: callers MUST verify trust before invoking this — executing
274
+ ``register_callbacks.py`` / ``__init__.py`` is arbitrary code execution.
275
+
276
+ The plugins directory is only added to ``sys.path`` here, i.e. after a
277
+ trust decision, so an untrusted repo can never shadow stdlib/third-party
278
+ modules just by existing.
279
+
280
+ Returns True if the plugin executed successfully.
281
+ """
282
+ callbacks_file = plugin_dir / "register_callbacks.py"
283
+ init_file = plugin_dir / "__init__.py"
284
+
285
+ if not callbacks_file.exists() and not init_file.exists():
286
+ return False
287
+
288
+ # sys.path entry is earned by trust — inserted just-in-time so sibling
289
+ # top-level imports inside the plugin resolve during exec below.
290
+ parent_str = str(plugin_dir.parent)
291
+ if parent_str not in sys.path:
292
+ sys.path.insert(0, parent_str)
293
+
294
+ try:
295
+ if callbacks_file.exists():
296
+ # Register parent package so relative imports resolve
297
+ _ensure_plugin_package(plugin_dir, plugin_name)
298
+
299
+ module_name = f"{_PROJECT_PLUGINS_NS}.{plugin_name}.register_callbacks"
300
+ spec = importlib.util.spec_from_file_location(module_name, callbacks_file)
301
+ if spec is None or spec.loader is None:
302
+ logger.warning(
303
+ f"Could not create module spec for project plugin: {plugin_name}"
304
+ )
305
+ return False
306
+
307
+ module = importlib.util.module_from_spec(spec)
308
+ sys.modules[module_name] = module
309
+ set_loading_context(plugin_name)
310
+ try:
311
+ spec.loader.exec_module(module)
312
+ finally:
313
+ clear_loading_context()
314
+ return True
315
+
316
+ # Fallback to __init__.py (mirrors user plugin behavior)
317
+ set_loading_context(plugin_name)
318
+ try:
319
+ loaded_ok = _ensure_plugin_package(plugin_dir, plugin_name)
320
+ finally:
321
+ clear_loading_context()
322
+ if not loaded_ok:
323
+ logger.warning(
324
+ f"Could not load __init__.py for project plugin: {plugin_name}"
325
+ )
326
+ return loaded_ok
327
+
328
+ except ImportError as e:
329
+ logger.warning(
330
+ f"Failed to import callbacks from project plugin {plugin_name}: {e}"
331
+ )
332
+ return False
333
+ except Exception as e:
334
+ logger.error(
335
+ f"Unexpected error loading project plugin {plugin_name}: {e}",
336
+ exc_info=True,
337
+ )
338
+ return False
339
+
340
+
264
341
  def _load_project_plugins(
265
342
  project_plugins_dir: Path,
266
343
  builtin_names: set[str],
267
344
  user_names: set[str],
268
345
  ) -> list[str]:
269
- """Load project plugins from <CWD>/.code_puppy/plugins/.
346
+ """Load TRUSTED project plugins from <CWD>/.code_puppy/plugins/.
270
347
 
271
- Mirrors _load_user_plugins() but uses a ``project_plugins.`` sys.modules
272
- namespace and warns on name collisions with builtin or user plugins.
348
+ Project plugins are disabled by default: a plugin is only imported when
349
+ the user previously accepted the risk via the /plugins TUI ceremony AND
350
+ its content hash still matches the accepted hash (see plugins.trust).
351
+ Everything else is recorded in ``_project_plugin_status`` and skipped
352
+ WITHOUT importing — import is code execution.
273
353
 
274
- Before loading each plugin's ``register_callbacks.py``, a synthetic
275
- parent package is registered in ``sys.modules`` so that relative
276
- imports (``from . import state``, ``from .utils import …``) resolve
277
- correctly.
354
+ NOTE: this is deliberately different from the ``disabled_plugins``
355
+ mechanism used by builtin/user tiers (loaded but callbacks skipped).
356
+ Do not "unify" them non-enabled project plugins must never import.
278
357
 
279
358
  Returns list of successfully loaded plugin names.
280
359
  """
360
+ from code_puppy.plugins.config import is_plugin_disabled
361
+
281
362
  loaded = []
282
363
 
283
364
  if not project_plugins_dir.exists():
@@ -289,9 +370,7 @@ def _load_project_plugins(
289
370
  )
290
371
  return loaded
291
372
 
292
- project_plugins_str = str(project_plugins_dir)
293
- if project_plugins_str not in sys.path:
294
- sys.path.insert(0, project_plugins_str)
373
+ project_root = project_plugins_dir.parent.parent
295
374
 
296
375
  # Create the top-level namespace package once
297
376
  _ensure_project_ns()
@@ -304,6 +383,36 @@ def _load_project_plugins(
304
383
  ):
305
384
  plugin_name = item.name
306
385
 
386
+ if (
387
+ not (item / "register_callbacks.py").exists()
388
+ and not (item / "__init__.py").exists()
389
+ ):
390
+ continue
391
+
392
+ # Trust gate — fail closed BEFORE any import machinery runs.
393
+ status = _trust.get_trust_status(project_root, plugin_name, item)
394
+ if status != _trust.TRUSTED:
395
+ # Recorded here; surfaced to the human by plugin_list's
396
+ # startup hook (orange banner) once renderers are live.
397
+ # logger.info only — a logger.warning would splat onto
398
+ # stderr above the logo, duplicating the banner.
399
+ _project_plugin_status[plugin_name] = status
400
+ logger.info(
401
+ "Skipping project plugin '%s' (%s). "
402
+ "Review and enable it in the /plugins TUI.",
403
+ plugin_name,
404
+ status,
405
+ )
406
+ continue
407
+
408
+ if is_plugin_disabled(plugin_name):
409
+ _project_plugin_status[plugin_name] = "disabled"
410
+ logger.info(
411
+ "Project plugin '%s' is trusted but disabled — not loading",
412
+ plugin_name,
413
+ )
414
+ continue
415
+
307
416
  # Warn if a project plugin shadows a builtin (user collisions
308
417
  # are handled earlier by skipping the user plugin entirely).
309
418
  if plugin_name in builtin_names:
@@ -311,65 +420,11 @@ def _load_project_plugins(
311
420
  f"Project plugin '{plugin_name}' shadows builtin plugin of the same name"
312
421
  )
313
422
 
314
- callbacks_file = item / "register_callbacks.py"
315
-
316
- if callbacks_file.exists():
317
- try:
318
- # Register parent package so relative imports resolve
319
- _ensure_plugin_package(item, plugin_name)
320
-
321
- module_name = (
322
- f"{_PROJECT_PLUGINS_NS}.{plugin_name}.register_callbacks"
323
- )
324
- spec = importlib.util.spec_from_file_location(
325
- module_name, callbacks_file
326
- )
327
- if spec is None or spec.loader is None:
328
- logger.warning(
329
- f"Could not create module spec for project plugin: {plugin_name}"
330
- )
331
- continue
332
-
333
- module = importlib.util.module_from_spec(spec)
334
- sys.modules[module_name] = module
335
- set_loading_context(plugin_name)
336
- try:
337
- spec.loader.exec_module(module)
338
- finally:
339
- clear_loading_context()
340
- loaded.append(plugin_name)
341
-
342
- except ImportError as e:
343
- logger.warning(
344
- f"Failed to import callbacks from project plugin {plugin_name}: {e}"
345
- )
346
- except Exception as e:
347
- logger.error(
348
- f"Unexpected error loading project plugin {plugin_name}: {e}",
349
- exc_info=True,
350
- )
423
+ if _load_one_project_plugin(item, plugin_name):
424
+ loaded.append(plugin_name)
425
+ _project_plugin_status[plugin_name] = "loaded"
351
426
  else:
352
- # Fallback to __init__.py (mirrors user plugin behavior)
353
- init_file = item / "__init__.py"
354
- if init_file.exists():
355
- try:
356
- set_loading_context(plugin_name)
357
- try:
358
- loaded_ok = _ensure_plugin_package(item, plugin_name)
359
- finally:
360
- clear_loading_context()
361
- if loaded_ok:
362
- loaded.append(plugin_name)
363
- else:
364
- logger.warning(
365
- f"Could not load __init__.py for project plugin: {plugin_name}"
366
- )
367
-
368
- except Exception as e:
369
- logger.error(
370
- f"Unexpected error loading project plugin {plugin_name}: {e}",
371
- exc_info=True,
372
- )
427
+ _project_plugin_status[plugin_name] = "error"
373
428
 
374
429
  return loaded
375
430
 
@@ -416,12 +471,18 @@ def load_plugin_callbacks() -> dict[str, list[str]]:
416
471
 
417
472
  # Pre-scan project plugin names so we can skip user plugins that the
418
473
  # project tier will supersede (project wins, matching agents dedup).
474
+ # SECURITY: only TRUSTED project plugins participate in dedup — otherwise
475
+ # an untrusted repo could knock out user plugins (e.g. force_push_guard)
476
+ # just by squatting on their names.
419
477
  project_plugins_dir = get_project_plugins_directory()
420
- project_plugin_names = (
421
- _scan_plugin_names(project_plugins_dir)
422
- if project_plugins_dir is not None
423
- else set()
424
- )
478
+ project_plugin_names: set[str] = set()
479
+ if project_plugins_dir is not None:
480
+ project_root = project_plugins_dir.parent.parent
481
+ project_plugin_names = {
482
+ name
483
+ for name in _scan_plugin_names(project_plugins_dir)
484
+ if _trust.is_plugin_trusted(project_root, name, project_plugins_dir / name)
485
+ }
425
486
 
426
487
  builtin_loaded = _load_builtin_plugins(plugins_dir)
427
488
  user_skip_names = set(builtin_loaded) | project_plugin_names
@@ -463,6 +524,53 @@ def get_loaded_plugins() -> dict[str, list[str]]:
463
524
  return dict(_loaded_plugin_names)
464
525
 
465
526
 
527
+ def get_project_plugin_status() -> dict[str, str]:
528
+ """Return status of every discovered project plugin.
529
+
530
+ Maps plugin name to one of ``loaded``, ``untrusted``, ``changed``,
531
+ ``disabled``, or ``error``. Used by the /plugins UI to surface
532
+ project plugins that were skipped by the trust gate.
533
+ """
534
+ return dict(_project_plugin_status)
535
+
536
+
537
+ def load_project_plugin_now(plugin_name: str) -> bool:
538
+ """Hot-load a single project plugin after the user granted trust.
539
+
540
+ Re-checks the trust store (fail closed) so callers can't accidentally
541
+ load an unaccepted plugin. Registers callbacks immediately — no
542
+ restart required.
543
+ """
544
+ project_plugins_dir = get_project_plugins_directory()
545
+ if project_plugins_dir is None:
546
+ return False
547
+
548
+ plugin_dir = project_plugins_dir / plugin_name
549
+ if not plugin_dir.is_dir():
550
+ return False
551
+
552
+ project_root = project_plugins_dir.parent.parent
553
+ if not _trust.is_plugin_trusted(project_root, plugin_name, plugin_dir):
554
+ logger.warning(
555
+ "Refusing to hot-load project plugin '%s' — not trusted", plugin_name
556
+ )
557
+ return False
558
+
559
+ if plugin_name in _loaded_plugin_names["project"]:
560
+ # Already imported this session; callbacks are registered.
561
+ _project_plugin_status[plugin_name] = "loaded"
562
+ return True
563
+
564
+ _ensure_project_ns()
565
+ if _load_one_project_plugin(plugin_dir, plugin_name):
566
+ _loaded_plugin_names["project"].append(plugin_name)
567
+ _project_plugin_status[plugin_name] = "loaded"
568
+ return True
569
+
570
+ _project_plugin_status[plugin_name] = "error"
571
+ return False
572
+
573
+
466
574
  def get_user_plugins_dir() -> Path:
467
575
  """Return the path to the user plugins directory."""
468
576
  return USER_PLUGINS_DIR