code-puppy 0.0.656__tar.gz → 0.0.657__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {code_puppy-0.0.656 → code_puppy-0.0.657}/PKG-INFO +1 -1
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/state.py +27 -8
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_manager.py +159 -13
- {code_puppy-0.0.656 → code_puppy-0.0.657}/pyproject.toml +1 -1
- {code_puppy-0.0.656 → code_puppy-0.0.657}/.gitignore +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/LICENSE +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/README.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/__main__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/_builder.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/_compaction.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/_diagnostics.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/_history.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/_key_listeners.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/_non_streaming_render.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/_run_signals.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/_runtime.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/_steer_processor.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/agent_code_puppy.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/agent_creator_agent.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/agent_helios.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/agent_manager.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/agent_planning.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/agent_qa_kitten.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/base_agent.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/event_stream_handler.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/json_agent.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/retry_profiles.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/run_stats.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/smooth_stream.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/agents/subagent_stream_handler.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/chatgpt_codex_client.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/claude_cache_client.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/cli_runner.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/add_model_menu.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/agent_menu.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/attachments.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/autosave_menu.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/autosave_search.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/clipboard.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/colors_menu.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/command_handler.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/command_registry.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/config_apply.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/config_commands.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/core_commands.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/diff_menu.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/file_index.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/file_path_completion.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/image_utils.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/judges_menu.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/load_context_completion.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/base.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/edit_command.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/handler.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/help_command.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/install_command.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/install_menu.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/list_command.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/logs_command.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/remove_command.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/restart_command.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/search_command.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/silence_warning_command.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/start_all_command.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/start_command.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/status_command.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/stop_command.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/trust_command.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/utils.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp_binding_menu.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp_completion.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/model_picker_completion.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/model_settings_menu.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/onboarding_slides.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/onboarding_wizard.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/pagination.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/pin_command_completion.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/session_commands.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/set_menu.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_catalog.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_render.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_schema.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_settings.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_shims.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_values.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/shell_passthrough.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/skills_completion.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/uc_menu.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/utils.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/wiggum_state.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/error_logging.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/gemini_code_assist.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/gemini_model.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/hook_engine/README.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/hook_engine/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/hook_engine/aliases.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/hook_engine/engine.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/hook_engine/executor.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/hook_engine/matcher.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/hook_engine/models.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/hook_engine/registry.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/hook_engine/validator.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/http_utils.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/audit.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/catalog.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/formats.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/locale.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/locales/en-US.json +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/locales/es-AR.json +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/locales/es-CL.json +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/locales/es-CO.json +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/locales/es-MX.json +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/locales/es.json +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/locales/fr-CA.json +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/plurals.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/pseudo.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/i18n/translate.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/keymap.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/list_filtering.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/main.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/agent_bindings.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/async_lifecycle.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/blocking_startup.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/captured_stdio_server.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/circuit_breaker.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/config_wizard.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/dashboard.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/error_isolation.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/examples/retry_example.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/health_monitor.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/managed_server.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/manager.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/mcp_logs.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/project_config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/registry.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/retry_manager.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/server_registry_catalog.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/status_tracker.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/system_tools.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_/tool_arg_coercion.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_prompts/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/mcp_prompts/hook_creator.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/bar_painters.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/bar_rendering.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/bottom_bar.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/bus.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/chords.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/commands.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/editor_actions.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/editor_completion.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/editor_display.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/editor_history.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/editor_keys.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/editor_paste.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/external_editor.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/inline_bar.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/line_editor.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/markdown_patches.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/message_queue.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/messages.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/pause_controller.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/prompt_prefix_style.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/queue_console.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/renderers.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/rich_renderer.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/run_ui.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/run_ui_wiring.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/spinner/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/subagent_console.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/messaging/transcript_guard.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/model_descriptions.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/model_factory.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/model_switching.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/model_utils.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/models.json +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/models_dev_api.json +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/models_dev_parser.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/README.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/agent.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/bridge.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/capabilities.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/commands.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/content.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/io_delegation.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/mcp_config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/permissions.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/persistence.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/replay.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/session.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/session_config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/acp/state.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/discovery.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/downloader.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/enabled_skills.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/installer.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/metadata.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/prompt_builder.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/remote_catalog.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/skill_catalog.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/skill_commands.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/skills_install_menu.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/skills_menu.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/aws_bedrock/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/aws_bedrock/config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/aws_bedrock/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/aws_bedrock/utils.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/README.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/discovery.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/token.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/utils.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/btw/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/btw/inline_view.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/btw/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/btw/side_query.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/image_generation.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/image_tool.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/usage.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/utils.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_hooks/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_hooks/config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_hooks/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/fast_mode.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/prompt_handler.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/test_fast_mode.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/utils.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/code_puppy_agent/SKILL.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/code_puppy_agent/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/code_puppy_agent/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/context_indicator/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/context_indicator/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/context_indicator/usage.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/reasoning_client.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/utils.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/cancel.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/commands.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/lifecycle.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/runtime.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/startup_lock.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/workflow_ids.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/wrapper.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/destructive_command_guard/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/destructive_command_guard/detector.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/destructive_command_guard/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/emoji_filter/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/emoji_filter/config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/emoji_filter/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/emoji_filter/stripper.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/empty_html_comment_filter/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/example_custom_command/README.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/installer.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/force_push_guard/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/force_push_guard/detector.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/force_push_guard/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/force_push_guard/test_detector.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/fork/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/fork/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/frontend_emitter/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/frontend_emitter/emitter.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/frontend_emitter/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/frontend_emitter/session_context.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/oauth_flow.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/test_plugin.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/utils.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/herdr/README.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/herdr/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/herdr/client.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/herdr/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/herdr/reporter.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/hook_creator/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/hook_creator/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/hook_manager/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/hook_manager/config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/hook_manager/hooks_menu.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/hook_manager/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/no_tools/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/no_tools/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/oauth_pasteback.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/oauth_puppy_html.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/obsidian_agent/README.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/obsidian_agent/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/obsidian_agent/agent_obsidian.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/obsidian_agent/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/ollama/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/ollama/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/ollama_setup/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/ollama_setup/completer.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/ollama_setup/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugin_contributions.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugin_meta.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugin_text_utils.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugins_menu.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugins_menu_layout.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugins_menu_render.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/project_trust_flow.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/pop_command/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/pop_command/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/prompt_newline/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/prompt_newline/config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/prompt_newline/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/prune/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/prune/prune_menu.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/prune/prune_model.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/prune/prune_render.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/prune/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/README.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/commands.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/kennel.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/packer.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/recorder.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/retriever.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/schema.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/state.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/tools.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/wings.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/README.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/builtin_frames.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/commands.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/picker.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/spinners.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/quick_resume/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/quick_resume/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/review_pr/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/review_pr/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/shell_safety/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/stack_dump/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/stack_dump/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/statusline/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/statusline/config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/statusline/payload.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/statusline/prompt_patch.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/statusline/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/statusline/runner.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/statusline/statusline_command.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/steer_queue/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/steer_queue/queue_menu.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/steer_queue/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/README.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/coalesce_patch.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/panel_render.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/resume_repaint.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/switch_agent_resume/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/switch_agent_resume/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/README.md +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/bundled_palettes.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/content_styles.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/osc_palette.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/picker.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/prompt_toolkit_theme.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/rich_themes.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/theme/themes.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/token_ratio_learner/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/token_ratio_learner/ratios.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/token_ratio_learner/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/trust.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/trust_notice.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/models.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/registry.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/sandbox.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/wide_completion_menu/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/wide_completion_menu/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/judge.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/judge_config.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/state.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/yolo_cli/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/plugins/yolo_cli/register_callbacks.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/provider_credentials.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/provider_identity.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/pydantic_patches.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/reopenable_async_client.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/round_robin_model.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/secret_store.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/secret_store_backends.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/session_lifecycle.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/session_migration.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/session_storage.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/status_display.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/summarization_agent.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/terminal_utils.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/agent_tools.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/constants.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/demo_tui.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/handler.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/models.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/registration.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/renderers.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/terminal_ui.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/theme.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/tui_loop.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/__init__.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_control.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_interactions.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_locator_resolver.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_locators.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_navigation.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_page_snapshot.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_screenshot.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_scripts.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_semantic_interactions.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_workflows.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/command_runner.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/common.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/display.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/file_modifications.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/file_operations.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/fs_access.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/image_tools.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/io_backends.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/model_tools.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/shell_backgrounding.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/skills_tools.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/subagent_context.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/subagent_invocation.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/tools_content.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/tools/universal_constructor.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/undo_manager.py +0 -0
- {code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/version_checker.py +0 -0
|
@@ -147,25 +147,44 @@ def snapshot() -> List[Dict[str, Any]]:
|
|
|
147
147
|
PARENTS are never idle-pruned either: a parent that has invoked children and
|
|
148
148
|
is merely AWAITING them emits no stream events of its own, so its last_seen
|
|
149
149
|
goes stale -- but it is busy, not idle. Pruning it would orphan its whole
|
|
150
|
-
subtree, making the children re-render as depth-0 roots.
|
|
151
|
-
|
|
152
|
-
|
|
150
|
+
subtree, making the children re-render as depth-0 roots.
|
|
151
|
+
|
|
152
|
+
ROOT rows (parent=None) are never idle-pruned either. A root is the visible
|
|
153
|
+
anchor of a live user-initiated ``invoke_agent`` call; silently deleting it
|
|
154
|
+
while its work is still in flight (e.g. a slow tool call that emits no
|
|
155
|
+
stream events for many minutes) would strand any completed sibling in state
|
|
156
|
+
with no flush trigger, and hide from the user that a real invocation is
|
|
157
|
+
still running. Roots exit via one of three legitimate paths only:
|
|
158
|
+
completion (``_handle_frozen`` -> ``mark_done`` -> ``_maybe_flush_group``),
|
|
159
|
+
cancel (``state.clear()`` from ``_on_agent_run_cancel``), or end-of-turn
|
|
160
|
+
(``state.clear()`` from ``_on_agent_run_end``).
|
|
161
|
+
|
|
162
|
+
So only childless, not-done, genuinely-stale ORPHAN LEAVES are eligible --
|
|
163
|
+
a non-root row whose parent is no longer in the tree AND has been silent
|
|
164
|
+
longer than IDLE_PRUNE_S. End-of-turn ``state.clear()`` remains the real
|
|
165
|
+
cleanup for anything that errors/cancels without flushing.
|
|
153
166
|
"""
|
|
154
167
|
now = time.time()
|
|
155
168
|
with _LOCK:
|
|
156
169
|
ids = set(_AGENTS)
|
|
157
170
|
# session_ids still referenced as someone's parent == busy (awaiting kids).
|
|
158
171
|
busy_parents = {e.get("parent") for e in _AGENTS.values() if e.get("parent")}
|
|
159
|
-
#
|
|
160
|
-
#
|
|
161
|
-
#
|
|
162
|
-
#
|
|
163
|
-
#
|
|
172
|
+
# Prune entries that are ALL of:
|
|
173
|
+
# - not done
|
|
174
|
+
# - not a parent of anything (else pruning orphans their subtree)
|
|
175
|
+
# - NOT a root (parent is not None) -- roots have explicit lifecycle
|
|
176
|
+
# handling; silent idle-eviction of a live root is never correct
|
|
177
|
+
# (see docstring). Without this guard, a childless root awaiting a
|
|
178
|
+
# slow tool would be misclassified as a disconnected orphan because
|
|
179
|
+
# ``None not in ids`` trivially holds.
|
|
180
|
+
# - whose own parent is gone from the tree (a true orphan)
|
|
181
|
+
# - has been silent longer than IDLE_PRUNE_S
|
|
164
182
|
stale = [
|
|
165
183
|
s
|
|
166
184
|
for s, e in _AGENTS.items()
|
|
167
185
|
if not e.get("done")
|
|
168
186
|
and s not in busy_parents
|
|
187
|
+
and e.get("parent") is not None
|
|
169
188
|
and e.get("parent") not in ids
|
|
170
189
|
and now - e["last_seen"] > IDLE_PRUNE_S
|
|
171
190
|
]
|
|
@@ -6,6 +6,7 @@ Supports multiple simultaneous instances with unique profile directories.
|
|
|
6
6
|
import asyncio
|
|
7
7
|
import atexit
|
|
8
8
|
import contextvars
|
|
9
|
+
import math
|
|
9
10
|
import os
|
|
10
11
|
from pathlib import Path
|
|
11
12
|
from typing import Callable, Dict, Optional
|
|
@@ -47,6 +48,42 @@ def _load_plugin_browser_types() -> None:
|
|
|
47
48
|
# Store active manager instances by session ID
|
|
48
49
|
_active_managers: dict[str, "BrowserManager"] = {}
|
|
49
50
|
|
|
51
|
+
|
|
52
|
+
# --------------------------------------------------------------------------- #
|
|
53
|
+
# Cleanup timeouts
|
|
54
|
+
#
|
|
55
|
+
# Playwright teardown awaits (``context.close``, ``browser.close``,
|
|
56
|
+
# ``playwright.stop``, ``storage_state``) have no internal timeout and can wedge
|
|
57
|
+
# indefinitely when: a page holds an unhandled ``beforeunload`` dialog, a service
|
|
58
|
+
# worker never releases its WebLock, the browser subprocess crashed but did not
|
|
59
|
+
# exit, or the CDP WebSocket went stale (e.g. laptop slept mid-run). Each step
|
|
60
|
+
# below is wrapped in ``asyncio.wait_for`` with a per-step budget so
|
|
61
|
+
# ``_cleanup()`` always returns in bounded time regardless of Playwright state.
|
|
62
|
+
#
|
|
63
|
+
# Overrides are env-var driven so users can bump the budgets on slow machines
|
|
64
|
+
# without a code change. Values are seconds (float, must be finite and > 0 --
|
|
65
|
+
# ``inf``/``nan`` are rejected and fall back to the default).
|
|
66
|
+
# --------------------------------------------------------------------------- #
|
|
67
|
+
def _env_float(name: str, default: float) -> float:
|
|
68
|
+
"""Parse a finite positive float from ``os.environ``; fall back on any parse error."""
|
|
69
|
+
raw = os.environ.get(name)
|
|
70
|
+
if not raw:
|
|
71
|
+
return default
|
|
72
|
+
try:
|
|
73
|
+
value = float(raw)
|
|
74
|
+
except ValueError:
|
|
75
|
+
return default
|
|
76
|
+
if not math.isfinite(value) or value <= 0:
|
|
77
|
+
return default
|
|
78
|
+
return value
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
_STATE_TIMEOUT_S = _env_float("BROWSER_CLEANUP_STATE_TIMEOUT_S", 10.0)
|
|
82
|
+
_CONTEXT_TIMEOUT_S = _env_float("BROWSER_CLEANUP_CONTEXT_TIMEOUT_S", 10.0)
|
|
83
|
+
_BROWSER_TIMEOUT_S = _env_float("BROWSER_CLEANUP_BROWSER_TIMEOUT_S", 5.0)
|
|
84
|
+
_PW_TIMEOUT_S = _env_float("BROWSER_CLEANUP_PW_TIMEOUT_S", 5.0)
|
|
85
|
+
|
|
86
|
+
|
|
50
87
|
# Context variable for browser session - properly inherits through async tasks
|
|
51
88
|
# This allows parallel agent invocations to each have their own browser instance
|
|
52
89
|
_browser_session_var: contextvars.ContextVar[Optional[str]] = contextvars.ContextVar(
|
|
@@ -184,6 +221,10 @@ class BrowserManager:
|
|
|
184
221
|
emit_info(f"Using persistent profile: {self.profile_dir}")
|
|
185
222
|
|
|
186
223
|
pw = await async_playwright().start()
|
|
224
|
+
# Track the driver instance so ``_cleanup`` can ``.stop()`` it (and,
|
|
225
|
+
# if it hangs, SIGKILL the driver subprocess). Without this reference
|
|
226
|
+
# the node driver leaks until Python GC eventually reaps it.
|
|
227
|
+
self._playwright = pw
|
|
187
228
|
# Use persistent context directory for Chromium to preserve browser state
|
|
188
229
|
context = await pw.chromium.launch_persistent_context(
|
|
189
230
|
user_data_dir=str(self.profile_dir), headless=self.headless
|
|
@@ -230,43 +271,148 @@ class BrowserManager:
|
|
|
230
271
|
async def _cleanup(self, silent: bool = False) -> None:
|
|
231
272
|
"""Clean up browser resources and save persistent state.
|
|
232
273
|
|
|
274
|
+
Every underlying await is bounded by ``asyncio.wait_for`` -- Playwright
|
|
275
|
+
teardown can otherwise wedge indefinitely on unresponsive service
|
|
276
|
+
workers, unhandled ``beforeunload`` prompts, or stale CDP WebSockets.
|
|
277
|
+
If ``playwright.stop()`` times out we escalate to SIGKILL on the node
|
|
278
|
+
driver subprocess, which transitively reaps the browser process (its
|
|
279
|
+
child) so we never leak processes even when CDP is completely wedged.
|
|
280
|
+
|
|
233
281
|
Args:
|
|
234
|
-
silent: If True, suppress
|
|
282
|
+
silent: If True, suppress ALL user-facing warnings/info emits (used
|
|
283
|
+
during shutdown/atexit). Timeouts and errors still occur, they
|
|
284
|
+
just don't spam the console.
|
|
235
285
|
"""
|
|
286
|
+
_emit_warning = (lambda _msg: None) if silent else emit_warning
|
|
287
|
+
_emit_success = (lambda _msg: None) if silent else emit_success
|
|
288
|
+
|
|
236
289
|
try:
|
|
237
|
-
# Save browser state before closing (cookies, localStorage, etc.)
|
|
290
|
+
# Save browser state before closing (cookies, localStorage, etc.).
|
|
238
291
|
if self._context:
|
|
292
|
+
storage_state_path = self.profile_dir / "storage_state.json"
|
|
239
293
|
try:
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
294
|
+
await asyncio.wait_for(
|
|
295
|
+
self._context.storage_state(path=str(storage_state_path)),
|
|
296
|
+
timeout=_STATE_TIMEOUT_S,
|
|
297
|
+
)
|
|
298
|
+
_emit_success(f"Browser state saved to {storage_state_path}")
|
|
299
|
+
except asyncio.TimeoutError:
|
|
300
|
+
_emit_warning(
|
|
301
|
+
f"Timed out ({_STATE_TIMEOUT_S:g}s) saving browser state; "
|
|
302
|
+
"proceeding with teardown"
|
|
303
|
+
)
|
|
244
304
|
except Exception as e:
|
|
245
|
-
|
|
246
|
-
|
|
305
|
+
_emit_warning(f"Could not save storage state: {e}")
|
|
306
|
+
|
|
307
|
+
# Auto-dismiss any beforeunload dialog Playwright might raise during
|
|
308
|
+
# context.close(). Without this, a page that registered a
|
|
309
|
+
# ``beforeunload`` handler causes context.close() to await a
|
|
310
|
+
# dialog handler that was never installed -> hang.
|
|
311
|
+
if self._context:
|
|
312
|
+
self._install_dialog_dismisser(silent=silent)
|
|
247
313
|
|
|
314
|
+
# Close the browser context.
|
|
315
|
+
if self._context:
|
|
248
316
|
try:
|
|
249
|
-
await
|
|
317
|
+
await asyncio.wait_for(
|
|
318
|
+
self._context.close(), timeout=_CONTEXT_TIMEOUT_S
|
|
319
|
+
)
|
|
320
|
+
except asyncio.TimeoutError:
|
|
321
|
+
_emit_warning(
|
|
322
|
+
f"Timed out ({_CONTEXT_TIMEOUT_S:g}s) closing browser context; "
|
|
323
|
+
"deferring to later driver cleanup"
|
|
324
|
+
)
|
|
250
325
|
except Exception:
|
|
251
|
-
pass # Ignore errors during context close
|
|
326
|
+
pass # Ignore other errors during context close
|
|
252
327
|
self._context = None
|
|
253
328
|
|
|
329
|
+
# Close the browser. If it wedges (unresponsive CDP), we can only
|
|
330
|
+
# emit a warning here -- current Python Playwright does NOT expose
|
|
331
|
+
# a subprocess handle on ``Browser``. The browser process is a
|
|
332
|
+
# child of the node driver, so ``_force_kill_playwright_process``
|
|
333
|
+
# below transitively reaps it via SIGKILL to the parent driver.
|
|
254
334
|
if self._browser:
|
|
255
335
|
try:
|
|
256
|
-
await
|
|
336
|
+
await asyncio.wait_for(
|
|
337
|
+
self._browser.close(), timeout=_BROWSER_TIMEOUT_S
|
|
338
|
+
)
|
|
339
|
+
except asyncio.TimeoutError:
|
|
340
|
+
_emit_warning(
|
|
341
|
+
f"Timed out ({_BROWSER_TIMEOUT_S:g}s) closing browser; "
|
|
342
|
+
"deferring to driver-process kill below"
|
|
343
|
+
)
|
|
257
344
|
except Exception:
|
|
258
|
-
pass # Ignore errors during browser close
|
|
345
|
+
pass # Ignore other errors during browser close
|
|
259
346
|
self._browser = None
|
|
260
347
|
|
|
348
|
+
# Stop the playwright driver subprocess.
|
|
349
|
+
if getattr(self, "_playwright", None):
|
|
350
|
+
try:
|
|
351
|
+
await asyncio.wait_for(
|
|
352
|
+
self._playwright.stop(), timeout=_PW_TIMEOUT_S
|
|
353
|
+
)
|
|
354
|
+
except asyncio.TimeoutError:
|
|
355
|
+
_emit_warning(
|
|
356
|
+
f"Timed out ({_PW_TIMEOUT_S:g}s) stopping playwright driver; "
|
|
357
|
+
"killing subprocess"
|
|
358
|
+
)
|
|
359
|
+
self._force_kill_playwright_process(silent=silent)
|
|
360
|
+
except Exception:
|
|
361
|
+
pass
|
|
362
|
+
self._playwright = None
|
|
363
|
+
|
|
261
364
|
self._initialized = False
|
|
262
365
|
|
|
263
366
|
# Remove from active managers
|
|
264
367
|
if self.session_id in _active_managers:
|
|
265
368
|
del _active_managers[self.session_id]
|
|
266
369
|
|
|
370
|
+
except Exception as e:
|
|
371
|
+
_emit_warning(f"Warning during cleanup: {e}")
|
|
372
|
+
|
|
373
|
+
def _install_dialog_dismisser(self, silent: bool = False) -> None:
|
|
374
|
+
"""Attach an auto-dismiss dialog handler to every open page.
|
|
375
|
+
|
|
376
|
+
Playwright blocks on unhandled ``beforeunload`` dialogs during
|
|
377
|
+
``context.close()``. Best-effort: iterate pages, ignore per-page
|
|
378
|
+
failures (a closed page raises when you touch it).
|
|
379
|
+
"""
|
|
380
|
+
if not self._context:
|
|
381
|
+
return
|
|
382
|
+
try:
|
|
383
|
+
pages = self._context.pages
|
|
384
|
+
except Exception:
|
|
385
|
+
return
|
|
386
|
+
for page in pages:
|
|
387
|
+
try:
|
|
388
|
+
page.on("dialog", lambda d: asyncio.ensure_future(d.dismiss()))
|
|
389
|
+
except Exception as e:
|
|
390
|
+
if not silent:
|
|
391
|
+
emit_warning(f"Could not install dialog handler: {e}")
|
|
392
|
+
|
|
393
|
+
def _force_kill_playwright_process(self, silent: bool = False) -> None:
|
|
394
|
+
"""Force-kill the Playwright node driver subprocess.
|
|
395
|
+
|
|
396
|
+
The browser process is a child of this driver, so a SIGKILL here
|
|
397
|
+
transitively reaps the whole browser tree -- our only reliable escape
|
|
398
|
+
hatch when CDP has gone unresponsive.
|
|
399
|
+
|
|
400
|
+
Attribute path: ``_playwright._impl_obj._connection._transport._proc``.
|
|
401
|
+
This is a private API but has been stable across Playwright releases
|
|
402
|
+
(verified against 1.61.0). If any hop in the chain moves, we no-op
|
|
403
|
+
rather than raise (best-effort).
|
|
404
|
+
"""
|
|
405
|
+
impl = getattr(self._playwright, "_impl_obj", None)
|
|
406
|
+
connection = getattr(impl, "_connection", None)
|
|
407
|
+
transport = getattr(connection, "_transport", None)
|
|
408
|
+
proc = getattr(transport, "_proc", None)
|
|
409
|
+
if proc is None:
|
|
410
|
+
return
|
|
411
|
+
try:
|
|
412
|
+
proc.kill()
|
|
267
413
|
except Exception as e:
|
|
268
414
|
if not silent:
|
|
269
|
-
emit_warning(f"
|
|
415
|
+
emit_warning(f"Could not kill playwright driver process: {e}")
|
|
270
416
|
|
|
271
417
|
async def close(self) -> None:
|
|
272
418
|
"""Close the browser and clean up resources."""
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/load_context_completion.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/catalog_server_installer.py
RENAMED
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/custom_server_installer.py
RENAMED
|
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
|
{code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/mcp/silence_warning_command.py
RENAMED
|
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
|
{code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/model_picker_completion.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.656 → code_puppy-0.0.657}/code_puppy/command_line/prompt_toolkit_completion.py
RENAMED
|
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
|
|
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
|