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.
- {code_puppy-0.0.642 → code_puppy-0.0.643}/PKG-INFO +1 -1
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/_runtime.py +39 -8
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/__init__.py +4 -4
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/bottom_bar.py +26 -2
- code_puppy-0.0.643/code_puppy/messaging/inline_bar.py +190 -0
- code_puppy-0.0.643/code_puppy/messaging/markdown_patches.py +89 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/renderers.py +14 -7
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/rich_renderer.py +13 -11
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_hooks/register_callbacks.py +2 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/pydantic_patches.py +28 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/pyproject.toml +1 -1
- code_puppy-0.0.642/code_puppy/messaging/markdown_patches.py +0 -57
- {code_puppy-0.0.642 → code_puppy-0.0.643}/.gitignore +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/LICENSE +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/README.md +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/__main__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/_builder.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/_compaction.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/_diagnostics.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/_history.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/_key_listeners.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/_non_streaming_render.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/_run_signals.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/_steer_processor.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/agent_code_puppy.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/agent_creator_agent.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/agent_helios.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/agent_manager.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/agent_planning.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/agent_qa_kitten.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/base_agent.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/event_stream_handler.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/json_agent.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/retry_profiles.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/run_stats.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/smooth_stream.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/agents/subagent_stream_handler.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/chatgpt_codex_client.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/claude_cache_client.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/cli_runner.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/add_model_menu.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/agent_menu.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/attachments.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/autosave_menu.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/autosave_search.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/clipboard.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/colors_menu.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/command_handler.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/command_registry.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/config_apply.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/config_commands.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/core_commands.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/diff_menu.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/file_index.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/file_path_completion.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/judges_menu.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/load_context_completion.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/base.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/edit_command.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/handler.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/help_command.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/install_command.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/install_menu.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/list_command.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/logs_command.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/remove_command.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/restart_command.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/search_command.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/silence_warning_command.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/start_all_command.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/start_command.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/status_command.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/stop_command.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/trust_command.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/utils.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp_binding_menu.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/mcp_completion.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/model_picker_completion.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/model_settings_menu.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/onboarding_slides.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/onboarding_wizard.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/pagination.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/pin_command_completion.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/session_commands.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/set_menu.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/set_menu_catalog.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/set_menu_render.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/set_menu_schema.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/set_menu_settings.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/set_menu_shims.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/set_menu_values.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/shell_passthrough.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/skills_completion.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/uc_menu.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/utils.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/command_line/wiggum_state.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/error_logging.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/gemini_code_assist.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/gemini_model.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/hook_engine/README.md +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/hook_engine/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/hook_engine/aliases.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/hook_engine/engine.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/hook_engine/executor.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/hook_engine/matcher.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/hook_engine/models.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/hook_engine/registry.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/hook_engine/validator.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/http_utils.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/catalog.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/formats.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/locale.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/locales/en-US.json +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/locales/es-419.json +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/locales/es-AR.json +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/locales/es-CL.json +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/locales/es-CO.json +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/locales/es-MX.json +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/locales/es.json +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/locales/fr-CA.json +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/plurals.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/pseudo.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/i18n/translate.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/keymap.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/list_filtering.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/main.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/agent_bindings.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/async_lifecycle.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/blocking_startup.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/captured_stdio_server.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/circuit_breaker.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/config_wizard.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/dashboard.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/error_isolation.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/examples/retry_example.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/health_monitor.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/managed_server.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/manager.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/mcp_logs.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/project_config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/registry.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/retry_manager.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/server_registry_catalog.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/status_tracker.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/system_tools.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_/tool_arg_coercion.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_prompts/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/mcp_prompts/hook_creator.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/bar_painters.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/bar_rendering.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/bus.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/chords.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/commands.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/editor_actions.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/editor_completion.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/editor_display.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/editor_history.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/editor_keys.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/editor_paste.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/external_editor.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/line_editor.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/message_queue.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/messages.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/pause_controller.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/prompt_prefix_style.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/queue_console.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/run_ui.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/run_ui_wiring.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/spinner/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/subagent_console.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/messaging/transcript_guard.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/model_descriptions.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/model_factory.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/model_switching.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/model_utils.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/models.json +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/models_dev_api.json +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/models_dev_parser.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/README.md +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/agent.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/bridge.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/capabilities.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/commands.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/content.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/io_delegation.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/mcp_config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/permissions.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/persistence.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/replay.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/session.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/session_config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/acp/state.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/discovery.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/downloader.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/enabled_skills.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/installer.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/metadata.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/prompt_builder.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/remote_catalog.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/skill_catalog.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/skill_commands.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/skills_install_menu.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/agent_skills/skills_menu.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/aws_bedrock/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/aws_bedrock/config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/aws_bedrock/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/aws_bedrock/utils.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/azure_foundry/README.md +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/azure_foundry/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/azure_foundry/config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/azure_foundry/discovery.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/azure_foundry/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/azure_foundry/token.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/azure_foundry/utils.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/btw/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/btw/inline_view.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/btw/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/btw/side_query.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/chatgpt_oauth/usage.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/chatgpt_oauth/utils.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_hooks/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_hooks/config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/fast_mode.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/prompt_handler.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/test_fast_mode.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/claude_code_oauth/utils.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/code_puppy_agent/SKILL.md +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/code_puppy_agent/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/code_puppy_agent/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/context_indicator/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/context_indicator/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/context_indicator/usage.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/copilot_auth/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/copilot_auth/config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/copilot_auth/reasoning_client.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/copilot_auth/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/copilot_auth/utils.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/cancel.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/commands.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/lifecycle.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/runtime.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/startup_lock.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/workflow_ids.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/dbos_durable_exec/wrapper.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/destructive_command_guard/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/destructive_command_guard/detector.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/destructive_command_guard/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/emoji_filter/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/emoji_filter/config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/emoji_filter/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/emoji_filter/stripper.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/empty_html_comment_filter/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/example_custom_command/README.md +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/force_push_guard/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/force_push_guard/detector.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/force_push_guard/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/force_push_guard/test_detector.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/fork/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/fork/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/frontend_emitter/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/frontend_emitter/emitter.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/frontend_emitter/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/frontend_emitter/session_context.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/grok_oauth/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/grok_oauth/config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/grok_oauth/oauth_flow.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/grok_oauth/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/grok_oauth/test_plugin.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/grok_oauth/utils.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/herdr/README.md +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/herdr/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/herdr/client.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/herdr/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/herdr/reporter.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/hook_creator/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/hook_creator/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/hook_manager/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/hook_manager/config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/hook_manager/hooks_menu.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/hook_manager/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/no_tools/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/no_tools/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/oauth_pasteback.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/oauth_puppy_html.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/obsidian_agent/README.md +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/obsidian_agent/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/obsidian_agent/agent_obsidian.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/obsidian_agent/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/ollama/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/ollama/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/ollama_setup/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/ollama_setup/completer.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/ollama_setup/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/plugin_list/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/plugin_list/plugin_contributions.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/plugin_list/plugin_meta.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/plugin_list/plugin_text_utils.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/plugin_list/plugins_menu.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/plugin_list/plugins_menu_layout.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/plugin_list/plugins_menu_render.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/plugin_list/project_trust_flow.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/plugin_list/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/pop_command/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/pop_command/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/prompt_newline/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/prompt_newline/config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/prompt_newline/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/prune/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/prune/prune_menu.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/prune/prune_model.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/prune/prune_render.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/prune/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/README.md +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/commands.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/kennel.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/packer.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/recorder.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/retriever.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/schema.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/state.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/tools.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_kennel/wings.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_spinner/README.md +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_spinner/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_spinner/builtin_frames.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_spinner/commands.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_spinner/picker.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_spinner/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/puppy_spinner/spinners.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/quick_resume/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/quick_resume/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/review_pr/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/review_pr/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/shell_safety/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/stack_dump/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/stack_dump/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/statusline/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/statusline/config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/statusline/payload.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/statusline/prompt_patch.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/statusline/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/statusline/runner.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/statusline/statusline_command.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/steer_queue/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/steer_queue/queue_menu.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/steer_queue/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/subagent_panel/README.md +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/subagent_panel/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/subagent_panel/coalesce_patch.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/subagent_panel/panel_render.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/subagent_panel/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/subagent_panel/resume_repaint.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/subagent_panel/state.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/switch_agent_resume/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/switch_agent_resume/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/README.md +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/bundled_palettes.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/content_styles.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/osc_palette.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/picker.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/prompt_toolkit_theme.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/rich_themes.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/theme/themes.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/token_ratio_learner/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/token_ratio_learner/ratios.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/token_ratio_learner/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/trust.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/trust_notice.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/universal_constructor/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/universal_constructor/models.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/universal_constructor/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/universal_constructor/registry.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/universal_constructor/sandbox.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/wide_completion_menu/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/wide_completion_menu/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/wiggum/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/wiggum/judge.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/wiggum/judge_config.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/wiggum/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/wiggum/state.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/yolo_cli/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/plugins/yolo_cli/register_callbacks.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/provider_credentials.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/provider_identity.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/reopenable_async_client.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/round_robin_model.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/secret_store.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/secret_store_backends.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/session_lifecycle.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/session_migration.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/session_storage.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/status_display.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/summarization_agent.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/terminal_utils.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/agent_tools.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/constants.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/demo_tui.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/handler.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/models.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/registration.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/renderers.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/terminal_ui.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/theme.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/ask_user_question/tui_loop.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/__init__.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_control.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_interactions.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_locator_resolver.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_locators.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_manager.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_navigation.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_page_snapshot.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_screenshot.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_scripts.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_semantic_interactions.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/browser/browser_workflows.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/command_runner.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/common.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/display.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/file_modifications.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/file_operations.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/fs_access.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/image_tools.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/io_backends.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/model_tools.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/shell_backgrounding.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/skills_tools.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/subagent_context.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/subagent_invocation.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/tools_content.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/tools/universal_constructor.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/undo_manager.py +0 -0
- {code_puppy-0.0.642 → code_puppy-0.0.643}/code_puppy/version_checker.py +0 -0
|
@@ -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
|
-
|
|
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
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
35
|
+
from .markdown_patches import patch_markdown
|
|
36
36
|
|
|
37
|
-
|
|
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
|
-
"
|
|
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
|
|
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
|
-
|
|
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
|
|
279
|
-
|
|
280
|
-
|
|
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().
|
|
284
|
+
transaction = get_bottom_bar().output_transaction()
|
|
287
285
|
except Exception:
|
|
288
|
-
|
|
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)
|
|
@@ -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()
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|