code-puppy 0.0.655__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.655 → code_puppy-0.0.657}/PKG-INFO +1 -1
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/config_apply.py +1 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/config_commands.py +4 -4
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/model_settings_menu.py +3 -44
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_catalog.py +0 -17
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/config.py +4 -79
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/model_factory.py +11 -9
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/state.py +27 -8
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_manager.py +159 -13
- {code_puppy-0.0.655 → code_puppy-0.0.657}/pyproject.toml +1 -1
- {code_puppy-0.0.655 → code_puppy-0.0.657}/.gitignore +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/LICENSE +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/README.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/__main__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/_builder.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/_compaction.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/_diagnostics.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/_history.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/_key_listeners.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/_non_streaming_render.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/_run_signals.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/_runtime.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/_steer_processor.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/agent_code_puppy.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/agent_creator_agent.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/agent_helios.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/agent_manager.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/agent_planning.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/agent_qa_kitten.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/base_agent.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/event_stream_handler.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/json_agent.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/retry_profiles.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/run_stats.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/smooth_stream.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/agents/subagent_stream_handler.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/chatgpt_codex_client.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/claude_cache_client.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/cli_runner.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/add_model_menu.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/agent_menu.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/attachments.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/autosave_menu.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/autosave_search.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/clipboard.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/colors_menu.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/command_handler.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/command_registry.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/core_commands.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/diff_menu.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/file_index.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/file_path_completion.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/image_utils.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/judges_menu.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/load_context_completion.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/base.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/edit_command.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/handler.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/help_command.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/install_command.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/install_menu.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/list_command.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/logs_command.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/remove_command.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/restart_command.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/search_command.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/silence_warning_command.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/start_all_command.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/start_command.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/status_command.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/stop_command.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/trust_command.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/utils.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp_binding_menu.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/mcp_completion.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/model_picker_completion.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/onboarding_slides.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/onboarding_wizard.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/pagination.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/pin_command_completion.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/session_commands.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/set_menu.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_render.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_schema.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_settings.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_shims.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/set_menu_values.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/shell_passthrough.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/skills_completion.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/uc_menu.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/utils.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/command_line/wiggum_state.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/error_logging.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/gemini_code_assist.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/gemini_model.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/hook_engine/README.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/hook_engine/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/hook_engine/aliases.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/hook_engine/engine.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/hook_engine/executor.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/hook_engine/matcher.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/hook_engine/models.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/hook_engine/registry.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/hook_engine/validator.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/http_utils.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/audit.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/catalog.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/formats.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/locale.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/locales/en-US.json +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/locales/es-AR.json +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/locales/es-CL.json +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/locales/es-CO.json +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/locales/es-MX.json +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/locales/es.json +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/locales/fr-CA.json +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/plurals.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/pseudo.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/i18n/translate.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/keymap.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/list_filtering.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/main.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/agent_bindings.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/async_lifecycle.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/blocking_startup.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/captured_stdio_server.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/circuit_breaker.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/config_wizard.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/dashboard.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/error_isolation.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/examples/retry_example.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/health_monitor.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/managed_server.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/manager.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/mcp_logs.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/project_config.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/registry.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/retry_manager.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/server_registry_catalog.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/status_tracker.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/system_tools.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_/tool_arg_coercion.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_prompts/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/mcp_prompts/hook_creator.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/bar_painters.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/bar_rendering.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/bottom_bar.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/bus.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/chords.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/commands.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/editor_actions.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/editor_completion.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/editor_display.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/editor_history.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/editor_keys.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/editor_paste.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/external_editor.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/inline_bar.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/line_editor.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/markdown_patches.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/message_queue.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/messages.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/pause_controller.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/prompt_prefix_style.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/queue_console.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/renderers.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/rich_renderer.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/run_ui.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/run_ui_wiring.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/spinner/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/subagent_console.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/messaging/transcript_guard.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/model_descriptions.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/model_switching.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/model_utils.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/models.json +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/models_dev_api.json +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/models_dev_parser.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/README.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/agent.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/bridge.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/capabilities.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/commands.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/content.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/io_delegation.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/mcp_config.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/permissions.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/persistence.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/replay.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/session.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/session_config.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/acp/state.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/config.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/discovery.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/downloader.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/enabled_skills.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/installer.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/metadata.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/prompt_builder.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/remote_catalog.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/skill_catalog.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/skill_commands.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/skills_install_menu.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/agent_skills/skills_menu.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/aws_bedrock/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/aws_bedrock/config.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/aws_bedrock/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/aws_bedrock/utils.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/README.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/config.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/discovery.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/token.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/azure_foundry/utils.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/btw/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/btw/inline_view.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/btw/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/btw/side_query.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/image_generation.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/image_tool.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/usage.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/chatgpt_oauth/utils.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_hooks/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_hooks/config.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_hooks/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/fast_mode.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/prompt_handler.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/test_fast_mode.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/claude_code_oauth/utils.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/code_puppy_agent/SKILL.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/code_puppy_agent/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/code_puppy_agent/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/config.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/context_indicator/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/context_indicator/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/context_indicator/usage.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/config.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/reasoning_client.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/copilot_auth/utils.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/cancel.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/commands.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/config.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/lifecycle.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/runtime.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/startup_lock.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/workflow_ids.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/dbos_durable_exec/wrapper.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/destructive_command_guard/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/destructive_command_guard/detector.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/destructive_command_guard/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/emoji_filter/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/emoji_filter/config.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/emoji_filter/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/emoji_filter/stripper.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/empty_html_comment_filter/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/example_custom_command/README.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/installer.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/flux_bootstrap/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/force_push_guard/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/force_push_guard/detector.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/force_push_guard/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/force_push_guard/test_detector.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/fork/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/fork/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/frontend_emitter/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/frontend_emitter/emitter.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/frontend_emitter/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/frontend_emitter/session_context.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/config.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/oauth_flow.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/test_plugin.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/grok_oauth/utils.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/herdr/README.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/herdr/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/herdr/client.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/herdr/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/herdr/reporter.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/hook_creator/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/hook_creator/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/hook_manager/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/hook_manager/config.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/hook_manager/hooks_menu.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/hook_manager/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/no_tools/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/no_tools/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/oauth_pasteback.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/oauth_puppy_html.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/obsidian_agent/README.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/obsidian_agent/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/obsidian_agent/agent_obsidian.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/obsidian_agent/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/ollama/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/ollama/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/ollama_setup/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/ollama_setup/completer.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/ollama_setup/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugin_contributions.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugin_meta.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugin_text_utils.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugins_menu.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugins_menu_layout.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/plugins_menu_render.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/project_trust_flow.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/plugin_list/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/pop_command/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/pop_command/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/prompt_newline/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/prompt_newline/config.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/prompt_newline/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/prune/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/prune/prune_menu.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/prune/prune_model.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/prune/prune_render.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/prune/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/README.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/commands.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/config.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/kennel.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/packer.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/recorder.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/retriever.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/schema.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/state.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/tools.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_kennel/wings.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/README.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/builtin_frames.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/commands.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/picker.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/puppy_spinner/spinners.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/quick_resume/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/quick_resume/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/review_pr/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/review_pr/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/shell_safety/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/stack_dump/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/stack_dump/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/statusline/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/statusline/config.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/statusline/payload.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/statusline/prompt_patch.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/statusline/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/statusline/runner.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/statusline/statusline_command.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/steer_queue/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/steer_queue/queue_menu.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/steer_queue/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/README.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/coalesce_patch.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/panel_render.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/subagent_panel/resume_repaint.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/switch_agent_resume/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/switch_agent_resume/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/README.md +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/bundled_palettes.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/content_styles.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/osc_palette.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/picker.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/prompt_toolkit_theme.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/rich_themes.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/theme/themes.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/token_ratio_learner/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/token_ratio_learner/ratios.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/token_ratio_learner/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/trust.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/trust_notice.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/models.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/registry.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/universal_constructor/sandbox.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/wide_completion_menu/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/wide_completion_menu/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/judge.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/judge_config.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/wiggum/state.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/yolo_cli/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/plugins/yolo_cli/register_callbacks.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/provider_credentials.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/provider_identity.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/pydantic_patches.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/reopenable_async_client.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/round_robin_model.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/secret_store.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/secret_store_backends.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/session_lifecycle.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/session_migration.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/session_storage.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/status_display.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/summarization_agent.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/terminal_utils.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/agent_tools.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/constants.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/demo_tui.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/handler.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/models.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/registration.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/renderers.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/terminal_ui.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/theme.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/ask_user_question/tui_loop.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/__init__.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_control.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_interactions.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_locator_resolver.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_locators.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_navigation.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_page_snapshot.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_screenshot.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_scripts.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_semantic_interactions.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/browser/browser_workflows.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/command_runner.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/common.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/display.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/file_modifications.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/file_operations.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/fs_access.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/image_tools.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/io_backends.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/model_tools.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/shell_backgrounding.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/skills_tools.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/subagent_context.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/subagent_invocation.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/tools_content.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/tools/universal_constructor.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/undo_manager.py +0 -0
- {code_puppy-0.0.655 → code_puppy-0.0.657}/code_puppy/version_checker.py +0 -0
|
@@ -38,9 +38,8 @@ def handle_show_command(command: str) -> bool:
|
|
|
38
38
|
get_compaction_strategy,
|
|
39
39
|
get_compaction_threshold,
|
|
40
40
|
get_default_agent,
|
|
41
|
+
get_effective_model_settings,
|
|
41
42
|
get_effective_temperature,
|
|
42
|
-
get_openai_reasoning_effort,
|
|
43
|
-
get_openai_verbosity,
|
|
44
43
|
get_owner_name,
|
|
45
44
|
get_protected_token_count,
|
|
46
45
|
get_puppy_name,
|
|
@@ -63,6 +62,7 @@ def handle_show_command(command: str) -> bool:
|
|
|
63
62
|
compaction_strategy = get_compaction_strategy()
|
|
64
63
|
global_temperature = get_temperature()
|
|
65
64
|
effective_temperature = get_effective_temperature(model)
|
|
65
|
+
model_settings = get_effective_model_settings(model)
|
|
66
66
|
|
|
67
67
|
# Get current agent info
|
|
68
68
|
current_agent = get_current_agent()
|
|
@@ -81,8 +81,8 @@ def handle_show_command(command: str) -> bool:
|
|
|
81
81
|
[bold]compaction_threshold:[/bold] [cyan]{compaction_threshold:.1%}[/cyan] context usage triggers compaction
|
|
82
82
|
[bold]compaction_strategy:[/bold] [cyan]{compaction_strategy}[/cyan] (summarization or truncation)
|
|
83
83
|
[bold]resume_message_count:[/bold] [cyan]{get_resume_message_count()}[/cyan] messages shown on /resume
|
|
84
|
-
[bold]reasoning_effort:[/bold] [cyan]{
|
|
85
|
-
[bold]verbosity:[/bold] [cyan]{
|
|
84
|
+
[bold]reasoning_effort:[/bold] [cyan]{model_settings.get("reasoning_effort", "(model default)")}[/cyan]
|
|
85
|
+
[bold]verbosity:[/bold] [cyan]{model_settings.get("verbosity", "(model default)")}[/cyan]
|
|
86
86
|
[bold]temperature:[/bold] [cyan]{effective_temperature if effective_temperature is not None else "(model default)"}[/cyan]{" (per-model)" if effective_temperature != global_temperature and effective_temperature is not None else ""}
|
|
87
87
|
[bold]cancel_agent_key:[/bold] [cyan]{get_cancel_agent_display_name()}[/cyan] (options: ctrl+c, ctrl+k, ctrl+q)
|
|
88
88
|
|
|
@@ -23,16 +23,10 @@ from code_puppy.command_line.pagination import (
|
|
|
23
23
|
from code_puppy.config import (
|
|
24
24
|
get_all_model_settings,
|
|
25
25
|
get_global_model_name,
|
|
26
|
-
get_openai_reasoning_effort,
|
|
27
|
-
get_openai_reasoning_summary,
|
|
28
|
-
get_openai_verbosity,
|
|
29
26
|
get_value,
|
|
30
27
|
model_supports_setting,
|
|
31
28
|
reset_value,
|
|
32
29
|
set_model_setting,
|
|
33
|
-
set_openai_reasoning_effort,
|
|
34
|
-
set_openai_reasoning_summary,
|
|
35
|
-
set_openai_verbosity,
|
|
36
30
|
set_value,
|
|
37
31
|
)
|
|
38
32
|
from code_puppy.messaging import emit_info
|
|
@@ -276,20 +270,13 @@ def _write_per_model_retry(model_name: str, menu_key: str, value) -> None:
|
|
|
276
270
|
|
|
277
271
|
|
|
278
272
|
def _get_model_display_settings(model_name: str) -> Dict:
|
|
279
|
-
"""Get model settings
|
|
273
|
+
"""Get configured model settings plus model-specific display defaults."""
|
|
280
274
|
settings = get_all_model_settings(model_name)
|
|
281
275
|
|
|
282
|
-
if model_supports_setting(model_name, "reasoning_effort"):
|
|
283
|
-
settings["reasoning_effort"] = get_openai_reasoning_effort()
|
|
284
276
|
if model_supports_setting(model_name, "reasoning_context"):
|
|
285
277
|
settings.setdefault("reasoning_context", "all_turns")
|
|
286
278
|
if model_supports_setting(model_name, "reasoning_mode"):
|
|
287
279
|
settings.setdefault("reasoning_mode", "standard")
|
|
288
|
-
if model_supports_setting(model_name, "summary"):
|
|
289
|
-
settings["summary"] = get_openai_reasoning_summary()
|
|
290
|
-
if model_supports_setting(model_name, "verbosity"):
|
|
291
|
-
settings["verbosity"] = get_openai_verbosity()
|
|
292
|
-
|
|
293
280
|
# Per-model retry overrides live in their own namespace, so inject their
|
|
294
281
|
# current values here (only when actually set -- unset shows the default).
|
|
295
282
|
for menu_key in _RETRY_MENU_KEYS:
|
|
@@ -692,14 +679,6 @@ class ModelSettingsMenu:
|
|
|
692
679
|
lines.append(("class:tui.label", f" {setting_def['name']}"))
|
|
693
680
|
lines.append(("", "\n"))
|
|
694
681
|
|
|
695
|
-
# Show if this is a global setting
|
|
696
|
-
if setting_key in ("reasoning_effort", "verbosity"):
|
|
697
|
-
lines.append(
|
|
698
|
-
(
|
|
699
|
-
"class:tui.warning",
|
|
700
|
-
" ⚠ Global setting (applies to all GPT-5 models)",
|
|
701
|
-
)
|
|
702
|
-
)
|
|
703
682
|
lines.append(("", "\n\n"))
|
|
704
683
|
|
|
705
684
|
# Description
|
|
@@ -864,17 +843,7 @@ class ModelSettingsMenu:
|
|
|
864
843
|
|
|
865
844
|
setting_key = self.supported_settings[self.setting_index]
|
|
866
845
|
|
|
867
|
-
|
|
868
|
-
if setting_key == "reasoning_effort":
|
|
869
|
-
if self.edit_value is not None:
|
|
870
|
-
set_openai_reasoning_effort(self.edit_value)
|
|
871
|
-
elif setting_key == "summary":
|
|
872
|
-
if self.edit_value is not None:
|
|
873
|
-
set_openai_reasoning_summary(self.edit_value)
|
|
874
|
-
elif setting_key == "verbosity":
|
|
875
|
-
if self.edit_value is not None:
|
|
876
|
-
set_openai_verbosity(self.edit_value)
|
|
877
|
-
elif setting_key in _RETRY_MENU_KEYS:
|
|
846
|
+
if setting_key in _RETRY_MENU_KEYS:
|
|
878
847
|
# Per-model retry override -> dedicated retry_model_ namespace.
|
|
879
848
|
_write_per_model_retry(self.selected_model, setting_key, self.edit_value)
|
|
880
849
|
else:
|
|
@@ -907,17 +876,7 @@ class ModelSettingsMenu:
|
|
|
907
876
|
# Reset edit value to default
|
|
908
877
|
self.edit_value = _get_setting_default(setting_key, self.selected_model)
|
|
909
878
|
else:
|
|
910
|
-
|
|
911
|
-
if setting_key == "reasoning_effort":
|
|
912
|
-
set_openai_reasoning_effort("medium") # Default
|
|
913
|
-
self.current_settings[setting_key] = "medium"
|
|
914
|
-
elif setting_key == "summary":
|
|
915
|
-
set_openai_reasoning_summary("auto") # Default
|
|
916
|
-
self.current_settings[setting_key] = "auto"
|
|
917
|
-
elif setting_key == "verbosity":
|
|
918
|
-
set_openai_verbosity("medium") # Default
|
|
919
|
-
self.current_settings[setting_key] = "medium"
|
|
920
|
-
elif setting_key in _RETRY_MENU_KEYS:
|
|
879
|
+
if setting_key in _RETRY_MENU_KEYS:
|
|
921
880
|
# Clear the per-model retry override -> falls back to global.
|
|
922
881
|
_write_per_model_retry(self.selected_model, setting_key, None)
|
|
923
882
|
if setting_key in self.current_settings:
|
|
@@ -43,7 +43,6 @@ from code_puppy.config import (
|
|
|
43
43
|
get_mcp_disabled,
|
|
44
44
|
get_mcp_unbound_warning_silenced,
|
|
45
45
|
get_message_limit,
|
|
46
|
-
get_openai_reasoning_summary,
|
|
47
46
|
get_output_level,
|
|
48
47
|
get_owner_name,
|
|
49
48
|
get_pack_agents_enabled,
|
|
@@ -265,21 +264,6 @@ _COMPACTION = SettingsCategory(
|
|
|
265
264
|
)
|
|
266
265
|
|
|
267
266
|
|
|
268
|
-
_OPENAI = SettingsCategory(
|
|
269
|
-
name="OpenAI",
|
|
270
|
-
settings=(
|
|
271
|
-
Setting(
|
|
272
|
-
key="openai_reasoning_summary",
|
|
273
|
-
display_name="Reasoning Summary",
|
|
274
|
-
description="Style of reasoning summary shown to the user.",
|
|
275
|
-
type_hint="choice",
|
|
276
|
-
valid_values=("auto", "concise", "detailed"),
|
|
277
|
-
effective_getter=get_openai_reasoning_summary,
|
|
278
|
-
),
|
|
279
|
-
),
|
|
280
|
-
)
|
|
281
|
-
|
|
282
|
-
|
|
283
267
|
_FEATURES = SettingsCategory(
|
|
284
268
|
name="Features",
|
|
285
269
|
settings=(
|
|
@@ -629,7 +613,6 @@ SETTINGS_CATEGORIES: Tuple[SettingsCategory, ...] = (
|
|
|
629
613
|
_SESSION,
|
|
630
614
|
_COMPACTION,
|
|
631
615
|
_OUTPUT,
|
|
632
|
-
_OPENAI,
|
|
633
616
|
_FEATURES,
|
|
634
617
|
_MCP,
|
|
635
618
|
_GOAL,
|
|
@@ -5,7 +5,7 @@ import json
|
|
|
5
5
|
import logging
|
|
6
6
|
import os
|
|
7
7
|
import pathlib
|
|
8
|
-
from typing import Optional
|
|
8
|
+
from typing import Any, Optional
|
|
9
9
|
|
|
10
10
|
from code_puppy.session_storage import save_session
|
|
11
11
|
|
|
@@ -393,9 +393,6 @@ def get_config_keys():
|
|
|
393
393
|
"summarization_model",
|
|
394
394
|
"message_limit",
|
|
395
395
|
"allow_recursion",
|
|
396
|
-
"openai_reasoning_effort",
|
|
397
|
-
"openai_reasoning_summary",
|
|
398
|
-
"openai_verbosity",
|
|
399
396
|
"auto_save_session",
|
|
400
397
|
"max_saved_sessions",
|
|
401
398
|
"http2",
|
|
@@ -855,78 +852,6 @@ def set_puppy_token(token: str):
|
|
|
855
852
|
set_config_value("puppy_token", token)
|
|
856
853
|
|
|
857
854
|
|
|
858
|
-
def get_openai_reasoning_effort() -> str:
|
|
859
|
-
"""Return the configured OpenAI reasoning effort."""
|
|
860
|
-
allowed_values = {"minimal", "low", "medium", "high", "xhigh", "ultra"}
|
|
861
|
-
configured = (get_value("openai_reasoning_effort") or "medium").strip().lower()
|
|
862
|
-
if configured not in allowed_values:
|
|
863
|
-
return "medium"
|
|
864
|
-
return configured
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
def set_openai_reasoning_effort(value: str) -> None:
|
|
868
|
-
"""Persist the OpenAI reasoning effort ensuring it remains within allowed values."""
|
|
869
|
-
allowed_values = {"minimal", "low", "medium", "high", "xhigh", "ultra"}
|
|
870
|
-
normalized = (value or "").strip().lower()
|
|
871
|
-
if normalized not in allowed_values:
|
|
872
|
-
raise ValueError(
|
|
873
|
-
f"Invalid reasoning effort '{value}'. Allowed: {', '.join(sorted(allowed_values))}"
|
|
874
|
-
)
|
|
875
|
-
set_config_value("openai_reasoning_effort", normalized)
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
def get_openai_reasoning_summary() -> str:
|
|
879
|
-
"""Return the configured OpenAI reasoning summary mode.
|
|
880
|
-
|
|
881
|
-
Supported values:
|
|
882
|
-
- auto: let the provider decide the best summary style
|
|
883
|
-
- concise: shorter reasoning summaries
|
|
884
|
-
- detailed: fuller reasoning summaries
|
|
885
|
-
"""
|
|
886
|
-
allowed_values = {"auto", "concise", "detailed"}
|
|
887
|
-
configured = (get_value("openai_reasoning_summary") or "detailed").strip().lower()
|
|
888
|
-
if configured not in allowed_values:
|
|
889
|
-
return "auto"
|
|
890
|
-
return configured
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
def set_openai_reasoning_summary(value: str) -> None:
|
|
894
|
-
"""Persist the OpenAI reasoning summary mode ensuring it remains valid."""
|
|
895
|
-
allowed_values = {"auto", "concise", "detailed"}
|
|
896
|
-
normalized = (value or "").strip().lower()
|
|
897
|
-
if normalized not in allowed_values:
|
|
898
|
-
raise ValueError(
|
|
899
|
-
f"Invalid reasoning summary '{value}'. Allowed: {', '.join(sorted(allowed_values))}"
|
|
900
|
-
)
|
|
901
|
-
set_config_value("openai_reasoning_summary", normalized)
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
def get_openai_verbosity() -> str:
|
|
905
|
-
"""Return the configured OpenAI verbosity (low, medium, high).
|
|
906
|
-
|
|
907
|
-
Controls how concise vs. verbose the model's responses are:
|
|
908
|
-
- low: more concise responses
|
|
909
|
-
- medium: balanced (default)
|
|
910
|
-
- high: more verbose responses
|
|
911
|
-
"""
|
|
912
|
-
allowed_values = {"low", "medium", "high"}
|
|
913
|
-
configured = (get_value("openai_verbosity") or "medium").strip().lower()
|
|
914
|
-
if configured not in allowed_values:
|
|
915
|
-
return "medium"
|
|
916
|
-
return configured
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
def set_openai_verbosity(value: str) -> None:
|
|
920
|
-
"""Persist the OpenAI verbosity ensuring it remains within allowed values."""
|
|
921
|
-
allowed_values = {"low", "medium", "high"}
|
|
922
|
-
normalized = (value or "").strip().lower()
|
|
923
|
-
if normalized not in allowed_values:
|
|
924
|
-
raise ValueError(
|
|
925
|
-
f"Invalid verbosity '{value}'. Allowed: {', '.join(sorted(allowed_values))}"
|
|
926
|
-
)
|
|
927
|
-
set_config_value("openai_verbosity", normalized)
|
|
928
|
-
|
|
929
|
-
|
|
930
855
|
def get_temperature() -> Optional[float]:
|
|
931
856
|
"""Return the configured model temperature (0.0 to 2.0).
|
|
932
857
|
|
|
@@ -1001,13 +926,13 @@ def get_model_setting(
|
|
|
1001
926
|
return default
|
|
1002
927
|
|
|
1003
928
|
|
|
1004
|
-
def set_model_setting(model_name: str, setting: str, value:
|
|
929
|
+
def set_model_setting(model_name: str, setting: str, value: Any | None) -> None:
|
|
1005
930
|
"""Set a specific setting for a model.
|
|
1006
931
|
|
|
1007
932
|
Args:
|
|
1008
933
|
model_name: The model name (e.g., 'gpt-5', 'zai-glm-5.1-api')
|
|
1009
|
-
setting: The setting name (e.g., 'temperature', '
|
|
1010
|
-
value: The value to set, or None to clear
|
|
934
|
+
setting: The setting name (e.g., 'temperature', 'reasoning_effort')
|
|
935
|
+
value: The numeric, string, or boolean value to set, or None to clear
|
|
1011
936
|
"""
|
|
1012
937
|
sanitized_name = _sanitize_model_name_for_key(model_name)
|
|
1013
938
|
key = f"model_settings_{sanitized_name}_{setting}"
|
|
@@ -171,9 +171,6 @@ def make_model_settings(
|
|
|
171
171
|
"""
|
|
172
172
|
from code_puppy.config import (
|
|
173
173
|
get_effective_model_settings,
|
|
174
|
-
get_openai_reasoning_effort,
|
|
175
|
-
get_openai_reasoning_summary,
|
|
176
|
-
get_openai_verbosity,
|
|
177
174
|
model_supports_setting,
|
|
178
175
|
)
|
|
179
176
|
|
|
@@ -293,7 +290,9 @@ def make_model_settings(
|
|
|
293
290
|
model_settings = OpenAIChatModelSettings(**model_settings_dict)
|
|
294
291
|
|
|
295
292
|
elif "gpt-5" in model_name:
|
|
296
|
-
model_settings_dict["openai_reasoning_effort"] =
|
|
293
|
+
model_settings_dict["openai_reasoning_effort"] = effective_settings.get(
|
|
294
|
+
"reasoning_effort", "medium"
|
|
295
|
+
)
|
|
297
296
|
|
|
298
297
|
uses_responses_api = (
|
|
299
298
|
model_type == "chatgpt_oauth"
|
|
@@ -306,11 +305,13 @@ def make_model_settings(
|
|
|
306
305
|
)
|
|
307
306
|
|
|
308
307
|
if uses_responses_api:
|
|
309
|
-
model_settings_dict["openai_reasoning_summary"] = (
|
|
310
|
-
|
|
308
|
+
model_settings_dict["openai_reasoning_summary"] = effective_settings.get(
|
|
309
|
+
"summary", "auto"
|
|
311
310
|
)
|
|
312
311
|
if "codex" not in model_name:
|
|
313
|
-
model_settings_dict["openai_text_verbosity"] =
|
|
312
|
+
model_settings_dict["openai_text_verbosity"] = effective_settings.get(
|
|
313
|
+
"verbosity", "medium"
|
|
314
|
+
)
|
|
314
315
|
|
|
315
316
|
underlying_name = str(model_config.get("name", "")).lower()
|
|
316
317
|
is_gpt_5_6 = "gpt-5.6" in model_name.lower() or "gpt-5.6" in underlying_name
|
|
@@ -336,8 +337,9 @@ def make_model_settings(
|
|
|
336
337
|
# Chat Completions models don't support configurable reasoning summaries.
|
|
337
338
|
# Keep the old verbosity injection path for non-Responses GPT-5 models.
|
|
338
339
|
if "codex" not in model_name:
|
|
339
|
-
|
|
340
|
-
|
|
340
|
+
model_settings_dict["extra_body"] = {
|
|
341
|
+
"verbosity": effective_settings.get("verbosity", "medium")
|
|
342
|
+
}
|
|
341
343
|
model_settings = OpenAIChatModelSettings(**model_settings_dict)
|
|
342
344
|
elif _is_anthropic_model(model_name, model_config):
|
|
343
345
|
# Handle Anthropic extended thinking settings
|
|
@@ -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
|