code-puppy-core-plugins 0.0.70__tar.gz → 0.0.72__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.70 → code_puppy_core_plugins-0.0.72}/PKG-INFO +7 -1
- code_puppy_core_plugins-0.0.72/code_puppy_core_plugins/attachment_references/__init__.py +1 -0
- code_puppy_core_plugins-0.0.72/code_puppy_core_plugins/attachment_references/register_callbacks.py +22 -0
- code_puppy_core_plugins-0.0.72/code_puppy_core_plugins/attachment_references/tool.py +137 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/jev_grep/chunks.py +14 -107
- code_puppy_core_plugins-0.0.72/code_puppy_core_plugins/jev_grep/structure.py +168 -0
- code_puppy_core_plugins-0.0.72/code_puppy_core_plugins/jev_grep/treesitter.py +249 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/universal_constructor/registry.py +100 -69
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/pyproject.toml +10 -1
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/.gitignore +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/LICENSE +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/README.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/THIRD_PARTY_NOTICES.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/README.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/agent.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/bridge.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/capabilities.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/commands.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/content.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/io_delegation.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/mcp_config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/permissions.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/persistence.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/replay.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/session.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/session_config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/state.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_creator_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_creator_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_creator_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/discovery.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/enabled_skills.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/metadata.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/prompt_builder.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/provider.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/skill_commands.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/skills_menu.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/auto_continue/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/auto_continue/classifier.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/auto_continue/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/aws_bedrock/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/aws_bedrock/config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/aws_bedrock/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/aws_bedrock/utils.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/azure_foundry/README.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/azure_foundry/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/azure_foundry/config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/azure_foundry/discovery.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/azure_foundry/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/azure_foundry/token.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/azure_foundry/utils.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/background_agents/README.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/background_agents/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/background_agents/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/btw/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/btw/inline_view.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/btw/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/btw/side_query.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/image_generation.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/image_tool.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/model_catalog.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/usage.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_hooks/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_hooks/config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_hooks/trust.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/README.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/SETUP.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/fast_mode.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/model_filter.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/model_provider.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/runtime_credentials.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/token_store.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/code_puppy_agent/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/code_puppy_agent/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/completion_notification/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/completion_notification/config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/completion_notification/locales/en-US.json +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/completion_notification/locales/es.json +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/completion_notification/locales/fr-CA.json +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/completion_notification/notifier.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/completion_notification/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/NativeCapture.swift +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/README.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/accessibility.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/activation.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/backend.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/backend_types.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/capture.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/commands.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/geometry.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/inline_image.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/keycodes.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/policy.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/safety.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/settle.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/state.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/tools.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/context_indicator/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/context_indicator/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/context_indicator/usage.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/copilot_auth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/copilot_auth/config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/copilot_auth/reasoning_client.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/copilot_auth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/copilot_auth/responses_stream.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/copilot_auth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/customizable_commands/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/cancel.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/commands.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/runtime.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/wrapper.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/destructive_command_guard/AGENTS.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/destructive_command_guard/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/destructive_command_guard/detector.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/emoji_filter/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/emoji_filter/config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/emoji_filter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/emoji_filter/stripper.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/example_custom_command/README.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/example_custom_command/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/file_permission_handler/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/file_permission_handler/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/installer.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/force_push_guard/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/force_push_guard/detector.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/force_push_guard/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/fork/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/fork/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/frontend_emitter/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/frontend_emitter/emitter.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/frontend_emitter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/frontend_emitter/session_context.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/grok_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/grok_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/grok_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/grok_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/grok_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/herdr/README.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/herdr/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/herdr/client.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/herdr/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/herdr/reporter.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/herdr/restore.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/herdr/smoke.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/herdr/sources.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/hook_creator/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/hook_creator/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/hook_manager/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/hook_manager/config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/hook_manager/hooks_menu.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/hook_manager/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/hook_manager/trust_handler.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/jev_grep/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/jev_grep/config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/jev_grep/judge.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/jev_grep/locales/en-US.json +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/jev_grep/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/jev_grep/retrieve.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/jev_grep/search.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/jev_grep/tool.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/logfire_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/logfire_oauth/oauth.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/logfire_oauth/query_tool.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/logfire_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/logfire_sessions/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/logfire_sessions/mirror.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/logfire_sessions/query.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/logfire_sessions/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/logfire_sessions/sync.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/mcp_binding_prompt/README.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/mcp_binding_prompt/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/mcp_binding_prompt/custom_install.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/mcp_binding_prompt/http_form.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/mcp_binding_prompt/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/meta_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/meta_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/meta_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/meta_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/meta_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/namespace_skill_search/README.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/namespace_skill_search/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/namespace_skill_search/namespaces.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/namespace_skill_search/search_tool.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/no_tools/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/no_tools/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/oauth_pasteback.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/oauth_puppy_html.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/obsidian_agent/README.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/obsidian_agent/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/obsidian_agent/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/ollama/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/ollama/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/ollama_setup/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/ollama_setup/completer.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/ollama_setup/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/openrouter_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/openrouter_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/openrouter_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/openrouter_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/openrouter_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/plugin_list/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/plugin_list/plugin_contributions.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/plugin_list/plugin_meta.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/plugin_list/plugin_text_utils.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/plugin_list/plugins_menu.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/plugin_list/plugins_menu_render.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/plugin_list/project_trust_flow.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/plugin_list/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/pop_command/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/pop_command/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/profiles/README.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/profiles/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/profiles/config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/profiles/locales/en-US.json +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/profiles/menu.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/profiles/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/prompt_newline/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/prompt_newline/config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/prompt_newline/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/prune/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/prune/prune_menu.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/prune/prune_model.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/prune/prune_render.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/prune/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/README.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/commands.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/kennel.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/packer.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/recorder.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/retriever.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/schema.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/state.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/tools.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/wings.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_spinner/README.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_spinner/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_spinner/builtin_frames.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_spinner/commands.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_spinner/picker.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_spinner/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_spinner/spinners.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/qa_kitten_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/qa_kitten_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/qa_kitten_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/quick_resume/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/quick_resume/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/review_pr/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/review_pr/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/session_namer/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/session_namer/namer.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/session_namer/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/spill/LICENSE.deepseek +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/spill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/spill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/spill/store.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/stack_dump/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/stack_dump/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/statusline/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/statusline/config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/statusline/payload.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/statusline/prompt_patch.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/statusline/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/statusline/runner.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/statusline/statusline_command.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/steer_queue/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/steer_queue/queue_menu.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/steer_queue/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/subagent_panel/README.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/subagent_panel/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/subagent_panel/coalesce_patch.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/subagent_panel/panel_render.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/subagent_panel/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/subagent_panel/resume_repaint.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/subagent_panel/state.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/switch_agent_resume/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/termflow_tui.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/README.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/bundled_palettes.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/content_styles.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/osc_palette.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/picker.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/prompt_toolkit_theme.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/rich_themes.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/themes.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/timestamp_heartbeat/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/token_ratio_learner/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/token_ratio_learner/ratios.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/universal_constructor/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/universal_constructor/models.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/universal_constructor/provider.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/universal_constructor/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/universal_constructor/sandbox.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/web_retriever_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/web_retriever_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/web_retriever_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/wiggum/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/wiggum/goal_runs.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/wiggum/judge.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/wiggum/judge_config.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/wiggum/judges_menu.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/wiggum/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/wiggum/state.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/yolo_cli/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/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.72
|
|
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
|
|
@@ -18,6 +18,12 @@ Requires-Python: <3.15,>=3.11
|
|
|
18
18
|
Requires-Dist: httpx2>=2.7
|
|
19
19
|
Requires-Dist: httpx<1,>=0.24.1
|
|
20
20
|
Requires-Dist: pydantic-ai-slim[anthropic,mcp,openai,typesafe]<3,>=2.51.0
|
|
21
|
+
Requires-Dist: tree-sitter-go>=0.25.0
|
|
22
|
+
Requires-Dist: tree-sitter-java>=0.23.5
|
|
23
|
+
Requires-Dist: tree-sitter-javascript>=0.25.0
|
|
24
|
+
Requires-Dist: tree-sitter-rust>=0.24.2
|
|
25
|
+
Requires-Dist: tree-sitter-typescript>=0.23.2
|
|
26
|
+
Requires-Dist: tree-sitter<0.26,>=0.25.2
|
|
21
27
|
Description-Content-Type: text/markdown
|
|
22
28
|
|
|
23
29
|
# Code Puppy Core Plugins
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Bridge user-attached images into on-disk reference files."""
|
code_puppy_core_plugins-0.0.72/code_puppy_core_plugins/attachment_references/register_callbacks.py
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""Register the attachment-to-reference bridge tool with Code Puppy."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from code_puppy.callbacks import register_callback
|
|
8
|
+
|
|
9
|
+
from .tool import TOOL_NAME, register_tools_callback
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _register_tools() -> list[dict[str, Any]]:
|
|
13
|
+
return register_tools_callback()
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _advertise_tool(agent_name: str | None = None) -> list[str]:
|
|
17
|
+
del agent_name
|
|
18
|
+
return [TOOL_NAME]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
register_callback("register_tools", _register_tools)
|
|
22
|
+
register_callback("register_agent_tools", _advertise_tool)
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"""Materialize the latest user-attached images into reference files.
|
|
2
|
+
|
|
3
|
+
Pasted or dragged images arrive as ``BinaryContent`` stapled onto the user
|
|
4
|
+
message; they never touch the filesystem. Tools such as ``codex_imagegen``
|
|
5
|
+
condition on ``reference_images`` *paths*, so there is otherwise no way to point
|
|
6
|
+
image generation at something the user just pasted. This tool bridges that gap
|
|
7
|
+
by writing the latest turn's image attachments to disk and returning their
|
|
8
|
+
paths -- nothing more (SRP/YAGNI).
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import asyncio
|
|
14
|
+
import mimetypes
|
|
15
|
+
import os
|
|
16
|
+
import uuid
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Any, List, Sequence
|
|
19
|
+
|
|
20
|
+
from pydantic_ai import BinaryContent, RunContext
|
|
21
|
+
from pydantic_ai.messages import UserPromptPart
|
|
22
|
+
|
|
23
|
+
from code_puppy import config
|
|
24
|
+
|
|
25
|
+
TOOL_NAME = "save_attachments_as_references"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _is_image(item: Any) -> bool:
|
|
29
|
+
return isinstance(item, BinaryContent) and str(
|
|
30
|
+
getattr(item, "media_type", "") or ""
|
|
31
|
+
).startswith("image/")
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _extract_latest_user_images(messages: Sequence[Any] | None) -> List[BinaryContent]:
|
|
35
|
+
"""Return image attachments from the most recent user message only.
|
|
36
|
+
|
|
37
|
+
Walks history backwards to the last request carrying a ``UserPromptPart``
|
|
38
|
+
(an actual user turn, not a tool return) and collects its image parts in
|
|
39
|
+
order. Returns an empty list when the latest user turn has no images.
|
|
40
|
+
"""
|
|
41
|
+
if not messages:
|
|
42
|
+
return []
|
|
43
|
+
for message in reversed(list(messages)):
|
|
44
|
+
parts = getattr(message, "parts", None)
|
|
45
|
+
if not parts:
|
|
46
|
+
continue
|
|
47
|
+
user_parts = [part for part in parts if isinstance(part, UserPromptPart)]
|
|
48
|
+
if not user_parts:
|
|
49
|
+
continue
|
|
50
|
+
images: List[BinaryContent] = []
|
|
51
|
+
for part in user_parts:
|
|
52
|
+
content = part.content
|
|
53
|
+
if isinstance(content, str):
|
|
54
|
+
continue
|
|
55
|
+
for item in content:
|
|
56
|
+
if _is_image(item):
|
|
57
|
+
images.append(item)
|
|
58
|
+
return images
|
|
59
|
+
return []
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _extension_for(media_type: str | None) -> str:
|
|
63
|
+
guessed = mimetypes.guess_extension(media_type or "") if media_type else None
|
|
64
|
+
if guessed in {".jpe", ".jpeg"}:
|
|
65
|
+
return ".jpg"
|
|
66
|
+
return guessed or ".png"
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _save_reference_images(images: Sequence[BinaryContent]) -> List[Path]:
|
|
70
|
+
"""Write each image to the Code Puppy data dir and return the paths."""
|
|
71
|
+
if not images:
|
|
72
|
+
return []
|
|
73
|
+
output_dir = Path(config.DATA_DIR) / "attachment_references"
|
|
74
|
+
output_dir.mkdir(parents=True, exist_ok=True, mode=0o700)
|
|
75
|
+
saved: List[Path] = []
|
|
76
|
+
for image in images:
|
|
77
|
+
extension = _extension_for(getattr(image, "media_type", None))
|
|
78
|
+
output_path = output_dir / f"attachment-{uuid.uuid4().hex}{extension}"
|
|
79
|
+
temporary_path = output_dir / f"{output_path.name}.tmp"
|
|
80
|
+
try:
|
|
81
|
+
temporary_path.write_bytes(image.data)
|
|
82
|
+
os.chmod(temporary_path, 0o600)
|
|
83
|
+
temporary_path.replace(output_path)
|
|
84
|
+
except OSError:
|
|
85
|
+
temporary_path.unlink(missing_ok=True)
|
|
86
|
+
raise
|
|
87
|
+
saved.append(output_path)
|
|
88
|
+
return saved
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def register_save_attachments_as_references(agent: Any) -> None:
|
|
92
|
+
"""Register the attachment-to-reference bridge on a pydantic-ai agent."""
|
|
93
|
+
|
|
94
|
+
@agent.tool
|
|
95
|
+
async def save_attachments_as_references(context: RunContext) -> dict[str, Any]:
|
|
96
|
+
"""Save images the user attached in their latest message to disk.
|
|
97
|
+
|
|
98
|
+
Use this to turn a pasted or dragged image into a real file path so
|
|
99
|
+
other tools can act on it. In particular, pass the returned paths to
|
|
100
|
+
``codex_imagegen`` as ``reference_images`` to generate a new image that
|
|
101
|
+
preserves the subject or style of what the user just shared.
|
|
102
|
+
|
|
103
|
+
Only images from the most recent user message are saved. Returns the
|
|
104
|
+
saved file paths; the paths are stable on disk under the Code Puppy
|
|
105
|
+
data directory.
|
|
106
|
+
"""
|
|
107
|
+
images = _extract_latest_user_images(getattr(context, "messages", None))
|
|
108
|
+
if not images:
|
|
109
|
+
return {
|
|
110
|
+
"success": True,
|
|
111
|
+
"paths": [],
|
|
112
|
+
"count": 0,
|
|
113
|
+
"message": (
|
|
114
|
+
"No image attachments were found in the latest user message."
|
|
115
|
+
),
|
|
116
|
+
}
|
|
117
|
+
try:
|
|
118
|
+
paths = await asyncio.to_thread(_save_reference_images, images)
|
|
119
|
+
except OSError as exc:
|
|
120
|
+
return {
|
|
121
|
+
"success": False,
|
|
122
|
+
"error": f"Could not save reference images: {exc}",
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
"success": True,
|
|
126
|
+
"paths": [str(path) for path in paths],
|
|
127
|
+
"count": len(paths),
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def register_tools_callback() -> list[dict[str, Any]]:
|
|
132
|
+
return [
|
|
133
|
+
{
|
|
134
|
+
"name": TOOL_NAME,
|
|
135
|
+
"register_func": register_save_attachments_as_references,
|
|
136
|
+
}
|
|
137
|
+
]
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"""Discovery and chunking: turn a directory into judgeable source snippets.
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
Source files are split along their syntax tree (see ``structure.py``):
|
|
4
|
+
functions and methods stay whole, long declarations split into the blocks
|
|
5
|
+
inside them. Python uses the stdlib ``ast``; JavaScript/TypeScript, Go, Rust
|
|
6
|
+
and Java use tree-sitter (``treesitter.py``). Everything else, and any file
|
|
7
|
+
that does not parse, falls back to overlapping line windows. Line coverage
|
|
8
|
+
is exact: every non-blank line lands in at least one snippet.
|
|
8
9
|
"""
|
|
9
10
|
|
|
10
11
|
from __future__ import annotations
|
|
11
12
|
|
|
12
|
-
import ast
|
|
13
13
|
import os
|
|
14
14
|
import subprocess
|
|
15
15
|
from collections import Counter
|
|
@@ -17,6 +17,9 @@ from dataclasses import dataclass, field
|
|
|
17
17
|
|
|
18
18
|
from code_puppy.tools.ripgrep import find_ripgrep
|
|
19
19
|
|
|
20
|
+
from .structure import Range, python_ranges
|
|
21
|
+
from .treesitter import treesitter_ranges
|
|
22
|
+
|
|
20
23
|
# Discovery is bounded by files and bytes only. Snippet count is not capped:
|
|
21
24
|
# only the ranked shortlist is judged, and local BM25 over the ~24k snippets
|
|
22
25
|
# of a repo root takes well under a second.
|
|
@@ -25,7 +28,6 @@ MAX_FILE_BYTES = 1024 * 1024
|
|
|
25
28
|
MAX_TOTAL_BYTES = 32 * 1024 * 1024
|
|
26
29
|
MAX_CHUNK_CHARS = 12_000
|
|
27
30
|
WHOLE_DECLARATION_LINES = 160
|
|
28
|
-
SPLIT_LINES = 24
|
|
29
31
|
WINDOW, OVERLAP = 60, 10
|
|
30
32
|
|
|
31
33
|
|
|
@@ -50,13 +52,6 @@ class Discovery:
|
|
|
50
52
|
parsers: Counter = field(default_factory=Counter)
|
|
51
53
|
|
|
52
54
|
|
|
53
|
-
@dataclass
|
|
54
|
-
class _Range:
|
|
55
|
-
start: int
|
|
56
|
-
end: int
|
|
57
|
-
symbol: str | None
|
|
58
|
-
|
|
59
|
-
|
|
60
55
|
def windows(
|
|
61
56
|
lines: list[str],
|
|
62
57
|
path: str,
|
|
@@ -90,99 +85,8 @@ def windows(
|
|
|
90
85
|
return out
|
|
91
86
|
|
|
92
87
|
|
|
93
|
-
def _begin(node: ast.AST) -> int:
|
|
94
|
-
decorators = getattr(node, "decorator_list", [])
|
|
95
|
-
return min([node.lineno, *(d.lineno for d in decorators)])
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
def _partition(node: ast.AST, start: int, end: int, symbol, depth: int = 0):
|
|
99
|
-
"""Split a long body into its blocks, covering every line of [start, end]."""
|
|
100
|
-
body = getattr(node, "body", None)
|
|
101
|
-
if not isinstance(body, list) or end - start < SPLIT_LINES:
|
|
102
|
-
return None
|
|
103
|
-
stmts = [s for s in body if hasattr(s, "end_lineno")]
|
|
104
|
-
if not stmts:
|
|
105
|
-
return None
|
|
106
|
-
if len(stmts) == 1:
|
|
107
|
-
return (
|
|
108
|
-
_partition(stmts[0], start, end, symbol, depth + 1) if depth < 3 else None
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
out: list[_Range] = []
|
|
112
|
-
cursor = start
|
|
113
|
-
group: list[ast.stmt] = []
|
|
114
|
-
|
|
115
|
-
def flush(last: bool) -> None:
|
|
116
|
-
nonlocal cursor
|
|
117
|
-
if not group:
|
|
118
|
-
return
|
|
119
|
-
stop = end if last else min(end, group[-1].end_lineno)
|
|
120
|
-
if stop >= cursor:
|
|
121
|
-
inner = None
|
|
122
|
-
if len(group) == 1 and depth < 3:
|
|
123
|
-
inner = _partition(group[0], cursor, stop, symbol, depth + 1)
|
|
124
|
-
out.extend(inner or [_Range(cursor, stop, symbol)])
|
|
125
|
-
cursor = stop + 1
|
|
126
|
-
group.clear()
|
|
127
|
-
|
|
128
|
-
for stmt in stmts:
|
|
129
|
-
span = stmt.end_lineno - _begin(stmt) + 1
|
|
130
|
-
if group and (span >= 6 or stmt.end_lineno - cursor + 1 > 20):
|
|
131
|
-
flush(False)
|
|
132
|
-
group.append(stmt)
|
|
133
|
-
if span >= 6 and stmt is not stmts[-1]:
|
|
134
|
-
flush(False)
|
|
135
|
-
flush(True)
|
|
136
|
-
return out if len(out) > 1 else None
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
def _python_ranges(text: str) -> list[_Range]:
|
|
140
|
-
tree = ast.parse(text)
|
|
141
|
-
ranges: list[_Range] = []
|
|
142
|
-
|
|
143
|
-
def emit(node: ast.AST, start: int, symbol: str | None) -> None:
|
|
144
|
-
ranges.extend(
|
|
145
|
-
_partition(node, start, node.end_lineno, symbol)
|
|
146
|
-
or [_Range(start, node.end_lineno, symbol)]
|
|
147
|
-
)
|
|
148
|
-
|
|
149
|
-
for node in tree.body:
|
|
150
|
-
if isinstance(node, ast.ClassDef):
|
|
151
|
-
ranges.append(_Range(_begin(node), node.body[0].lineno - 1, node.name))
|
|
152
|
-
for member in node.body:
|
|
153
|
-
name = getattr(member, "name", "body")
|
|
154
|
-
emit(member, _begin(member), f"{node.name}.{name}")
|
|
155
|
-
else:
|
|
156
|
-
emit(node, _begin(node), getattr(node, "name", None))
|
|
157
|
-
return _merge_short_neighbours(ranges)
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
def _merge_short_neighbours(ranges: list[_Range]) -> list[_Range]:
|
|
161
|
-
"""Fold runs of imports/one-liners into one target (each costs a judgment)."""
|
|
162
|
-
|
|
163
|
-
def mergeable(r: _Range) -> bool:
|
|
164
|
-
return r.end - r.start <= 1 and "." not in (r.symbol or "")
|
|
165
|
-
|
|
166
|
-
merged: list[_Range] = []
|
|
167
|
-
for r in ranges:
|
|
168
|
-
last = merged[-1] if merged else None
|
|
169
|
-
if (
|
|
170
|
-
last
|
|
171
|
-
and mergeable(last)
|
|
172
|
-
and mergeable(r)
|
|
173
|
-
and r.start <= last.end + 1
|
|
174
|
-
and r.end - last.start < 12
|
|
175
|
-
and len(f"{last.symbol} {r.symbol}") < 60
|
|
176
|
-
):
|
|
177
|
-
names = dict.fromkeys(s for s in (last.symbol, r.symbol) if s)
|
|
178
|
-
last.end, last.symbol = r.end, ", ".join(names) or None
|
|
179
|
-
else:
|
|
180
|
-
merged.append(_Range(r.start, r.end, r.symbol))
|
|
181
|
-
return merged
|
|
182
|
-
|
|
183
|
-
|
|
184
88
|
def _chunks_from_ranges(
|
|
185
|
-
lines: list[str], path: str, ranges: list[
|
|
89
|
+
lines: list[str], path: str, ranges: list[Range]
|
|
186
90
|
) -> list[Chunk]:
|
|
187
91
|
out: list[Chunk] = []
|
|
188
92
|
next_line = 1
|
|
@@ -208,11 +112,14 @@ def source_chunks(text: str, path: str) -> tuple[list[Chunk], str]:
|
|
|
208
112
|
lines = text.splitlines()
|
|
209
113
|
if path.endswith(".py"):
|
|
210
114
|
try:
|
|
211
|
-
ranges =
|
|
115
|
+
ranges = python_ranges(text)
|
|
212
116
|
except (SyntaxError, ValueError, RecursionError):
|
|
213
117
|
ranges = []
|
|
214
118
|
if ranges:
|
|
215
119
|
return _chunks_from_ranges(lines, path, ranges), "python"
|
|
120
|
+
elif parsed := treesitter_ranges(text, path):
|
|
121
|
+
ranges, parser = parsed
|
|
122
|
+
return _chunks_from_ranges(lines, path, ranges), parser
|
|
216
123
|
return windows(lines, path), "overlapping-lines"
|
|
217
124
|
|
|
218
125
|
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"""Language-agnostic structural chunking: declarations -> line ranges.
|
|
2
|
+
|
|
3
|
+
One algorithm for every parser. A language plugs in by implementing
|
|
4
|
+
:class:`Syntax` (Python via stdlib ``ast`` here, others via tree-sitter in
|
|
5
|
+
``treesitter.py``):
|
|
6
|
+
|
|
7
|
+
* containers (classes, impls, modules) are split into a header plus one
|
|
8
|
+
range per member, named ``Container.member``;
|
|
9
|
+
* declarations of ``SPLIT_LINES`` or more are split into the blocks inside
|
|
10
|
+
them, so each range is one behaviour. Splits cover every line of the
|
|
11
|
+
original range, so coverage is unchanged;
|
|
12
|
+
* runs of short neighbours (imports, one-liners) merge into one range,
|
|
13
|
+
since each range costs a relevance judgment.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import ast
|
|
19
|
+
from collections.abc import Sequence
|
|
20
|
+
from dataclasses import dataclass
|
|
21
|
+
from typing import Any, Protocol
|
|
22
|
+
|
|
23
|
+
SPLIT_LINES = 24
|
|
24
|
+
_MAX_DEPTH = 3
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass
|
|
28
|
+
class Range:
|
|
29
|
+
start: int
|
|
30
|
+
end: int
|
|
31
|
+
symbol: str | None
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class Syntax(Protocol):
|
|
35
|
+
"""What the chunker needs to know about one language's tree."""
|
|
36
|
+
|
|
37
|
+
def span(self, node: Any) -> tuple[int, int]:
|
|
38
|
+
"""1-based first and last line, including decorators/wrappers."""
|
|
39
|
+
|
|
40
|
+
def symbol(self, node: Any) -> str | None:
|
|
41
|
+
"""The declared name, if any."""
|
|
42
|
+
|
|
43
|
+
def members(self, node: Any) -> Sequence[Any] | None:
|
|
44
|
+
"""Member declarations when ``node`` is a container, else None."""
|
|
45
|
+
|
|
46
|
+
def statements(self, node: Any) -> Sequence[Any] | None:
|
|
47
|
+
"""The statements of ``node``'s body, if it has one."""
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def partition(node: Any, start: int, end: int, symbol, syntax: Syntax, depth=0):
|
|
51
|
+
"""Split a long body into its blocks, covering every line of [start, end]."""
|
|
52
|
+
body = syntax.statements(node)
|
|
53
|
+
if not body or end - start < SPLIT_LINES:
|
|
54
|
+
return None
|
|
55
|
+
if len(body) == 1:
|
|
56
|
+
if depth >= _MAX_DEPTH:
|
|
57
|
+
return None
|
|
58
|
+
return partition(body[0], start, end, symbol, syntax, depth + 1)
|
|
59
|
+
|
|
60
|
+
out: list[Range] = []
|
|
61
|
+
cursor = start
|
|
62
|
+
group: list[Any] = []
|
|
63
|
+
|
|
64
|
+
def flush(last: bool) -> None:
|
|
65
|
+
nonlocal cursor
|
|
66
|
+
if not group:
|
|
67
|
+
return
|
|
68
|
+
stop = end if last else min(end, syntax.span(group[-1])[1])
|
|
69
|
+
if stop >= cursor:
|
|
70
|
+
inner = None
|
|
71
|
+
if len(group) == 1 and depth < _MAX_DEPTH:
|
|
72
|
+
inner = partition(group[0], cursor, stop, symbol, syntax, depth + 1)
|
|
73
|
+
out.extend(inner or [Range(cursor, stop, symbol)])
|
|
74
|
+
cursor = stop + 1
|
|
75
|
+
group.clear()
|
|
76
|
+
|
|
77
|
+
for index, stmt in enumerate(body):
|
|
78
|
+
first, last = syntax.span(stmt)
|
|
79
|
+
span = last - first + 1
|
|
80
|
+
if group and (span >= 6 or last - cursor + 1 > 20):
|
|
81
|
+
flush(False)
|
|
82
|
+
group.append(stmt)
|
|
83
|
+
if span >= 6 and index != len(body) - 1:
|
|
84
|
+
flush(False)
|
|
85
|
+
flush(True)
|
|
86
|
+
return out if len(out) > 1 else None
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def structure_ranges(nodes: Sequence[Any], syntax: Syntax) -> list[Range]:
|
|
90
|
+
"""Ranges for a file's top-level nodes."""
|
|
91
|
+
ranges: list[Range] = []
|
|
92
|
+
|
|
93
|
+
def walk(node: Any, prefix: str | None) -> None:
|
|
94
|
+
start, end = syntax.span(node)
|
|
95
|
+
name = syntax.symbol(node)
|
|
96
|
+
symbol = f"{prefix}.{name or 'body'}" if prefix else name
|
|
97
|
+
members = syntax.members(node)
|
|
98
|
+
if members:
|
|
99
|
+
header_end = syntax.span(members[0])[0] - 1
|
|
100
|
+
if header_end >= start:
|
|
101
|
+
ranges.append(Range(start, header_end, symbol))
|
|
102
|
+
for member in members:
|
|
103
|
+
walk(member, symbol or "body")
|
|
104
|
+
# The container's tail (a closing brace) joins its last member
|
|
105
|
+
# rather than becoming a judgment-costing snippet of its own.
|
|
106
|
+
if ranges and ranges[-1].end < end:
|
|
107
|
+
ranges[-1].end = end
|
|
108
|
+
return
|
|
109
|
+
ranges.extend(
|
|
110
|
+
partition(node, start, end, symbol, syntax) or [Range(start, end, symbol)]
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
for node in nodes:
|
|
114
|
+
walk(node, None)
|
|
115
|
+
return merge_short_neighbours(ranges)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def merge_short_neighbours(ranges: list[Range]) -> list[Range]:
|
|
119
|
+
"""Fold runs of imports/one-liners into one target (each costs a judgment).
|
|
120
|
+
|
|
121
|
+
Members (dotted symbols) never merge, so a method is never folded into its
|
|
122
|
+
container's header or a neighbour.
|
|
123
|
+
"""
|
|
124
|
+
|
|
125
|
+
def mergeable(r: Range) -> bool:
|
|
126
|
+
return r.end - r.start <= 1 and "." not in (r.symbol or "")
|
|
127
|
+
|
|
128
|
+
merged: list[Range] = []
|
|
129
|
+
for r in ranges:
|
|
130
|
+
last = merged[-1] if merged else None
|
|
131
|
+
if (
|
|
132
|
+
last
|
|
133
|
+
and mergeable(last)
|
|
134
|
+
and mergeable(r)
|
|
135
|
+
and r.start <= last.end + 1
|
|
136
|
+
and r.end - last.start < 12
|
|
137
|
+
and len(f"{last.symbol} {r.symbol}") < 60
|
|
138
|
+
):
|
|
139
|
+
names = dict.fromkeys(s for s in (last.symbol, r.symbol) if s)
|
|
140
|
+
last.end, last.symbol = r.end, ", ".join(names) or None
|
|
141
|
+
else:
|
|
142
|
+
merged.append(Range(r.start, r.end, r.symbol))
|
|
143
|
+
return merged
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
class PythonSyntax:
|
|
147
|
+
""":class:`Syntax` over the standard library ``ast``."""
|
|
148
|
+
|
|
149
|
+
def span(self, node: ast.AST) -> tuple[int, int]:
|
|
150
|
+
decorators = getattr(node, "decorator_list", [])
|
|
151
|
+
return min([node.lineno, *(d.lineno for d in decorators)]), node.end_lineno
|
|
152
|
+
|
|
153
|
+
def symbol(self, node: ast.AST) -> str | None:
|
|
154
|
+
return getattr(node, "name", None)
|
|
155
|
+
|
|
156
|
+
def members(self, node: ast.AST) -> Sequence[ast.AST] | None:
|
|
157
|
+
return node.body if isinstance(node, ast.ClassDef) else None
|
|
158
|
+
|
|
159
|
+
def statements(self, node: ast.AST) -> Sequence[ast.AST] | None:
|
|
160
|
+
body = getattr(node, "body", None)
|
|
161
|
+
if not isinstance(body, list):
|
|
162
|
+
return None
|
|
163
|
+
return [s for s in body if hasattr(s, "end_lineno")]
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def python_ranges(text: str) -> list[Range]:
|
|
167
|
+
"""Raises SyntaxError/ValueError/RecursionError on unparseable source."""
|
|
168
|
+
return structure_ranges(ast.parse(text).body, PythonSyntax())
|