code-puppy-core-plugins 0.0.2__tar.gz → 0.0.5__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.2 → code_puppy_core_plugins-0.0.5}/PKG-INFO +2 -1
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/remote_catalog.py +5 -5
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/skill_catalog.py +58 -38
- code_puppy_core_plugins-0.0.5/code_puppy_core_plugins/spill/LICENSE.deepseek +28 -0
- code_puppy_core_plugins-0.0.5/code_puppy_core_plugins/spill/__init__.py +1 -0
- code_puppy_core_plugins-0.0.5/code_puppy_core_plugins/spill/register_callbacks.py +235 -0
- code_puppy_core_plugins-0.0.5/code_puppy_core_plugins/spill/store.py +97 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/pyproject.toml +5 -1
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/.gitignore +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/LICENSE +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/README.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/README.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/agent.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/bridge.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/capabilities.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/commands.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/content.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/io_delegation.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/mcp_config.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/permissions.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/persistence.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/replay.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/session.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/session_config.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/state.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/config.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/discovery.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/downloader.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/enabled_skills.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/installer.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/metadata.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/prompt_builder.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/provider.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/skill_commands.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/skills_install_menu.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/skills_menu.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/aws_bedrock/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/aws_bedrock/config.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/aws_bedrock/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/aws_bedrock/utils.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/azure_foundry/README.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/azure_foundry/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/azure_foundry/config.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/azure_foundry/discovery.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/azure_foundry/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/azure_foundry/token.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/azure_foundry/utils.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/btw/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/btw/inline_view.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/btw/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/btw/side_query.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/image_generation.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/image_tool.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/usage.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_hooks/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_hooks/config.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/README.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/SETUP.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/fast_mode.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/code_puppy_agent/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/code_puppy_agent/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/NativeCapture.swift +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/README.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/accessibility.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/activation.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/backend.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/backend_types.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/capture.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/commands.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/geometry.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/inline_image.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/keycodes.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/policy.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/safety.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/settle.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/state.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/tools.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/context_indicator/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/context_indicator/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/context_indicator/usage.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/copilot_auth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/copilot_auth/config.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/copilot_auth/reasoning_client.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/copilot_auth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/copilot_auth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/customizable_commands/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/cancel.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/commands.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/config.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/runtime.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/wrapper.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/destructive_command_guard/AGENTS.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/destructive_command_guard/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/destructive_command_guard/detector.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/emoji_filter/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/emoji_filter/config.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/emoji_filter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/emoji_filter/stripper.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/example_custom_command/README.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/example_custom_command/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/file_permission_handler/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/file_permission_handler/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/installer.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/force_push_guard/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/force_push_guard/detector.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/force_push_guard/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/fork/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/fork/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/frontend_emitter/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/frontend_emitter/emitter.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/frontend_emitter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/frontend_emitter/session_context.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/grok_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/grok_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/grok_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/grok_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/grok_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/herdr/README.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/herdr/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/herdr/client.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/herdr/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/herdr/reporter.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/herdr/smoke.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/herdr/sources.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/hook_creator/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/hook_creator/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/hook_manager/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/hook_manager/config.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/hook_manager/hooks_menu.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/hook_manager/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/meta_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/meta_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/meta_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/meta_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/meta_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/namespace_skill_search/README.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/namespace_skill_search/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/namespace_skill_search/namespaces.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/namespace_skill_search/search_tool.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/no_tools/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/no_tools/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/oauth_pasteback.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/oauth_puppy_html.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/obsidian_agent/README.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/obsidian_agent/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/obsidian_agent/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/ollama/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/ollama/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/ollama_setup/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/ollama_setup/completer.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/ollama_setup/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/plugin_list/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/plugin_list/plugin_contributions.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/plugin_list/plugin_meta.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/plugin_list/plugin_text_utils.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/plugin_list/plugins_menu.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/plugin_list/plugins_menu_layout.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/plugin_list/plugins_menu_render.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/plugin_list/project_trust_flow.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/plugin_list/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/pop_command/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/pop_command/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/prompt_newline/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/prompt_newline/config.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/prompt_newline/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/prune/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/prune/prune_menu.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/prune/prune_model.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/prune/prune_render.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/prune/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/README.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/commands.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/config.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/kennel.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/packer.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/recorder.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/retriever.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/schema.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/state.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/tools.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/wings.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_spinner/README.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_spinner/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_spinner/builtin_frames.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_spinner/commands.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_spinner/picker.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_spinner/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_spinner/spinners.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/quick_resume/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/quick_resume/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/review_pr/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/review_pr/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/shell_safety/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/shell_safety/agent_shell_safety.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/shell_safety/command_cache.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/shell_safety/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/stack_dump/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/stack_dump/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/statusline/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/statusline/config.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/statusline/payload.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/statusline/prompt_patch.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/statusline/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/statusline/runner.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/statusline/statusline_command.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/steer_queue/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/steer_queue/queue_menu.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/steer_queue/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/subagent_panel/README.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/subagent_panel/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/subagent_panel/coalesce_patch.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/subagent_panel/panel_render.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/subagent_panel/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/subagent_panel/resume_repaint.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/subagent_panel/state.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/switch_agent_resume/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/README.md +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/bundled_palettes.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/content_styles.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/osc_palette.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/picker.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/prompt_toolkit_theme.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/rich_themes.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/themes.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/timestamp_heartbeat/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/token_ratio_learner/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/token_ratio_learner/ratios.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/universal_constructor/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/universal_constructor/models.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/universal_constructor/provider.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/universal_constructor/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/universal_constructor/registry.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/universal_constructor/sandbox.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/wide_completion_menu/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/wide_completion_menu/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/wiggum/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/wiggum/goal_runs.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/wiggum/judge.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/wiggum/judge_config.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/wiggum/judges_menu.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/wiggum/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/wiggum/state.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/yolo_cli/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/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.5
|
|
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
|
|
@@ -14,6 +14,7 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
14
14
|
Classifier: Programming Language :: Python :: 3.12
|
|
15
15
|
Classifier: Programming Language :: Python :: 3.13
|
|
16
16
|
Requires-Python: <3.15,>=3.11
|
|
17
|
+
Requires-Dist: httpx<1,>=0.24.1
|
|
17
18
|
Description-Content-Type: text/markdown
|
|
18
19
|
|
|
19
20
|
# Code Puppy Core Plugins
|
|
@@ -156,8 +156,8 @@ def _fetch_remote_json(url: str) -> Optional[dict[str, Any]]:
|
|
|
156
156
|
f"{e.response.status_code} {e.response.reason_phrase}"
|
|
157
157
|
)
|
|
158
158
|
return None
|
|
159
|
-
except
|
|
160
|
-
logger.
|
|
159
|
+
except httpx.TransportError as e:
|
|
160
|
+
logger.debug(f"Remote catalog network failure: {e}")
|
|
161
161
|
return None
|
|
162
162
|
except json.JSONDecodeError as e:
|
|
163
163
|
logger.warning(f"Remote catalog returned invalid JSON: {e}")
|
|
@@ -296,7 +296,7 @@ def fetch_remote_catalog(force_refresh: bool = False) -> Optional[RemoteCatalogD
|
|
|
296
296
|
f"(cache_path={_CACHE_PATH}, fresh={cache_fresh})"
|
|
297
297
|
)
|
|
298
298
|
else:
|
|
299
|
-
logger.
|
|
299
|
+
logger.debug("No cache present; fetching remote skills catalog")
|
|
300
300
|
|
|
301
301
|
remote_raw = _fetch_remote_json(SKILLS_JSON_URL)
|
|
302
302
|
if remote_raw is not None:
|
|
@@ -309,7 +309,7 @@ def fetch_remote_catalog(force_refresh: bool = False) -> Optional[RemoteCatalogD
|
|
|
309
309
|
|
|
310
310
|
# Offline fallback: use cache even if expired.
|
|
311
311
|
if _CACHE_PATH.exists():
|
|
312
|
-
logger.
|
|
312
|
+
logger.debug(
|
|
313
313
|
"Remote fetch failed; falling back to cached skills catalog "
|
|
314
314
|
f"(even if expired): {_CACHE_PATH}"
|
|
315
315
|
)
|
|
@@ -318,5 +318,5 @@ def fetch_remote_catalog(force_refresh: bool = False) -> Optional[RemoteCatalogD
|
|
|
318
318
|
return None
|
|
319
319
|
return _parse_catalog(cached)
|
|
320
320
|
|
|
321
|
-
logger.
|
|
321
|
+
logger.debug("Remote fetch failed and no cache is available")
|
|
322
322
|
return None
|
|
@@ -13,12 +13,14 @@ Public API:
|
|
|
13
13
|
)
|
|
14
14
|
|
|
15
15
|
If the remote catalog can't be fetched (and there's no cache), the catalog is
|
|
16
|
-
empty by default
|
|
16
|
+
empty by default. Loading is deferred until a catalog-backed operation needs it.
|
|
17
17
|
"""
|
|
18
18
|
|
|
19
19
|
from __future__ import annotations
|
|
20
20
|
|
|
21
21
|
import logging
|
|
22
|
+
import threading
|
|
23
|
+
import time
|
|
22
24
|
from dataclasses import dataclass, field
|
|
23
25
|
from pathlib import Path
|
|
24
26
|
from typing import List, Optional
|
|
@@ -26,6 +28,7 @@ from typing import List, Optional
|
|
|
26
28
|
from code_puppy_core_plugins.agent_skills.remote_catalog import fetch_remote_catalog
|
|
27
29
|
|
|
28
30
|
logger = logging.getLogger(__name__)
|
|
31
|
+
_RETRY_DELAY_SECONDS = 60
|
|
29
32
|
|
|
30
33
|
|
|
31
34
|
_ACRONYMS = {
|
|
@@ -133,47 +136,59 @@ class SkillCatalog:
|
|
|
133
136
|
self._entries: list[SkillCatalogEntry] = []
|
|
134
137
|
self._by_id: dict[str, SkillCatalogEntry] = {}
|
|
135
138
|
self._by_category: dict[str, list[SkillCatalogEntry]] = {}
|
|
139
|
+
self._loaded = False
|
|
140
|
+
self._next_retry_at = 0.0
|
|
141
|
+
self._load_lock = threading.Lock()
|
|
136
142
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
logger.warning(f"Failed to fetch remote catalog: {e}")
|
|
142
|
-
remote = None
|
|
143
|
-
|
|
144
|
-
if remote is None:
|
|
145
|
-
logger.warning(
|
|
146
|
-
"Remote skill catalog unavailable (no network and no cache). "
|
|
147
|
-
"Catalog will be empty."
|
|
148
|
-
)
|
|
143
|
+
def _load(self) -> None:
|
|
144
|
+
"""Load the optional remote catalog, retrying after bounded failures."""
|
|
145
|
+
|
|
146
|
+
if self._loaded or time.monotonic() < self._next_retry_at:
|
|
149
147
|
return
|
|
150
148
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
149
|
+
with self._load_lock:
|
|
150
|
+
if self._loaded or time.monotonic() < self._next_retry_at:
|
|
151
|
+
return
|
|
152
|
+
|
|
153
|
+
try:
|
|
154
|
+
remote = fetch_remote_catalog()
|
|
155
|
+
except Exception as e:
|
|
156
|
+
logger.debug(f"Failed to fetch remote catalog: {e}")
|
|
157
|
+
self._next_retry_at = time.monotonic() + _RETRY_DELAY_SECONDS
|
|
158
|
+
return
|
|
159
|
+
|
|
160
|
+
if remote is None:
|
|
161
|
+
logger.debug("Remote skill catalog unavailable; catalog will be empty.")
|
|
162
|
+
self._next_retry_at = time.monotonic() + _RETRY_DELAY_SECONDS
|
|
163
|
+
return
|
|
164
|
+
|
|
165
|
+
entries: list[SkillCatalogEntry] = []
|
|
166
|
+
|
|
167
|
+
for remote_entry in remote.entries:
|
|
168
|
+
skill_id = remote_entry.name
|
|
169
|
+
entry = SkillCatalogEntry(
|
|
170
|
+
id=skill_id,
|
|
171
|
+
name=remote_entry.name,
|
|
172
|
+
display_name=_format_display_name(remote_entry.name),
|
|
173
|
+
description=remote_entry.description,
|
|
174
|
+
category=remote_entry.group,
|
|
175
|
+
tags=[],
|
|
176
|
+
source_path=None,
|
|
177
|
+
has_scripts=remote_entry.has_scripts,
|
|
178
|
+
has_references=remote_entry.has_references,
|
|
179
|
+
file_count=remote_entry.file_count,
|
|
180
|
+
download_url=remote_entry.download_url,
|
|
181
|
+
zip_size_bytes=remote_entry.zip_size_bytes,
|
|
182
|
+
)
|
|
183
|
+
entries.append(entry)
|
|
184
|
+
|
|
185
|
+
self._rebuild_indices(entries)
|
|
186
|
+
self._loaded = True
|
|
187
|
+
|
|
188
|
+
logger.info(
|
|
189
|
+
f"Loaded remote skill catalog: {len(self._entries)} skills in "
|
|
190
|
+
f"{len(self._by_category)} categories"
|
|
168
191
|
)
|
|
169
|
-
entries.append(entry)
|
|
170
|
-
|
|
171
|
-
self._rebuild_indices(entries)
|
|
172
|
-
|
|
173
|
-
logger.info(
|
|
174
|
-
f"Loaded remote skill catalog: {len(self._entries)} skills in "
|
|
175
|
-
f"{len(self._by_category)} categories"
|
|
176
|
-
)
|
|
177
192
|
|
|
178
193
|
def _rebuild_indices(self, entries: list[SkillCatalogEntry]) -> None:
|
|
179
194
|
"""Rebuild internal lookup indices from the loaded entries."""
|
|
@@ -198,12 +213,14 @@ class SkillCatalog:
|
|
|
198
213
|
def list_categories(self) -> List[str]:
|
|
199
214
|
"""List all categories."""
|
|
200
215
|
|
|
216
|
+
self._load()
|
|
201
217
|
categories = {e.category for e in self._entries if e.category}
|
|
202
218
|
return sorted(categories, key=lambda c: c.casefold())
|
|
203
219
|
|
|
204
220
|
def get_by_category(self, category: str) -> List[SkillCatalogEntry]:
|
|
205
221
|
"""Return all entries in a category (case-insensitive)."""
|
|
206
222
|
|
|
223
|
+
self._load()
|
|
207
224
|
if not category:
|
|
208
225
|
return []
|
|
209
226
|
return list(self._by_category.get(category.casefold(), []))
|
|
@@ -211,6 +228,7 @@ class SkillCatalog:
|
|
|
211
228
|
def search(self, query: str) -> List[SkillCatalogEntry]:
|
|
212
229
|
"""Search by substring over id/name/display_name/description/tags/category."""
|
|
213
230
|
|
|
231
|
+
self._load()
|
|
214
232
|
q = (query or "").strip().casefold()
|
|
215
233
|
if not q:
|
|
216
234
|
return self.get_all()
|
|
@@ -234,6 +252,7 @@ class SkillCatalog:
|
|
|
234
252
|
def get_by_id(self, skill_id: str) -> Optional[SkillCatalogEntry]:
|
|
235
253
|
"""Get a skill entry by id (case-sensitive exact match)."""
|
|
236
254
|
|
|
255
|
+
self._load()
|
|
237
256
|
if not skill_id:
|
|
238
257
|
return None
|
|
239
258
|
return self._by_id.get(skill_id)
|
|
@@ -241,6 +260,7 @@ class SkillCatalog:
|
|
|
241
260
|
def get_all(self) -> List[SkillCatalogEntry]:
|
|
242
261
|
"""Return all entries."""
|
|
243
262
|
|
|
263
|
+
self._load()
|
|
244
264
|
return list(self._entries)
|
|
245
265
|
|
|
246
266
|
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
DeepSeek Harness spill attribution
|
|
2
|
+
|
|
3
|
+
The spill functionality in this package is based on the spill packages from
|
|
4
|
+
DeepSeek Harness:
|
|
5
|
+
|
|
6
|
+
https://github.com/deepseek-ai/DeepSeek-Harness
|
|
7
|
+
|
|
8
|
+
MIT License
|
|
9
|
+
|
|
10
|
+
Copyright (c) 2026 DeepSeek
|
|
11
|
+
|
|
12
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
13
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
14
|
+
in the Software without restriction, including without limitation the rights
|
|
15
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
16
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
17
|
+
furnished to do so, subject to the following conditions:
|
|
18
|
+
|
|
19
|
+
The above copyright notice and this permission notice shall be included in all
|
|
20
|
+
copies or substantial portions of the Software.
|
|
21
|
+
|
|
22
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
23
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
24
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
25
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
26
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
27
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
28
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Keep oversized dict-shaped tool results out of model context."""
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"""Plugin: spill oversized dict-shaped tool results to private files.
|
|
2
|
+
|
|
3
|
+
Ported from DeepSeek Harness's MIT-licensed spill design. See
|
|
4
|
+
``LICENSE.deepseek`` in this package for its copyright and license notice.
|
|
5
|
+
|
|
6
|
+
The post-tool hook receives the same dict reference that Code Puppy later
|
|
7
|
+
serializes for the model, so this plugin can replace top-level string fields
|
|
8
|
+
in place. Non-dict results (notably plain strings) cannot be replaced through
|
|
9
|
+
this hook and are deliberately left untouched.
|
|
10
|
+
|
|
11
|
+
When the combined UTF-8 size of top-level string values exceeds the configured
|
|
12
|
+
cap, fields are considered largest-first. Their full text is saved verbatim,
|
|
13
|
+
then replaced by a bounded byte-sliced head/tail preview and a retrieval notice.
|
|
14
|
+
``read_file`` is skipped by default to avoid a read -> spill -> read loop.
|
|
15
|
+
Every failure is best-effort: the successful tool result stays available inline.
|
|
16
|
+
|
|
17
|
+
Config (puppy.cfg, also settable with ``/set``):
|
|
18
|
+
spill_max_inline_bytes = 32768 # 0 or negative disables
|
|
19
|
+
spill_preview_bytes = 4096 # source bytes retained per field
|
|
20
|
+
spill_root = # unset uses a private OS temp directory
|
|
21
|
+
spill_skip_tools = read_file # comma-separated tool names
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
import logging
|
|
27
|
+
import math
|
|
28
|
+
from pathlib import Path
|
|
29
|
+
from typing import Any
|
|
30
|
+
|
|
31
|
+
from code_puppy.callbacks import register_callback
|
|
32
|
+
|
|
33
|
+
from . import store
|
|
34
|
+
|
|
35
|
+
logger = logging.getLogger(__name__)
|
|
36
|
+
|
|
37
|
+
MAX_INLINE_KEY = "spill_max_inline_bytes"
|
|
38
|
+
PREVIEW_KEY = "spill_preview_bytes"
|
|
39
|
+
ROOT_KEY = "spill_root"
|
|
40
|
+
SKIP_TOOLS_KEY = "spill_skip_tools"
|
|
41
|
+
DEFAULT_MAX_INLINE_BYTES = 32768
|
|
42
|
+
DEFAULT_PREVIEW_BYTES = 4096
|
|
43
|
+
DEFAULT_SKIP_TOOLS = frozenset({"read_file"})
|
|
44
|
+
OMISSION_MARKER = "\n\n[...]\n\n"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _get_value(key: str) -> Any:
|
|
48
|
+
try:
|
|
49
|
+
from code_puppy.config import get_value
|
|
50
|
+
|
|
51
|
+
return get_value(key)
|
|
52
|
+
except Exception:
|
|
53
|
+
return None
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _get_int(key: str, default: int) -> int:
|
|
57
|
+
raw = _get_value(key)
|
|
58
|
+
if raw is None or str(raw).strip() == "":
|
|
59
|
+
return default
|
|
60
|
+
try:
|
|
61
|
+
return int(str(raw).strip())
|
|
62
|
+
except (TypeError, ValueError):
|
|
63
|
+
logger.warning("Invalid %s value; falling back to %d", key, default)
|
|
64
|
+
return default
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _get_root() -> str | None:
|
|
68
|
+
raw = _get_value(ROOT_KEY)
|
|
69
|
+
if raw is None or not str(raw).strip():
|
|
70
|
+
return None
|
|
71
|
+
return str(raw).strip()
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _get_skip_tools() -> frozenset[str]:
|
|
75
|
+
raw = _get_value(SKIP_TOOLS_KEY)
|
|
76
|
+
if raw is None or not str(raw).strip():
|
|
77
|
+
return DEFAULT_SKIP_TOOLS
|
|
78
|
+
return frozenset(name.strip() for name in str(raw).split(",") if name.strip())
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _byte_size(text: str) -> int:
|
|
82
|
+
return len(text.encode("utf-8"))
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _preview(text: str, budget: int) -> tuple[str, int]:
|
|
86
|
+
"""Return a byte-sliced preview and the count of omitted source bytes."""
|
|
87
|
+
encoded = text.encode("utf-8")
|
|
88
|
+
kept_bytes = min(max(0, budget), len(encoded))
|
|
89
|
+
if kept_bytes == 0:
|
|
90
|
+
return "", len(encoded)
|
|
91
|
+
head_bytes = math.ceil(kept_bytes / 2)
|
|
92
|
+
tail_bytes = math.floor(kept_bytes / 2)
|
|
93
|
+
head = encoded[:head_bytes].decode("utf-8", errors="replace")
|
|
94
|
+
tail = encoded[-tail_bytes:].decode("utf-8", errors="replace") if tail_bytes else ""
|
|
95
|
+
return f"{head}{OMISSION_MARKER}{tail}", len(encoded) - kept_bytes
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _notice(omitted: int, path: Path) -> str:
|
|
99
|
+
return (
|
|
100
|
+
f"(~{omitted} bytes omitted. Full output stored at: {path}. "
|
|
101
|
+
"Retrieve it with read_file using start_line/num_lines, or grep this path.)"
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def _build_replacement(
|
|
106
|
+
text: str,
|
|
107
|
+
path: Path,
|
|
108
|
+
preview_bytes: int,
|
|
109
|
+
max_bytes: int | None,
|
|
110
|
+
) -> str | None:
|
|
111
|
+
"""Build a strictly smaller replacement, optionally fitting ``max_bytes``."""
|
|
112
|
+
original_bytes = _byte_size(text)
|
|
113
|
+
budget = min(max(0, preview_bytes), original_bytes)
|
|
114
|
+
limit = original_bytes - 1
|
|
115
|
+
if max_bytes is not None:
|
|
116
|
+
limit = min(limit, max_bytes)
|
|
117
|
+
if limit < 0:
|
|
118
|
+
return None
|
|
119
|
+
|
|
120
|
+
while True:
|
|
121
|
+
preview, omitted = _preview(text, budget)
|
|
122
|
+
notice = _notice(omitted, path)
|
|
123
|
+
replacement = f"{preview}\n\n{notice}" if preview else notice
|
|
124
|
+
replacement_bytes = _byte_size(replacement)
|
|
125
|
+
if replacement_bytes <= limit:
|
|
126
|
+
return replacement
|
|
127
|
+
if budget == 0:
|
|
128
|
+
return None
|
|
129
|
+
budget = max(0, budget - max(1, replacement_bytes - limit))
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def _spill_result(tool_name: str, result: dict[Any, Any]) -> None:
|
|
133
|
+
cap = _get_int(MAX_INLINE_KEY, DEFAULT_MAX_INLINE_BYTES)
|
|
134
|
+
if cap <= 0 or tool_name in _get_skip_tools():
|
|
135
|
+
return
|
|
136
|
+
preview_bytes = _get_int(PREVIEW_KEY, DEFAULT_PREVIEW_BYTES)
|
|
137
|
+
if preview_bytes < 0:
|
|
138
|
+
logger.warning(
|
|
139
|
+
"Invalid %s value; falling back to %d",
|
|
140
|
+
PREVIEW_KEY,
|
|
141
|
+
DEFAULT_PREVIEW_BYTES,
|
|
142
|
+
)
|
|
143
|
+
preview_bytes = DEFAULT_PREVIEW_BYTES
|
|
144
|
+
|
|
145
|
+
fields = [
|
|
146
|
+
(key, value, _byte_size(value))
|
|
147
|
+
for key, value in result.items()
|
|
148
|
+
if isinstance(value, str)
|
|
149
|
+
]
|
|
150
|
+
total = sum(size for _, _, size in fields)
|
|
151
|
+
if total <= cap:
|
|
152
|
+
return
|
|
153
|
+
|
|
154
|
+
replacements: dict[Any, str] = {}
|
|
155
|
+
for key, original, original_bytes in sorted(
|
|
156
|
+
fields, key=lambda item: item[2], reverse=True
|
|
157
|
+
):
|
|
158
|
+
if total <= cap:
|
|
159
|
+
break
|
|
160
|
+
try:
|
|
161
|
+
path = store.save_text(original, tool_name, _get_root())
|
|
162
|
+
except Exception:
|
|
163
|
+
logger.warning(
|
|
164
|
+
"Failed to spill %s result field %r; keeping it inline",
|
|
165
|
+
tool_name,
|
|
166
|
+
key,
|
|
167
|
+
exc_info=True,
|
|
168
|
+
)
|
|
169
|
+
continue
|
|
170
|
+
|
|
171
|
+
other_bytes = total - original_bytes
|
|
172
|
+
field_limit = cap - other_bytes if other_bytes < cap else None
|
|
173
|
+
replacement = _build_replacement(
|
|
174
|
+
original,
|
|
175
|
+
path,
|
|
176
|
+
preview_bytes,
|
|
177
|
+
field_limit,
|
|
178
|
+
)
|
|
179
|
+
if replacement is None:
|
|
180
|
+
logger.warning(
|
|
181
|
+
"Spill notice for %s result field %r cannot fit; keeping it inline",
|
|
182
|
+
tool_name,
|
|
183
|
+
key,
|
|
184
|
+
)
|
|
185
|
+
continue
|
|
186
|
+
replacements[key] = replacement
|
|
187
|
+
total = other_bytes + _byte_size(replacement)
|
|
188
|
+
|
|
189
|
+
# Commit atomically. A partial preview set that still exceeds the cap is
|
|
190
|
+
# neither bounded nor graceful; keep every original inline in that case.
|
|
191
|
+
if total <= cap:
|
|
192
|
+
result.update(replacements)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def _on_post_tool_call(
|
|
196
|
+
tool_name: str,
|
|
197
|
+
tool_args: dict,
|
|
198
|
+
result: Any,
|
|
199
|
+
duration_ms: float,
|
|
200
|
+
context: Any = None,
|
|
201
|
+
) -> None:
|
|
202
|
+
"""Spill oversized top-level string fields without breaking tool calls."""
|
|
203
|
+
_ = tool_args, duration_ms, context
|
|
204
|
+
try:
|
|
205
|
+
if not isinstance(result, dict) or set(result) == {"error"}:
|
|
206
|
+
return
|
|
207
|
+
_spill_result(tool_name, result)
|
|
208
|
+
except Exception:
|
|
209
|
+
logger.debug(
|
|
210
|
+
"spill plugin failed; keeping the tool result inline", exc_info=True
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def _reset_state() -> None:
|
|
215
|
+
"""Reset lazy process storage state for tests and defensive re-init."""
|
|
216
|
+
store._reset_state()
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
register_callback("post_tool_call", _on_post_tool_call)
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
__all__ = [
|
|
223
|
+
"DEFAULT_MAX_INLINE_BYTES",
|
|
224
|
+
"DEFAULT_PREVIEW_BYTES",
|
|
225
|
+
"DEFAULT_SKIP_TOOLS",
|
|
226
|
+
"MAX_INLINE_KEY",
|
|
227
|
+
"PREVIEW_KEY",
|
|
228
|
+
"ROOT_KEY",
|
|
229
|
+
"SKIP_TOOLS_KEY",
|
|
230
|
+
"_build_replacement",
|
|
231
|
+
"_get_int",
|
|
232
|
+
"_on_post_tool_call",
|
|
233
|
+
"_reset_state",
|
|
234
|
+
"_spill_result",
|
|
235
|
+
]
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"""Private local storage for spilled tool-result text."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
import os
|
|
7
|
+
import re
|
|
8
|
+
import secrets
|
|
9
|
+
import tempfile
|
|
10
|
+
import uuid
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
_default_root: Path | None = None
|
|
14
|
+
_process_session_id: str | None = None
|
|
15
|
+
_UNSAFE_NAME = re.compile(r"[^A-Za-z0-9._-]+")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def private_root(configured_root: str | None = None) -> Path:
|
|
19
|
+
"""Return the configured root or a lazy private per-process temp root."""
|
|
20
|
+
global _default_root
|
|
21
|
+
if configured_root:
|
|
22
|
+
root = Path(configured_root).expanduser().resolve()
|
|
23
|
+
root.mkdir(mode=0o700, parents=True, exist_ok=True)
|
|
24
|
+
return root
|
|
25
|
+
if _default_root is None:
|
|
26
|
+
_default_root = Path(tempfile.mkdtemp(prefix="code-puppy-spill-"))
|
|
27
|
+
return _default_root
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def current_session_id() -> str:
|
|
31
|
+
"""Return the active agent session id, with a stable process fallback."""
|
|
32
|
+
global _process_session_id
|
|
33
|
+
try:
|
|
34
|
+
from code_puppy.messaging import get_session_context
|
|
35
|
+
|
|
36
|
+
session_id = get_session_context()
|
|
37
|
+
if session_id:
|
|
38
|
+
return str(session_id)
|
|
39
|
+
except Exception:
|
|
40
|
+
pass
|
|
41
|
+
if _process_session_id is None:
|
|
42
|
+
_process_session_id = uuid.uuid4().hex
|
|
43
|
+
return _process_session_id
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def session_dir(root: Path, session_id: str) -> Path:
|
|
47
|
+
"""Create and return a private, hashed session directory under ``root``."""
|
|
48
|
+
digest = hashlib.sha256(session_id.encode("utf-8")).hexdigest()[:12]
|
|
49
|
+
directory = root / f"session-{digest}"
|
|
50
|
+
directory.mkdir(mode=0o700, parents=True, exist_ok=True)
|
|
51
|
+
os.chmod(directory, 0o700)
|
|
52
|
+
return directory
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def safe_filename(tool_name: str) -> str:
|
|
56
|
+
"""Convert an untrusted tool name into one harmless filename segment."""
|
|
57
|
+
raw = f"{tool_name}.txt".replace("\x00", "_")
|
|
58
|
+
safe = _UNSAFE_NAME.sub("_", raw.replace("/", "_").replace("\\", "_"))
|
|
59
|
+
while ".." in safe:
|
|
60
|
+
safe = safe.replace("..", "_")
|
|
61
|
+
safe = safe.strip(".")
|
|
62
|
+
return safe or "tool.txt"
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def save_text(content: str, tool_name: str, configured_root: str | None = None) -> Path:
|
|
66
|
+
"""Persist ``content`` verbatim with exclusive owner-only creation."""
|
|
67
|
+
root = private_root(configured_root)
|
|
68
|
+
directory = session_dir(root, current_session_id())
|
|
69
|
+
path = directory / f"{secrets.token_hex(6)}-{safe_filename(tool_name)}"
|
|
70
|
+
flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL
|
|
71
|
+
descriptor = os.open(path, flags, 0o600)
|
|
72
|
+
try:
|
|
73
|
+
with os.fdopen(descriptor, "w", encoding="utf-8", newline="") as spill_file:
|
|
74
|
+
descriptor = -1
|
|
75
|
+
spill_file.write(content)
|
|
76
|
+
os.chmod(path, 0o600)
|
|
77
|
+
finally:
|
|
78
|
+
if descriptor >= 0:
|
|
79
|
+
os.close(descriptor)
|
|
80
|
+
return path
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _reset_state() -> None:
|
|
84
|
+
"""Forget lazy process state; test cleanup remains the caller's job."""
|
|
85
|
+
global _default_root, _process_session_id
|
|
86
|
+
_default_root = None
|
|
87
|
+
_process_session_id = None
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
__all__ = [
|
|
91
|
+
"_reset_state",
|
|
92
|
+
"current_session_id",
|
|
93
|
+
"private_root",
|
|
94
|
+
"safe_filename",
|
|
95
|
+
"save_text",
|
|
96
|
+
"session_dir",
|
|
97
|
+
]
|
|
@@ -4,10 +4,13 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "code-puppy-core-plugins"
|
|
7
|
-
version = "0.0.
|
|
7
|
+
version = "0.0.5"
|
|
8
8
|
description = "Official plugin bundle for Code Puppy"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11,<3.15"
|
|
11
|
+
dependencies = [
|
|
12
|
+
"httpx>=0.24.1,<1",
|
|
13
|
+
]
|
|
11
14
|
license = {text = "MIT"}
|
|
12
15
|
authors = [{name = "Michael Pfaffenberger"}]
|
|
13
16
|
classifiers = [
|
|
@@ -66,6 +69,7 @@ puppy_spinner = "code_puppy_core_plugins.puppy_spinner.register_callbacks"
|
|
|
66
69
|
quick_resume = "code_puppy_core_plugins.quick_resume.register_callbacks"
|
|
67
70
|
review_pr = "code_puppy_core_plugins.review_pr.register_callbacks"
|
|
68
71
|
shell_safety = "code_puppy_core_plugins.shell_safety.register_callbacks"
|
|
72
|
+
spill = "code_puppy_core_plugins.spill.register_callbacks"
|
|
69
73
|
stack_dump = "code_puppy_core_plugins.stack_dump.register_callbacks"
|
|
70
74
|
statusline = "code_puppy_core_plugins.statusline.register_callbacks"
|
|
71
75
|
steer_queue = "code_puppy_core_plugins.steer_queue.register_callbacks"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/agent.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
|
{code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/state.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
|