code-puppy 0.0.591__tar.gz → 0.0.593__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.591 → code_puppy-0.0.593}/PKG-INFO +1 -1
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/_runtime.py +31 -15
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/claude_cache_client.py +9 -2
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/auth_retry.py +70 -2
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/utils.py +22 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/pyproject.toml +1 -1
- {code_puppy-0.0.591 → code_puppy-0.0.593}/.gitignore +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/LICENSE +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/README.md +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/__main__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/_builder.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/_compaction.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/_diagnostics.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/_history.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/_key_listeners.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/_non_streaming_render.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/_run_signals.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/_steer_processor.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/agent_code_puppy.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/agent_creator_agent.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/agent_helios.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/agent_manager.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/agent_planning.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/agent_qa_kitten.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/base_agent.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/event_stream_handler.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/json_agent.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/run_stats.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/smooth_stream.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/agents/subagent_stream_handler.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/chatgpt_codex_client.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/cli_runner.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/add_model_menu.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/agent_menu.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/attachments.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/autosave_menu.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/autosave_search.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/clipboard.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/colors_menu.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/command_handler.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/command_registry.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/config_apply.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/config_commands.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/core_commands.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/diff_menu.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/file_index.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/file_path_completion.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/judges_menu.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/load_context_completion.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/base.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/edit_command.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/handler.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/help_command.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/install_command.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/install_menu.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/list_command.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/logs_command.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/remove_command.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/restart_command.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/search_command.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/silence_warning_command.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/start_all_command.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/start_command.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/status_command.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/stop_command.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/utils.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp_binding_menu.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp_completion.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/model_picker_completion.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/model_settings_menu.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/onboarding_slides.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/onboarding_wizard.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/pagination.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/pin_command_completion.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/session_commands.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/set_menu.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/set_menu_catalog.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/set_menu_render.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/set_menu_schema.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/set_menu_settings.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/set_menu_shims.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/set_menu_values.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/shell_passthrough.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/skills_completion.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/uc_menu.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/utils.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/wiggum_state.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/config.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/error_logging.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/gemini_code_assist.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/gemini_model.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/hook_engine/README.md +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/hook_engine/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/hook_engine/aliases.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/hook_engine/engine.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/hook_engine/executor.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/hook_engine/matcher.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/hook_engine/models.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/hook_engine/registry.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/hook_engine/validator.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/http_utils.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/keymap.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/list_filtering.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/main.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/agent_bindings.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/async_lifecycle.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/blocking_startup.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/captured_stdio_server.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/circuit_breaker.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/config_wizard.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/dashboard.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/error_isolation.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/examples/retry_example.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/health_monitor.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/managed_server.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/manager.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/mcp_logs.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/registry.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/retry_manager.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/server_registry_catalog.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/status_tracker.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/system_tools.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_/tool_arg_coercion.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_prompts/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/mcp_prompts/hook_creator.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/bar_painters.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/bar_rendering.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/bottom_bar.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/bus.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/commands.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/editor_actions.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/editor_completion.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/editor_display.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/editor_history.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/editor_keys.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/editor_paste.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/line_editor.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/markdown_patches.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/message_queue.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/messages.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/pause_controller.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/prompt_prefix_style.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/queue_console.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/renderers.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/rich_renderer.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/run_ui.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/run_ui_wiring.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/spinner/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/messaging/subagent_console.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/model_descriptions.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/model_factory.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/model_switching.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/model_utils.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/models.json +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/models_dev_api.json +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/models_dev_parser.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/config.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/discovery.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/downloader.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/enabled_skills.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/installer.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/metadata.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/prompt_builder.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/remote_catalog.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/skill_catalog.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/skill_commands.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/skills_install_menu.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/agent_skills/skills_menu.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/aws_bedrock/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/aws_bedrock/config.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/aws_bedrock/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/aws_bedrock/utils.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/azure_foundry/README.md +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/azure_foundry/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/azure_foundry/config.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/azure_foundry/discovery.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/azure_foundry/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/azure_foundry/token.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/azure_foundry/utils.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/btw/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/btw/inline_view.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/btw/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/btw/side_query.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/chatgpt_oauth/utils.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_hooks/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_hooks/config.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_hooks/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/fast_mode.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/prompt_handler.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/test_fast_mode.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/code_puppy_agent/SKILL.md +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/code_puppy_agent/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/code_puppy_agent/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/config.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/context_indicator/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/context_indicator/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/context_indicator/usage.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/copilot_auth/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/copilot_auth/config.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/copilot_auth/reasoning_client.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/copilot_auth/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/copilot_auth/utils.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/cancel.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/commands.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/config.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/lifecycle.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/runtime.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/startup_lock.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/workflow_ids.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/dbos_durable_exec/wrapper.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/destructive_command_guard/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/destructive_command_guard/detector.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/destructive_command_guard/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/emoji_filter/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/emoji_filter/config.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/emoji_filter/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/emoji_filter/stripper.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/example_custom_command/README.md +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/force_push_guard/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/force_push_guard/detector.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/force_push_guard/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/force_push_guard/test_detector.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/frontend_emitter/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/frontend_emitter/emitter.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/frontend_emitter/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/frontend_emitter/session_context.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/hook_creator/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/hook_creator/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/hook_manager/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/hook_manager/config.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/hook_manager/hooks_menu.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/hook_manager/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/oauth_puppy_html.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/obsidian_agent/README.md +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/obsidian_agent/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/obsidian_agent/agent_obsidian.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/obsidian_agent/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/ollama/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/ollama/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/ollama_setup/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/ollama_setup/completer.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/ollama_setup/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/plugin_list/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/plugin_list/plugin_contributions.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/plugin_list/plugin_meta.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/plugin_list/plugin_text_utils.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/plugin_list/plugins_menu.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/plugin_list/plugins_menu_render.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/plugin_list/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/pop_command/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/pop_command/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/prompt_newline/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/prompt_newline/config.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/prompt_newline/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/prune/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/prune/prune_menu.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/prune/prune_model.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/prune/prune_render.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/prune/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/README.md +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/commands.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/config.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/kennel.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/packer.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/recorder.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/retriever.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/schema.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/state.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/tools.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_kennel/wings.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_spinner/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/puppy_spinner/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/quick_resume/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/quick_resume/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/review_pr/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/review_pr/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/shell_safety/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/statusline/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/statusline/config.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/statusline/payload.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/statusline/prompt_patch.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/statusline/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/statusline/runner.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/statusline/statusline_command.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/steer_queue/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/steer_queue/queue_menu.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/steer_queue/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/subagent_panel/README.md +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/subagent_panel/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/subagent_panel/coalesce_patch.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/subagent_panel/panel_render.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/subagent_panel/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/subagent_panel/resume_repaint.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/subagent_panel/state.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/switch_agent_resume/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/switch_agent_resume/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/theme/README.md +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/theme/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/theme/bundled_palettes.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/theme/content_styles.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/theme/osc_palette.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/theme/picker.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/theme/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/theme/rich_themes.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/theme/themes.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/token_ratio_learner/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/token_ratio_learner/ratios.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/token_ratio_learner/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/universal_constructor/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/universal_constructor/models.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/universal_constructor/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/universal_constructor/registry.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/universal_constructor/sandbox.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/wide_completion_menu/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/wide_completion_menu/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/wiggum/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/wiggum/judge.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/wiggum/judge_config.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/wiggum/register_callbacks.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/wiggum/state.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/provider_credentials.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/provider_identity.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/pydantic_patches.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/reopenable_async_client.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/round_robin_model.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/session_lifecycle.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/session_migration.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/session_storage.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/status_display.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/summarization_agent.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/terminal_utils.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/agent_tools.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/constants.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/demo_tui.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/handler.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/models.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/registration.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/renderers.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/terminal_ui.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/theme.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/ask_user_question/tui_loop.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/browser/__init__.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/browser/browser_control.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/browser/browser_interactions.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/browser/browser_locators.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/browser/browser_manager.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/browser/browser_navigation.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/browser/browser_screenshot.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/browser/browser_scripts.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/browser/browser_workflows.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/command_runner.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/common.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/display.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/file_modifications.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/file_operations.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/image_tools.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/model_tools.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/skills_tools.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/subagent_context.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/subagent_invocation.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/tools_content.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/tools/universal_constructor.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/undo_manager.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/uvx_detection.py +0 -0
- {code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/version_checker.py +0 -0
|
@@ -19,6 +19,7 @@ from __future__ import annotations
|
|
|
19
19
|
import asyncio
|
|
20
20
|
import signal
|
|
21
21
|
import threading
|
|
22
|
+
import time
|
|
22
23
|
import uuid
|
|
23
24
|
from contextlib import AsyncExitStack
|
|
24
25
|
from typing import Any, Callable, Iterator, List, Optional, Sequence, Type, Union
|
|
@@ -297,6 +298,7 @@ def streaming_retry(
|
|
|
297
298
|
max_attempts: int = 3,
|
|
298
299
|
delays: Sequence[float] = (1, 2, 4),
|
|
299
300
|
model_name: Optional[str] = None,
|
|
301
|
+
progress_window: float = 120.0,
|
|
300
302
|
) -> Callable[[Callable[[], Any]], Callable[[], Any]]:
|
|
301
303
|
"""Wrap a no-arg async callable with streaming-retry semantics.
|
|
302
304
|
|
|
@@ -311,36 +313,43 @@ def streaming_retry(
|
|
|
311
313
|
``agent_retryable_exception`` hook, so plugins can opt provider-specific
|
|
312
314
|
failures (e.g. OAuth auth errors) into this same retry schedule.
|
|
313
315
|
``model_name`` is forwarded to the hook so plugins can scope themselves.
|
|
316
|
+
|
|
317
|
+
``max_attempts`` caps *consecutive rapid* failures, not total failures
|
|
318
|
+
per run. An agent run wraps many model calls; a long run can hit several
|
|
319
|
+
unrelated provider blips spread across minutes of successful work. If an
|
|
320
|
+
attempt survives at least ``progress_window`` seconds before failing, it
|
|
321
|
+
clearly made progress, so the failure streak resets and the blip gets a
|
|
322
|
+
fresh retry budget. Only back-to-back quick failures — the actual
|
|
323
|
+
hopeless-loop signature — burn through the cap.
|
|
314
324
|
"""
|
|
315
325
|
from code_puppy.error_logging import log_error
|
|
316
326
|
|
|
317
327
|
def decorator(factory: Callable[[], Any]) -> Callable[[], Any]:
|
|
318
328
|
async def runner() -> Any:
|
|
319
|
-
|
|
320
|
-
|
|
329
|
+
streak = 0 # consecutive rapid failures
|
|
330
|
+
while True:
|
|
331
|
+
attempt_started = time.monotonic()
|
|
321
332
|
try:
|
|
322
333
|
return await factory()
|
|
323
334
|
except Exception as exc:
|
|
335
|
+
made_progress = (
|
|
336
|
+
time.monotonic() - attempt_started >= progress_window
|
|
337
|
+
)
|
|
324
338
|
if not should_retry_streaming(exc) and not await _plugin_says_retry(
|
|
325
|
-
exc, model_name,
|
|
339
|
+
exc, model_name, streak + 1, max_attempts
|
|
326
340
|
):
|
|
327
341
|
raise
|
|
328
|
-
|
|
342
|
+
if made_progress:
|
|
343
|
+
streak = 0
|
|
344
|
+
streak += 1
|
|
329
345
|
log_error(
|
|
330
346
|
exc,
|
|
331
347
|
context=(
|
|
332
348
|
f"streaming_retry: transient exception on attempt "
|
|
333
|
-
f"{
|
|
349
|
+
f"{streak}/{max_attempts}"
|
|
334
350
|
),
|
|
335
351
|
)
|
|
336
|
-
if
|
|
337
|
-
delay = delays[attempt] if attempt < len(delays) else delays[-1]
|
|
338
|
-
emit_warning(
|
|
339
|
-
f"\u26a1 Streaming interrupted, auto-retrying in {delay}s... "
|
|
340
|
-
f"(attempt {attempt + 1}/{max_attempts})"
|
|
341
|
-
)
|
|
342
|
-
await asyncio.sleep(delay)
|
|
343
|
-
else:
|
|
352
|
+
if streak >= max_attempts:
|
|
344
353
|
log_error(
|
|
345
354
|
exc,
|
|
346
355
|
context=(
|
|
@@ -351,8 +360,15 @@ def streaming_retry(
|
|
|
351
360
|
emit_error(
|
|
352
361
|
f"\u274c Streaming failed after {max_attempts} attempts"
|
|
353
362
|
)
|
|
354
|
-
|
|
355
|
-
|
|
363
|
+
raise
|
|
364
|
+
delay = (
|
|
365
|
+
delays[streak - 1] if streak - 1 < len(delays) else delays[-1]
|
|
366
|
+
)
|
|
367
|
+
emit_warning(
|
|
368
|
+
f"\u26a1 Streaming interrupted, auto-retrying in {delay}s... "
|
|
369
|
+
f"(attempt {streak}/{max_attempts})"
|
|
370
|
+
)
|
|
371
|
+
await asyncio.sleep(delay)
|
|
356
372
|
|
|
357
373
|
return runner
|
|
358
374
|
|
|
@@ -440,8 +440,15 @@ class ClaudeCacheAsyncClient(httpx.AsyncClient):
|
|
|
440
440
|
if response.status_code == 400:
|
|
441
441
|
is_auth_error = await self._is_cloudflare_html_error(response)
|
|
442
442
|
if is_auth_error:
|
|
443
|
-
|
|
444
|
-
|
|
443
|
+
# cf-ray + request size make edge flaps diagnosable
|
|
444
|
+
# (and reportable to Anthropic) from errors.log alone.
|
|
445
|
+
request_body = self._extract_body_bytes(request) or b""
|
|
446
|
+
logger.warning(
|
|
447
|
+
"Detected Cloudflare HTML 400 (cf-ray=%s, "
|
|
448
|
+
"request_bytes=%d, url=%s); attempting token refresh",
|
|
449
|
+
response.headers.get("cf-ray"),
|
|
450
|
+
len(request_body),
|
|
451
|
+
request.url.path,
|
|
445
452
|
)
|
|
446
453
|
|
|
447
454
|
if is_auth_error:
|
{code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/plugins/claude_code_oauth/auth_retry.py
RENAMED
|
@@ -15,12 +15,20 @@ and return ``True`` so the exception rides the **main agent retry loop**
|
|
|
15
15
|
(``streaming_retry``) — the same delays, banners, error-logging, and
|
|
16
16
|
attempt cap as a 429. The loop's ``max_attempts`` bounds us, so a dead
|
|
17
17
|
refresh token can't spin forever.
|
|
18
|
+
|
|
19
|
+
Recovery escalation ladder for Cloudflare HTML 400s specifically:
|
|
20
|
+
refresh-token exchanges only buy temporary recovery (the edge starts
|
|
21
|
+
flapping again minutes later), while a full interactive re-auth durably
|
|
22
|
+
cures it. So the first CF400 gets the cheap refresh+retry; a recurrence
|
|
23
|
+
within ``CLOUDFLARE_REAUTH_WINDOW_SECONDS`` escalates to the browser
|
|
24
|
+
sign-in flow before retrying.
|
|
18
25
|
"""
|
|
19
26
|
|
|
20
27
|
from __future__ import annotations
|
|
21
28
|
|
|
22
29
|
import asyncio
|
|
23
30
|
import logging
|
|
31
|
+
import time
|
|
24
32
|
from typing import Any, Callable, Iterator, Optional
|
|
25
33
|
from weakref import WeakSet
|
|
26
34
|
|
|
@@ -34,6 +42,17 @@ logger = logging.getLogger(__name__)
|
|
|
34
42
|
AUTH_STATUS_CODES = frozenset({401, 403})
|
|
35
43
|
CLOUDFLARE_400_MARKERS = ("cloudflare", "400 bad request")
|
|
36
44
|
|
|
45
|
+
# Cloudflare 400s are only *durably* cured by a full interactive re-auth
|
|
46
|
+
# (field evidence: refresh-token exchanges buy temporary recovery, then the
|
|
47
|
+
# edge starts flapping again; a browser sign-in stops it entirely). The
|
|
48
|
+
# first CF400 gets the cheap refresh+retry. A recurrence within this window
|
|
49
|
+
# proves refresh isn't curing it, so we escalate to the browser flow.
|
|
50
|
+
CLOUDFLARE_REAUTH_WINDOW_SECONDS = 900.0 # 15 minutes
|
|
51
|
+
|
|
52
|
+
# Monotonic timestamp of the last Cloudflare-400 recovery attempt.
|
|
53
|
+
# Module-level: recurrence is a per-process pattern, not per-run.
|
|
54
|
+
_last_cloudflare_event_at: float = 0.0
|
|
55
|
+
|
|
37
56
|
# Live-client token updaters, registered when a claude_code model is built.
|
|
38
57
|
# Weak references: entries vanish automatically when a model is torn down
|
|
39
58
|
# (the client holds the only strong ref to its updater closure).
|
|
@@ -101,6 +120,25 @@ def is_claude_auth_error(exc: BaseException) -> bool:
|
|
|
101
120
|
return False
|
|
102
121
|
|
|
103
122
|
|
|
123
|
+
def is_cloudflare_error(exc: BaseException) -> bool:
|
|
124
|
+
"""True when any link in the chain is specifically a Cloudflare 400."""
|
|
125
|
+
return any(
|
|
126
|
+
_is_cloudflare_400(link, _status_code_of(link))
|
|
127
|
+
for link in _iter_exception_chain(exc)
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _run_full_reauthentication(model_name: str) -> Optional[str]:
|
|
132
|
+
"""Launch the interactive browser OAuth flow; returns a token or None.
|
|
133
|
+
|
|
134
|
+
Lazy import: register_callbacks imports this module at load time, so a
|
|
135
|
+
top-level import here would be circular.
|
|
136
|
+
"""
|
|
137
|
+
from .register_callbacks import _reauthenticate_after_expired_oauth
|
|
138
|
+
|
|
139
|
+
return _reauthenticate_after_expired_oauth(model_name)
|
|
140
|
+
|
|
141
|
+
|
|
104
142
|
async def handle_retryable_exception(
|
|
105
143
|
exception: Exception, *args: Any, **kwargs: Any
|
|
106
144
|
) -> bool:
|
|
@@ -126,15 +164,45 @@ async def handle_retryable_exception(
|
|
|
126
164
|
)
|
|
127
165
|
return False
|
|
128
166
|
|
|
167
|
+
# Cloudflare 400s that keep recurring are not cured by refresh-token
|
|
168
|
+
# exchanges (field-proven); only a full interactive re-auth stops them.
|
|
169
|
+
global _last_cloudflare_event_at
|
|
170
|
+
if is_cloudflare_error(exception):
|
|
171
|
+
now = time.monotonic()
|
|
172
|
+
recurring = (
|
|
173
|
+
_last_cloudflare_event_at > 0
|
|
174
|
+
and (now - _last_cloudflare_event_at) < CLOUDFLARE_REAUTH_WINDOW_SECONDS
|
|
175
|
+
)
|
|
176
|
+
_last_cloudflare_event_at = now
|
|
177
|
+
if recurring:
|
|
178
|
+
emit_warning(
|
|
179
|
+
"Cloudflare keeps rejecting requests and token refresh isn't "
|
|
180
|
+
"curing it — escalating to full browser re-authentication…"
|
|
181
|
+
)
|
|
182
|
+
token = await asyncio.to_thread(_run_full_reauthentication, model_name)
|
|
183
|
+
if token:
|
|
184
|
+
_broadcast_token(token)
|
|
185
|
+
_last_cloudflare_event_at = 0.0 # cured; future CF400s start fresh
|
|
186
|
+
emit_info("Claude Code re-authentication complete; retrying.")
|
|
187
|
+
return True
|
|
188
|
+
emit_warning(
|
|
189
|
+
"Re-authentication did not produce a usable token. "
|
|
190
|
+
"Run /claude-code-auth manually."
|
|
191
|
+
)
|
|
192
|
+
return False
|
|
193
|
+
|
|
129
194
|
emit_warning(
|
|
130
|
-
"Claude Code OAuth rejected the request —
|
|
195
|
+
"Claude Code OAuth rejected the request — ensuring a fresh token "
|
|
196
|
+
"before the retry…"
|
|
131
197
|
)
|
|
132
198
|
|
|
133
199
|
# refresh_access_token does blocking network I/O; keep the loop free.
|
|
200
|
+
# (It has a built-in cooldown: if a refresh just happened, it reuses the
|
|
201
|
+
# still-warm token instead of burning another refresh-token rotation.)
|
|
134
202
|
refreshed = await asyncio.to_thread(refresh_access_token, True)
|
|
135
203
|
if refreshed:
|
|
136
204
|
_broadcast_token(refreshed)
|
|
137
|
-
emit_info("Claude Code OAuth token
|
|
205
|
+
emit_info("Claude Code OAuth token ready; retrying.")
|
|
138
206
|
else:
|
|
139
207
|
# Still opt in: the HTTP client gets a fresh shot at recovery on the
|
|
140
208
|
# next attempt (including its interactive reauthentication fallback).
|
|
@@ -26,6 +26,14 @@ from .config import (
|
|
|
26
26
|
TOKEN_REFRESH_BUFFER_SECONDS = 300
|
|
27
27
|
MIN_REFRESH_BUFFER_SECONDS = 30
|
|
28
28
|
|
|
29
|
+
# Cooldown for *forced* refreshes (seconds). Every refresh-token exchange
|
|
30
|
+
# rotates the refresh token; hammering the endpoint during a flappy episode
|
|
31
|
+
# (e.g. repeated Cloudflare 400s that a new token can't cure anyway) burns
|
|
32
|
+
# through rotations for nothing and risks invalidating the token family.
|
|
33
|
+
# If the stored tokens were refreshed within this window and are still
|
|
34
|
+
# valid, force=True short-circuits to the existing access token.
|
|
35
|
+
FORCE_REFRESH_COOLDOWN_SECONDS = 30
|
|
36
|
+
|
|
29
37
|
logger = logging.getLogger(__name__)
|
|
30
38
|
|
|
31
39
|
|
|
@@ -213,6 +221,19 @@ def refresh_access_token(force: bool = False) -> Optional[str]:
|
|
|
213
221
|
if not force and not is_token_expired(tokens):
|
|
214
222
|
return tokens.get("access_token")
|
|
215
223
|
|
|
224
|
+
# Forced-refresh cooldown: a token minted seconds ago is as fresh as a
|
|
225
|
+
# new exchange would produce. Skip the rotation and reuse it.
|
|
226
|
+
if force and tokens.get("access_token") and not is_token_expired(tokens):
|
|
227
|
+
seconds_since_refresh = time.time() - float(tokens.get("refreshed_at") or 0)
|
|
228
|
+
if seconds_since_refresh < FORCE_REFRESH_COOLDOWN_SECONDS:
|
|
229
|
+
logger.info(
|
|
230
|
+
"Skipping forced token refresh (last refresh %.0fs ago, "
|
|
231
|
+
"cooldown %ds); reusing current access token",
|
|
232
|
+
seconds_since_refresh,
|
|
233
|
+
FORCE_REFRESH_COOLDOWN_SECONDS,
|
|
234
|
+
)
|
|
235
|
+
return tokens.get("access_token")
|
|
236
|
+
|
|
216
237
|
refresh_token = tokens.get("refresh_token")
|
|
217
238
|
if not refresh_token:
|
|
218
239
|
logger.debug("No refresh_token available")
|
|
@@ -259,6 +280,7 @@ def refresh_access_token(force: bool = False) -> Optional[str]:
|
|
|
259
280
|
if expires_in_value is not None:
|
|
260
281
|
tokens["expires_in"] = expires_in_value
|
|
261
282
|
tokens["expires_at"] = _calculate_expires_at(expires_in_value)
|
|
283
|
+
tokens["refreshed_at"] = time.time()
|
|
262
284
|
if save_tokens(tokens):
|
|
263
285
|
update_claude_code_model_tokens(tokens["access_token"])
|
|
264
286
|
return tokens["access_token"]
|
|
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.591 → code_puppy-0.0.593}/code_puppy/command_line/load_context_completion.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.591 → code_puppy-0.0.593}/code_puppy/command_line/mcp/catalog_server_installer.py
RENAMED
|
File without changes
|
|
File without changes
|
{code_puppy-0.0.591 → code_puppy-0.0.593}/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.591 → code_puppy-0.0.593}/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
|
{code_puppy-0.0.591 → code_puppy-0.0.593}/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.591 → code_puppy-0.0.593}/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
|
|
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
|