code-puppy-core-plugins 0.0.37__tar.gz → 0.0.38__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_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/PKG-INFO +1 -1
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/config.py +5 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +11 -2
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/utils.py +13 -2
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/pyproject.toml +1 -2
- code_puppy_core_plugins-0.0.37/code_puppy_core_plugins/shell_safety/__init__.py +0 -6
- code_puppy_core_plugins-0.0.37/code_puppy_core_plugins/shell_safety/classifier.py +0 -48
- code_puppy_core_plugins-0.0.37/code_puppy_core_plugins/shell_safety/command_cache.py +0 -156
- code_puppy_core_plugins-0.0.37/code_puppy_core_plugins/shell_safety/register_callbacks.py +0 -209
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/.gitignore +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/LICENSE +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/README.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/README.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/agent.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/bridge.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/capabilities.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/commands.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/content.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/io_delegation.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/mcp_config.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/permissions.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/persistence.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/replay.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/session.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/session_config.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/state.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_creator_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_creator_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_creator_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/config.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/discovery.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/downloader.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/enabled_skills.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/installer.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/metadata.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/prompt_builder.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/provider.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/remote_catalog.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/skill_catalog.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/skill_commands.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/skills_install_menu.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/skills_menu.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/auto_continue/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/auto_continue/classifier.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/auto_continue/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/aws_bedrock/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/aws_bedrock/config.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/aws_bedrock/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/aws_bedrock/utils.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/README.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/config.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/discovery.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/token.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/utils.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/btw/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/btw/inline_view.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/btw/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/btw/side_query.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/image_generation.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/image_tool.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/model_catalog.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/usage.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_hooks/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_hooks/config.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_hooks/trust.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/README.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/SETUP.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/fast_mode.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/code_puppy_agent/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/code_puppy_agent/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/NativeCapture.swift +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/README.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/accessibility.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/activation.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/backend.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/backend_types.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/capture.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/commands.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/geometry.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/inline_image.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/keycodes.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/policy.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/safety.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/settle.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/state.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/tools.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/context_indicator/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/context_indicator/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/context_indicator/usage.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/copilot_auth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/copilot_auth/config.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/copilot_auth/reasoning_client.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/copilot_auth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/copilot_auth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/customizable_commands/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/cancel.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/commands.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/config.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/runtime.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/wrapper.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/destructive_command_guard/AGENTS.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/destructive_command_guard/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/destructive_command_guard/detector.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/emoji_filter/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/emoji_filter/config.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/emoji_filter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/emoji_filter/stripper.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/example_custom_command/README.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/example_custom_command/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/file_permission_handler/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/file_permission_handler/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/installer.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/force_push_guard/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/force_push_guard/detector.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/force_push_guard/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/fork/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/fork/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/frontend_emitter/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/frontend_emitter/emitter.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/frontend_emitter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/frontend_emitter/session_context.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/grok_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/grok_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/grok_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/grok_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/grok_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/README.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/client.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/reporter.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/smoke.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/sources.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/hook_creator/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/hook_creator/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/hook_manager/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/hook_manager/config.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/hook_manager/hooks_menu.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/hook_manager/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/hook_manager/trust_handler.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_oauth/oauth.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_oauth/query_tool.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_sessions/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_sessions/mirror.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_sessions/query.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_sessions/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_sessions/sync.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/meta_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/meta_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/meta_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/meta_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/meta_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/namespace_skill_search/README.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/namespace_skill_search/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/namespace_skill_search/namespaces.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/namespace_skill_search/search_tool.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/no_tools/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/no_tools/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/oauth_pasteback.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/oauth_puppy_html.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/obsidian_agent/README.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/obsidian_agent/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/obsidian_agent/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/ollama/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/ollama/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/ollama_setup/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/ollama_setup/completer.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/ollama_setup/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/openrouter_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/openrouter_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/openrouter_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/openrouter_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/openrouter_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/plugin_list/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/plugin_list/plugin_contributions.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/plugin_list/plugin_meta.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/plugin_list/plugin_text_utils.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/plugin_list/plugins_menu.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/plugin_list/plugins_menu_render.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/plugin_list/project_trust_flow.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/plugin_list/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/pop_command/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/pop_command/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prompt_newline/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prompt_newline/config.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prompt_newline/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prune/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prune/prune_menu.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prune/prune_model.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prune/prune_render.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prune/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/README.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/commands.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/config.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/kennel.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/packer.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/recorder.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/retriever.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/schema.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/state.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/tools.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/wings.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_spinner/README.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_spinner/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_spinner/builtin_frames.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_spinner/commands.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_spinner/picker.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_spinner/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_spinner/spinners.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/qa_kitten_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/qa_kitten_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/qa_kitten_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/quick_resume/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/quick_resume/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/review_pr/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/review_pr/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/session_namer/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/session_namer/namer.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/session_namer/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/spill/LICENSE.deepseek +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/spill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/spill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/spill/store.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/stack_dump/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/stack_dump/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/config.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/payload.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/prompt_patch.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/runner.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/statusline_command.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/steer_queue/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/steer_queue/queue_menu.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/steer_queue/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/subagent_panel/README.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/subagent_panel/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/subagent_panel/coalesce_patch.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/subagent_panel/panel_render.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/subagent_panel/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/subagent_panel/resume_repaint.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/subagent_panel/state.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/switch_agent_resume/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/termflow_tui.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/README.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/bundled_palettes.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/content_styles.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/osc_palette.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/picker.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/prompt_toolkit_theme.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/rich_themes.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/themes.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/timestamp_heartbeat/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/token_ratio_learner/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/token_ratio_learner/ratios.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/universal_constructor/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/universal_constructor/models.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/universal_constructor/provider.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/universal_constructor/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/universal_constructor/registry.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/universal_constructor/sandbox.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/web_retriever_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/web_retriever_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/web_retriever_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/goal_runs.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/judge.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/judge_config.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/judges_menu.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/state.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/yolo_cli/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/yolo_cli/register_callbacks.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: code-puppy-core-plugins
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.38
|
|
4
4
|
Summary: Official plugin bundle for Code Puppy
|
|
5
5
|
Project-URL: Repository, https://github.com/mpfaffenberger/code_puppy_core_plugins
|
|
6
6
|
Project-URL: Homepage, https://github.com/mpfaffenberger/code_puppy_core_plugins
|
|
@@ -32,9 +32,14 @@ CLAUDE_CODE_OAUTH_CONFIG: Dict[str, Any] = {
|
|
|
32
32
|
"claude-opus-5",
|
|
33
33
|
"claude-sonnet-5",
|
|
34
34
|
"claude-fable-5",
|
|
35
|
+
"claude-fable-5-1",
|
|
35
36
|
],
|
|
36
37
|
"api_key_env_var": "CLAUDE_CODE_ACCESS_TOKEN",
|
|
37
38
|
"anthropic_version": "2023-06-01",
|
|
39
|
+
# Per-family caps applied by filter_latest_claude_models. Shared by the
|
|
40
|
+
# save path (add_models_to_extra_config) and the load path
|
|
41
|
+
# (load_claude_models_filtered) so the two can never drift apart.
|
|
42
|
+
"model_family_limits": {"default": 1, "opus": 3, "fable": 3},
|
|
38
43
|
}
|
|
39
44
|
|
|
40
45
|
|
|
@@ -52,6 +52,10 @@ from .utils import (
|
|
|
52
52
|
|
|
53
53
|
logger = logging.getLogger(__name__)
|
|
54
54
|
|
|
55
|
+
# Model switched to after a successful /claude-code-auth run. Only applied
|
|
56
|
+
# when authentication succeeded AND discovery actually minted this entry.
|
|
57
|
+
POST_AUTH_MODEL = f"{CLAUDE_CODE_OAUTH_CONFIG['prefix']}claude-fable-5-1-long"
|
|
58
|
+
|
|
55
59
|
|
|
56
60
|
class _OAuthResult:
|
|
57
61
|
def __init__(self) -> None:
|
|
@@ -393,8 +397,13 @@ def _handle_custom_command(command: str, name: str) -> Optional[bool]:
|
|
|
393
397
|
tokens = load_stored_tokens()
|
|
394
398
|
if tokens and tokens.get("access_token"):
|
|
395
399
|
emit_warning(t("oauth.claude.cmd.auth.overwrite_warning"))
|
|
396
|
-
_perform_authentication()
|
|
397
|
-
|
|
400
|
+
authenticated = _perform_authentication()
|
|
401
|
+
if authenticated and POST_AUTH_MODEL in load_claude_models_filtered():
|
|
402
|
+
set_model_and_reload_agent(POST_AUTH_MODEL)
|
|
403
|
+
else:
|
|
404
|
+
emit_warning(
|
|
405
|
+
t("oauth.claude.cmd.auth.model_switch_skipped", model=POST_AUTH_MODEL)
|
|
406
|
+
)
|
|
398
407
|
return True
|
|
399
408
|
|
|
400
409
|
if name == "claude-code-status":
|
|
@@ -340,7 +340,8 @@ def load_claude_models_filtered() -> Dict[str, Any]:
|
|
|
340
340
|
# Filter to only latest models
|
|
341
341
|
latest_names = set(
|
|
342
342
|
filter_latest_claude_models(
|
|
343
|
-
model_names,
|
|
343
|
+
model_names,
|
|
344
|
+
max_per_family=CLAUDE_CODE_OAUTH_CONFIG["model_family_limits"],
|
|
344
345
|
)
|
|
345
346
|
)
|
|
346
347
|
|
|
@@ -450,6 +451,12 @@ def filter_latest_claude_models(
|
|
|
450
451
|
mapping family name to its limit (e.g. ``{"opus": 3}``). Families
|
|
451
452
|
not present in the dict fall back to ``"default"`` key, or ``2``.
|
|
452
453
|
"""
|
|
454
|
+
# Dedupe while preserving order: base and "-long" config entries share the
|
|
455
|
+
# same underlying model name, and a duplicate must not consume a slot of
|
|
456
|
+
# the per-family limit (e.g. [opus-5, opus-5, opus-4-8] silently dropping
|
|
457
|
+
# opus-4-7 at limit 3).
|
|
458
|
+
models = list(dict.fromkeys(models))
|
|
459
|
+
|
|
453
460
|
# Collect all parsed models per family
|
|
454
461
|
# family -> list of (model_name, major, minor, date)
|
|
455
462
|
family_models: Dict[str, List[Tuple[str, int, int, int]]] = {}
|
|
@@ -476,6 +483,9 @@ def filter_latest_claude_models(
|
|
|
476
483
|
if model_name == "claude-fable-5":
|
|
477
484
|
family_models.setdefault("fable", []).append((model_name, 5, 0, 0))
|
|
478
485
|
continue
|
|
486
|
+
if model_name == "claude-fable-5-1":
|
|
487
|
+
family_models.setdefault("fable", []).append((model_name, 5, 1, 0))
|
|
488
|
+
continue
|
|
479
489
|
# Match pattern: claude-{family}-{major}-{minor}-{date}
|
|
480
490
|
# Examples: claude-haiku-3-5-20241022, claude-sonnet-4-5-20250929
|
|
481
491
|
match = re.match(r"claude-(haiku|sonnet|opus)-(\d+)-(\d+)-(\d+)", model_name)
|
|
@@ -609,7 +619,8 @@ def add_models_to_extra_config(models: List[str]) -> bool:
|
|
|
609
619
|
try:
|
|
610
620
|
# Filter to only latest haiku, sonnet, and opus models
|
|
611
621
|
filtered_models = filter_latest_claude_models(
|
|
612
|
-
models,
|
|
622
|
+
models,
|
|
623
|
+
max_per_family=CLAUDE_CODE_OAUTH_CONFIG["model_family_limits"],
|
|
613
624
|
)
|
|
614
625
|
|
|
615
626
|
# Start fresh - overwrite the file on every auth instead of loading existing
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "code-puppy-core-plugins"
|
|
7
|
-
version = "0.0.
|
|
7
|
+
version = "0.0.38"
|
|
8
8
|
description = "Official plugin bundle for Code Puppy"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11,<3.15"
|
|
@@ -76,7 +76,6 @@ qa_kitten_skill = "code_puppy_core_plugins.qa_kitten_skill.register_callbacks"
|
|
|
76
76
|
quick_resume = "code_puppy_core_plugins.quick_resume.register_callbacks"
|
|
77
77
|
review_pr = "code_puppy_core_plugins.review_pr.register_callbacks"
|
|
78
78
|
session_namer = "code_puppy_core_plugins.session_namer.register_callbacks"
|
|
79
|
-
shell_safety = "code_puppy_core_plugins.shell_safety.register_callbacks"
|
|
80
79
|
spill = "code_puppy_core_plugins.spill.register_callbacks"
|
|
81
80
|
stack_dump = "code_puppy_core_plugins.stack_dump.register_callbacks"
|
|
82
81
|
statusline = "code_puppy_core_plugins.statusline.register_callbacks"
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"""Private shell-command risk classifier."""
|
|
2
|
-
|
|
3
|
-
from code_puppy.config import get_global_model_name
|
|
4
|
-
from code_puppy.private_inference import run_private_prompt
|
|
5
|
-
from code_puppy.tools.command_runner import ShellSafetyAssessment
|
|
6
|
-
|
|
7
|
-
_INSTRUCTIONS = """You are a shell command safety analyzer. Assess risk levels concisely.
|
|
8
|
-
|
|
9
|
-
Risk levels:
|
|
10
|
-
- none: Completely safe (ls, pwd, echo, cat readonly files)
|
|
11
|
-
- low: Minimal risk (mkdir, touch, git status, read-only queries)
|
|
12
|
-
- medium: Moderate risk (file edits, package installs, service restarts)
|
|
13
|
-
- high: Significant risk (rm files, unfiltered UPDATE/DELETE, TRUNCATE, dangerous chmod)
|
|
14
|
-
- critical: Severe/destructive (rm -rf, DROP, dd, format, mkfs, mass deletes)
|
|
15
|
-
|
|
16
|
-
Evaluate scope, reversibility, data-loss potential, privileges, and database
|
|
17
|
-
destruction patterns. Return the risk level and at most one sentence of reasoning."""
|
|
18
|
-
|
|
19
|
-
_NON_THINKING_OVERRIDES = {
|
|
20
|
-
"reasoning_effort": "none",
|
|
21
|
-
"extended_thinking": "off",
|
|
22
|
-
"interleaved_thinking": False,
|
|
23
|
-
"thinking_type": "disabled",
|
|
24
|
-
"thinking_enabled": False,
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
async def classify(command: str, cwd: str | None = None) -> ShellSafetyAssessment:
|
|
29
|
-
"""Assess one command without entering Code Puppy's agent runtime."""
|
|
30
|
-
model_name = get_global_model_name()
|
|
31
|
-
if not model_name:
|
|
32
|
-
raise RuntimeError("No model configured for shell-safety assessment")
|
|
33
|
-
|
|
34
|
-
prompt = f"Assess this shell command:\n\nCommand: {command}"
|
|
35
|
-
if cwd:
|
|
36
|
-
prompt += f"\nWorking directory: {cwd}"
|
|
37
|
-
|
|
38
|
-
return await run_private_prompt(
|
|
39
|
-
model_name=model_name,
|
|
40
|
-
instructions=_INSTRUCTIONS,
|
|
41
|
-
prompt=prompt,
|
|
42
|
-
output_type=ShellSafetyAssessment,
|
|
43
|
-
model_settings_overrides=_NON_THINKING_OVERRIDES,
|
|
44
|
-
max_tokens=128,
|
|
45
|
-
)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
__all__ = ["classify"]
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
"""Caching layer for shell command safety assessments.
|
|
2
|
-
|
|
3
|
-
This module provides an LRU cache for recently assessed commands to avoid redundant API calls.
|
|
4
|
-
|
|
5
|
-
The approach is simple and secure: let the LLM assess ALL commands and cache
|
|
6
|
-
those assessments. This eliminates the security risks of pre-defined whitelists
|
|
7
|
-
while providing the performance benefits of caching.
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
from collections import OrderedDict
|
|
11
|
-
from dataclasses import dataclass
|
|
12
|
-
from typing import Optional, Tuple
|
|
13
|
-
|
|
14
|
-
# Maximum number of cached assessments (LRU eviction after this)
|
|
15
|
-
MAX_CACHE_SIZE = 200
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@dataclass
|
|
19
|
-
class CachedAssessment:
|
|
20
|
-
"""A cached safety assessment result."""
|
|
21
|
-
|
|
22
|
-
risk: str
|
|
23
|
-
reasoning: str
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class CommandSafetyCache:
|
|
27
|
-
"""LRU cache for shell command safety assessments.
|
|
28
|
-
|
|
29
|
-
This cache stores previous LLM assessments to avoid redundant API calls.
|
|
30
|
-
It uses an OrderedDict for O(1) LRU eviction.
|
|
31
|
-
"""
|
|
32
|
-
|
|
33
|
-
def __init__(self, max_size: int = MAX_CACHE_SIZE):
|
|
34
|
-
self._cache: OrderedDict[Tuple[str, Optional[str]], CachedAssessment] = (
|
|
35
|
-
OrderedDict()
|
|
36
|
-
)
|
|
37
|
-
self._max_size = max_size
|
|
38
|
-
self._hits = 0
|
|
39
|
-
self._misses = 0
|
|
40
|
-
|
|
41
|
-
def _make_key(self, command: str, cwd: Optional[str]) -> Tuple[str, Optional[str]]:
|
|
42
|
-
"""Create a cache key from command and cwd."""
|
|
43
|
-
# Normalize command (strip whitespace)
|
|
44
|
-
return (command.strip(), cwd)
|
|
45
|
-
|
|
46
|
-
def get(
|
|
47
|
-
self, command: str, cwd: Optional[str] = None
|
|
48
|
-
) -> Optional[CachedAssessment]:
|
|
49
|
-
"""Get a cached assessment if it exists.
|
|
50
|
-
|
|
51
|
-
Args:
|
|
52
|
-
command: The shell command
|
|
53
|
-
cwd: Optional working directory
|
|
54
|
-
|
|
55
|
-
Returns:
|
|
56
|
-
CachedAssessment if found, None otherwise
|
|
57
|
-
"""
|
|
58
|
-
key = self._make_key(command, cwd)
|
|
59
|
-
if key in self._cache:
|
|
60
|
-
# Move to end (most recently used)
|
|
61
|
-
self._cache.move_to_end(key)
|
|
62
|
-
self._hits += 1
|
|
63
|
-
return self._cache[key]
|
|
64
|
-
self._misses += 1
|
|
65
|
-
return None
|
|
66
|
-
|
|
67
|
-
def put(
|
|
68
|
-
self, command: str, cwd: Optional[str], assessment: CachedAssessment
|
|
69
|
-
) -> None:
|
|
70
|
-
"""Store an assessment in the cache.
|
|
71
|
-
|
|
72
|
-
Args:
|
|
73
|
-
command: The shell command
|
|
74
|
-
cwd: Optional working directory
|
|
75
|
-
assessment: The assessment result to cache
|
|
76
|
-
"""
|
|
77
|
-
key = self._make_key(command, cwd)
|
|
78
|
-
|
|
79
|
-
# If already exists, update and move to end
|
|
80
|
-
if key in self._cache:
|
|
81
|
-
self._cache.move_to_end(key)
|
|
82
|
-
self._cache[key] = assessment
|
|
83
|
-
return
|
|
84
|
-
|
|
85
|
-
# Evict oldest if at capacity
|
|
86
|
-
while len(self._cache) >= self._max_size:
|
|
87
|
-
self._cache.popitem(last=False)
|
|
88
|
-
|
|
89
|
-
self._cache[key] = assessment
|
|
90
|
-
|
|
91
|
-
def clear(self) -> None:
|
|
92
|
-
"""Clear all cached assessments."""
|
|
93
|
-
self._cache.clear()
|
|
94
|
-
self._hits = 0
|
|
95
|
-
self._misses = 0
|
|
96
|
-
|
|
97
|
-
@property
|
|
98
|
-
def stats(self) -> dict:
|
|
99
|
-
"""Get cache statistics."""
|
|
100
|
-
total = self._hits + self._misses
|
|
101
|
-
hit_rate = (self._hits / total * 100) if total > 0 else 0
|
|
102
|
-
return {
|
|
103
|
-
"size": len(self._cache),
|
|
104
|
-
"max_size": self._max_size,
|
|
105
|
-
"hits": self._hits,
|
|
106
|
-
"misses": self._misses,
|
|
107
|
-
"hit_rate": f"{hit_rate:.1f}%",
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
# Global cache instance (singleton for the session)
|
|
112
|
-
_cache = CommandSafetyCache()
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
def get_cache_stats() -> dict:
|
|
116
|
-
"""Get statistics about the cache performance."""
|
|
117
|
-
return _cache.stats
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
def get_cached_assessment(
|
|
121
|
-
command: str, cwd: Optional[str] = None
|
|
122
|
-
) -> Optional[CachedAssessment]:
|
|
123
|
-
"""Get a cached command safety assessment.
|
|
124
|
-
|
|
125
|
-
Cache-only approach: use the LLM cache for speed, but let the LLM
|
|
126
|
-
determine safety for all commands. No pre-defined whitelists.
|
|
127
|
-
|
|
128
|
-
Args:
|
|
129
|
-
command: The shell command to check
|
|
130
|
-
cwd: Optional working directory
|
|
131
|
-
|
|
132
|
-
Returns:
|
|
133
|
-
CachedAssessment if found in cache, None if needs LLM assessment
|
|
134
|
-
"""
|
|
135
|
-
return _cache.get(command, cwd)
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
def cache_assessment(
|
|
139
|
-
command: str, cwd: Optional[str], risk: str, reasoning: str
|
|
140
|
-
) -> None:
|
|
141
|
-
"""Cache an LLM assessment result.
|
|
142
|
-
|
|
143
|
-
Cache all LLM assessments since the same command should get
|
|
144
|
-
the same assessment, providing both security and performance.
|
|
145
|
-
|
|
146
|
-
Args:
|
|
147
|
-
command: The shell command
|
|
148
|
-
cwd: Optional working directory
|
|
149
|
-
risk: The assessed risk level
|
|
150
|
-
reasoning: The assessment reasoning
|
|
151
|
-
"""
|
|
152
|
-
assessment = CachedAssessment(
|
|
153
|
-
risk=risk,
|
|
154
|
-
reasoning=reasoning,
|
|
155
|
-
)
|
|
156
|
-
_cache.put(command, cwd, assessment)
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
"""Callback registration for shell command safety checking.
|
|
2
|
-
|
|
3
|
-
This module registers a callback that intercepts shell commands in yolo_mode
|
|
4
|
-
and assesses their safety risk before execution.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import inspect
|
|
8
|
-
import logging
|
|
9
|
-
from typing import Any, Dict, Optional
|
|
10
|
-
|
|
11
|
-
from code_puppy.callbacks import register_callback
|
|
12
|
-
from code_puppy.config import (
|
|
13
|
-
get_global_model_name,
|
|
14
|
-
get_safety_permission_level,
|
|
15
|
-
get_yolo_mode,
|
|
16
|
-
)
|
|
17
|
-
from code_puppy_core_plugins.shell_safety.command_cache import (
|
|
18
|
-
cache_assessment,
|
|
19
|
-
get_cached_assessment,
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
logger = logging.getLogger(__name__)
|
|
23
|
-
|
|
24
|
-
# OAuth model prefixes - these models have their own safety mechanisms
|
|
25
|
-
OAUTH_MODEL_PREFIXES = (
|
|
26
|
-
"claude-code-", # Anthropic OAuth
|
|
27
|
-
"codex-", # OpenAI OAuth
|
|
28
|
-
"chatgpt-", # Legacy OpenAI OAuth
|
|
29
|
-
"gemini-oauth", # Google OAuth
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
def is_oauth_model(model_name: str | None) -> bool:
|
|
34
|
-
"""Check if the model is an OAuth model that should skip safety checks.
|
|
35
|
-
|
|
36
|
-
OAuth models have their own built-in safety mechanisms, so we skip
|
|
37
|
-
the shell safety callback to avoid redundant checks and potential bugs.
|
|
38
|
-
|
|
39
|
-
Args:
|
|
40
|
-
model_name: The name of the current model
|
|
41
|
-
|
|
42
|
-
Returns:
|
|
43
|
-
True if the model is an OAuth model, False otherwise
|
|
44
|
-
"""
|
|
45
|
-
if not model_name:
|
|
46
|
-
return False
|
|
47
|
-
return model_name.startswith(OAUTH_MODEL_PREFIXES)
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
# Numeric risk hierarchy: lower values are safer.
|
|
51
|
-
RISK_LEVELS: Dict[str, int] = {
|
|
52
|
-
"none": 0,
|
|
53
|
-
"low": 1,
|
|
54
|
-
"medium": 2,
|
|
55
|
-
"high": 3,
|
|
56
|
-
"critical": 4,
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
def compare_risk_levels(assessed_risk: Optional[str], threshold: str) -> bool:
|
|
61
|
-
"""Compare assessed risk against threshold.
|
|
62
|
-
|
|
63
|
-
Args:
|
|
64
|
-
assessed_risk: The risk level from the agent (can be None)
|
|
65
|
-
threshold: The configured risk threshold
|
|
66
|
-
|
|
67
|
-
Returns:
|
|
68
|
-
True if the command should be blocked (risk exceeds threshold)
|
|
69
|
-
False if the command is acceptable
|
|
70
|
-
"""
|
|
71
|
-
# If assessment failed (None), treat as high risk (fail-safe behavior)
|
|
72
|
-
if assessed_risk is None:
|
|
73
|
-
assessed_risk = "high"
|
|
74
|
-
|
|
75
|
-
# Map risk names to numeric values; unknown defaults are conservative.
|
|
76
|
-
assessed_level = RISK_LEVELS.get(assessed_risk, 4) # Default to critical if unknown
|
|
77
|
-
threshold_level = RISK_LEVELS.get(threshold, 2) # Default to medium if unknown
|
|
78
|
-
|
|
79
|
-
# Block if assessed risk is GREATER than threshold
|
|
80
|
-
# Note: Commands AT the threshold level are allowed (>, not >=)
|
|
81
|
-
return assessed_level > threshold_level
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
async def shell_safety_callback(
|
|
85
|
-
context: Any, command: str, cwd: Optional[str] = None, timeout: int = 60
|
|
86
|
-
) -> Optional[Dict[str, Any]]:
|
|
87
|
-
"""Callback to assess shell command safety before execution.
|
|
88
|
-
|
|
89
|
-
This callback is only active when yolo_mode is True. When yolo_mode is False,
|
|
90
|
-
the user manually reviews every command, so we don't need the agent.
|
|
91
|
-
|
|
92
|
-
Args:
|
|
93
|
-
context: The execution context
|
|
94
|
-
command: The shell command to execute
|
|
95
|
-
cwd: Optional working directory
|
|
96
|
-
timeout: Command timeout (unused here)
|
|
97
|
-
|
|
98
|
-
Returns:
|
|
99
|
-
None if command is safe to proceed
|
|
100
|
-
Dict with rejection info if command should be blocked
|
|
101
|
-
"""
|
|
102
|
-
try:
|
|
103
|
-
# Only check safety in yolo_mode - otherwise the user reviews manually.
|
|
104
|
-
# A failure to read this setting must block rather than become approval,
|
|
105
|
-
# including for OAuth models checked below.
|
|
106
|
-
if not get_yolo_mode():
|
|
107
|
-
return None
|
|
108
|
-
|
|
109
|
-
# Skip safety checks for OAuth models - they have their own mechanisms.
|
|
110
|
-
if is_oauth_model(get_global_model_name()):
|
|
111
|
-
return None
|
|
112
|
-
|
|
113
|
-
threshold = get_safety_permission_level()
|
|
114
|
-
|
|
115
|
-
# Check cache first (fast path - no LLM call)
|
|
116
|
-
cached = get_cached_assessment(command, cwd)
|
|
117
|
-
|
|
118
|
-
if cached:
|
|
119
|
-
# Got a cached result - check against threshold
|
|
120
|
-
if compare_risk_levels(cached.risk, threshold):
|
|
121
|
-
# Cached result says it's too risky
|
|
122
|
-
risk_display = cached.risk or "unknown"
|
|
123
|
-
concise_reason = cached.reasoning or "No reasoning provided"
|
|
124
|
-
error_msg = (
|
|
125
|
-
f"🛑 Command blocked (risk {risk_display.upper()} > permission {threshold.upper()}).\n"
|
|
126
|
-
f"Reason: {concise_reason}\n"
|
|
127
|
-
f"Override: /set safety_permission_level {risk_display}"
|
|
128
|
-
)
|
|
129
|
-
return {
|
|
130
|
-
"blocked": True,
|
|
131
|
-
"risk": cached.risk,
|
|
132
|
-
"reasoning": cached.reasoning,
|
|
133
|
-
"error_message": error_msg,
|
|
134
|
-
}
|
|
135
|
-
# Cached result is within threshold - allow silently
|
|
136
|
-
return None
|
|
137
|
-
|
|
138
|
-
# Cache miss - need LLM assessment
|
|
139
|
-
from code_puppy_core_plugins.shell_safety.classifier import classify
|
|
140
|
-
|
|
141
|
-
assessment = await classify(command, cwd)
|
|
142
|
-
|
|
143
|
-
# Cache the result for future use, but only if it's not a fallback assessment
|
|
144
|
-
if not getattr(assessment, "is_fallback", False):
|
|
145
|
-
cache_assessment(command, cwd, assessment.risk, assessment.reasoning)
|
|
146
|
-
|
|
147
|
-
# Check if risk exceeds threshold (commands at threshold are allowed)
|
|
148
|
-
if compare_risk_levels(assessment.risk, threshold):
|
|
149
|
-
risk_display = assessment.risk or "unknown"
|
|
150
|
-
concise_reason = assessment.reasoning or "No reasoning provided"
|
|
151
|
-
error_msg = (
|
|
152
|
-
f"🛑 Command blocked (risk {risk_display.upper()} > permission {threshold.upper()}).\n"
|
|
153
|
-
f"Reason: {concise_reason}\n"
|
|
154
|
-
f"Override: /set safety_permission_level {risk_display}"
|
|
155
|
-
)
|
|
156
|
-
# Return rejection info for the command runner
|
|
157
|
-
return {
|
|
158
|
-
"blocked": True,
|
|
159
|
-
"risk": assessment.risk,
|
|
160
|
-
"reasoning": assessment.reasoning,
|
|
161
|
-
"error_message": error_msg,
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
# Command is within acceptable risk threshold - remain silent
|
|
165
|
-
return None # Allow command to proceed
|
|
166
|
-
|
|
167
|
-
except Exception as exc:
|
|
168
|
-
# On any error, fail safe by blocking the command. This includes config
|
|
169
|
-
# and model reads above the assessment-specific logic.
|
|
170
|
-
try:
|
|
171
|
-
logger.warning(
|
|
172
|
-
"Shell-safety assessment unavailable (%s)", type(exc).__name__
|
|
173
|
-
)
|
|
174
|
-
except Exception:
|
|
175
|
-
pass
|
|
176
|
-
error_msg = (
|
|
177
|
-
"\U0001f6d1 Command blocked because shell-safety configuration or model "
|
|
178
|
-
"was unavailable.\n"
|
|
179
|
-
"Reason: Safety assessment was unavailable.\n"
|
|
180
|
-
"Next step: check the logs and retry the command."
|
|
181
|
-
)
|
|
182
|
-
return {
|
|
183
|
-
"blocked": True,
|
|
184
|
-
"risk": "high",
|
|
185
|
-
"reasoning": "Safety assessment was unavailable.",
|
|
186
|
-
"error_message": error_msg,
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
def register():
|
|
191
|
-
"""Register the shell safety callback."""
|
|
192
|
-
try:
|
|
193
|
-
parameters = inspect.signature(register_callback).parameters
|
|
194
|
-
except (TypeError, ValueError):
|
|
195
|
-
parameters = {}
|
|
196
|
-
|
|
197
|
-
fail_closed_parameter = parameters.get("fail_closed")
|
|
198
|
-
|
|
199
|
-
if fail_closed_parameter is not None:
|
|
200
|
-
# An explicit parameter is the host's compatibility contract; signature
|
|
201
|
-
# inspection cannot verify how a wrapper implements it.
|
|
202
|
-
register_callback("run_shell_command", shell_safety_callback, fail_closed=True)
|
|
203
|
-
else:
|
|
204
|
-
# A **kwargs adapter does not prove the host implements fail_closed.
|
|
205
|
-
register_callback("run_shell_command", shell_safety_callback)
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
# Auto-register the callback when this module is imported
|
|
209
|
-
register()
|
|
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
|