code-puppy-core-plugins 0.0.69__tar.gz → 0.0.71__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.69 → code_puppy_core_plugins-0.0.71}/PKG-INFO +8 -1
- code_puppy_core_plugins-0.0.71/code_puppy_core_plugins/attachment_references/__init__.py +1 -0
- code_puppy_core_plugins-0.0.71/code_puppy_core_plugins/attachment_references/register_callbacks.py +22 -0
- code_puppy_core_plugins-0.0.71/code_puppy_core_plugins/attachment_references/tool.py +137 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/copilot_auth/reasoning_client.py +16 -16
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/copilot_auth/register_callbacks.py +6 -6
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/copilot_auth/responses_stream.py +8 -8
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/jev_grep/chunks.py +14 -107
- code_puppy_core_plugins-0.0.71/code_puppy_core_plugins/jev_grep/structure.py +168 -0
- code_puppy_core_plugins-0.0.71/code_puppy_core_plugins/jev_grep/treesitter.py +249 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/universal_constructor/registry.py +100 -69
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/pyproject.toml +11 -1
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/.gitignore +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/LICENSE +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/README.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/THIRD_PARTY_NOTICES.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/README.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/agent.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/bridge.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/capabilities.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/commands.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/content.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/io_delegation.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/mcp_config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/permissions.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/persistence.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/replay.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/session.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/session_config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/state.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_creator_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_creator_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_creator_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/discovery.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/enabled_skills.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/metadata.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/prompt_builder.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/provider.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/skill_commands.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/skills_menu.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/auto_continue/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/auto_continue/classifier.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/auto_continue/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/aws_bedrock/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/aws_bedrock/config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/aws_bedrock/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/aws_bedrock/utils.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/azure_foundry/README.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/azure_foundry/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/azure_foundry/config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/azure_foundry/discovery.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/azure_foundry/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/azure_foundry/token.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/azure_foundry/utils.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/background_agents/README.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/background_agents/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/background_agents/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/btw/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/btw/inline_view.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/btw/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/btw/side_query.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/image_generation.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/image_tool.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/model_catalog.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/usage.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_hooks/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_hooks/config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_hooks/trust.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/README.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/SETUP.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/fast_mode.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/model_filter.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/model_provider.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/runtime_credentials.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/token_store.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/code_puppy_agent/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/code_puppy_agent/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/completion_notification/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/completion_notification/config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/completion_notification/locales/en-US.json +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/completion_notification/locales/es.json +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/completion_notification/locales/fr-CA.json +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/completion_notification/notifier.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/completion_notification/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/NativeCapture.swift +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/README.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/accessibility.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/activation.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/backend.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/backend_types.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/capture.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/commands.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/geometry.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/inline_image.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/keycodes.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/policy.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/safety.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/settle.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/state.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/tools.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/context_indicator/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/context_indicator/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/context_indicator/usage.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/copilot_auth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/copilot_auth/config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/copilot_auth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/customizable_commands/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/cancel.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/commands.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/runtime.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/wrapper.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/destructive_command_guard/AGENTS.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/destructive_command_guard/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/destructive_command_guard/detector.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/emoji_filter/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/emoji_filter/config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/emoji_filter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/emoji_filter/stripper.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/example_custom_command/README.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/example_custom_command/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/file_permission_handler/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/file_permission_handler/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/installer.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/force_push_guard/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/force_push_guard/detector.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/force_push_guard/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/fork/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/fork/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/frontend_emitter/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/frontend_emitter/emitter.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/frontend_emitter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/frontend_emitter/session_context.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/grok_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/grok_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/grok_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/grok_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/grok_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/herdr/README.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/herdr/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/herdr/client.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/herdr/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/herdr/reporter.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/herdr/restore.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/herdr/smoke.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/herdr/sources.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/hook_creator/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/hook_creator/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/hook_manager/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/hook_manager/config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/hook_manager/hooks_menu.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/hook_manager/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/hook_manager/trust_handler.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/jev_grep/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/jev_grep/config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/jev_grep/judge.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/jev_grep/locales/en-US.json +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/jev_grep/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/jev_grep/retrieve.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/jev_grep/search.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/jev_grep/tool.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/logfire_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/logfire_oauth/oauth.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/logfire_oauth/query_tool.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/logfire_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/logfire_sessions/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/logfire_sessions/mirror.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/logfire_sessions/query.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/logfire_sessions/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/logfire_sessions/sync.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/mcp_binding_prompt/README.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/mcp_binding_prompt/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/mcp_binding_prompt/custom_install.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/mcp_binding_prompt/http_form.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/mcp_binding_prompt/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/meta_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/meta_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/meta_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/meta_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/meta_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/namespace_skill_search/README.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/namespace_skill_search/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/namespace_skill_search/namespaces.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/namespace_skill_search/search_tool.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/no_tools/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/no_tools/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/oauth_pasteback.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/oauth_puppy_html.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/obsidian_agent/README.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/obsidian_agent/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/obsidian_agent/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/ollama/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/ollama/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/ollama_setup/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/ollama_setup/completer.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/ollama_setup/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/openrouter_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/openrouter_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/openrouter_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/openrouter_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/openrouter_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/plugin_list/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/plugin_list/plugin_contributions.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/plugin_list/plugin_meta.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/plugin_list/plugin_text_utils.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/plugin_list/plugins_menu.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/plugin_list/plugins_menu_render.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/plugin_list/project_trust_flow.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/plugin_list/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/pop_command/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/pop_command/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/profiles/README.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/profiles/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/profiles/config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/profiles/locales/en-US.json +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/profiles/menu.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/profiles/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/prompt_newline/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/prompt_newline/config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/prompt_newline/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/prune/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/prune/prune_menu.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/prune/prune_model.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/prune/prune_render.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/prune/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/README.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/commands.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/kennel.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/packer.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/recorder.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/retriever.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/schema.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/state.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/tools.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/wings.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_spinner/README.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_spinner/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_spinner/builtin_frames.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_spinner/commands.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_spinner/picker.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_spinner/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_spinner/spinners.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/qa_kitten_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/qa_kitten_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/qa_kitten_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/quick_resume/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/quick_resume/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/review_pr/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/review_pr/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/session_namer/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/session_namer/namer.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/session_namer/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/spill/LICENSE.deepseek +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/spill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/spill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/spill/store.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/stack_dump/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/stack_dump/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/statusline/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/statusline/config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/statusline/payload.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/statusline/prompt_patch.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/statusline/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/statusline/runner.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/statusline/statusline_command.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/steer_queue/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/steer_queue/queue_menu.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/steer_queue/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/subagent_panel/README.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/subagent_panel/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/subagent_panel/coalesce_patch.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/subagent_panel/panel_render.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/subagent_panel/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/subagent_panel/resume_repaint.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/subagent_panel/state.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/switch_agent_resume/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/termflow_tui.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/README.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/bundled_palettes.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/content_styles.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/osc_palette.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/picker.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/prompt_toolkit_theme.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/rich_themes.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/themes.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/timestamp_heartbeat/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/token_ratio_learner/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/token_ratio_learner/ratios.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/universal_constructor/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/universal_constructor/models.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/universal_constructor/provider.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/universal_constructor/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/universal_constructor/sandbox.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/web_retriever_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/web_retriever_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/web_retriever_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/wiggum/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/wiggum/goal_runs.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/wiggum/judge.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/wiggum/judge_config.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/wiggum/judges_menu.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/wiggum/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/wiggum/state.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/yolo_cli/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/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.71
|
|
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
|
|
@@ -15,8 +15,15 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
15
15
|
Classifier: Programming Language :: Python :: 3.12
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.13
|
|
17
17
|
Requires-Python: <3.15,>=3.11
|
|
18
|
+
Requires-Dist: httpx2>=2.7
|
|
18
19
|
Requires-Dist: httpx<1,>=0.24.1
|
|
19
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
|
|
20
27
|
Description-Content-Type: text/markdown
|
|
21
28
|
|
|
22
29
|
# Code Puppy Core Plugins
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Bridge user-attached images into on-disk reference files."""
|
code_puppy_core_plugins-0.0.71/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
|
+
]
|
|
@@ -10,7 +10,7 @@ pydantic-ai's ``openai_chat_send_back_thinking_parts="field"`` mode preserves
|
|
|
10
10
|
``reasoning_opaque``. The Copilot API returns **400 Bad Request** if
|
|
11
11
|
``reasoning_text`` is sent without the accompanying ``reasoning_opaque``.
|
|
12
12
|
|
|
13
|
-
This module monkey-patches the
|
|
13
|
+
This module monkey-patches the httpx2 client to transparently:
|
|
14
14
|
|
|
15
15
|
1. Capture ``reasoning_opaque`` (keyed by ``reasoning_text``) from responses
|
|
16
16
|
2. Inject the matching ``reasoning_opaque`` into outgoing request messages
|
|
@@ -25,8 +25,8 @@ import json
|
|
|
25
25
|
import logging
|
|
26
26
|
from typing import Any, Dict
|
|
27
27
|
|
|
28
|
-
import
|
|
29
|
-
from
|
|
28
|
+
import httpx2
|
|
29
|
+
from httpx2 import AsyncByteStream
|
|
30
30
|
|
|
31
31
|
logger = logging.getLogger(__name__)
|
|
32
32
|
|
|
@@ -57,8 +57,8 @@ class _OpaqueCapturingStream(AsyncByteStream):
|
|
|
57
57
|
lines, parses JSON, and pairs ``reasoning_text`` chunks with
|
|
58
58
|
``reasoning_opaque`` chunks for storage in *opaque_cache*.
|
|
59
59
|
|
|
60
|
-
Inherits from ``
|
|
61
|
-
``
|
|
60
|
+
Inherits from ``httpx2.AsyncByteStream`` so that
|
|
61
|
+
``httpx2.Response.aclose()`` recognises us as an async stream and
|
|
62
62
|
doesn't blow up with *"Attempted to call an async close on an sync
|
|
63
63
|
stream"*. Ask me how I know.
|
|
64
64
|
"""
|
|
@@ -188,9 +188,9 @@ def _capture_from_content(
|
|
|
188
188
|
|
|
189
189
|
|
|
190
190
|
def _rebuild_request_body(
|
|
191
|
-
request:
|
|
191
|
+
request: httpx2.Request,
|
|
192
192
|
body: dict,
|
|
193
|
-
client:
|
|
193
|
+
client: httpx2.AsyncClient,
|
|
194
194
|
) -> None:
|
|
195
195
|
"""Replace the request body in-place (mirrors ChatGPTCodexAsyncClient)."""
|
|
196
196
|
new_body = json.dumps(body).encode("utf-8")
|
|
@@ -210,9 +210,9 @@ def _rebuild_request_body(
|
|
|
210
210
|
|
|
211
211
|
|
|
212
212
|
def _inject_opaque_into_request(
|
|
213
|
-
request:
|
|
213
|
+
request: httpx2.Request,
|
|
214
214
|
opaque_cache: Dict[str, str],
|
|
215
|
-
client:
|
|
215
|
+
client: httpx2.AsyncClient,
|
|
216
216
|
thinking_field: str,
|
|
217
217
|
) -> None:
|
|
218
218
|
"""Add stored ``reasoning_opaque`` to assistant messages that need it.
|
|
@@ -288,8 +288,8 @@ def _inject_opaque_into_request(
|
|
|
288
288
|
|
|
289
289
|
|
|
290
290
|
def _strip_all_reasoning_fields(
|
|
291
|
-
request:
|
|
292
|
-
client:
|
|
291
|
+
request: httpx2.Request,
|
|
292
|
+
client: httpx2.AsyncClient,
|
|
293
293
|
thinking_field: str,
|
|
294
294
|
) -> bool:
|
|
295
295
|
"""Remove ALL reasoning fields from the request body.
|
|
@@ -340,17 +340,17 @@ def _strip_all_reasoning_fields(
|
|
|
340
340
|
|
|
341
341
|
|
|
342
342
|
def patch_client_for_reasoning_opaque(
|
|
343
|
-
client:
|
|
343
|
+
client: httpx2.AsyncClient,
|
|
344
344
|
thinking_field: str = "reasoning_text",
|
|
345
345
|
) -> None:
|
|
346
346
|
"""Monkey-patch *client* to round-trip ``reasoning_opaque`` transparently.
|
|
347
347
|
|
|
348
348
|
Call **after** creating the client but **before** handing it to
|
|
349
|
-
``OpenAIProvider``. Works with plain ``
|
|
349
|
+
``OpenAIProvider``. Works with plain ``httpx2.AsyncClient`` and the
|
|
350
350
|
``RetryingAsyncClient`` subclass returned by ``create_async_client``.
|
|
351
351
|
|
|
352
352
|
Args:
|
|
353
|
-
client: The
|
|
353
|
+
client: The httpx2 async client to patch.
|
|
354
354
|
thinking_field: JSON field name that carries the thinking content
|
|
355
355
|
(default ``"reasoning_text"`` — the Copilot Claude convention).
|
|
356
356
|
"""
|
|
@@ -358,8 +358,8 @@ def patch_client_for_reasoning_opaque(
|
|
|
358
358
|
original_send = client.send
|
|
359
359
|
|
|
360
360
|
async def _patched_send(
|
|
361
|
-
request:
|
|
362
|
-
) ->
|
|
361
|
+
request: httpx2.Request, *args: Any, **kwargs: Any
|
|
362
|
+
) -> httpx2.Response:
|
|
363
363
|
# 1) Inject reasoning_opaque into outgoing POST bodies.
|
|
364
364
|
# Also strips orphaned reasoning_text with no cached opaque.
|
|
365
365
|
if request.method == "POST":
|
|
@@ -371,11 +371,11 @@ def _create_copilot_model(model_name: str, model_config: Dict, config: Dict) ->
|
|
|
371
371
|
GPT-5.6 family, Codex, Grok, ...) are built as ``OpenAIResponsesModel``;
|
|
372
372
|
everything else keeps using Chat Completions.
|
|
373
373
|
"""
|
|
374
|
-
import
|
|
374
|
+
import httpx2
|
|
375
375
|
from pydantic_ai.models.openai import OpenAIChatModel, OpenAIResponsesModel
|
|
376
376
|
from pydantic_ai.providers.openai import OpenAIProvider
|
|
377
377
|
|
|
378
|
-
from code_puppy.
|
|
378
|
+
from code_puppy.httpx2_utils import create_async_client
|
|
379
379
|
|
|
380
380
|
# Discover token — match against the host stored in the model config
|
|
381
381
|
host = model_config.get("copilot_host", "github.com")
|
|
@@ -405,14 +405,14 @@ def _create_copilot_model(model_name: str, model_config: Dict, config: Dict) ->
|
|
|
405
405
|
"Openai-Intent": COPILOT_AUTH_CONFIG["openai_intent"],
|
|
406
406
|
}
|
|
407
407
|
|
|
408
|
-
class _CopilotAuth(
|
|
409
|
-
"""
|
|
408
|
+
class _CopilotAuth(httpx2.Auth):
|
|
409
|
+
"""httpx2 auth flow that refreshes the Copilot session token per-request."""
|
|
410
410
|
|
|
411
411
|
def __init__(self, oauth_token: str, token_host: str):
|
|
412
412
|
self._oauth_token = oauth_token
|
|
413
413
|
self._host = token_host
|
|
414
414
|
|
|
415
|
-
def auth_flow(self, request:
|
|
415
|
+
def auth_flow(self, request: httpx2.Request):
|
|
416
416
|
token = get_valid_session_token(self._oauth_token, self._host)
|
|
417
417
|
if token:
|
|
418
418
|
request.headers["Authorization"] = f"Bearer {token}"
|
|
@@ -447,7 +447,7 @@ def _create_copilot_model(model_name: str, model_config: Dict, config: Dict) ->
|
|
|
447
447
|
from .reasoning_client import patch_client_for_reasoning_opaque
|
|
448
448
|
|
|
449
449
|
# Field-mode so thinking persists across tool calls; the reasoning_opaque
|
|
450
|
-
# interceptor (patched onto the
|
|
450
|
+
# interceptor (patched onto the httpx2 client) re-injects the encrypted blob
|
|
451
451
|
# into subsequent requests, preventing 400s.
|
|
452
452
|
profile = OpenAIModelProfile(
|
|
453
453
|
openai_chat_thinking_field="reasoning_text",
|
|
@@ -14,7 +14,7 @@ brand-new part: tool calls come through with empty ``arguments`` (the
|
|
|
14
14
|
``read_file ... Field required: file_path`` failure) and assistant text is
|
|
15
15
|
split into one part per delta.
|
|
16
16
|
|
|
17
|
-
This module wraps the
|
|
17
|
+
This module wraps the httpx2 response byte-stream and rewrites each event so
|
|
18
18
|
every item keeps the first id seen for its ``output_index``. Bytes that
|
|
19
19
|
are not SSE ``data:`` JSON events pass through untouched. The wrapper
|
|
20
20
|
follows the ``_OpaqueCapturingStream`` pattern in ``reasoning_client``.
|
|
@@ -26,8 +26,8 @@ import json
|
|
|
26
26
|
import logging
|
|
27
27
|
from typing import Any, Dict
|
|
28
28
|
|
|
29
|
-
import
|
|
30
|
-
from
|
|
29
|
+
import httpx2
|
|
30
|
+
from httpx2 import AsyncByteStream
|
|
31
31
|
|
|
32
32
|
logger = logging.getLogger(__name__)
|
|
33
33
|
|
|
@@ -112,7 +112,7 @@ class _StableIdStream(AsyncByteStream):
|
|
|
112
112
|
Buffers bytes, splits on newlines, rewrites ``data:`` JSON events via
|
|
113
113
|
:func:`normalise_event_ids`, and re-emits them. Everything else (event
|
|
114
114
|
lines, blank separators, ``[DONE]``, unparseable payloads) is forwarded
|
|
115
|
-
verbatim. Inherits ``
|
|
115
|
+
verbatim. Inherits ``httpx2.AsyncByteStream`` so ``Response.aclose()``
|
|
116
116
|
treats it as an async stream.
|
|
117
117
|
"""
|
|
118
118
|
|
|
@@ -166,7 +166,7 @@ class _StableIdStream(AsyncByteStream):
|
|
|
166
166
|
return b"data: " + json.dumps(event, ensure_ascii=False).encode("utf-8")
|
|
167
167
|
|
|
168
168
|
|
|
169
|
-
def _is_responses_sse(request:
|
|
169
|
+
def _is_responses_sse(request: httpx2.Request, response: httpx2.Response) -> bool:
|
|
170
170
|
if request.method != "POST" or not request.url.path.rstrip("/").endswith(
|
|
171
171
|
"/responses"
|
|
172
172
|
):
|
|
@@ -175,7 +175,7 @@ def _is_responses_sse(request: httpx.Request, response: httpx.Response) -> bool:
|
|
|
175
175
|
return "text/event-stream" in content_type.lower()
|
|
176
176
|
|
|
177
177
|
|
|
178
|
-
def patch_client_for_stable_ids(client:
|
|
178
|
+
def patch_client_for_stable_ids(client: httpx2.AsyncClient) -> None:
|
|
179
179
|
"""Monkey-patch *client* so ``/responses`` SSE streams carry stable ids.
|
|
180
180
|
|
|
181
181
|
Call after creating the client and before handing it to
|
|
@@ -186,8 +186,8 @@ def patch_client_for_stable_ids(client: httpx.AsyncClient) -> None:
|
|
|
186
186
|
original_send = client.send
|
|
187
187
|
|
|
188
188
|
async def _patched_send(
|
|
189
|
-
request:
|
|
190
|
-
) ->
|
|
189
|
+
request: httpx2.Request, *args: Any, **kwargs: Any
|
|
190
|
+
) -> httpx2.Response:
|
|
191
191
|
response = await original_send(request, *args, **kwargs)
|
|
192
192
|
if (
|
|
193
193
|
response.status_code == 200
|
|
@@ -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
|
|