code-puppy 0.0.414__tar.gz → 0.0.415__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 (267) hide show
  1. {code_puppy-0.0.414 → code_puppy-0.0.415}/PKG-INFO +1 -1
  2. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/messaging/rich_renderer.py +76 -44
  3. {code_puppy-0.0.414 → code_puppy-0.0.415}/pyproject.toml +1 -1
  4. {code_puppy-0.0.414 → code_puppy-0.0.415}/.gitignore +0 -0
  5. {code_puppy-0.0.414 → code_puppy-0.0.415}/LICENSE +0 -0
  6. {code_puppy-0.0.414 → code_puppy-0.0.415}/README.md +0 -0
  7. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/__init__.py +0 -0
  8. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/__main__.py +0 -0
  9. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/__init__.py +0 -0
  10. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/agent_c_reviewer.py +0 -0
  11. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/agent_code_puppy.py +0 -0
  12. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/agent_code_reviewer.py +0 -0
  13. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/agent_cpp_reviewer.py +0 -0
  14. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/agent_creator_agent.py +0 -0
  15. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/agent_golang_reviewer.py +0 -0
  16. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/agent_helios.py +0 -0
  17. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/agent_javascript_reviewer.py +0 -0
  18. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/agent_manager.py +0 -0
  19. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/agent_pack_leader.py +0 -0
  20. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/agent_planning.py +0 -0
  21. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/agent_python_programmer.py +0 -0
  22. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/agent_python_reviewer.py +0 -0
  23. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/agent_qa_expert.py +0 -0
  24. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/agent_qa_kitten.py +0 -0
  25. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/agent_scheduler.py +0 -0
  26. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/agent_security_auditor.py +0 -0
  27. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/agent_terminal_qa.py +0 -0
  28. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/agent_typescript_reviewer.py +0 -0
  29. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/base_agent.py +0 -0
  30. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/event_stream_handler.py +0 -0
  31. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/json_agent.py +0 -0
  32. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/pack/__init__.py +0 -0
  33. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/pack/bloodhound.py +0 -0
  34. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/pack/husky.py +0 -0
  35. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/pack/retriever.py +0 -0
  36. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/pack/shepherd.py +0 -0
  37. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/pack/terrier.py +0 -0
  38. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/pack/watchdog.py +0 -0
  39. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/prompt_reviewer.py +0 -0
  40. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/agents/subagent_stream_handler.py +0 -0
  41. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/api/__init__.py +0 -0
  42. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/api/app.py +0 -0
  43. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/api/main.py +0 -0
  44. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/api/pty_manager.py +0 -0
  45. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/api/routers/__init__.py +0 -0
  46. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/api/routers/agents.py +0 -0
  47. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/api/routers/commands.py +0 -0
  48. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/api/routers/config.py +0 -0
  49. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/api/routers/sessions.py +0 -0
  50. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/api/templates/terminal.html +0 -0
  51. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/api/websocket.py +0 -0
  52. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/callbacks.py +0 -0
  53. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/chatgpt_codex_client.py +0 -0
  54. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/claude_cache_client.py +0 -0
  55. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/cli_runner.py +0 -0
  56. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/__init__.py +0 -0
  57. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/add_model_menu.py +0 -0
  58. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/agent_menu.py +0 -0
  59. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/attachments.py +0 -0
  60. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/autosave_menu.py +0 -0
  61. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/clipboard.py +0 -0
  62. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/colors_menu.py +0 -0
  63. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/command_handler.py +0 -0
  64. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/command_registry.py +0 -0
  65. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/config_commands.py +0 -0
  66. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/core_commands.py +0 -0
  67. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/diff_menu.py +0 -0
  68. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/file_path_completion.py +0 -0
  69. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/load_context_completion.py +0 -0
  70. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/__init__.py +0 -0
  71. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/base.py +0 -0
  72. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
  73. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
  74. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
  75. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/edit_command.py +0 -0
  76. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/handler.py +0 -0
  77. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/help_command.py +0 -0
  78. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/install_command.py +0 -0
  79. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/install_menu.py +0 -0
  80. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/list_command.py +0 -0
  81. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/logs_command.py +0 -0
  82. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/remove_command.py +0 -0
  83. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/restart_command.py +0 -0
  84. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/search_command.py +0 -0
  85. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/start_all_command.py +0 -0
  86. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/start_command.py +0 -0
  87. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/status_command.py +0 -0
  88. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
  89. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/stop_command.py +0 -0
  90. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/test_command.py +0 -0
  91. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/utils.py +0 -0
  92. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  93. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/mcp_completion.py +0 -0
  94. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/model_picker_completion.py +0 -0
  95. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/model_settings_menu.py +0 -0
  96. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/motd.py +0 -0
  97. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/onboarding_slides.py +0 -0
  98. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/onboarding_wizard.py +0 -0
  99. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/pin_command_completion.py +0 -0
  100. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
  101. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/session_commands.py +0 -0
  102. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/skills_completion.py +0 -0
  103. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/uc_menu.py +0 -0
  104. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/utils.py +0 -0
  105. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/command_line/wiggum_state.py +0 -0
  106. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/config.py +0 -0
  107. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/error_logging.py +0 -0
  108. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/gemini_code_assist.py +0 -0
  109. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/gemini_model.py +0 -0
  110. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/http_utils.py +0 -0
  111. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/keymap.py +0 -0
  112. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/main.py +0 -0
  113. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/mcp_/__init__.py +0 -0
  114. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/mcp_/async_lifecycle.py +0 -0
  115. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/mcp_/blocking_startup.py +0 -0
  116. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/mcp_/captured_stdio_server.py +0 -0
  117. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/mcp_/circuit_breaker.py +0 -0
  118. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/mcp_/config_wizard.py +0 -0
  119. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/mcp_/dashboard.py +0 -0
  120. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/mcp_/error_isolation.py +0 -0
  121. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/mcp_/examples/retry_example.py +0 -0
  122. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/mcp_/health_monitor.py +0 -0
  123. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/mcp_/managed_server.py +0 -0
  124. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/mcp_/manager.py +0 -0
  125. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/mcp_/mcp_logs.py +0 -0
  126. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/mcp_/registry.py +0 -0
  127. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/mcp_/retry_manager.py +0 -0
  128. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/mcp_/server_registry_catalog.py +0 -0
  129. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/mcp_/status_tracker.py +0 -0
  130. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/mcp_/system_tools.py +0 -0
  131. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/messaging/__init__.py +0 -0
  132. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/messaging/bus.py +0 -0
  133. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/messaging/commands.py +0 -0
  134. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/messaging/markdown_patches.py +0 -0
  135. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/messaging/message_queue.py +0 -0
  136. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/messaging/messages.py +0 -0
  137. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/messaging/queue_console.py +0 -0
  138. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/messaging/renderers.py +0 -0
  139. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/messaging/spinner/__init__.py +0 -0
  140. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/messaging/spinner/console_spinner.py +0 -0
  141. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/messaging/spinner/spinner_base.py +0 -0
  142. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/messaging/subagent_console.py +0 -0
  143. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/model_factory.py +0 -0
  144. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/model_switching.py +0 -0
  145. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/model_utils.py +0 -0
  146. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/models.json +0 -0
  147. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/models_dev_api.json +0 -0
  148. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/models_dev_parser.py +0 -0
  149. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/__init__.py +0 -0
  150. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/agent_skills/__init__.py +0 -0
  151. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/agent_skills/config.py +0 -0
  152. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/agent_skills/discovery.py +0 -0
  153. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/agent_skills/downloader.py +0 -0
  154. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/agent_skills/installer.py +0 -0
  155. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/agent_skills/metadata.py +0 -0
  156. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/agent_skills/prompt_builder.py +0 -0
  157. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/agent_skills/register_callbacks.py +0 -0
  158. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/agent_skills/remote_catalog.py +0 -0
  159. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/agent_skills/skill_catalog.py +0 -0
  160. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/agent_skills/skills_install_menu.py +0 -0
  161. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/agent_skills/skills_menu.py +0 -0
  162. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/antigravity_oauth/__init__.py +0 -0
  163. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/antigravity_oauth/accounts.py +0 -0
  164. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/antigravity_oauth/antigravity_model.py +0 -0
  165. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/antigravity_oauth/config.py +0 -0
  166. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/antigravity_oauth/constants.py +0 -0
  167. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/antigravity_oauth/oauth.py +0 -0
  168. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/antigravity_oauth/register_callbacks.py +0 -0
  169. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/antigravity_oauth/storage.py +0 -0
  170. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/antigravity_oauth/test_plugin.py +0 -0
  171. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/antigravity_oauth/token.py +0 -0
  172. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/antigravity_oauth/transport.py +0 -0
  173. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/antigravity_oauth/utils.py +0 -0
  174. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
  175. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
  176. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
  177. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +0 -0
  178. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +0 -0
  179. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/chatgpt_oauth/utils.py +0 -0
  180. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
  181. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
  182. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
  183. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
  184. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +0 -0
  185. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
  186. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  187. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/claude_code_oauth/utils.py +0 -0
  188. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
  189. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
  190. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/example_custom_command/README.md +0 -0
  191. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
  192. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
  193. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
  194. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/frontend_emitter/__init__.py +0 -0
  195. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/frontend_emitter/emitter.py +0 -0
  196. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/frontend_emitter/register_callbacks.py +0 -0
  197. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/oauth_puppy_html.py +0 -0
  198. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/scheduler/__init__.py +0 -0
  199. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/scheduler/register_callbacks.py +0 -0
  200. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/scheduler/scheduler_menu.py +0 -0
  201. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/scheduler/scheduler_wizard.py +0 -0
  202. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/shell_safety/__init__.py +0 -0
  203. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
  204. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
  205. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
  206. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/synthetic_status/__init__.py +0 -0
  207. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/synthetic_status/register_callbacks.py +0 -0
  208. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/synthetic_status/status_api.py +0 -0
  209. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/universal_constructor/__init__.py +0 -0
  210. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/universal_constructor/models.py +0 -0
  211. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/universal_constructor/register_callbacks.py +0 -0
  212. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/universal_constructor/registry.py +0 -0
  213. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/plugins/universal_constructor/sandbox.py +0 -0
  214. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/prompts/antigravity_system_prompt.md +0 -0
  215. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/pydantic_patches.py +0 -0
  216. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/reopenable_async_client.py +0 -0
  217. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/round_robin_model.py +0 -0
  218. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/scheduler/__init__.py +0 -0
  219. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/scheduler/__main__.py +0 -0
  220. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/scheduler/cli.py +0 -0
  221. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/scheduler/config.py +0 -0
  222. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/scheduler/daemon.py +0 -0
  223. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/scheduler/executor.py +0 -0
  224. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/scheduler/platform.py +0 -0
  225. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/scheduler/platform_unix.py +0 -0
  226. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/scheduler/platform_win.py +0 -0
  227. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/session_storage.py +0 -0
  228. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/status_display.py +0 -0
  229. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/summarization_agent.py +0 -0
  230. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/terminal_utils.py +0 -0
  231. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/__init__.py +0 -0
  232. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/agent_tools.py +0 -0
  233. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/ask_user_question/__init__.py +0 -0
  234. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/ask_user_question/constants.py +0 -0
  235. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/ask_user_question/demo_tui.py +0 -0
  236. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/ask_user_question/handler.py +0 -0
  237. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/ask_user_question/models.py +0 -0
  238. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/ask_user_question/registration.py +0 -0
  239. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/ask_user_question/renderers.py +0 -0
  240. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/ask_user_question/terminal_ui.py +0 -0
  241. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/ask_user_question/theme.py +0 -0
  242. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/ask_user_question/tui_loop.py +0 -0
  243. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/browser/__init__.py +0 -0
  244. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/browser/browser_control.py +0 -0
  245. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/browser/browser_interactions.py +0 -0
  246. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/browser/browser_locators.py +0 -0
  247. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/browser/browser_manager.py +0 -0
  248. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/browser/browser_navigation.py +0 -0
  249. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/browser/browser_screenshot.py +0 -0
  250. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/browser/browser_scripts.py +0 -0
  251. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/browser/browser_workflows.py +0 -0
  252. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/browser/chromium_terminal_manager.py +0 -0
  253. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/browser/terminal_command_tools.py +0 -0
  254. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/browser/terminal_screenshot_tools.py +0 -0
  255. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/browser/terminal_tools.py +0 -0
  256. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/command_runner.py +0 -0
  257. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/common.py +0 -0
  258. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/display.py +0 -0
  259. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/file_modifications.py +0 -0
  260. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/file_operations.py +0 -0
  261. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/scheduler_tools.py +0 -0
  262. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/skills_tools.py +0 -0
  263. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/subagent_context.py +0 -0
  264. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/tools_content.py +0 -0
  265. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/tools/universal_constructor.py +0 -0
  266. {code_puppy-0.0.414 → code_puppy-0.0.415}/code_puppy/uvx_detection.py +0 -0
  267. {code_puppy-0.0.414 → code_puppy-0.0.415}/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.414
3
+ Version: 0.0.415
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
@@ -98,6 +98,17 @@ DIFF_STYLES = {
98
98
  "context": "dim",
99
99
  }
100
100
 
101
+ GROUPABLE_TYPES = frozenset(
102
+ {
103
+ FileContentMessage,
104
+ GrepResultMessage,
105
+ DiffMessage,
106
+ FileListingMessage,
107
+ ShellStartMessage,
108
+ }
109
+ )
110
+ TRANSPARENT_TYPES = frozenset({SpinnerControl})
111
+
101
112
 
102
113
  # =============================================================================
103
114
  # Rich Console Renderer
@@ -111,6 +122,12 @@ class RichConsoleRenderer:
111
122
  It uses a background thread for synchronous compatibility with the main loop.
112
123
  """
113
124
 
125
+ # Message types that support consecutive grouping under a single banner
126
+ _GROUPABLE_TYPES = GROUPABLE_TYPES
127
+
128
+ # Message types that are "transparent" - they don't break an active group
129
+ _TRANSPARENT_TYPES = TRANSPARENT_TYPES
130
+
114
131
  def __init__(
115
132
  self,
116
133
  bus: MessageBus,
@@ -132,6 +149,8 @@ class RichConsoleRenderer:
132
149
  self._running = False
133
150
  self._thread: Optional[threading.Thread] = None
134
151
  self._spinners: Dict[str, object] = {} # spinner_id -> status context
152
+ # Grouping: track last rendered message type for consecutive grouping
153
+ self._last_rendered_type: Optional[type] = None
135
154
 
136
155
  @property
137
156
  def console(self) -> Console:
@@ -172,6 +191,16 @@ class RichConsoleRenderer:
172
191
  """
173
192
  return is_subagent() and not get_subagent_verbose()
174
193
 
194
+ def _is_continuation(self, msg_type: type) -> bool:
195
+ """Check if this message should be rendered as a grouped child (no banner).
196
+
197
+ Returns True if the previous rendered message was the same groupable type,
198
+ meaning the banner was already printed and we just need the child line.
199
+ """
200
+ return (
201
+ msg_type in self._GROUPABLE_TYPES and self._last_rendered_type == msg_type
202
+ )
203
+
175
204
  # =========================================================================
176
205
  # Lifecycle (Synchronous - for compatibility with main.py)
177
206
  # =========================================================================
@@ -226,9 +255,12 @@ class RichConsoleRenderer:
226
255
  """Render a message synchronously with error handling."""
227
256
  try:
228
257
  self._do_render(message)
258
+ # Track type for grouping (transparent types don't break groups)
259
+ msg_type = type(message)
260
+ if msg_type not in self._TRANSPARENT_TYPES:
261
+ self._last_rendered_type = msg_type
229
262
  except Exception as e:
230
- # Don't let rendering errors crash the loop
231
- # Escape the error message to prevent nested markup errors
263
+ self._last_rendered_type = None
232
264
  safe_error = escape_rich_markup(str(e))
233
265
  self._console.print(f"[dim red]Render error: {safe_error}[/dim red]")
234
266
 
@@ -327,8 +359,8 @@ class RichConsoleRenderer:
327
359
  elif isinstance(message, SelectionRequest):
328
360
  await self._render_selection_request(message)
329
361
  else:
330
- # Use sync render for everything else
331
- self._do_render(message)
362
+ # Use sync renderer for shared rendering and grouping behavior
363
+ self._render_sync(message)
332
364
 
333
365
  # =========================================================================
334
366
  # Text Messages
@@ -383,12 +415,13 @@ class RichConsoleRenderer:
383
415
  import os
384
416
  from collections import defaultdict
385
417
 
386
- # Header on single line
387
418
  rec_flag = f"(recursive={msg.recursive})"
388
- banner = self._format_banner("directory_listing", "DIRECTORY LISTING")
419
+ if not self._is_continuation(FileListingMessage):
420
+ banner = self._format_banner("directory_listing", "DIRECTORY LISTING")
421
+ self._console.print(f"\n{banner}")
422
+
389
423
  self._console.print(
390
- f"\n{banner} "
391
- f"📂 [bold cyan]{msg.directory}[/bold cyan] [dim]{rec_flag}[/dim]\n"
424
+ f" ├─ 📂 [bold cyan]{msg.directory}[/bold cyan] [dim]{rec_flag}[/dim]\n"
392
425
  )
393
426
 
394
427
  # Build a tree structure: {parent_path: {files: [], dirs: set(), size: int}}
@@ -498,11 +531,7 @@ class RichConsoleRenderer:
498
531
  )
499
532
 
500
533
  def _render_file_content(self, msg: FileContentMessage) -> None:
501
- """Render a file read - just show the header, not the content.
502
-
503
- The file content is for the LLM only, not for display in the UI.
504
- """
505
- # Skip for sub-agents unless verbose mode
534
+ """Render a file read - just show the header, not the content."""
506
535
  if self._should_suppress_subagent_output():
507
536
  return
508
537
 
@@ -512,11 +541,13 @@ class RichConsoleRenderer:
512
541
  end_line = msg.start_line + msg.num_lines - 1
513
542
  line_info = f" [dim](lines {msg.start_line}-{end_line})[/dim]"
514
543
 
515
- # Just print the header - content is for LLM only
516
- banner = self._format_banner("read_file", "READ FILE")
517
- self._console.print(
518
- f"\n{banner} 📂 [bold cyan]{msg.path}[/bold cyan]{line_info}"
519
- )
544
+ # Print banner only if this is NOT a continuation of the same type
545
+ if not self._is_continuation(FileContentMessage):
546
+ banner = self._format_banner("read_file", "READ FILE")
547
+ self._console.print(f"\n{banner}")
548
+
549
+ # Always print as tree child
550
+ self._console.print(f" ├─ 📂 [bold cyan]{msg.path}[/bold cyan]{line_info}")
520
551
 
521
552
  def _render_grep_result(self, msg: GrepResultMessage) -> None:
522
553
  """Render grep results grouped by file matching old format."""
@@ -526,15 +557,17 @@ class RichConsoleRenderer:
526
557
 
527
558
  import re
528
559
 
529
- # Header
530
- banner = self._format_banner("grep", "GREP")
560
+ if not self._is_continuation(GrepResultMessage):
561
+ banner = self._format_banner("grep", "GREP")
562
+ self._console.print(f"\n{banner}")
563
+
531
564
  self._console.print(
532
- f"\n{banner} 📂 [dim]{msg.directory} for '{msg.search_term}'[/dim]"
565
+ f" ├─ 📂 [dim]{msg.directory} for '{msg.search_term}'[/dim]"
533
566
  )
534
567
 
535
568
  if not msg.matches:
536
569
  self._console.print(
537
- f"[dim]No matches found for '{msg.search_term}' "
570
+ f"[dim]No matches found for '{msg.search_term}' "
538
571
  f"in {msg.directory}[/dim]"
539
572
  )
540
573
  return
@@ -551,7 +584,7 @@ class RichConsoleRenderer:
551
584
  file_matches = by_file[file_path]
552
585
  match_word = "match" if len(file_matches) == 1 else "matches"
553
586
  self._console.print(
554
- f"\n[dim]📄 {file_path} ({len(file_matches)} {match_word})[/dim]"
587
+ f"[dim]📄 {file_path} ({len(file_matches)} {match_word})[/dim]"
555
588
  )
556
589
 
557
590
  # Show each match with line number and content
@@ -577,15 +610,16 @@ class RichConsoleRenderer:
577
610
  highlighted_line = line
578
611
 
579
612
  ln = match.line_number
580
- self._console.print(f" [dim]{ln:4d}[/dim] │ {highlighted_line}")
613
+ self._console.print(
614
+ f" │ [dim]{ln:4d}[/dim] │ {highlighted_line}"
615
+ )
581
616
  else:
582
617
  # Concise mode (default): Show only file summaries
583
- self._console.print("")
584
618
  for file_path in sorted(by_file.keys()):
585
619
  file_matches = by_file[file_path]
586
620
  match_word = "match" if len(file_matches) == 1 else "matches"
587
621
  self._console.print(
588
- f"[dim]📄 {file_path} ({len(file_matches)} {match_word})[/dim]"
622
+ f"[dim]📄 {file_path} ({len(file_matches)} {match_word})[/dim]"
589
623
  )
590
624
 
591
625
  # Summary - subtle
@@ -593,13 +627,10 @@ class RichConsoleRenderer:
593
627
  file_word = "file" if len(by_file) == 1 else "files"
594
628
  num_files = len(by_file)
595
629
  self._console.print(
596
- f"[dim]Found {msg.total_matches} {match_word} "
630
+ f"[dim]Found {msg.total_matches} {match_word} "
597
631
  f"across {num_files} {file_word}[/dim]"
598
632
  )
599
633
 
600
- # Trailing newline for spinner separation
601
- self._console.print()
602
-
603
634
  # =========================================================================
604
635
  # Diff
605
636
  # =========================================================================
@@ -616,11 +647,12 @@ class RichConsoleRenderer:
616
647
  icon = op_icons.get(msg.operation, "📄")
617
648
  op_color = op_colors.get(msg.operation, "white")
618
649
 
619
- # Header on single line
620
- banner = self._format_banner("edit_file", "EDIT FILE")
650
+ if not self._is_continuation(DiffMessage):
651
+ banner = self._format_banner("edit_file", "EDIT FILE")
652
+ self._console.print(f"\n{banner}")
653
+
621
654
  self._console.print(
622
- f"\n{banner} "
623
- f"{icon} [{op_color}]{msg.operation.upper()}[/{op_color}] "
655
+ f" ├─ {icon} [{op_color}]{msg.operation.upper()}[/{op_color}] "
624
656
  f"[bold cyan]{msg.path}[/bold cyan]"
625
657
  )
626
658
 
@@ -654,33 +686,33 @@ class RichConsoleRenderer:
654
686
 
655
687
  def _render_shell_start(self, msg: ShellStartMessage) -> None:
656
688
  """Render shell command start notification."""
657
- # Skip for sub-agents unless verbose mode
658
689
  if self._should_suppress_subagent_output():
659
690
  return
660
691
 
661
- # Escape command to prevent Rich markup injection
662
692
  safe_command = escape_rich_markup(msg.command)
663
- # Header showing command is starting
664
- banner = self._format_banner("shell_command", "SHELL COMMAND")
665
693
 
666
- # Add background indicator if running in background mode
694
+ if not self._is_continuation(ShellStartMessage):
695
+ banner = self._format_banner("shell_command", "SHELL COMMAND")
696
+ self._console.print(f"\n{banner}")
697
+
698
+ # Tree child with command
667
699
  if msg.background:
668
700
  self._console.print(
669
- f"\n{banner} 🚀 [dim]$ {safe_command}[/dim] [bold magenta][BACKGROUND 🌙][/bold magenta]"
701
+ f" ├─ 🚀 [dim]$ {safe_command}[/dim] [bold magenta][BACKGROUND 🌙][/bold magenta]"
670
702
  )
671
703
  else:
672
- self._console.print(f"\n{banner} 🚀 [dim]$ {safe_command}[/dim]")
704
+ self._console.print(f" ├─ 🚀 [dim]$ {safe_command}[/dim]")
673
705
 
674
706
  # Show working directory if specified
675
707
  if msg.cwd:
676
708
  safe_cwd = escape_rich_markup(msg.cwd)
677
- self._console.print(f"[dim]📂 Working directory: {safe_cwd}[/dim]")
709
+ self._console.print(f"[dim]📂 Working directory: {safe_cwd}[/dim]")
678
710
 
679
711
  # Show timeout or background status
680
712
  if msg.background:
681
- self._console.print("[dim]⏱ Runs detached (no timeout)[/dim]")
713
+ self._console.print("[dim]⏱ Runs detached (no timeout)[/dim]")
682
714
  else:
683
- self._console.print(f"[dim]⏱ Timeout: {msg.timeout}s[/dim]")
715
+ self._console.print(f"[dim]⏱ Timeout: {msg.timeout}s[/dim]")
684
716
 
685
717
  def _render_shell_line(self, msg: ShellLineMessage) -> None:
686
718
  """Render shell output line preserving ANSI codes and carriage returns."""
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "code-puppy"
7
- version = "0.0.414"
7
+ version = "0.0.415"
8
8
  description = "Code generation agent"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11,<3.14"
File without changes
File without changes
File without changes