code-puppy 0.0.642__tar.gz → 0.0.643__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 (484) hide show
  1. {code_puppy-0.0.642 → code_puppy-0.0.643}/PKG-INFO +1 -1
  2. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/_runtime.py +39 -8
  3. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/__init__.py +4 -4
  4. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/bottom_bar.py +26 -2
  5. code_puppy-0.0.643/code_puppy/messaging/inline_bar.py +190 -0
  6. code_puppy-0.0.643/code_puppy/messaging/markdown_patches.py +89 -0
  7. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/renderers.py +14 -7
  8. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/rich_renderer.py +13 -11
  9. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_hooks/register_callbacks.py +2 -0
  10. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/pydantic_patches.py +28 -0
  11. {code_puppy-0.0.642 → code_puppy-0.0.643}/pyproject.toml +1 -1
  12. code_puppy-0.0.642/code_puppy/messaging/markdown_patches.py +0 -57
  13. {code_puppy-0.0.642 → code_puppy-0.0.643}/.gitignore +0 -0
  14. {code_puppy-0.0.642 → code_puppy-0.0.643}/LICENSE +0 -0
  15. {code_puppy-0.0.642 → code_puppy-0.0.643}/README.md +0 -0
  16. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/__init__.py +0 -0
  17. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/__main__.py +0 -0
  18. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/__init__.py +0 -0
  19. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/_builder.py +0 -0
  20. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/_compaction.py +0 -0
  21. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/_diagnostics.py +0 -0
  22. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/_history.py +0 -0
  23. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/_key_listeners.py +0 -0
  24. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/_non_streaming_render.py +0 -0
  25. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/_run_signals.py +0 -0
  26. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/_steer_processor.py +0 -0
  27. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/agent_code_puppy.py +0 -0
  28. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/agent_creator_agent.py +0 -0
  29. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/agent_helios.py +0 -0
  30. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/agent_manager.py +0 -0
  31. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/agent_planning.py +0 -0
  32. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/agent_qa_kitten.py +0 -0
  33. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/base_agent.py +0 -0
  34. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/event_stream_handler.py +0 -0
  35. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/json_agent.py +0 -0
  36. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/retry_profiles.py +0 -0
  37. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/run_stats.py +0 -0
  38. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/smooth_stream.py +0 -0
  39. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/subagent_stream_handler.py +0 -0
  40. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/callbacks.py +0 -0
  41. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/chatgpt_codex_client.py +0 -0
  42. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/claude_cache_client.py +0 -0
  43. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/cli_runner.py +0 -0
  44. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/__init__.py +0 -0
  45. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/add_model_menu.py +0 -0
  46. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/agent_menu.py +0 -0
  47. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/attachments.py +0 -0
  48. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/autosave_menu.py +0 -0
  49. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/autosave_search.py +0 -0
  50. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/clipboard.py +0 -0
  51. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/colors_menu.py +0 -0
  52. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/command_handler.py +0 -0
  53. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/command_registry.py +0 -0
  54. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/config_apply.py +0 -0
  55. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/config_commands.py +0 -0
  56. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/core_commands.py +0 -0
  57. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/diff_menu.py +0 -0
  58. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/file_index.py +0 -0
  59. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/file_path_completion.py +0 -0
  60. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/judges_menu.py +0 -0
  61. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/load_context_completion.py +0 -0
  62. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/__init__.py +0 -0
  63. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/base.py +0 -0
  64. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
  65. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
  66. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
  67. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/edit_command.py +0 -0
  68. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/handler.py +0 -0
  69. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/help_command.py +0 -0
  70. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/install_command.py +0 -0
  71. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/install_menu.py +0 -0
  72. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/list_command.py +0 -0
  73. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/logs_command.py +0 -0
  74. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/remove_command.py +0 -0
  75. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/restart_command.py +0 -0
  76. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/search_command.py +0 -0
  77. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/silence_warning_command.py +0 -0
  78. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/start_all_command.py +0 -0
  79. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/start_command.py +0 -0
  80. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/status_command.py +0 -0
  81. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
  82. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/stop_command.py +0 -0
  83. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/trust_command.py +0 -0
  84. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/utils.py +0 -0
  85. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  86. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp_binding_menu.py +0 -0
  87. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp_completion.py +0 -0
  88. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/model_picker_completion.py +0 -0
  89. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/model_settings_menu.py +0 -0
  90. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/onboarding_slides.py +0 -0
  91. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/onboarding_wizard.py +0 -0
  92. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/pagination.py +0 -0
  93. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/pin_command_completion.py +0 -0
  94. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
  95. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/session_commands.py +0 -0
  96. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/set_menu.py +0 -0
  97. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/set_menu_catalog.py +0 -0
  98. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/set_menu_render.py +0 -0
  99. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/set_menu_schema.py +0 -0
  100. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/set_menu_settings.py +0 -0
  101. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/set_menu_shims.py +0 -0
  102. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/set_menu_values.py +0 -0
  103. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/shell_passthrough.py +0 -0
  104. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/skills_completion.py +0 -0
  105. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/uc_menu.py +0 -0
  106. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/utils.py +0 -0
  107. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/wiggum_state.py +0 -0
  108. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/config.py +0 -0
  109. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/error_logging.py +0 -0
  110. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/gemini_code_assist.py +0 -0
  111. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/gemini_model.py +0 -0
  112. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/hook_engine/README.md +0 -0
  113. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/hook_engine/__init__.py +0 -0
  114. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/hook_engine/aliases.py +0 -0
  115. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/hook_engine/engine.py +0 -0
  116. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/hook_engine/executor.py +0 -0
  117. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/hook_engine/matcher.py +0 -0
  118. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/hook_engine/models.py +0 -0
  119. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/hook_engine/registry.py +0 -0
  120. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/hook_engine/validator.py +0 -0
  121. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/http_utils.py +0 -0
  122. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/__init__.py +0 -0
  123. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/catalog.py +0 -0
  124. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/formats.py +0 -0
  125. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/locale.py +0 -0
  126. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/locales/en-US.json +0 -0
  127. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/locales/es-419.json +0 -0
  128. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/locales/es-AR.json +0 -0
  129. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/locales/es-CL.json +0 -0
  130. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/locales/es-CO.json +0 -0
  131. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/locales/es-MX.json +0 -0
  132. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/locales/es.json +0 -0
  133. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/locales/fr-CA.json +0 -0
  134. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/plurals.py +0 -0
  135. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/pseudo.py +0 -0
  136. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/translate.py +0 -0
  137. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/keymap.py +0 -0
  138. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/list_filtering.py +0 -0
  139. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/main.py +0 -0
  140. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/__init__.py +0 -0
  141. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/agent_bindings.py +0 -0
  142. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/async_lifecycle.py +0 -0
  143. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/blocking_startup.py +0 -0
  144. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/captured_stdio_server.py +0 -0
  145. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/circuit_breaker.py +0 -0
  146. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/config_wizard.py +0 -0
  147. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/dashboard.py +0 -0
  148. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/error_isolation.py +0 -0
  149. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/examples/retry_example.py +0 -0
  150. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/health_monitor.py +0 -0
  151. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/managed_server.py +0 -0
  152. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/manager.py +0 -0
  153. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/mcp_logs.py +0 -0
  154. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/project_config.py +0 -0
  155. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/registry.py +0 -0
  156. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/retry_manager.py +0 -0
  157. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/server_registry_catalog.py +0 -0
  158. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/status_tracker.py +0 -0
  159. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/system_tools.py +0 -0
  160. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/tool_arg_coercion.py +0 -0
  161. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_prompts/__init__.py +0 -0
  162. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_prompts/hook_creator.py +0 -0
  163. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/bar_painters.py +0 -0
  164. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/bar_rendering.py +0 -0
  165. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/bus.py +0 -0
  166. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/chords.py +0 -0
  167. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/commands.py +0 -0
  168. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/editor_actions.py +0 -0
  169. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/editor_completion.py +0 -0
  170. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/editor_display.py +0 -0
  171. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/editor_history.py +0 -0
  172. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/editor_keys.py +0 -0
  173. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/editor_paste.py +0 -0
  174. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/external_editor.py +0 -0
  175. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/line_editor.py +0 -0
  176. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/message_queue.py +0 -0
  177. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/messages.py +0 -0
  178. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/pause_controller.py +0 -0
  179. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/prompt_prefix_style.py +0 -0
  180. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/queue_console.py +0 -0
  181. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/run_ui.py +0 -0
  182. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/run_ui_wiring.py +0 -0
  183. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/spinner/__init__.py +0 -0
  184. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/subagent_console.py +0 -0
  185. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/transcript_guard.py +0 -0
  186. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/model_descriptions.py +0 -0
  187. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/model_factory.py +0 -0
  188. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/model_switching.py +0 -0
  189. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/model_utils.py +0 -0
  190. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/models.json +0 -0
  191. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/models_dev_api.json +0 -0
  192. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/models_dev_parser.py +0 -0
  193. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/__init__.py +0 -0
  194. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/README.md +0 -0
  195. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/__init__.py +0 -0
  196. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/agent.py +0 -0
  197. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/bridge.py +0 -0
  198. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/capabilities.py +0 -0
  199. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/commands.py +0 -0
  200. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/content.py +0 -0
  201. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/io_delegation.py +0 -0
  202. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/mcp_config.py +0 -0
  203. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/permissions.py +0 -0
  204. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/persistence.py +0 -0
  205. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/register_callbacks.py +0 -0
  206. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/replay.py +0 -0
  207. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/session.py +0 -0
  208. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/session_config.py +0 -0
  209. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/state.py +0 -0
  210. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/__init__.py +0 -0
  211. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/config.py +0 -0
  212. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/discovery.py +0 -0
  213. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/downloader.py +0 -0
  214. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/enabled_skills.py +0 -0
  215. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/installer.py +0 -0
  216. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/metadata.py +0 -0
  217. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/prompt_builder.py +0 -0
  218. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/register_callbacks.py +0 -0
  219. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/remote_catalog.py +0 -0
  220. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/skill_catalog.py +0 -0
  221. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/skill_commands.py +0 -0
  222. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/skills_install_menu.py +0 -0
  223. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/skills_menu.py +0 -0
  224. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/aws_bedrock/__init__.py +0 -0
  225. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/aws_bedrock/config.py +0 -0
  226. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/aws_bedrock/register_callbacks.py +0 -0
  227. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/aws_bedrock/utils.py +0 -0
  228. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/azure_foundry/README.md +0 -0
  229. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/azure_foundry/__init__.py +0 -0
  230. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/azure_foundry/config.py +0 -0
  231. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/azure_foundry/discovery.py +0 -0
  232. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/azure_foundry/register_callbacks.py +0 -0
  233. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/azure_foundry/token.py +0 -0
  234. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/azure_foundry/utils.py +0 -0
  235. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/btw/__init__.py +0 -0
  236. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/btw/inline_view.py +0 -0
  237. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/btw/register_callbacks.py +0 -0
  238. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/btw/side_query.py +0 -0
  239. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
  240. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
  241. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
  242. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +0 -0
  243. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +0 -0
  244. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/chatgpt_oauth/usage.py +0 -0
  245. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/chatgpt_oauth/utils.py +0 -0
  246. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_hooks/__init__.py +0 -0
  247. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_hooks/config.py +0 -0
  248. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
  249. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
  250. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
  251. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
  252. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/fast_mode.py +0 -0
  253. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/prompt_handler.py +0 -0
  254. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +0 -0
  255. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/test_fast_mode.py +0 -0
  256. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
  257. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  258. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/utils.py +0 -0
  259. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/code_puppy_agent/SKILL.md +0 -0
  260. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/code_puppy_agent/__init__.py +0 -0
  261. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/code_puppy_agent/register_callbacks.py +0 -0
  262. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/config.py +0 -0
  263. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/context_indicator/__init__.py +0 -0
  264. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/context_indicator/register_callbacks.py +0 -0
  265. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/context_indicator/usage.py +0 -0
  266. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/copilot_auth/__init__.py +0 -0
  267. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/copilot_auth/config.py +0 -0
  268. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/copilot_auth/reasoning_client.py +0 -0
  269. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/copilot_auth/register_callbacks.py +0 -0
  270. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/copilot_auth/utils.py +0 -0
  271. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
  272. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
  273. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/__init__.py +0 -0
  274. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/cancel.py +0 -0
  275. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/commands.py +0 -0
  276. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/config.py +0 -0
  277. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/lifecycle.py +0 -0
  278. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/register_callbacks.py +0 -0
  279. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/runtime.py +0 -0
  280. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/startup_lock.py +0 -0
  281. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/workflow_ids.py +0 -0
  282. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/wrapper.py +0 -0
  283. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/destructive_command_guard/__init__.py +0 -0
  284. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/destructive_command_guard/detector.py +0 -0
  285. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/destructive_command_guard/register_callbacks.py +0 -0
  286. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/emoji_filter/__init__.py +0 -0
  287. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/emoji_filter/config.py +0 -0
  288. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/emoji_filter/register_callbacks.py +0 -0
  289. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/emoji_filter/stripper.py +0 -0
  290. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/empty_html_comment_filter/register_callbacks.py +0 -0
  291. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/example_custom_command/README.md +0 -0
  292. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
  293. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
  294. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
  295. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/force_push_guard/__init__.py +0 -0
  296. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/force_push_guard/detector.py +0 -0
  297. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/force_push_guard/register_callbacks.py +0 -0
  298. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/force_push_guard/test_detector.py +0 -0
  299. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/fork/__init__.py +0 -0
  300. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/fork/register_callbacks.py +0 -0
  301. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/frontend_emitter/__init__.py +0 -0
  302. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/frontend_emitter/emitter.py +0 -0
  303. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/frontend_emitter/register_callbacks.py +0 -0
  304. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/frontend_emitter/session_context.py +0 -0
  305. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/grok_oauth/__init__.py +0 -0
  306. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/grok_oauth/config.py +0 -0
  307. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/grok_oauth/oauth_flow.py +0 -0
  308. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/grok_oauth/register_callbacks.py +0 -0
  309. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/grok_oauth/test_plugin.py +0 -0
  310. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/grok_oauth/utils.py +0 -0
  311. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/herdr/README.md +0 -0
  312. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/herdr/__init__.py +0 -0
  313. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/herdr/client.py +0 -0
  314. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/herdr/register_callbacks.py +0 -0
  315. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/herdr/reporter.py +0 -0
  316. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/hook_creator/__init__.py +0 -0
  317. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/hook_creator/register_callbacks.py +0 -0
  318. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/hook_manager/__init__.py +0 -0
  319. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/hook_manager/config.py +0 -0
  320. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/hook_manager/hooks_menu.py +0 -0
  321. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/hook_manager/register_callbacks.py +0 -0
  322. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/no_tools/__init__.py +0 -0
  323. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/no_tools/register_callbacks.py +0 -0
  324. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/oauth_pasteback.py +0 -0
  325. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/oauth_puppy_html.py +0 -0
  326. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/obsidian_agent/README.md +0 -0
  327. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/obsidian_agent/__init__.py +0 -0
  328. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/obsidian_agent/agent_obsidian.py +0 -0
  329. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/obsidian_agent/register_callbacks.py +0 -0
  330. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/ollama/__init__.py +0 -0
  331. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/ollama/register_callbacks.py +0 -0
  332. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/ollama_setup/__init__.py +0 -0
  333. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/ollama_setup/completer.py +0 -0
  334. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/ollama_setup/register_callbacks.py +0 -0
  335. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/plugin_list/__init__.py +0 -0
  336. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/plugin_list/plugin_contributions.py +0 -0
  337. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/plugin_list/plugin_meta.py +0 -0
  338. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/plugin_list/plugin_text_utils.py +0 -0
  339. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/plugin_list/plugins_menu.py +0 -0
  340. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/plugin_list/plugins_menu_layout.py +0 -0
  341. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/plugin_list/plugins_menu_render.py +0 -0
  342. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/plugin_list/project_trust_flow.py +0 -0
  343. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/plugin_list/register_callbacks.py +0 -0
  344. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/pop_command/__init__.py +0 -0
  345. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/pop_command/register_callbacks.py +0 -0
  346. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/prompt_newline/__init__.py +0 -0
  347. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/prompt_newline/config.py +0 -0
  348. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/prompt_newline/register_callbacks.py +0 -0
  349. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/prune/__init__.py +0 -0
  350. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/prune/prune_menu.py +0 -0
  351. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/prune/prune_model.py +0 -0
  352. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/prune/prune_render.py +0 -0
  353. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/prune/register_callbacks.py +0 -0
  354. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/README.md +0 -0
  355. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/__init__.py +0 -0
  356. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/commands.py +0 -0
  357. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/config.py +0 -0
  358. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/kennel.py +0 -0
  359. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/packer.py +0 -0
  360. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/recorder.py +0 -0
  361. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/register_callbacks.py +0 -0
  362. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/retriever.py +0 -0
  363. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/schema.py +0 -0
  364. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/state.py +0 -0
  365. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/tools.py +0 -0
  366. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/wings.py +0 -0
  367. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_spinner/README.md +0 -0
  368. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_spinner/__init__.py +0 -0
  369. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_spinner/builtin_frames.py +0 -0
  370. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_spinner/commands.py +0 -0
  371. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_spinner/picker.py +0 -0
  372. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_spinner/register_callbacks.py +0 -0
  373. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_spinner/spinners.py +0 -0
  374. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/quick_resume/__init__.py +0 -0
  375. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/quick_resume/register_callbacks.py +0 -0
  376. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/review_pr/__init__.py +0 -0
  377. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/review_pr/register_callbacks.py +0 -0
  378. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/shell_safety/__init__.py +0 -0
  379. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
  380. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
  381. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
  382. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/stack_dump/__init__.py +0 -0
  383. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/stack_dump/register_callbacks.py +0 -0
  384. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/statusline/__init__.py +0 -0
  385. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/statusline/config.py +0 -0
  386. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/statusline/payload.py +0 -0
  387. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/statusline/prompt_patch.py +0 -0
  388. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/statusline/register_callbacks.py +0 -0
  389. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/statusline/runner.py +0 -0
  390. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/statusline/statusline_command.py +0 -0
  391. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/steer_queue/__init__.py +0 -0
  392. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/steer_queue/queue_menu.py +0 -0
  393. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/steer_queue/register_callbacks.py +0 -0
  394. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/subagent_panel/README.md +0 -0
  395. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/subagent_panel/__init__.py +0 -0
  396. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/subagent_panel/coalesce_patch.py +0 -0
  397. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/subagent_panel/panel_render.py +0 -0
  398. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/subagent_panel/register_callbacks.py +0 -0
  399. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/subagent_panel/resume_repaint.py +0 -0
  400. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/subagent_panel/state.py +0 -0
  401. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/switch_agent_resume/__init__.py +0 -0
  402. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/switch_agent_resume/register_callbacks.py +0 -0
  403. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/README.md +0 -0
  404. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/__init__.py +0 -0
  405. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/bundled_palettes.py +0 -0
  406. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/content_styles.py +0 -0
  407. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/osc_palette.py +0 -0
  408. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/picker.py +0 -0
  409. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/prompt_toolkit_theme.py +0 -0
  410. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/register_callbacks.py +0 -0
  411. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/rich_themes.py +0 -0
  412. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/themes.py +0 -0
  413. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/token_ratio_learner/__init__.py +0 -0
  414. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/token_ratio_learner/ratios.py +0 -0
  415. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/token_ratio_learner/register_callbacks.py +0 -0
  416. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/trust.py +0 -0
  417. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/trust_notice.py +0 -0
  418. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/universal_constructor/__init__.py +0 -0
  419. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/universal_constructor/models.py +0 -0
  420. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/universal_constructor/register_callbacks.py +0 -0
  421. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/universal_constructor/registry.py +0 -0
  422. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/universal_constructor/sandbox.py +0 -0
  423. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/wide_completion_menu/__init__.py +0 -0
  424. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/wide_completion_menu/register_callbacks.py +0 -0
  425. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/wiggum/__init__.py +0 -0
  426. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/wiggum/judge.py +0 -0
  427. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/wiggum/judge_config.py +0 -0
  428. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/wiggum/register_callbacks.py +0 -0
  429. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/wiggum/state.py +0 -0
  430. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/yolo_cli/__init__.py +0 -0
  431. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/yolo_cli/register_callbacks.py +0 -0
  432. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/provider_credentials.py +0 -0
  433. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/provider_identity.py +0 -0
  434. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/reopenable_async_client.py +0 -0
  435. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/round_robin_model.py +0 -0
  436. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/secret_store.py +0 -0
  437. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/secret_store_backends.py +0 -0
  438. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/session_lifecycle.py +0 -0
  439. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/session_migration.py +0 -0
  440. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/session_storage.py +0 -0
  441. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/status_display.py +0 -0
  442. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/summarization_agent.py +0 -0
  443. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/terminal_utils.py +0 -0
  444. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/__init__.py +0 -0
  445. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/agent_tools.py +0 -0
  446. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/__init__.py +0 -0
  447. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/constants.py +0 -0
  448. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/demo_tui.py +0 -0
  449. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/handler.py +0 -0
  450. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/models.py +0 -0
  451. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/registration.py +0 -0
  452. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/renderers.py +0 -0
  453. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/terminal_ui.py +0 -0
  454. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/theme.py +0 -0
  455. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/tui_loop.py +0 -0
  456. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/__init__.py +0 -0
  457. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_control.py +0 -0
  458. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_interactions.py +0 -0
  459. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_locator_resolver.py +0 -0
  460. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_locators.py +0 -0
  461. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_manager.py +0 -0
  462. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_navigation.py +0 -0
  463. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_page_snapshot.py +0 -0
  464. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_screenshot.py +0 -0
  465. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_scripts.py +0 -0
  466. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_semantic_interactions.py +0 -0
  467. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_workflows.py +0 -0
  468. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/command_runner.py +0 -0
  469. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/common.py +0 -0
  470. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/display.py +0 -0
  471. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/file_modifications.py +0 -0
  472. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/file_operations.py +0 -0
  473. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/fs_access.py +0 -0
  474. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/image_tools.py +0 -0
  475. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/io_backends.py +0 -0
  476. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/model_tools.py +0 -0
  477. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/shell_backgrounding.py +0 -0
  478. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/skills_tools.py +0 -0
  479. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/subagent_context.py +0 -0
  480. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/subagent_invocation.py +0 -0
  481. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/tools_content.py +0 -0
  482. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/universal_constructor.py +0 -0
  483. {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/undo_manager.py +0 -0
  484. {code_puppy-0.0.642 → code_puppy-0.0.643}/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.642
3
+ Version: 0.0.643
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
@@ -987,7 +987,14 @@ async def _run_with_mcp_impl(
987
987
  run_success = False
988
988
  run_error: Optional[BaseException] = None
989
989
  run_response_text = ""
990
- run_usage_output_tokens: Optional[int] = None
990
+ run_usage_metadata: dict[str, int | None] = {
991
+ "usage_input_tokens": None,
992
+ "usage_output_tokens": None,
993
+ "usage_total_tokens": None,
994
+ "usage_cached_read_tokens": None,
995
+ "usage_cached_write_tokens": None,
996
+ "usage_thought_tokens": None,
997
+ }
991
998
 
992
999
  try:
993
1000
  # Nested runs (e.g. shell_safety mid-run) leave the SIGINT handler
@@ -1044,13 +1051,37 @@ async def _run_with_mcp_impl(
1044
1051
  run_success = True
1045
1052
  run_response_text = _extract_response_text(result)
1046
1053
  try:
1047
- # Real billed output tokens -- calibrates the run-stats TG
1048
- # estimate (see run_stats.snapshot_cycle_into_aggregates).
1049
- run_usage_output_tokens = (
1050
- int(getattr(result.usage(), "output_tokens", 0) or 0) or None
1051
- )
1054
+ usage = result.usage()
1055
+
1056
+ def _pick_usage_int(*names: str) -> int | None:
1057
+ for name in names:
1058
+ value = getattr(usage, name, None)
1059
+ if value is not None:
1060
+ return int(value) or None
1061
+ return None
1062
+
1063
+ run_usage_metadata = {
1064
+ "usage_input_tokens": _pick_usage_int(
1065
+ "input_tokens", "request_tokens", "prompt_tokens"
1066
+ ),
1067
+ # Real billed output tokens -- calibrates the run-stats TG
1068
+ # estimate (see run_stats.snapshot_cycle_into_aggregates).
1069
+ "usage_output_tokens": _pick_usage_int(
1070
+ "output_tokens", "response_tokens", "completion_tokens"
1071
+ ),
1072
+ "usage_total_tokens": _pick_usage_int("total_tokens"),
1073
+ "usage_cached_read_tokens": _pick_usage_int(
1074
+ "cache_read_tokens", "cached_read_tokens"
1075
+ ),
1076
+ "usage_cached_write_tokens": _pick_usage_int(
1077
+ "cache_write_tokens", "cached_write_tokens"
1078
+ ),
1079
+ "usage_thought_tokens": _pick_usage_int(
1080
+ "thinking_tokens", "thought_tokens", "reasoning_tokens"
1081
+ ),
1082
+ }
1052
1083
  except Exception:
1053
- run_usage_output_tokens = None
1084
+ pass
1054
1085
  return result
1055
1086
  except asyncio.CancelledError:
1056
1087
  run_response_text = ""
@@ -1086,7 +1117,7 @@ async def _run_with_mcp_impl(
1086
1117
  response_text=run_response_text,
1087
1118
  metadata={
1088
1119
  "model": agent.get_model_name(),
1089
- "usage_output_tokens": run_usage_output_tokens,
1120
+ **run_usage_metadata,
1090
1121
  },
1091
1122
  )
1092
1123
  except Exception:
@@ -30,11 +30,11 @@ Example (new):
30
30
  """
31
31
 
32
32
  # =============================================================================
33
- # Apply Rich Markdown patches (left-justified headers)
33
+ # Apply Rich Markdown patches (left-justified headers, unpadded code blocks)
34
34
  # =============================================================================
35
- from .markdown_patches import patch_markdown_headings
35
+ from .markdown_patches import patch_markdown
36
36
 
37
- patch_markdown_headings()
37
+ patch_markdown()
38
38
 
39
39
  # =============================================================================
40
40
  # Legacy API (backward compatible)
@@ -290,7 +290,7 @@ __all__ = [
290
290
  "DEFAULT_STYLES",
291
291
  "DIFF_STYLES",
292
292
  # Markdown patches
293
- "patch_markdown_headings",
293
+ "patch_markdown",
294
294
  # Sub-agent console manager
295
295
  "AgentState",
296
296
  "SubAgentConsoleManager",
@@ -287,6 +287,12 @@ class BottomBar(TranscriptGuardMixin, BarPainterMixin):
287
287
  self._popup_slack = max(0, old_block - len(cleaned))
288
288
  self._sync_reserved(self._popup_seq)
289
289
 
290
+ @contextmanager
291
+ def output_transaction(self) -> Iterator[None]:
292
+ """Coordinate one transcript render with the live prompt surface."""
293
+ self.notify_transcript_output()
294
+ yield
295
+
290
296
  def notify_transcript_output(self) -> None:
291
297
  """Release ONE row of popup slack — called per rendered message.
292
298
 
@@ -698,12 +704,30 @@ _bottom_bar: Optional[BottomBar] = None
698
704
  _bottom_bar_lock = threading.Lock()
699
705
 
700
706
 
707
+ def _use_inline_surface() -> bool:
708
+ """Use the DECSTBM-free surface for known-incompatible terminals."""
709
+ import os
710
+
711
+ mode = os.environ.get("CODE_PUPPY_PROMPT_MODE", "auto").strip().lower()
712
+ if mode in {"inline", "flow"}:
713
+ return True
714
+ if mode in {"pinned", "scroll-region"}:
715
+ return False
716
+ emulator = os.environ.get("TERMINAL_EMULATOR", "").strip().lower()
717
+ return emulator == "jetbrains-jediterm"
718
+
719
+
701
720
  def get_bottom_bar() -> BottomBar:
702
- """Get or lazily create the global BottomBar singleton."""
721
+ """Get or lazily create the terminal-appropriate prompt surface."""
703
722
  global _bottom_bar
704
723
  with _bottom_bar_lock:
705
724
  if _bottom_bar is None:
706
- _bottom_bar = BottomBar()
725
+ if _use_inline_surface():
726
+ from .inline_bar import InlineBottomBar
727
+
728
+ _bottom_bar = InlineBottomBar()
729
+ else:
730
+ _bottom_bar = BottomBar()
707
731
  return _bottom_bar
708
732
 
709
733
 
@@ -0,0 +1,190 @@
1
+ """Inline prompt surface for terminals that mishandle DECSTBM.
2
+
3
+ Unlike :class:`bottom_bar.BottomBar`, this surface never establishes scroll
4
+ margins or paints at absolute screen rows. It keeps the live UI at the normal
5
+ terminal cursor, erases it before transcript output, then redraws it below the
6
+ new output. The public API intentionally matches ``BottomBar`` so the editor
7
+ and status/panel plugins do not need terminal-specific branches.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from contextlib import contextmanager
13
+ from typing import Iterator
14
+
15
+ from .bar_rendering import (
16
+ CLEAR_LINE,
17
+ CURSOR_HIDE,
18
+ CURSOR_SHOW,
19
+ WRAP_OFF,
20
+ WRAP_ON,
21
+ render_prompt_block,
22
+ sanitize,
23
+ )
24
+ from .bottom_bar import PANEL_MAX_ROWS, POPUP_MAX_ROWS, BottomBar
25
+
26
+
27
+ class InlineBottomBar(BottomBar):
28
+ """A DECSTBM-free prompt surface for embedded terminal emulators."""
29
+
30
+ def __init__(self, *args, **kwargs) -> None:
31
+ super().__init__(*args, **kwargs)
32
+ self._displayed_rows = 0
33
+ self._output_depth = 0
34
+
35
+ def start(self) -> None:
36
+ if not self._is_tty():
37
+ return
38
+ with self._lock:
39
+ if self._active:
40
+ return
41
+ self._active = True
42
+ self._cols, self._rows = self._safe_size()
43
+ self._write(CURSOR_HIDE)
44
+ self._paint_inline()
45
+ self._install_sigwinch()
46
+ self._register_atexit()
47
+
48
+ def stop(self) -> None:
49
+ with self._lock:
50
+ if not self._active:
51
+ return
52
+ self._erase_inline()
53
+ self._write(CURSOR_SHOW)
54
+ self._active = False
55
+ self._displayed_rows = 0
56
+
57
+ def _sync_reserved(self, _painter) -> None:
58
+ """Repaint cached state without creating a terminal scroll region."""
59
+ if not self._active or self._suspend_depth > 0 or self._output_depth > 0:
60
+ return
61
+ self._ensure_inline_geometry()
62
+ self._erase_inline()
63
+ self._paint_inline()
64
+
65
+ def notify_transcript_output(self) -> None:
66
+ """Retain popup-slack semantics; erasing is owned by the transaction."""
67
+ with self._lock:
68
+ if self._popup_slack:
69
+ self._popup_slack -= 1
70
+
71
+ @contextmanager
72
+ def output_transaction(self) -> Iterator[None]:
73
+ """Atomically remove the live UI, allow output, then redraw it."""
74
+ with self._lock:
75
+ outermost = self._output_depth == 0
76
+ self._output_depth += 1
77
+ if outermost and self._active and self._suspend_depth == 0:
78
+ self.notify_transcript_output()
79
+ self._erase_inline()
80
+ try:
81
+ yield
82
+ finally:
83
+ self._output_depth -= 1
84
+ if outermost and self._active and self._suspend_depth == 0:
85
+ self._ensure_inline_geometry()
86
+ self._paint_inline()
87
+
88
+ @contextmanager
89
+ def suspended(self) -> Iterator[None]:
90
+ if not self._is_tty():
91
+ yield
92
+ return
93
+ with self._lock:
94
+ self._suspend_depth += 1
95
+ if self._suspend_depth == 1 and self._active:
96
+ self._erase_inline()
97
+ try:
98
+ yield
99
+ finally:
100
+ with self._lock:
101
+ self._suspend_depth -= 1
102
+ if self._suspend_depth == 0 and self._active:
103
+ self._paint_inline()
104
+
105
+ def set_panel_lines(self, lines) -> None:
106
+ from rich.text import Text
107
+
108
+ cleaned = [
109
+ line.copy() if isinstance(line, Text) else sanitize(str(line))
110
+ for line in (lines or [])
111
+ ][:PANEL_MAX_ROWS]
112
+ with self._lock:
113
+ self._panel_lines = cleaned
114
+ self._sync_reserved(None)
115
+
116
+ def set_popup_lines(self, lines, selected: int = -1) -> None:
117
+ cleaned = [sanitize(str(line)) for line in (lines or [])][:POPUP_MAX_ROWS]
118
+ with self._lock:
119
+ self._popup_lines = cleaned
120
+ self._popup_selected = selected
121
+ self._popup_slack = 0
122
+ self._sync_reserved(None)
123
+
124
+ def _ensure_inline_geometry(self) -> None:
125
+ cols, rows = self._safe_size()
126
+ self._cols, self._rows = cols, rows
127
+
128
+ def _inline_lines(self) -> list[str]:
129
+ lines: list[str] = []
130
+ panel = [] if self._popup_lines else self._panel_lines
131
+ for line in panel:
132
+ lines.append(sanitize(line.plain if hasattr(line, "plain") else str(line)))
133
+
134
+ prompt_rows, _ = render_prompt_block(
135
+ self._prompt_prefix,
136
+ self._prompt_buffer,
137
+ self._prompt_cursor,
138
+ self._cols,
139
+ 5,
140
+ prefix_sgrs=self._prompt_prefix_sgrs,
141
+ )
142
+ lines.extend(prompt_rows)
143
+
144
+ for index, line in enumerate(self._popup_lines):
145
+ marker = "› " if index == self._popup_selected else " "
146
+ lines.append(f"{marker}{line}")
147
+
148
+ status = f"{self._status_prefix}{self._status}{self._status_suffix}"
149
+ if status:
150
+ lines.append(sanitize(status))
151
+ return lines or [""]
152
+
153
+ def _paint_inline(self) -> None:
154
+ if not self._active or self._suspend_depth > 0 or self._output_depth > 0:
155
+ return
156
+ lines = self._inline_lines()
157
+ parts = [WRAP_OFF]
158
+ for index, line in enumerate(lines):
159
+ if index:
160
+ parts.append("\r\n")
161
+ parts.append(f"{CLEAR_LINE}{line}")
162
+ if len(lines) > 1:
163
+ parts.append(f"\x1b[{len(lines) - 1}A")
164
+ parts.extend(["\r", WRAP_ON])
165
+ self._write("".join(parts))
166
+ self._displayed_rows = len(lines)
167
+
168
+ def _erase_inline(self) -> None:
169
+ if not self._displayed_rows:
170
+ return
171
+ parts = [WRAP_OFF, "\r"]
172
+ for index in range(self._displayed_rows):
173
+ if index:
174
+ parts.append("\x1b[1B\r")
175
+ parts.append(CLEAR_LINE)
176
+ if self._displayed_rows > 1:
177
+ parts.append(f"\x1b[{self._displayed_rows - 1}A")
178
+ parts.extend(["\r", WRAP_ON])
179
+ self._write("".join(parts))
180
+ self._displayed_rows = 0
181
+
182
+ def _emergency_restore(self) -> None:
183
+ try:
184
+ with self._lock:
185
+ if self._active:
186
+ self._erase_inline()
187
+ self._write(CURSOR_SHOW)
188
+ self._active = False
189
+ except Exception:
190
+ pass
@@ -0,0 +1,89 @@
1
+ """Patches for Rich's Markdown rendering.
2
+
3
+ - Headings: Rich hardcodes them to center-justified; we want left.
4
+ - Code blocks: Rich pads every line to fill a rectangular highlight
5
+ background, and that padding survives copy/paste (#505). See
6
+ ``NoPadCodeBlock``.
7
+ """
8
+
9
+ from rich import box
10
+ from rich.markdown import CodeBlock, Heading, Markdown
11
+ from rich.panel import Panel
12
+ from rich.rule import Rule
13
+ from rich.syntax import Syntax
14
+ from rich.text import Text
15
+
16
+
17
+ class LeftJustifiedHeading(Heading):
18
+ """A heading that left-justifies text instead of centering.
19
+
20
+ Rich's default Heading class hardcodes `text.justify = 'center'`,
21
+ which can look odd in a CLI context. This subclass overrides that
22
+ to use left justification instead.
23
+ """
24
+
25
+ def __rich_console__(self, console, options):
26
+ """Render the heading with left justification."""
27
+ text = self.text
28
+ text.justify = "left" # Override Rich's default 'center'
29
+
30
+ if self.tag == "h1":
31
+ # Draw a border around h1s (same as Rich default)
32
+ yield Panel(
33
+ text,
34
+ box=box.HEAVY,
35
+ style="markdown.h1.border",
36
+ )
37
+ else:
38
+ # Styled text for h2 and beyond (same as Rich default)
39
+ if self.tag == "h2":
40
+ yield Text("")
41
+ yield text
42
+
43
+
44
+ class NoPadCodeBlock(CodeBlock):
45
+ """Code block with per-character background but no padding (#505).
46
+
47
+ Rich's default ``CodeBlock`` pads every line to width so the theme
48
+ background fills a rectangle -- that padding survives copy/paste.
49
+ We bypass ``Syntax``'s line-filling and yield each highlighted line
50
+ directly: theme background stays on real characters, box is "ragged"
51
+ (hugs each line's own width) instead of a filled rectangle. Language
52
+ label + boundary drawn with ``Rule``.
53
+ """
54
+
55
+ def __rich_console__(self, console, options):
56
+ code = str(self.text).rstrip()
57
+ syntax = Syntax(
58
+ code,
59
+ self.lexer_name,
60
+ theme=self.theme,
61
+ word_wrap=True,
62
+ background_color=None,
63
+ )
64
+ yield Rule(title=self.lexer_name, align="left", style="dim")
65
+ for line in syntax.highlight(code).split("\n"):
66
+ # ``Text.highlight()`` sets ``justify="left"`` for opaque
67
+ # backgrounds, which re-pads to container width. Undo it;
68
+ # per-character bg from the base style is unaffected.
69
+ line.justify = None
70
+ yield line
71
+ yield Rule(style="dim")
72
+
73
+
74
+ _patched = False
75
+
76
+
77
+ def patch_markdown():
78
+ """Install left-justified headings + unpadded code blocks. Idempotent."""
79
+ global _patched
80
+ if _patched:
81
+ return
82
+
83
+ Markdown.elements["heading_open"] = LeftJustifiedHeading
84
+ Markdown.elements["fence"] = NoPadCodeBlock
85
+ Markdown.elements["code_block"] = NoPadCodeBlock
86
+ _patched = True
87
+
88
+
89
+ __all__ = ["patch_markdown", "LeftJustifiedHeading", "NoPadCodeBlock"]
@@ -275,18 +275,25 @@ def _classify_style(message: UIMessage) -> Optional[str]:
275
275
 
276
276
 
277
277
  def _print_message(console: Console, message: UIMessage) -> None:
278
- """Print ``message`` to ``console`` using the standard styling rules."""
279
- # New transcript output is about to scroll: the bottom bar walks
280
- # its popup slack back one row per message so the prompt steps down
281
- # with the flow (see BottomBar.notify_transcript_output). Guarded:
282
- # bar geometry plumbing must NEVER break (or kill) a render thread.
278
+ """Print one message while coordinating with the live prompt surface."""
279
+ from contextlib import nullcontext
280
+
283
281
  try:
284
282
  from .bottom_bar import get_bottom_bar
285
283
 
286
- get_bottom_bar().notify_transcript_output()
284
+ transaction = get_bottom_bar().output_transaction()
287
285
  except Exception:
288
- pass
286
+ transaction = nullcontext()
287
+ with transaction:
288
+ _print_message_uncoordinated(console, message)
289
289
 
290
+
291
+ def _print_message_uncoordinated(console: Console, message: UIMessage) -> None:
292
+ """Print ``message`` to ``console`` using the standard styling rules."""
293
+ # New transcript output is about to scroll: the bottom bar walks
294
+ # its popup slack back one row per message so the prompt steps down
295
+ # with the flow (see BottomBar.notify_transcript_output). Guarded:
296
+ # bar geometry plumbing must NEVER break (or kill) a render thread.
290
297
  style = _classify_style(message)
291
298
  content = message.content
292
299
  if message.type == MessageType.QUEUED:
@@ -433,6 +433,19 @@ class RichConsoleRenderer:
433
433
  # =========================================================================
434
434
 
435
435
  def _do_render(self, message: AnyMessage) -> None:
436
+ """Render one message while coordinating with the prompt surface."""
437
+ from contextlib import nullcontext
438
+
439
+ try:
440
+ from .bottom_bar import get_bottom_bar
441
+
442
+ transaction = get_bottom_bar().output_transaction()
443
+ except Exception:
444
+ transaction = nullcontext()
445
+ with transaction:
446
+ self._do_render_uncoordinated(message)
447
+
448
+ def _do_render_uncoordinated(self, message: AnyMessage) -> None:
436
449
  """Synchronously render a message by dispatching to the appropriate handler.
437
450
 
438
451
  Note: User input requests are skipped in sync mode as they require async.
@@ -463,17 +476,6 @@ class RichConsoleRenderer:
463
476
  if get_output_level() != "high" and get_suppress_thinking_messages():
464
477
  return
465
478
 
466
- # New transcript output is about to scroll (peek or full render):
467
- # the bottom bar walks its completion-popup slack back one row
468
- # per message so the prompt steps down with the flow. Guarded:
469
- # bar geometry plumbing must NEVER break a render path.
470
- try:
471
- from .bottom_bar import get_bottom_bar
472
-
473
- get_bottom_bar().notify_transcript_output()
474
- except Exception:
475
- pass
476
-
477
479
  # -- Output-level density gate --
478
480
  if self._should_collapse(message):
479
481
  self._render_peek(message)
@@ -366,6 +366,8 @@ async def on_agent_run_end_hook(
366
366
  "session_id": session_id,
367
367
  "success": success,
368
368
  "error": str(error) if error else None,
369
+ "response_text": response_text,
370
+ "metadata": metadata,
369
371
  },
370
372
  )
371
373
 
@@ -529,6 +529,33 @@ def patch_termflow_clipboard() -> None:
529
529
  pass # never crash on patch failure
530
530
 
531
531
 
532
+ def _no_pad_render_code_line(_line, highlighted, width, margin, style, pretty_pad=True):
533
+ """Drop-in for ``render_code_line`` minus the ``' ' * padding`` suffix."""
534
+ return f"{margin}{highlighted}"
535
+
536
+
537
+ def patch_termflow_code_padding() -> None:
538
+ """Strip trailing-space padding from termflow code lines (#505).
539
+
540
+ termflow's ``render_code_line`` right-pads to render width, but
541
+ termflow doesn't color code backgrounds -- so the padding is pure
542
+ invisible filler that corrupts copy/paste. Must patch both
543
+ ``termflow.render.code`` (the definition) AND
544
+ ``termflow.render.renderer`` (did ``from … import render_code_line``,
545
+ so it holds a stale reference).
546
+ """
547
+ try:
548
+ import termflow.render.code as _termflow_code
549
+ import termflow.render.renderer as _termflow_renderer
550
+
551
+ _termflow_code.render_code_line = _no_pad_render_code_line
552
+ _termflow_renderer.render_code_line = _no_pad_render_code_line
553
+ except ImportError:
554
+ pass # termflow not available
555
+ except Exception:
556
+ pass # never crash on patch failure
557
+
558
+
532
559
  def apply_all_patches() -> None:
533
560
  """Apply all monkey patches.
534
561
 
@@ -541,3 +568,4 @@ def apply_all_patches() -> None:
541
568
  patch_tool_call_callbacks()
542
569
  patch_prompt_toolkit_emoji_width()
543
570
  patch_termflow_clipboard()
571
+ patch_termflow_code_padding()
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "code-puppy"
7
- version = "0.0.642"
7
+ version = "0.0.643"
8
8
  description = "Code generation agent"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11,<3.15"
@@ -1,57 +0,0 @@
1
- """Patches for Rich's Markdown rendering.
2
-
3
- This module provides customizations to Rich's default Markdown rendering,
4
- particularly for header justification which is hardcoded to center in Rich.
5
- """
6
-
7
- from rich import box
8
- from rich.markdown import Heading, Markdown
9
- from rich.panel import Panel
10
- from rich.text import Text
11
-
12
-
13
- class LeftJustifiedHeading(Heading):
14
- """A heading that left-justifies text instead of centering.
15
-
16
- Rich's default Heading class hardcodes `text.justify = 'center'`,
17
- which can look odd in a CLI context. This subclass overrides that
18
- to use left justification instead.
19
- """
20
-
21
- def __rich_console__(self, console, options):
22
- """Render the heading with left justification."""
23
- text = self.text
24
- text.justify = "left" # Override Rich's default 'center'
25
-
26
- if self.tag == "h1":
27
- # Draw a border around h1s (same as Rich default)
28
- yield Panel(
29
- text,
30
- box=box.HEAVY,
31
- style="markdown.h1.border",
32
- )
33
- else:
34
- # Styled text for h2 and beyond (same as Rich default)
35
- if self.tag == "h2":
36
- yield Text("")
37
- yield text
38
-
39
-
40
- _patched = False
41
-
42
-
43
- def patch_markdown_headings():
44
- """Patch Rich's Markdown to use left-justified headings.
45
-
46
- This function is idempotent - calling it multiple times has no effect
47
- after the first call.
48
- """
49
- global _patched
50
- if _patched:
51
- return
52
-
53
- Markdown.elements["heading_open"] = LeftJustifiedHeading
54
- _patched = True
55
-
56
-
57
- __all__ = ["patch_markdown_headings", "LeftJustifiedHeading"]
File without changes
File without changes
File without changes